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