オムライスの備忘録

数学・統計学・機械学習・プログラミングに関することを記す

【深層学習】BERT #実装編 #05

この記事の読者

深層学習・ディープラーニングの手法の1つである「BERT」について知りたい.


キーワード・知ってると理解がしやすい

  • BERT

yhayato1320.hatenablog.com


yhayato1320.hatenablog.com

Index

環境とライブラリ

Torch Serve を使って、Web API を作りたい.

Docker で環境構築を行う.

github.com

環境構築

今回は、ネットワークアーキテクチャのコードは、書かないで、
BERT のモデルを指定して、
マスクの穴埋め処理を行って、その結果を返却する API を作りたい.

手順としては、

  1. Docker Image 作成
  2. handler を python で実装
  3. Torch Serve の 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


じつは、ここの作業は、 setup_config.json を設定し、 Download_Transformer_models.py を実行することでも取得できる.

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 オプションで止めるよう.

handler 結局いじった

参考