사쿠라 VPS (GPU 없음)로 BERT를 움직여 보았습니다.

소개



이 기사
BERT에 대해 해설! 일본어 모델을 사용하여 예측을 해보자!
대로 하면 Google collaboratory에서 쉽게 BERT를 체험할 수 있습니다.

이것을, Google colaborator상이 아니라, 싼 서버상에서 공개 이용할 수 없을까 생각해, 사쿠라 VPS1G(월액 800엔)로 움직여 보았습니다.

요점은 Google colaboratory에서 사용할 수 있는 GPU가 사쿠라 VPS에서는 사용할 수 없기 때문에 CPU 버전의 라이브러리를 설치해야 한다는 것입니다.

도입 환경



사쿠라 VPS
메모리 1GB, 스토리지 SSD 50GB, CPU 2코어(월액 800엔)
표준 설치 CentOS8 x86_64

소개



우선, 다음의 기사를 참고로 해, 「anaconda」유저를 작성해, 기계 학습용의 환경 「ml_env」를 작성했습니다. 기사에서는 Centos7.7로 구축되었지만 CentOS8에서도 전혀 문제가 없었습니다.
【제1회】CentOS에 Python의 기계 학습 개발 환경을 구축한다(Anaconda 설치편) - Qiita

위 기사에 이어 'anaconda' 사용자로 기계 학습 환경 'ml_env'를 활성화하여 이 환경에 BERT를 도입합니다.

CPU 버전의 Transformers 설치


pip install transformers[tf-cpu]

※이 설치로 TensorFlow도 동시에 설치됩니다. 참고

CPU 버전의 Torch 설치


pip install torch==1.7.0+cpu torchvision==0.8.1+cpu torchaudio===0.7.0 -f https://download.pytorch.org/whl/torch_stable.html

※ Anaconda로 인스톨 conda install pytorch 라고 하면(자), Illegal instruction (core dumped) 와 같은 에러가 나왔습니다. GPU 관련 에러와 같으므로 위와 같은 CPU 버전을 설치했습니다. 이 명령은 htps : // py와 rch. 오 rg / 게 ts r d / ぉ 굉장히 /의 "START LOCALLY"에서

와 같이 선택하여 생성된 것입니다. CUDA를 None으로, GUP 없음으로 하고 있습니다.

이제 필요한 라이브러리를 설치할 수 있습니다.

BERT 일본어 Pretrained 모델 다운로드



다음으로 교토 대학의 구로바시・가와라・무라와키 연구실이 공개되었습니다, BERT 일본어 Pretrained 모델을 다운로드합니다.

현재 anaconda 사용자가 /home/anaconda/에 있다고 가정하고 일본어 모델을 저장하는 디렉토리 /home/anaconda/bert/japan_test를 만들고 이동합니다.
mkdir bert
cd bert
mkdir japan_test
cd japan_test

그런 다음 다운로드, 압축 해제, 다운로드 파일을 삭제합니다.
curl -OL http://nlp.ist.i.kyoto-u.ac.jp/nl-resource/JapaneseBertPretrainedModel/Japanese_L-12_H-768_A-12_E-30_BPE.zip
unzip Japanese_L-12_H-768_A-12_E-30_BPE.zip
rm -rf Japanese_L-12_H-768_A-12_E-30_BPE.zip

이제 /home/anaconda/bert/japan_test/apanese_L-12_H-768_A-12_E-30_BPE 에 모델을 설치할 수 있었습니다.

작성한 디렉토리에서 나옵니다.
cd ../..

여기 /home/anaconda/에 BERT 테스트 용 Python 프로그램 파일 bert_test.py를 넣습니다.

bert_test.py
from transformers import BertTokenizer, BertForMaskedLM, BertConfig
import torch
import numpy as np

config = BertConfig.from_json_file('/home/anaconda/bert/japan_test/Japanese_L-12_H-768_A-12_E-30_BPE/bert_config.json')
model = BertForMaskedLM.from_pretrained('/home/anaconda/bert/japan_test/Japanese_L-12_H-768_A-12_E-30_BPE/pytorch_model.bin', config=config)
bert_tokenizer = BertTokenizer('/home/anaconda/bert/japan_test/Japanese_L-12_H-768_A-12_E-30_BPE/vocab.txt',
 do_lower_case=False, do_basic_tokenize=False)

tokenized_text = ['[CLS]', 'むかし', '浦島', 'という', '漁師', 'が', '住んで', 'いました', '。'
, 'ある', '日', '、', '[MASK]', 'が', '浜', 'を', '歩いて', 'いると', '[SEP]']
masked_index = 12

tokens=bert_tokenizer.convert_tokens_to_ids(tokenized_text)
tokens_tensor=torch.tensor([tokens])

model.eval()
with torch.no_grad():
  outputs = model(tokens_tensor)
  predictions = outputs[0]
_,predicted_indexes=torch.topk(predictions[0,masked_index],k=10)
predicted_tokens = bert_tokenizer.convert_ids_to_tokens(predicted_indexes.tolist())
print(predicted_tokens)

이 프로그램은
['[CLS]', 'むかし', '浦島', 'という', '漁師', 'が', '住んで', 'いました', '。', 'ある', '日', '、', '[MASK]', 'が', '浜', 'を', '歩いて', 'いると', '[SEP]']

[MASK] 에 들어갈 단어를 예측합니다.
python bert_test.py

에서 실행하면,
['漁師', '[UNK]', '男', '人々', '人', '若者', '女', '役人', '少年', '魚']

라는 그런 결과를 얻었습니다. 이제 BERT를 움직이는 데 성공했습니다.

기타



이 BERT의 해석 결과를, 웹 어플리케이션으로 사용하고 싶다고 생각해, Flask로 로컬인 웹 서버를 세워 버리고, Flask상에서 BERT의 모델을 데몬화(상주화)시켜 보았습니다. 그리고 Apache에서 웹 서버를 세우고 API로 공개했습니다. 즉 외부에서 Apache의 API에 액세스하면 그 API 프로그램이 Flask상의 BERT에 액세스하여 BERT의 해석 결과를 얻는 흐름을 만들어 보았습니다. 그것이,

BERT 단어 추측 데모

됩니다. 좋으면 시도하십시오.

좋은 웹페이지 즐겨찾기