您可以使用Python開發自定義Processor文件,結合模型文件在本地調試后分別上傳至OSS,在部署服務時掛載使用。本文為您介紹使用Python開發自定義Processor的詳細步驟。
背景信息
建議將模型文件和Processor的實現分開,這樣在將來需要微調模型并重新部署服務時,可以重用之前的Processor包。您可以在編寫預測邏輯時,使用
get_model_path()
方法獲取模型的存儲路徑,以便在預測邏輯中加載和使用該模型。當自定義Processor的依賴較多、Processor包較大時,不建議使用Processor方式來部署服務,建議您使用鏡像方式來部署服務,兩種部署方式的對比介紹請參見部署原理。
使用Python開發自定義Processor的流程如下:
EAS提供的Python SDK支持多種Python機器學習框架,并能夠集成Pandas等數據分析處理框架。通過本文給出的方式,您可以在本地構建Python開發環境,以便后續開發自定義Processor,并打包上傳環境。
EAS的Python SDK提供了高性能的RPC框架和與EAS集群交互所需的內部接口。您只需要編寫預測邏輯實現簡單的接口,就可以將模型服務部署至EAS。
編寫預測邏輯后,您需要進行本地測試服務。本地測試可以幫助您驗證預測邏輯的正確性,以確保后續部署服務后,其功能符合要求。
按照指定要求打包代碼,以便于后續部署模型服務。
將完整的打包文件和模型文件分別上傳至OSS。
將以已構建的自定義的Processor部署為模型服務。
前提條件
已準備好模型文件。
建議將模型文件和自定義Processor分開開發,以便于模型和Processor文件的維護和替換。開發完成后,分別將其上傳到OSS,在后續部署服務時進行掛載調用。
步驟一:構建開發環境
您可以使用Pyenv等Python包管理工具構建開發環境。EAS提供的客戶端工具EASCMD對Python SDK的初始化過程進行了封裝,下載該工具后,您只需要運行一條命令即可完成Python SDK環境初始化,并生成相關的文件模板,僅適用于Linux操作系統。示例命令如下:
# 安裝并初始化EASCMD,該示例為安裝Linux環境的EASCMD工具。
$ wget https://eas-data.oss-cn-shanghai.aliyuncs.com/tools/eascmd/v2/eascmd64
# 下載完成后,可以修改訪問權限,配置阿里云上AccessKey信息。
$ chmod +x eascmd64
$ ./eascmd64 config -i <access_id> -k <access_key>
# 初始化環境。
$ ./eascmd64 pysdk init ./pysdk_demo
在返回結果中輸入Python版本(默認為3.6版本)后,系統會自動在您配置的./pysdk_demo
目錄中創建Python環境ENV目錄、預測服務代碼模板app.py及服務部署模板app.json。
步驟二:編寫預測邏輯
在ENV同級目錄下,創建預測服務主文件app.py,文件內容示例如下:
使用EASCMD構建Python初始化環境時,系統會自動生成app.py文件,無需手動創建。您可以根據需要修改該文件內容。
EAS預置的開發鏡像中已預先創建了app.py文件,無需手動創建,您可以根據需要修改該文件內容。
# -*- coding: utf-8 -*-
import allspark
class MyProcessor(allspark.BaseProcessor):
""" MyProcessor is a example
you can send mesage like this to predict
curl -v http://127.0.0.1:8080/api/predict/service_name -d '2 105'
"""
def initialize(self):
""" load module, executed once at the start of the service
do service intialization and load models in this function.
"""
self.module = {'w0': 100, 'w1': 2}
# model_dir = self.get_model_path().decode()
# load_model函數需要您自行實現,若您需要加載model.pt模型文件,則可以實現為torch.load(model_dir + "/model.pt")。
# self.model = load_model(model_dir)
def pre_process(self, data):
""" data format pre process
"""
x, y = data.split(b' ')
return int(x), int(y)
def post_process(self, data):
""" process after process
"""
return bytes(data, encoding='utf8')
def process(self, data):
""" process the request data
"""
x, y = self.pre_process(data)
w0 = self.module['w0']
w1 = self.module['w1']
y1 = w1 * x + w0
if y1 >= y:
return self.post_process("True"), 200
else:
return self.post_process("False"), 400
if __name__ == '__main__':
# allspark.default_properties().put('rpc.keepalive', '10000')
# 設置服務計算超時時間為10s, 默認為5秒
# parameter worker_threads indicates concurrency of processing
runner = MyProcessor(worker_threads=10)
runner.run()
上述代碼即為Python SDK的簡單示例,代碼中繼承了EAS提供的基類BaseProcessor,實現了initialize()和process()函數。
函數 | 功能描述 | 使用說明 |
initialize() | Processor初始化函數。服務啟動時,進行模型加載等初始化工作。 | 在
|
get_model_path() | 獲取bytes類型的模型存儲目錄。 | 當您在部署服務的JSON配置文件中通過指定model_path參數來上傳模型文件時,可調用 |
process(data) | 請求處理函數。每個請求會將Request Body作為參數傳遞給process()進行處理,并將函數返回值返回至客戶端。 | data為Request Body,類型為BYTES。返回值為BYTES和INT類型,輸出參數分別為response_data和status_code,正常請求status_code可以返回0或200。 |
_init_(worker_threads=5, worker_processes=1,endpoint=None) | Processor構造函數。 |
|
run() | 啟動服務。 | 無參數。 |
步驟三:本地測試服務
在終端app.py文件所在目錄執行以下命令,啟動Python應用程序。
./ENV/bin/python app.py
系統返回如下結果,表明應用程序啟動成功。
[INFO] waiting for service initialization to complete... [INFO] service initialization complete [INFO] create service [INFO] rpc binds to predefined port 8080 [INFO] install builtin handler call to /api/builtin/call [INFO] install builtin handler eastool to /api/builtin/eastool [INFO] install builtin handler monitor to /api/builtin/monitor [INFO] install builtin handler ping to /api/builtin/ping [INFO] install builtin handler prop to /api/builtin/prop [INFO] install builtin handler realtime_metrics to /api/builtin/realtime_metrics [INFO] install builtin handler tell to /api/builtin/tell [INFO] install builtin handler term to /api/builtin/term [INFO] Service start successfully
重新打開一個終端,執行以下命令測試應用程序的響應情況。
按照步驟二給出的示例代碼,執行以下命令向應用程序發送兩個請求數據,返回結果與代碼邏輯對應。
curl http://127.0.0.1:8080/test -d '10 20'
步驟四:打包代碼文件與Python環境
EASCMD為您提供了打包命令,您可以一鍵完成打包。如果您沒有使用EASCMD進行自定義Processor開發,您也可以手動打包完整環境。兩種打包方式的介紹如下。
使用EASCMD封裝的打包命令(僅Linux系統)。
$ ./eascmd64 pysdk pack ./pysdk_demo
命令執行成功后,輸出如下結果:
[PYSDK] Creating package: /home/xi****.lwp/code/test/pysdk_demo.tar.gz
手動打包
打包要求
詳情
代碼包格式要求
您需要打包為一個.zip或.tar.gz格式的壓縮包。
代碼包內容要求
打包的根目錄必須為/ENV目錄且包含app.py文件。
代碼包示例:.tar.gz代碼包示例。
步驟五:上傳Processor代碼包文件和代碼文件
打包完成后,您需要將完整的打包文件(.zip
或.tar.gz
格式)和模型文件分別上傳至OSS,便于后續部署服務時掛載使用。上傳至OSS的操作請參見命令行工具ossutil命令參考。
步驟六:部署和測試服務
您可以通過控制臺或EASCMD客戶端來部署模型服務。
部署服務。
通過控制臺方式部署服務
登錄PAI控制臺,在頁面上方選擇目標地域,并在右側選擇目標工作空間,然后單擊進入EAS。
單擊部署服務,然后在自定義模型部署區域,單擊自定義部署。
在自定義部署頁面配置以下關鍵參數,更多參數配置詳情,請參見服務部署:控制臺。
參數
描述
部署方式
選擇processor部署。
模型配置
配置類型選擇對象存儲(OSS),并選擇模型文件所在的OSS路徑。
Processor種類
選擇自定義processor。
Processor語言
選擇python。
Processor包
配置類型選擇對象存儲(OSS),并選擇上述步驟已打包的文件所在的OSS路徑。
Processor主文件
配置為
./app.py
。(可選)在服務配置區域添加data_image參數,參數內容配置為上述步驟中打包時配置的鏡像路徑。
說明如果您在步驟四中通過鏡像上傳環境,則需要配置data_image參數,否則忽略該操作。
單擊部署。
通過EASCMD方式部署服務
以Linux操作系統為例,說明部署服務的操作步驟:
下載EASCMD客戶端并進行身份認證。具體操作,請參見下載并認證客戶端。
在客戶端文件所在目錄新建JSON格式的文件,命名為app.json。通過EASCMD或手動打包完整環境的文件內容示例如下:
{ "name": "pysdk_demo", "processor_entry": "./app.py", "processor_type": "python", "processor_path": "oss://examplebucket/exampledirectory/pysdk_demo.tar.gz", "model_path": "oss://examplebucket/exampledirectory/model", "cloud": { "computing": { "instance_type": "ecs.c7.large" } }, "metadata": { "instance": 1, } }
打開終端工具,在JSON文件所在目錄,使用以下命令部署服務。
$ ./eascmd64 create app.json
系統返回如下結果,表示服務部署成功。
[RequestId]: 1202D427-8187-4BCB-8D32-D7096E95B5CA +-------------------+-------------------------------------------------------------------+ | Intranet Endpoint | http://182848887922****.vpc.cn-beijing.pai-eas.aliyuncs.com/api/predict/pysdk_demo | | Token | ZTBhZTY3ZjgwMmMyMTQ5OTgyMTQ5YmM0NjdiMmNiNmJkY2M5ODI0**** | +-------------------+-------------------------------------------------------------------+ [OK] Waiting task server to be ready [OK] Fetching processor from [oss://eas-model-beijing/195557026392****/pysdk_demo.tar.gz] [OK] Building image [registry-vpc.cn-beijing.aliyuncs.com/eas/pysdk_demo_cn-beijing:v0.0.1-20190806082810] [OK] Pushing image [registry-vpc.cn-beijing.aliyuncs.com/eas/pysdk_demo_cn-beijing:v0.0.1-20190806082810] [OK] Waiting [Total: 1, Pending: 1, Running: 0] [OK] Service is running
測試服務。
登錄PAI控制臺,在頁面上方選擇目標地域,并在右側選擇目標工作空間,然后單擊進入EAS。
單擊目標服務的服務方式列下的調用信息,獲取調用的公網地址和Token。
在終端中,根據步驟b查詢的信息進行調用。
$ curl <service_url> -H 'Authorization: <token>' -d '10 20'
其中:
<service_url>:替換為步驟b中獲取的公網地址。例如:
http://182848887922****.vpc.cn-beijing.pai-eas.aliyuncs.com/api/predict/pysdk_demo
。<token>:替換為步驟b中獲取的Token。例如:
ZTBhZTY3ZjgwMmMyMTQ5OTgyMTQ5YmM0NjdiMmNiNmJkY2M5ODI0****
。-d后的內容配置為服務的調用輸入參數。
相關文檔
開發自定義Processor時可能遇到的問題,詳情請參見常見問題。
如何基于Java開發自定義Processor,詳情請參見使用Java開發自定義Processor。