TorchServe(v0.3.0)を使った感想

3 min読了の目安(約2700字TECH技術記事

クイックスタート

READMEにある『Quick start with docker: Start a container with a TorchServe image』に書かれている内容に従えば、環境構築できていればサーバーを起動するところまでは出来ると思います。dockerを使う気がない場合もここを見れば使い方は分かります。

動作確認だけREDMEの"Get predictions from a model"に戻る必要があるのですが、内容としてはcurlでサンプル画像をダウンロードして、curlで画像をTorchServeに投げてレスポンスの確認になります。

はまったところ

"Worker died."が良く出る

設定ファイルでjavaのヒープサイズの最大値を上げたり、ジョブのキューサイズを上げると解決するかもしれません。設定ファイルは--ts-configで指定出来ます。設定ファイルの例としては、こんな感じです。

ts_config.properties
inference_address=http://0.0.0.0:8080
management_address=http://0.0.0.0:8081
job_queue_size=100

load_models=ssd.mar
default_workers_per_model=1
model_store=/tmp/models

vmargs=-Xmx12g

モデルやハンドラのimportエラーが出る

torch-model-archiverを実行して生成されるmarファイルですが、--model-file--handlerで指定したpythonスクリプトをtar.gz形式で圧縮しているだけなので、モデルのコードがパッケージ化されているか、PYTHONPATHでパスを通さない限りはimportで失敗します。

torchserveにモデルを配置すれば、REST APIが動くというような状況を作ろうと考えるならば、torchscript形式に変換してからptファイルを作ることが考えられます。このときは--model-fileの指定は要らなくなります。

ハンドラはtorchserveで用意されているBaseHandlerが参考になると思います。継承して使っても良いです。from ts.torch_handler.base_handler import BaseHandlerでインポートできます。他にもハンドラクラスは用意されているので、参考にできると思います。「tsってなんだよ」と思われるかもしれませんが、torchserveのモジュール名です。

windows10に実行環境を作る

windowsサーバー2019でしか動作保証が無いと書かれていますが、windows10 HomeでもPython3.6.9で動きました。環境構築はgithub上のドキュメント、「TorchServe on Windows」のバイナリからインストールするコースに従えば使えるようになりました(リンク先はv0.3.0タグのものです)。手順通りにするとmasterブランチのコードを使ってしまうので

git checkout -b v0.3.0 refs/tags/v0.3.0

を挟んだほうが安全だと思います。Prerequisitesのリンクはjdk, nodeなどそれぞれバージョンも指定してあるので、リリースブランチに合わせると失敗しないと思います。

もしワーカーが死んだりする場合、pytorchをimportしたときにエラーが出ないか確認してみると良いかもしれません。

OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized.
OMP: Hint This means that multiple copies of the OpenMP runtime have been linked into the program. 
That is dangerous, since it can degrade performance or cause incorrect results. 
The best thing to do is to ensure that only a single OpenMP runtime is linked into the process,
e.g. by avoiding static linking of the OpenMP runtime in any library. 
As an unsafe, unsupported, undocumented workaround you can set the environment variable KMP_DUPLICATE_LIB_OK=TRUE to
allow the program to continue to execute, but that may cause crashes or silently produce incorrect results. For more information, 
please see http://www.intel.com/software/products/support/.

根本的な解決ではないようですが、Hintに書かれている通りに環境変数KMP_DUPLICATE_LIB_OKTrueに設定すると動くようにはなります。