EAS は、標準の PyTorch TorchScript 形式のモデルをオンラインサービスとしてデプロイする、組み込みの PyTorch プロセッサを提供します。 このトピックでは、PyTorch モデルサービスをデプロイおよび呼び出す方法について説明します。
PyTorch プロセッサのバージョン
PyTorch は、GPU 版と CPU 版を含む複数のバージョンをサポートしています。次の表に、各バージョンのプロセッサ名を示します。
| プロセッサ名 | PyTorch バージョン | GPU サポート |
|---|---|---|
| pytorch_cpu_1.6 | PyTorch 1.6 | いいえ |
| pytorch_cpu_1.7 | PyTorch 1.7 | いいえ |
| pytorch_cpu_1.9 | PyTorch 1.9 | いいえ |
| pytorch_cpu_1.10 | PyTorch 1.10 | いいえ |
| pytorch_gpu_1.6 | PyTorch 1.6 | はい |
| pytorch_gpu_1.7 | PyTorch 1.7 | はい |
| pytorch_gpu_1.9 | PyTorch 1.9 | はい |
| pytorch_gpu_1.10 | PyTorch 1.10 | はい |
手順1:サービスのデプロイ
EASCMD クライアントを使用して PyTorch モデルサービスをデプロイする場合、processor 設定パラメータを、前述のサポートされている PyTorch プロセッサ名のいずれかに設定します。次の例は、サービスの設定ファイルを示しています。
{
"name": "pytorch_resnet_example",
"model_path": "http://examplebucket.oss-cn-shanghai.aliyuncs.com/models/resnet18.pt",
"processor": "pytorch_cpu_1.6",
"metadata": {
"cpu": 1,
"instance": 1,
"memory": 1000
}
}
クライアントツールを使用したサービスのデプロイ方法については、「サービスのデプロイ: EASCMD & DSW」をご参照ください。
コンソールで PyTorch モデルサービスをデプロイすることもできます。詳細については、「サービスのデプロイ: コンソール」をご参照ください。
手順2:サービスの呼び出し
PyTorch サービスでは、入出力にプレーンテキストではなく ProtoBuf を使用します。そのため、コンソールのオンラインデバッグ機能は使用できません。
EAS は、複数バージョンのソフトウェア開発キット (SDK) を提供しています。SDK はリクエストとレスポンスのデータをカプセル化し、組み込みのダイレクト接続とフォールトトレランスを提供します。SDK を使用してリクエストを構築、送信することを推奨します。次の例は、推論リクエストを示しています。
#!/usr/bin/env python
from eas_prediction import PredictClient
from eas_prediction import TorchRequest
if __name__ == '__main__':
client = PredictClient('http://182848887922****.cn-shanghai.pai-eas.aliyuncs.com', 'pytorch_gpu_wl')
client.init()
req = TorchRequest()
req.add_feed(0, [1, 3, 224, 224], TorchRequest.DT_FLOAT, [1] * 150528)
# フェッチ 0 を追加
for x in range(0, 10):
resp = client.predict(req)
print(resp.get_tensor_shape(0))
コードでのパラメーター設定とサービスの呼び出し方法については、「Python SDK を使用する」をご参照ください。
サービスリクエストを独自に作成することも可能です。詳細については、「PyTorch プロセッサ」をご参照ください。
リクエスト形式
PyTorch プロセッサは、入力と出力に ProtoBuf フォーマットを使用します。 SDK を使用してリクエストを送信すると、SDK がリクエストをカプセル化するため、SDK が提供する関数を使用してリクエストを構築するだけで済みます。 サービスリクエストを独自に構築するには、次の .proto 定義に基づいて関連コードを生成します。 詳細については、「TensorFlow サービスのリクエストを構築する」をご参照ください。
syntax = "proto3";
package pytorch.eas;
option cc_enable_arenas = true;
enum ArrayDataType {
// DataTypeの無効な値。DataTypeフィールドが未設定であることを示します。
DT_INVALID = 0;
// すべての計算デバイスでサポートされることが想定されるデータ型
DT_FLOAT = 1;
DT_DOUBLE = 2;
DT_INT32 = 3;
DT_UINT8 = 4;
DT_INT16 = 5;
DT_INT8 = 6;
DT_STRING = 7;
DT_COMPLEX64 = 8; // 単精度複素数
DT_INT64 = 9;
DT_BOOL = 10;
DT_QINT8 = 11; // 量子化 int8
DT_QUINT8 = 12; // 量子化 uint8
DT_QINT32 = 13; // 量子化 int32
DT_BFLOAT16 = 14; // 16ビットに切り詰められたFloat32。キャスト操作専用です。
DT_QINT16 = 15; // 量子化 int16
DT_QUINT16 = 16; // 量子化 uint16
DT_UINT16 = 17;
DT_COMPLEX128 = 18; // 倍精度複素数
DT_HALF = 19;
DT_RESOURCE = 20;
DT_VARIANT = 21; // 任意のC++データ型
}
// 配列の次元
message ArrayShape {
repeated int64 dim = 1 [packed = true];
}
// 配列を表すプロトコル バッファ
message ArrayProto {
// データ型
ArrayDataType dtype = 1;
// 配列のシェイプ
ArrayShape array_shape = 2;
// DT_FLOAT
repeated float float_val = 3 [packed = true];
// DT_DOUBLE
repeated double double_val = 4 [packed = true];
// DT_INT32, DT_INT16, DT_INT8, DT_UINT8
repeated int32 int_val = 5 [packed = true];
// DT_STRING
repeated bytes string_val = 6;
// DT_INT64
repeated int64 int64_val = 7 [packed = true];
}
message PredictRequest {
// 入力テンソル
repeated ArrayProto inputs = 1;
// 出力フィルター
repeated int32 output_filter = 2;
}
// PredictRequestの実行成功時のレスポンス
message PredictResponse {
// 出力テンソル
repeated ArrayProto outputs = 1;
}