全部產品
Search
文件中心

Platform For AI:使用Blade EAS Plugin最佳化並部署模型

更新時間:Jul 13, 2024

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如下表所示。

表 1. plugins包含的欄位

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包中的blade.optimize介面參數對齊。支援的最佳化項如下文的最佳化項列表所示。

表 2. Processor與Plugin鏡像的對應表

裝置類型

key

value

CPU

image(Blade EAS Plugin鏡像地址)

registry.cn-shanghai.aliyuncs.com/eas/pai-blade-deploy:cpu_latest

command(外掛程式啟動並執行最佳化命令)

blade --mode eas_plugin --optimize_for cpu

processor

  • TensorFlow Processor對應的value為tensorflow_cpu_1.15

  • PyTorch Processor對應的value為pytorch_cpu_1.6

GPU

image(Blade EAS Plugin鏡像地址)

  • CUDA 10.0:registry.cn-shanghai.aliyuncs.com/eas/pai-blade-deploy:gpu_latest

  • CUDA 11.0:registry.cn-shanghai.aliyuncs.com/eas/pai-blade-deploy:cu110_latest

command(外掛程式啟動並執行最佳化命令)

blade --mode eas_plugin --optimize_for gpu

processor

  • TensorFlow 1.15(CUDA 10.0)對應的value為tensorflow_gpu_1.15

  • Tensorflow 2.4(CUDA 11.0)對應的value為tensorflow_gpu_2.4

  • PyTorch 1.6(CUDA 10.0)對應的value為pytorch_gpu_1.6

  • PyTorch 1.7(CUDA 11.0)對應的value為pytorch_gpu_1.7

表 3. 最佳化項列表

最佳化項

描述

optimization_level

optimization_level分為以下兩個等級:

  • o1:預設值,表示無損精度最佳化,根據實際使用硬體嘗試FP32或FP16最佳化,以保證精度損失在一個極小的閾值範圍內。

  • o2:表示開啟INT8量化。對於支援INT8的硬體可以開啟該最佳化層級。

test_data

測試資料檔案,可選。測試資料檔案需要包含在model_path指定的路徑或壓縮包中。建議您提供一組可以正常進行模型推理的真實測試資料(尤其是PyTorch模型最佳化)。關於測試資料檔案的產生方式請參見下文的用於最佳化的輔助資料

calibration_dataset

量化校準資料檔案,可選。量化校準資料檔案需要包含在model_path指定的路徑或壓縮包中。

如果沒有指定該欄位,則進行Online INT8量化。如果指定了該欄位,則進行Offline INT8量化。

通常建議您提供100條以上的校正資料。量化校準資料檔案的產生方式請參見下文的用於最佳化的輔助資料

inputs

字串列表,可選。該參數表示模型輸入節點的名稱。如果沒有指定該參數,Blade會將沒有上遊的節點作為輸入節點。

PyTorch模型無需指定該參數。

outputs

字串列表,可選。該參數表示模型輸出節點的名稱。如果沒有指定該參數,Blade會將沒有下遊的節點作為輸出節點。

PyTorch模型無需指定該參數。

input_shapes

輸入Tensor可能的形狀,用於提升特定情境的最佳化效果。內層列表元素個數必須等於模型輸入Tensor的數量,每個元素是一個字串,表示某種輸入的形狀,例如'1*512'

如果有多組可能的形狀,則在外層列表中增加元素即可。例如,有兩個輸入的模型可能有如下形狀或若干組可能的形狀,取值樣本如下:

  • [['1*512', '3*256']]

  • [              
        ['1*512', '3*256'],
        ['5*512', '9*256'],     
        ['10*512', '27*256']      
    ]

input_ranges

每個輸入Tensor的元素取值範圍。內層列表元素數量必須等於模型輸入Tensor的數量,每個元素是一個字串,表示某種取值範圍。

取值範圍可以使用方括弧加實數或字元表示,例如'[1,2]''[0.3,0.9]''[a,f]'

如果有多組可能的取值範圍,則在外層列表中增加元素即可。例如,有兩個輸入的模型可能有如下取值範圍或若干組可能的取值範圍,取值樣本分別如下:

  • [['[0.1,0.4]', '[a,f]']]

  • [           
        ['[0.1,0.4]', '[a,f]'],
        ['[1.1,1.4]', '[h,l]'],     
        ['[2.1,2.4]', '[n,z]']      
    ]

quantization

該參數是一個JSON字典,目前僅支援唯一的key值weight_adjustment,表示是否嘗試調整模型參數以減小量化精度損失。該key值對應的value支援如下取值:

  • "true":開啟該選項。

  • "false":關閉該選項。

用於最佳化的輔助資料

在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