EAS Plugin是EAS在模型部署前進行統一的前處理機制。基於該機制,Blade推出了Blade EAS Plugin,用於部署前的模型最佳化。相比直接使用Blade Python Wheel包進行模型最佳化,Blade EAS Plugin能夠自動嵌入到模型的發布流程中,極大簡化了整合Blade的工程開銷。本文介紹如何通過EAS服務組態檔使用Blade EAS Plugin進行模型最佳化及部署。
背景資訊
目前EAS的TensorFlow和PyTorch Processor已經整合了Blade運行時SDK,因此如果您使用這兩種Processor進行模型部署,則可以通過配置EAS服務組態檔的方式進行模型最佳化。
啟用Blade EAS Plugin將在EAS服務之前對您提供的模型提前最佳化,最佳化過程根據模型複雜程度可能持續3~10分鐘左右,Blade EAS Plugin只在部署EAS服務時執行一次,服務後續縮擴容都直接使用最佳化後的模型。
目前,Blade EAS Plugin功能只能在通過eascmd用戶端建立服務時啟用。關於如何配置和使用eascmd用戶端,請參見下載並認證用戶端和命令使用說明。
啟動Blade EAS PluginEAS服務組態檔中增加plugins欄位。關於該欄位詳情請參見下文的plugins欄位。本文也提供了如下樣本,以示範如何在PAI-EAS的服務組態檔中啟動Blade EAS Plugin:
plugins欄位
啟動Blade EAS Plugin,您只需要在EAS服務組態檔中增加plugins欄位。該欄位是一個列表,列表包含一個或多個字典元素。關於EAS服務組態檔的欄位詳情,請參見建立服務。
每個字典元素包含的key如下表所示。
key | 是否必選 | 描述 |
command | 是 | 啟動並執行最佳化命令,取值請參見下文的Processor與Plugin鏡像的對應表。 |
image | 是 | Blade EAS Plugin的鏡像地址。Blade EAS Plugin目前支援TensorFlow和PyTorch架構,支援CPU和GPU(CUDA 10.0)兩種裝置,對應的Processor名稱與Plugin鏡像地址如下文的Processor與Plugin鏡像的對應表所示。 |
resource | 否 | 執行最佳化的資源群組。您需要將該參數與服務描述檔案最外層表示EAS服務運行資源群組的resource欄位區分開。 如果進行GPU最佳化,則必須配置該參數。在華東1(杭州)和華東2(上海)兩個地區可以使用T4_8CORE資源群組執行Blade EAS Plugin。此外,在華東2(上海)還可以使用V100_8CORE或P4_8CORE資源群組。 說明 對於GPU而言,執行Blade EAS Plugin的資源群組卡型需要與最終建立EAS服務的資源群組的卡型一致。 |
gpu | 否 | 最佳化時使用的GPU數量,通常取值為1。 |
config | 否 | 進階最佳化配置項。目前只有model_info一個子項。 model_info中可以配置多個模型的最佳化項,目前只支援配置一個模型的最佳化項。 模型的key為模型的檔案名稱,value支援多個最佳化項,這些最佳化項與PAI-Blade Wheel包中的 |
裝置類型 | key | value |
CPU | image(Blade EAS Plugin鏡像地址) |
|
command(外掛程式啟動並執行最佳化命令) |
| |
processor |
| |
GPU | image(Blade EAS Plugin鏡像地址) |
|
command(外掛程式啟動並執行最佳化命令) |
| |
processor |
|
最佳化項 | 描述 |
optimization_level | optimization_level分為以下兩個等級:
|
test_data | 測試資料檔案,可選。測試資料檔案需要包含在model_path指定的路徑或壓縮包中。建議您提供一組可以正常進行模型推理的真實測試資料(尤其是PyTorch模型最佳化)。關於測試資料檔案的產生方式請參見下文的用於最佳化的輔助資料。 |
calibration_dataset | 量化校準資料檔案,可選。量化校準資料檔案需要包含在model_path指定的路徑或壓縮包中。 如果沒有指定該欄位,則進行Online INT8量化。如果指定了該欄位,則進行Offline INT8量化。 通常建議您提供100條以上的校正資料。量化校準資料檔案的產生方式請參見下文的用於最佳化的輔助資料。 |
inputs | 字串列表,可選。該參數表示模型輸入節點的名稱。如果沒有指定該參數,Blade會將沒有上遊的節點作為輸入節點。 PyTorch模型無需指定該參數。 |
outputs | 字串列表,可選。該參數表示模型輸出節點的名稱。如果沒有指定該參數,Blade會將沒有下遊的節點作為輸出節點。 PyTorch模型無需指定該參數。 |
input_shapes | 輸入Tensor可能的形狀,用於提升特定情境的最佳化效果。內層列表元素個數必須等於模型輸入Tensor的數量,每個元素是一個字串,表示某種輸入的形狀,例如 如果有多組可能的形狀,則在外層列表中增加元素即可。例如,有兩個輸入的模型可能有如下形狀或若干組可能的形狀,取值樣本如下:
|
input_ranges | 每個輸入Tensor的元素取值範圍。內層列表元素數量必須等於模型輸入Tensor的數量,每個元素是一個字串,表示某種取值範圍。 取值範圍可以使用方括弧加實數或字元表示,例如 如果有多組可能的取值範圍,則在外層列表中增加元素即可。例如,有兩個輸入的模型可能有如下取值範圍或若干組可能的取值範圍,取值樣本分別如下:
|
quantization | 該參數是一個JSON字典,目前僅支援唯一的key值weight_adjustment,表示是否嘗試調整模型參數以減小量化精度損失。該key值對應的value支援如下取值:
|
用於最佳化的輔助資料
在O1最佳化層級中,提供test_data可以使最佳化更具指向性。在O2最佳化層級中,提供calibration_dataset可以指導Blade進行離線INT8最佳化。這兩個參數均需符合Blade的最佳化輔助資料格式。TensorFlow和PyTorch的最佳化輔助資料格式如下所示:
TensorFlow的輔助資料是List of Feed Dict格式。Feed Dict的key是字串,value是numpy的ndarray。輔助資料檔案儲存為 .npy檔案。
PyTorch的輔助資料是List of Tensor Tuple格式,儲存為.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')
樣本1:不使用Blade EAS Plugin
如下是一個簡單的、不使用Blade EAS Plugin的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
樣本2:使用Blade EAS Plugin的簡單樣本
啟動Blade EAS Plugin,您只需要在EAS服務組態檔中增加plugins欄位。該欄位是一個列表,在如下樣本中只有一個Blade的最佳化外掛程式,所以列表中只有一個字典元素。
{
"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列表下的字典元素包含如下兩個key:
command欄位:表示啟動並執行最佳化命令。其中
--mode eas_plugin
表示執行EAS Plugin最佳化模式,--optimize_for cpu
表示為CPU推理進行最佳化。image欄位:表示Blade EAS Plugin的鏡像地址,所有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 Plugin的配置,多了如下一行日誌,表示成功執行了Blade最佳化。
[OK] Executing plugin eas-plugin-73d70d54: registry.cn-shanghai.aliyuncs.com/eas/pai-blade-deploy:cpu_latest
樣本3:使用Blade EAS Plugin的複雜樣本
通常情況下,提供更多有關模型的資訊有助於提升最佳化的準確性和加速比。以下樣本帶有更多最佳化參數,且以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包含的欄位詳情請參見上文的plugins包含的欄位。此外,上述服務組態檔中的frozen.pb是模型的檔案名稱,表示最佳化fronzon.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 Plugin的配置,多了如下一行日誌,表示成功執行了Blade最佳化。
[OK] Executing plugin eas-plugin-7126ee68: registry.cn-shanghai.aliyuncs.com/eas/pai-blade-deploy:gpu_latest