この記事の読者
キーワード・知ってると理解がしやすい
- BERT
Index
環境とライブラリ
Torch Serve を使って、Web API を作りたい.
Docker で環境構築を行う.
環境構築
今回は、ネットワークアーキテクチャのコードは、書かないで、
BERT のモデルを指定して、
マスクの穴埋め処理を行って、その結果を返却する API を作りたい.
手順としては、
Docker Image 作成
上のTorch Serve で提供している README を参考に、docker image を作成
./build_image.sh
image build の時に、git で clone しているのだが、そのとき、master branch で clone すると python library の依存関係のエラーがでたので、 -b オプションで、branch を指定する.
./build_image.sh -b v0.5.0
上の実行で、pytorch/torchserve:dev-cpu という docker image ができる.
handler を python で実装
あとで、handler python script を作る.
Torch Serve の API コンテナの起動
上で作った docker image を run コマンドで実行
docker run --rm -it -p 8080:8080 -p 8081:8081 -p 8082:8082 -p 7070:7070 -p 7071:7071 pytorch/torchserve:dev-cpu
curl でヘルスチェック
curl http://localhost:8080/ping { "status": "Healthy" }
健康な様子.
実装
Transformer の事前学習モデルを取得
Transformer の事前学習(pre trained)モデルを使いたい.
そのために、事前学習モデルを取得する.
上で作った環境で、作業を行う.
docker run --rm -it -v $(pwd):/home/get_model -p 8080:8080 -p 8081:8081 -p 8082:8082 -p 7070:7070 -p 7071:7071 pytorch/torchserve:dev-cpu /bin/bash
(必要があれば、volume した場所に python script を置いて編集する.)
volume する場所は、ここがよい.
pip install \ fugashi \ ipadic
日本語のモデルの利用で必要だったので、入れておく.
モデルを取得し、保存するスクリプトを作成.
get_model.py
import argparse from transformers import BertJapaneseTokenizer, BertModel parser = argparse.ArgumentParser() parser.add_argument("--save_path", required=True) def main(model_name = "cl-tohoku/bert-base-japanese-whole-word-masking", save_path = "./Transformer_model"): tokenizer = BertJapaneseTokenizer.from_pretrained(model_name) bert = BertModel.from_pretrained(model_name) tokenizer.save_pretrained(save_path) bert.save_pretrained(save_path) if __name__ == "__main__": args = parser.parse_args() print(args.save_path) main(save_path=args.save_path)
以下のファイルが生成される
config.json pytorch_model.bin special_tokens_map.json tokenizer_config.json vocab.txt
保存する先のディレクトリを作成して、get_model を実行.
mkdir Transformer_model python get_model.py --save_path Transformer_model
handler
API にアクセスされた時の推論処理を custom_handler.py として作成できるが、
Transfomers の推論処理は、Transformer_handler_generalized.py
で提供されている.
これをそのまま使う. (必要があれば、修正する.)
mar file を作成
しかし、このままでは、torch serve で利用できないので、
モデルを使用できる形式 torch model archive (mar) ファイルを整形する.
torch-model-archiver \ --model-name BERTSeqClassification \ --version 1.0 \ --serialized-file Transformer_model/pytorch_model.bin \ --handler ./Transformer_handler_generalized.py \ --extra-files "Transformer_model/config.json,\ ./setup_config.json,\ Transformer_model/vocab.txt,\ Transformer_model/special_tokens_map.json,\ Transformer_model/tokenizer_config.json"
この実行で BERTSeqClassification.mar が作成される.
モデルの登録
作った mar ファイルを /home/model-server/model_store
に移動.
torchserve
コマンドでデプロイ.
mv BERTSeqClassification.mar /home/model-server/model-store/ cd /home/model-server/ torchserve \ --start \ --model-store model-store \ --models my_tc=BERTSeqClassification.mar \ --ncs
curl
コマンドで推定処理を実行.
curl -X POST http://127.0.0.1:8080/predictions/my_tc -T Token_classification_artifacts/sample_text_captum_input.txt Accepted
分類結果が返ってきた.
torchserve --stop
stop オプションで止めるよう.