Amazon Web Services ブログ
PyTorch のオープンソースモデルサーバー、TorchServe を発表
PyTorch は、ディープラーニングで最も人気のあるオープンソースライブラリの 1 つです。開発者と研究者は、モデルの構築とトレーニングにおいて享受できる柔軟性を特に重宝しています。しかし、これはストーリーの半分にすぎず、本番環境でのモデルのデプロイと管理は、機械学習プロセスの最も困難な部分であることが多々あります。オーダーメイドの予測 API の構築、それらのスケーリング、保護などがその厄介な部分です。
モデルのデプロイプロセスを簡略化する 1 つの方法は、モデルサーバー、つまり、本番環境で機械学習予測を行うために特別に設計された既製のウェブアプリケーションを使用することです。モデルサーバーを使用すると、1 つまたは複数のモデルを簡単に読み込むことができ、スケーラブルなウェブサーバーに基づく予測 API が自動的に作成されます。また、予測リクエストに対して前処理と後処理のコードを実行することもできます。最後に忘れてならないのが、モデルサーバーは、ログ記録、モニタリング、セキュリティなどの生産に不可欠な機能も提供している点です。一般的なモデルサーバーには、TensorFlow Serving と Multi Model Server があります。
今日、TorchServe を発表できることをとても嬉しく思います。これは、カスタムコードを記述することなく、トレーニングされた PyTorch モデルを大規模かつ簡単にデプロイできる PyTorch のモデルサービングライブラリです。
TorchServe のご紹介
TorchServe は AWS と Facebook 間のコラボレーションであり、PyTorch オープンソースプロジェクトの一部として利用できます。プロジェクトの開始方法に興味がある場合は、Github で初期の RFC を読むことができます。
TorchServe を使用すると、PyTorch ユーザーは、カスタムコードを記述することなく、モデルをより迅速に本番環境に導入できるようになります。低レイテンシーの予測 API の提供に加えて、TorchServe は、オブジェクト検出やテキスト分類などの最も一般的なアプリケーションのデフォルトハンドラーも埋め込んでいます。さらに、TorchServe には、アプリケーション統合のためのマルチモデルの提供、A/B テストのモデルバージョン管理、モニタリング指標、RESTful エンドポイントが含まれます。ご想像のとおり、TorchServe は、Amazon SageMaker、コンテナサービス、Amazon Elastic Compute Cloud (EC2) などの機械学習環境をサポートしています。
一部のお客様はすでに TorchServe のメリットを享受しています。
Toyota Research Institute Advanced Development, Inc. (TRI-AD) は、トヨタ自動車で自動運転用のソフトウェアを開発しています。TRI-AD の ML ツールのリード、Yusuke Yachide 氏は次のように述べています。「私たちはコンピュータービジョンモデルを継続的に最適化および改善しています。これは、自律走行ですべての人に安全なモビリティを実現するという TRI-AD の使命に不可欠です。私たちのモデルは AWS の PyTorch でトレーニングしていますが、これまでの PyTorch にはモデルサービングフレームワークがありませんでした。その結果、PyTorch モデルを一連の車両とクラウドサーバーにデプロイするためのソフトウェアの作成と保守に多大なエンジニアリングの労力を要しました。TorchServe では、AWS と PyTorch コミュニティによって正式にサポートおよび保守されている、高性能で軽量なモデルサーバーを使用できるようになりました」
Matroid は、動画映像内のオブジェクトとイベントを検出するコンピュータービジョンソフトウェアのメーカーです。Matroid Inc. の創設者兼 CEO の Reza Zadeh 氏は次のように述べています。「AWS とオンプレミス環境で PyTorch を使用して、急速に増加する機械学習モデルを開発しています。モデルは、カスタムモデルサーバーを使用してデプロイされますが、モデルを別の形式に変換する必要があるため、これには時間がかかり、負担となります。TorchServe を使用すると、1 つの信頼できるソースとしても機能し、共有と管理が容易な単一のサービング可能ファイルを使用して、モデルのデプロイを簡素化できます」
ここで、TorchServe をインストールし、事前トレーニング済みモデルを Amazon Elastic Compute Cloud (EC2) にロードする方法をご紹介します。ドキュメントの手順に従って、他の環境を試すこともできます。
TorchServe のインストール
まず、CPU ベースの Amazon Elastic Compute Cloud (EC2) インスタンスを起動し、Deep Learning AMI (Ubuntu エディション) を実行します。この AMI には、必要な依存関係がプリインストールされており、セットアップを高速化します。もちろん、代わりに任意の AMI も使用できます。
TorchServe は Java で実装されており、実行するには最新の OpenJDK が必要です。
sudo apt install openjdk-11-jdk
次に、TorchServe の新しい Conda 環境を作成してアクティブ化します。これにより、Python パッケージが整然と保たれます (もちろん、virtualenv も動作します)。
conda create -n torchserve
source activate torchserve
次に、TorchServe の依存関係をインストールします。
pip install sentencepiece # not available as a Conda package
conda install psutil pytorch torchvision torchtext -c pytorch
GPU インスタンスを使用している場合は、追加のパッケージが必要になります。
conda install cudatoolkit=10.1
依存関係がインストールされたので、TorchServe リポジトリのクローンを作成し、TorchServe をインストールできます。
git clone https://github.com/pytorch/serve.git
cd serve
pip install .
cd model-archiver
pip install .
セットアップが完了しました。では、モデルをデプロイしていきましょう。
モデルをデプロイする
このデモのために、PyTorch の model zoo から事前トレーニング済みモデルをダウンロードします。実際には、おそらく独自のモデルを使用したいと思うことでしょう。
wget https://download.pytorch.org/models/densenet161-8d451a50.pth
次に、モデルをモデルアーカイブにパッケージ化する必要があります。モデルアーカイブは、すべてのモデルアーティファクト、つまりモデル自体 (densenet161-8d451a50.pth)、ステートディクショナリをロードする Python スクリプト (テンソルをレイヤーに一致させる)、および必要に応じた追加ファイルを格納する ZIP ファイルです。ここでは、クラス識別子をクラス名にマップする index_to_name.json という名前のファイルを含めます。これは、予測ロジックを担当する組み込みの image_classifier ハンドラーが使用します。他の組み込みハンドラー (object_detector、text_classifier、image_segmenter) が利用でき、独自のハンドラーを実装できます。
torch-model-archiver --model-name densenet161 --version 1.0 \
--model-file examples/image_classifier/densenet_161/model.py \
--serialized-file densenet161-8d451a50.pth \
--extra-files examples/image_classifier/index_to_name.json \
--handler image_classifier
次に、モデルアーカイブを保存するディレクトリを作成し、作成したばかりのモデルをそのディレクトリに移動します。
mkdir model_store
mv densenet161.mar model_store/
これで、TorchServe を開始して、モデルストアとロードするモデルを指すことができます。もちろん、必要に応じていくつかのモデルをロードできます。
torchserve --start --model-store model_store --models densenet161=densenet161.mar
それでも同じマシン上で、画像を取得し、HTTP POST リクエストを使用してローカルサービング用に簡単に TorchServe に送信できます。使用するモデルの名前を含む URL の形式に注意してください。
curl -O https://s3.amazonaws.com/model-server/inputs/kitten.jpg
curl -X POST http://127.0.0.1:8080/predictions/densenet161 -T kitten.jpg
結果はすぐに表示されます。組み込みハンドラーのおかげで、クラス名が表示されています。
[
{"tiger_cat": 0.4693356156349182},
{"tabby": 0.46338796615600586},
{"Egyptian_cat": 0.06456131488084793},
{"lynx": 0.0012828155886381865},
{"plastic_bag": 0.00023323005007114261}
]
次に、「stop」コマンドで TorchServe を停止します。
torchserve --stop
ご覧のとおり、デフォルトの設定を使用して、TorchServe を開始するのは簡単です。次に、リモートサービング用に設定する方法をご紹介します。
リモートサービング用に TorchServe を設定する
config.properties (デフォルト名) という名前の TorchServe の設定ファイルを作成してみましょう。このファイルは、ロードするモデルを定義し、リモートサービングをセットアップします。ここでは、サーバーをすべてのパブリック IP アドレスにバインドしていますが、必要に応じてサーバーを特定のアドレスに制限できます。これは EC2 インスタンスで実行されているため、セキュリティグループでポート 8080 および 8081 が開いていることを確認する必要があります。
model_store=model_store
load_models=densenet161.mar
inference_address=http://0.0.0.0:8080
management_address=http://0.0.0.0:8081
これで、コマンドライン引数を渡さなくても、同じディレクトリで TorchServe を開始できます。
torchserve --start
ローカルマシンに戻り、TorchServe をリモートで呼び出して、同じ結果を得ることができます。
curl -X POST http://ec2-54-85-61-250.compute-1.amazonaws.com:8080/predictions/densenet161 -T kitten.jpg
ここでは HTTP を使用していることに気づかれたのではないでしょうか。多くの人が本番環境で HTTPS を必要とすると思われるので、その設定方法をご紹介しましょう。
TorchServe を設定して HTTPS を使用する
TorchServe は、Java キーストアまたは証明書のいずれかを使用できます。ここでは後者を使います。
まず、openssl を使用して証明書とプライベートキーを作成します。
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mykey.key -out mycert.pem
次に、設定ファイルを更新して証明書とキーの場所を定義し、TorchServe をデフォルトのセキュアポートにバインドします (セキュリティグループを更新することを忘れないでください)。
model_store=model_store
load_models=densenet161.mar
inference_address=https://0.0.0.0:8443
management_address=https://0.0.0.0:8444
private_key_file=mykey.key
certificate_file=mycert.pem
TorchServe を再起動すると、HTTPS で呼び出すことができます。自己署名証明書を使用しているため、「–insecure」フラグを curl に渡す必要があります。
curl --insecure -X POST https://ec2-54-85-61-250.compute-1.amazonaws.com:8443/predictions/densenet161 -T kitten.jpg
TorchServe の設定は他にも内容が盛りだくさんなので、ドキュメントを読むことをお勧めします!
開始方法
TorchServe は、https://github.com/pytorch/serve から入手できます。
是非試してみて、Github でご意見をお寄せください。