Blade EAS プラグインは、構成ファイルの設定を通じて、EAS サービスのデプロイ時に自動的にモデルを最適化します。
前提条件と制限事項
EAS の TensorFlow および PyTorch プロセッサには、Blade ランタイム SDK が統合されています。これらのプロセッサでデプロイするモデルを最適化するには、EAS サービス構成ファイルを設定してください。
Blade EAS プラグインは、EAS サービスのデプロイ前にモデルを最適化します。最適化に要する時間は、モデルの複雑さに応じて 3~10 分程度です。プラグインは、初回の EAS サービスデプロイ時に 1 回のみ実行されます。その後の水平スケーリング(スケールアウト/スケールイン)では、最適化済みのモデルが使用されます。
Blade EAS プラグインを有効にするには、eascmd クライアントを使用してサービスを作成する場合のみ可能です。eascmd クライアントの構成については、「クライアントのダウンロードと認証」および「コマンドリファレンス」をご参照ください。
Blade EAS プラグインを有効にするには、EAS サービス構成ファイルに plugins フィールドを追加します。詳細については、「plugins フィールド」をご参照ください。以下に Blade EAS プラグインの構成例を示します:
plugins フィールド
Blade EAS プラグインを有効にするには、EAS サービス構成ファイルに plugins フィールドを追加します。このフィールドには、1 個以上の辞書要素からなるリストを指定します。フィールドの詳細については、「サービスの作成」をご参照ください。
各辞書要素には、以下のキーが含まれます:
表 1. plugins のフィールド
|
キー |
必須 |
説明 |
|
command |
はい |
実行する最適化コマンドです。値の詳細については、「プロセッサとプラグインランタイムイメージの対応関係」をご参照ください。 |
|
image |
はい |
Blade EAS プラグインランタイムイメージのレジストリアドレスです。Blade EAS プラグインは、CPU および GPU(CUDA 10.0)デバイス上で動作する TensorFlow および PyTorch フレームワークをサポートしています。「プロセッサとプラグインランタイムイメージの対応関係」で、プロセッサ名およびプラグインレジストリアドレスをご確認ください。 |
|
resource |
いいえ |
最適化実行用のリソースグループです。これは、サービス記述ファイルの最上位レベルにある resource フィールドとは異なり、EAS サービス用のリソースグループを指定します。 GPU 最適化には必須です。中国 (杭州) および中国 (上海) リージョンでは、T4_8CORE リソースグループを使用します。中国 (上海) リージョンでは、V100_8CORE または P4_8CORE リソースグループもサポートされています。 説明
GPU を使用する場合、Blade EAS プラグインを実行するリソースグループと、EAS サービス用のリソースグループで使用する GPU カードの種類は同一である必要があります。 |
|
gpu |
いいえ |
最適化に使用する GPU の数です。通常は 1 です。 |
|
config |
いいえ |
高度な最適化構成項目です。現在は、1 つのモデルを構成するためのサブキー model_info のみがサポートされています。 キーはモデルファイル名です。値には、PAI-Blade Wheel パッケージの |
表 2. プロセッサとプラグインランタイムイメージの対応関係
|
デバイスタイプ |
キー |
値 |
|
CPU |
image(Blade EAS プラグインレジストリアドレス) |
|
|
command(プラグイン最適化コマンド) |
|
|
|
processor |
|
|
|
GPU |
image(Blade EAS プラグインレジストリアドレス) |
|
|
command(プラグイン最適化コマンド) |
|
|
|
processor |
|
表 3. 最適化項目一覧
|
最適化項目 |
説明 |
|
optimization_level |
最適化レベルです。以下の 2 つのレベルが利用可能です:
|
|
test_data |
テストデータファイルです。オプションです。テストデータファイルは、model_path で指定されたパスまたは圧縮パッケージ内に含める必要があります。特に PyTorch モデルの最適化では、通常のモデル推論用テストデータを提供することを推奨します。テストデータファイルの生成方法については、「最適化の補助データ」をご参照ください。 |
|
calibration_dataset |
量子化キャリブレーション用データファイルです。オプションです。量子化キャリブレーション用データファイルは、model_path で指定されたパスまたは圧縮パッケージ内に含める必要があります。 指定しない場合、Blade はオンライン INT8 量子化を実行します。指定した場合、Blade はオフライン INT8 量子化を実行します。 キャリブレーションデータは 100 件以上を提供してください。「最適化の補助データ」で、キャリブレーション用データファイルの生成方法をご確認ください。 |
|
inputs |
文字列のリストです。オプションです。モデルの入力ノード名を指定します。指定しない場合、Blade は上流ノードを持たないノードを入力ノードとして使用します。 PyTorch モデルでは不要です。 |
|
outputs |
文字列のリストです。オプションです。モデルの出力ノード名を指定します。指定しない場合、Blade は下流ノードを持たないノードを出力ノードとして使用します。 PyTorch モデルでは不要です。 |
|
input_shapes |
入力テンソルの可能な形状です。特定のシナリオでの最適化品質向上に使用します。内側のリスト要素数は、入力テンソルの数と一致する必要があります。各要素は、 複数の可能な形状セットを指定する場合は、外側のリストに要素を追加します。たとえば、2 つの入力を持つモデルでは、以下の値例が考えられます:
|
|
input_ranges |
各入力テンソルの要素の値範囲です。内側のリスト要素数は、入力テンソルの数と一致する必要があります。各要素は、値範囲を表す文字列です。 値範囲は、実数または文字を含む角括弧で表現します。例: 複数の可能な値範囲セットを指定する場合は、外側のリストに要素を追加します。たとえば、2 つの入力を持つモデルでは、以下の値例が考えられます:
|
|
quantization |
JSON 辞書です。現在は、weight_adjustment キーのみがサポートされています。このキーは、量子化による精度損失を低減するためにモデルパラメーターを調整するかどうかを示します。サポートされる値は以下のとおりです:
|
最適化の補助データ
O1 最適化レベルでは、test_data を提供することで、より的確な最適化が可能になります。O2 最適化レベルでは、calibration_dataset を提供することで、Blade がオフライン INT8 最適化を実行します。両パラメーターとも、Blade の補助データ形式に準拠している必要があります。TensorFlow および PyTorch の補助データ形式は以下のとおりです:
-
TensorFlow の補助データは、feed dict のリスト形式です。feed dict のキーは文字列、値は numpy ndarray です。補助データファイルは .npy ファイルとして保存します。
-
PyTorch の補助データは、tensor タプルのリスト形式です。.pth ファイルとして保存します。
以下は、TensorFlow 向け補助データファイルを生成するサンプルコードです:
import numpy as np
calib_data = list()
for i in range(10):
feed_dict = {
'image_placeholder:0': np.ones((8, 3, 224, 224), dtype=np.float32),
'threshold_placeholder:0': np.float32(0.5),
}
calib_data.append(feed_dict)
np.save("calib_data.npy", calib_data)
以下は、PyTorch 向け補助データファイルを生成するサンプルコードです:
import numpy as np
import torch
calib_data = list()
for i in range(10):
image = torch.ones(8, 3, 224, 224)
threshold = torch.tensor(0.5)
feed_tuple = (image, threshold)
calib_data.append(feed_tuple)
torch.save(calib_data, 'calib_data.pth')
Blade EAS プラグイン未使用の場合
以下は、Blade EAS プラグインを含まない単純な EAS サービス構成ファイルの例です:
{
"name": "blade_eas_plugin_test",
"model_path": "oss://<yourBucket>/<pathToYourModel>/",
"processor": "tensorflow_cpu_1.15",
"metadata": {
"instance": 1,
"memory": 4000
},
"resource": "<yourEASResource>"
}
EAS サービス構成ファイルの各フィールドの詳細については、「サービスの作成」をご参照ください。
サービス構成ファイルを service.json として保存します。以下のコマンドを実行して、CPU 上でデプロイされる TensorFlow 1.15 サービスを作成します:
eascmd create service.json
実行結果の例:
+-------------------+-------------------------------------------------------------------------------------------------+
| Internet Endpoint | http://123456789012****.cn-shanghai.pai-eas.aliyuncs.com/api/predict/blade_eas_plugin_test |
| Intranet Endpoint | http://123456789012****.vpc.cn-shanghai.pai-eas.aliyuncs.com/api/predict/blade_eas_plugin_test |
| Token | owic823JI3kRmMDZlOTQzMTA3ODhmOWIzMmVkZmZmZGQyNmQ1N2M5**** |
+-------------------+-------------------------------------------------------------------------------------------------+
[OK] Service is now creating
[OK] Schedule process to node cn-shanghai.i-uf6hv6kfua25q1k8****
[OK] Fetching processor from [http://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/release/3.18.0/py3.6.8_cpu_tf1.15.0_torch1.6.0_abiprecxx11/TENSORFLOW_SDK_CPU.d12d3dc-91024d0-1.15.0-Linux.tar.gz]
[OK] Successfully downloaded all artifacts
[OK] Building image registry-vpc.cn-shanghai.aliyuncs.com/eas/blade_eas_plugin_test_cn-shanghai:v0.0.1-20211117170541
[OK] Pushing image registry-vpc.cn-shanghai.aliyuncs.com/eas/blade_eas_plugin_test_cn-shanghai:v0.0.1-20211117170541
[OK] Successfully pushed image registry-vpc.cn-shanghai.aliyuncs.com/eas/blade_eas_plugin_test_cn-shanghai:v0.0.1-20211117170541
[OK] Successfully created ingress
[OK] Successfully synchronized resources
[OK] Waiting [Total: 1, Pending: 1, Running: 0]
[OK] Running [Total: 1, Pending: 0, Running: 1]
[OK] Service is running
基本構成
Blade EAS プラグインを有効にするには、EAS サービス構成ファイルに plugins フィールドを追加します。このフィールドはリストです。以下の例では、Blade 最適化プラグイン用の辞書要素が 1 つ含まれています:
{
"name": "blade_eas_plugin_test",
"model_path": "oss://<yourBucket>/<pathToYourModel>/",
"processor": "tensorflow_cpu_1.15",
"metadata": {
"instance": 1,
"memory": 4000
},
"plugins": [
{
"command": "blade --mode eas_plugin --optimize_for cpu",
"image": "registry.cn-shanghai.aliyuncs.com/eas/pai-blade-deploy:cpu_latest"
}
],
"resource": "<yourEASResource>"
}
この例では、plugins を除く他のフィールドは、PAI-EAS サービス構成ファイルの形式に従っています。詳細については、「サービスの作成」をご参照ください。plugins リスト内の辞書要素には、以下の 2 つのキーがあります:
-
command:実行する最適化コマンドです。
--mode eas_pluginは EAS プラグイン最適化パターンを示します。--optimize_for cpuは CPU 推論最適化を示します。 -
image:Blade EAS プラグインランタイムイメージのレジストリアドレスです。すべての CPU 最適化では、ランタイムイメージ
registry.cn-shanghai.aliyuncs.com/eas/pai-blade-deploy:cpu_latestを使用します。
この例では、テストデータなしで CPU デバイス上での最適化構成を完了しています。service1.json としてサービス構成ファイルを保存し、eascmd クライアントツールの create コマンドを使用してサービスを作成します:
eascmd create service1.json
実行結果の例:
+-------------------+-------------------------------------------------------------------------------------------------+
| Internet Endpoint | http://123456789012****.cn-shanghai.pai-eas.aliyuncs.com/api/predict/blade_eas_plugin_test |
| Intranet Endpoint | http://123456789012****.vpc.cn-shanghai.pai-eas.aliyuncs.com/api/predict/blade_eas_plugin_test |
| Token | owic823JI3kRmMDZlOTQzMTA3ODhmOWIzMmVkZmZmZGQyNmQ1N2M5**** |
+-------------------+-------------------------------------------------------------------------------------------------+
[OK] Service is now creating
[OK] Fetching processor from [http://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/release/3.18.0/py3.6.8_cpu_tf1.15.0_torch1.6.0_abiprecxx11/TENSORFLOW_SDK_CPU.d12d3dc-91024d0-1.15.0-Linux.tar.gz]
[OK] Successfully downloaded all artifacts
[OK] Executing plugin eas-plugin-73d70d54: registry.cn-shanghai.aliyuncs.com/eas/pai-blade-deploy:cpu_latest
[OK] Building image registry-vpc.cn-shanghai.aliyuncs.com/eas/blade_eas_plugin_test_cn-shanghai:v0.0.1-20211117172259
[OK] Pushing image registry-vpc.cn-shanghai.aliyuncs.com/eas/blade_eas_plugin_test_cn-shanghai:v0.0.1-20211117172259
[OK] Successfully pushed image registry-vpc.cn-shanghai.aliyuncs.com/eas/blade_eas_plugin_test_cn-shanghai:v0.0.1-20211117172259
[OK] Successfully created ingress
[OK] Successfully patch resources
[OK] Waiting [Total: 1, Pending: 1, Running: 0]
[OK] Running [Total: 1, Pending: 0, Running: 1]
[OK] Service is running
Blade EAS プラグイン未使用の構成と比較すると、ログに Blade 最適化の実行成功を示す追加の行が表示されます:
[OK] Executing plugin eas-plugin-73d70d54: registry.cn-shanghai.aliyuncs.com/eas/pai-blade-deploy:cpu_latest
高度な構成
より多くのモデル情報を提供することで、最適化の精度および加速率が向上します。以下の例は、追加の最適化パラメーターを含む GPU サービス記述ファイルです:
{
"name": "blade_eas_plugin_test",
"metadata": {
"cpu": 4,
"gpu": 1,
"instance": 1,
"memory": 4096,
"cuda": "10.0"
},
"model_path": "oss://<yourBucket>/<pathToYourModel>/",
"plugins": [
{
"command": "blade --mode eas_plugin --optimize_for gpu",
"image": "registry.cn-shanghai.aliyuncs.com/eas/pai-blade-deploy:gpu_latest",
"resource": "T4_8CORE",
"gpu": 1,
"config": {
"model_info": {
"frozen.pb": {
"optimization_level": "o1",
"inputs": [
"input_ids_a_1"
],
"outputs": [
"l2_normalize"
],
"test_data": "test_len9240_bc1.npy"
}
}
}
}
],
"processor": "tensorflow_gpu_1.15",
"resource": "<yourEASResource>"
}
この例では、plugins を除く他のフィールドは、EAS サービス構成ファイルの形式に従っています。詳細については、「サービスの作成」および「plugins のフィールド」をご参照ください。frozen.pb はモデルファイル名であり、frozen.pb ファイル内の TensorFlow モデルを最適化することを意味します。
サービス構成ファイルを service2.json として保存し、eascmd クライアントツールの create コマンドを使用してサービスを作成します:
eascmd create service2.json
実行結果の例:
+-------------------+-------------------------------------------------------------------------------------------------+
| Internet Endpoint | http://123456789012****cn-shanghai.pai-eas.aliyuncs.com/api/predict/blade_eas_plugin_test |
| Intranet Endpoint | http://123456789012****.vpc.cn-shanghai.pai-eas.aliyuncs.com/api/predict/blade_eas_plugin_test |
| Token | owic823JI3kRmMDZlOTQzMTA3ODhmOWIzMmVkZmZmZGQyNmQ1N2M5**** |
+-------------------+-------------------------------------------------------------------------------------------------+
[OK] Service is now creating
[OK] Schedule process to node cn-shanghai.i-uf642ocg20xinsme****
[OK] Downloading oss file: oss://blade-qa/test_assets/tf_security_textcnn/
[OK] Fetching processor from [http://pai-blade.oss-cn-zhangjiakou.aliyuncs.com/release/3.18.0/py3.6.8_cu100_tf1.15.0_torch1.6.0_abiprecxx11/TENSORFLOW_SDK_GPU.d12d3dc-91024d0-1.15.0-Linux.tar.gz]
[OK] Successfully downloaded all artifacts
[OK] Executing plugin eas-plugin-7126ee68: registry.cn-shanghai.aliyuncs.com/eas/pai-blade-deploy:gpu_latest
[OK] Building image registry-vpc.cn-shanghai.aliyuncs.com/eas/blade_eas_plugin_test_cn-shanghai:v0.0.1-20211117191732
[OK] Pushing image registry-vpc.cn-shanghai.aliyuncs.com/eas/blade_eas_plugin_test_cn-shanghai:v0.0.1-20211117191732
[OK] Successfully pushed image registry-vpc.cn-shanghai.aliyuncs.com/eas/blade_eas_plugin_test_cn-shanghai:v0.0.1-20211117191732
[OK] Successfully created ingress
[OK] Successfully synchronized resources
[OK] Waiting [Total: 1, Pending: 1, Running: 0]
[OK] Running [Total: 1, Pending: 0, Running: 1]
[OK] Service is running
Blade EAS プラグイン未使用の構成と比較すると、ログに Blade 最適化の実行成功を示す追加のエントリが表示されます:
[OK] Executing plugin eas-plugin-7126ee68: registry.cn-shanghai.aliyuncs.com/eas/pai-blade-deploy:gpu_latest