LoginSignup
5
2

More than 1 year has passed since last update.

さくらVPS(GPU無し)でBERTを動かしてみた

Last updated at Posted at 2020-11-16

はじめに

こちらの記事
BERTについて解説!日本語モデルを使って予測をしてみようー!
の通りにしますと、Google colaboratory上で簡単にBERTが体験できます。

これを、Google colaboratory上ではなく、安いサーバー上で公開利用できないかと考え、さくらVPS1G (月額800円)で動かしてみました。

ポイントは、Google colaboratoryでは使えるGPUが、さくらVPSでは使えないので、CPU版のライブラリのインストールが必要だということです。

導入環境

さくらVPS 
メモリ 1GB、ストレージSSD 50 GB、CPU 2コア (月額800円)
標準インストール CentOS8 x86_64

導入

まずは、次の記事を参考にさせていただき、「anaconda」ユーザーを作成して、機械学習用の環境「ml_env」を作成しました。記事ではCentos7.7で構築されていますが、CentOS8でも全く問題はありませんでした。
【第一回】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版をインストールしました。このコマンドは、https://pytorch.org/get-started/locally/ の「START LOCALLY」で
pytorch.png
のように選択して生成されたものです。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の解析結果を、Webアプリケーションで使いたいと考え、FlaskでローカルなWebサーバーを立てましまして、Flask上でBERTのモデルをデーモン化(常駐化)させてみました。そしてApacheでWebサーバーを立てまして、APIとして公開しました。つまり外部からApacheのAPIにアクセスしますとそのAPIプログラムが、Flask上のBERTにアクセスしまして、BERTの解析結果を得る、という流れを作ってみました。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2