EAS支援使用自訂鏡像的方式來部署模型服務。您可以使用docker鏡像來構建自己完整的運行環境,並通過服務儲存掛載將模型或代碼在運行時掛載至服務執行個體中。本文介紹使用自訂鏡像部署模型服務的詳細步驟。
背景資訊
模型服務開發中,通常會有較為複雜的商務邏輯,無法通過簡單的模型部署的方式實現。同時自訂的推理代碼對於環境也有較為複雜的依賴,比如需要使用yum install/apt-get install
命令在系統目錄中安裝依賴包等,因此EAS推出了使用自訂鏡像的方式來部署模型服務。
您可以通過控制台或用戶端工具EASCMD(詳情請參見下載並認證用戶端)來進行模型服務的部署,本文會分別介紹如何通過這兩種方式使用自訂鏡像來部署模型服務。
在服務運行過程中,EAS的服務引擎會以Sidecar的方式注入到服務執行個體中,主要進行流量或系統監控資料的採集,以及對服務要求增加認證資訊等。鏡像部署支援在鏡像中以HTTP、WebSocket、gRPC(HTTP2)三種協議提供API服務。
鏡像中使用GRPC協議時需要在服務部署時指定額外參數:"metadata.enable_grpc": true。
自訂鏡像準備
如果您已經有一個開發好的鏡像,並能夠提供HTTP、WebSocket、gRPC協議的訪問,則可跳過該章節。
鏡像服務開發
您可以使用多種方式開發一個鏡像服務,例如使用Flask拉起一個Webserver來進行服務訪問。如下樣本是一個最簡單的服務。代碼檔案為app.py。
from flask import Flask
app = Flask(__name__)
@app.route('/hello/model')
def hello_world():
return 'Hello World'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000)
鏡像構建
如果您使用DSW開發,在DSW執行個體的操作列中單擊製作鏡像,系統將構建Docker鏡像並儲存到阿里雲Container RegistryACR中,部署時選擇自訂鏡像即可下拉選擇到。
下文介紹本地安裝Docker構建鏡像。您也可以使用如阿里雲Container RegistryACR進行鏡像構建。關於如何建立ACR鏡像,請參見什麼是Container RegistryACR。
編寫Dockerfile檔案。
Dockerfile是一個包含了構建鏡像需要的指令和說明的文字檔。在
app.py
檔案同級建立Dockerfile檔案,檔案目錄結構如下:flask_app ├── app.py └── Dockerfile
以下Dockerfile樣本檔案中其將模型服務檔案
app.py
打包在待部署的鏡像中,您也可以儲存在OSS、NAS或Git倉庫中,通過儲存掛載的方式在運行時掛載進服務執行個體,詳情請參見服務儲存掛載。# 說明該鏡像以哪個鏡像為基礎 FROM alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/python # 在容器內部執行的命令 RUN yum -y install python3-pip RUN pip3 install flask # 建立 app 檔案夾 RUN mkdir -p /app # 進入 app 目錄 RUN cd /app # 將 linux 系統目前的目錄下的app.py拷貝到容器的 /app 目錄下 COPY app.py /app/ # 暴露 8000 連接埠 EXPOSE 8000 # 將 app 檔案夾為工作目錄 WORKDIR /app # 容器啟動的時候執行的命令 flask run CMD ["flask", "run", "--host", "0.0.0.0"]
本地構建鏡像。在命令列中,進入目錄flask_app,執行以下命令構建一個名為flask-app的Docker鏡像。
docker build -t flask-app .
鏡像推送倉庫
EAS從鏡像倉庫拉取鏡像進行部署,下面將本地構建的鏡像推送到鏡像倉庫。
執行命令
docker images
可以擷取剛剛構建的鏡像ID。假設使用ACR鏡像倉庫,倉庫地址為
crpi-***.cn-hangzhou.personal.cr.aliyuncs.com/***/***
。不同的鏡像倉庫對EAS部署時網路設定有不同要求,詳情請參見鏡像倉庫選擇。執行以下命令,將鏡像推送到ACR鏡像倉庫。
docker login --username=<使用者名稱> crpi-***.cn-hangzhou.personal.cr.aliyuncs.com docker tag <鏡像ID> crpi-***.cn-hangzhou.personal.cr.aliyuncs.com/***/***:flask-app docker push crpi-***.cn-hangzhou.personal.cr.aliyuncs.com/***/***:flask-app
則該鏡像的鏡像地址為:
crpi-***.cn-hangzhou.personal.cr.aliyuncs.com/***/***:flask-app
鏡像倉庫選擇
EAS使用不同類型鏡像倉庫需進行不同的網路設定。
Container RegistryACR:
個人版: ACR個人版會在每個地區提供統一的內網地址,與ACR個人版執行個體同地區可使用鏡像內網地址來部署,否則需通過鏡像公網地址部署。
企業版:企業版鏡像內網地址僅在使用者VPC中可訪問,因此EAS需要配置VPC專用網路。詳情請參見配置VPC專用網路。
自建鏡像倉庫:
如果您在阿里雲VPC中使用Harbor自建的鏡像倉庫,地址僅支援在您的VPC中訪問,與ACR企業版類似,需要打通EAS到您的VPC網路,詳情請參見配置VPC專用網路。
EAS預設不可訪問公網,如需通過公網拉取鏡像倉庫,則需要開通公網訪問,詳情請參見配置公網串連。
鏡像倉庫認證
使用同帳號下的ACR鏡像倉庫部署時,無需填寫使用者名稱密碼,EAS可實現跨服務免密拉取。
若自建倉庫需要使用者名稱密碼訪問,則在服務部署時需要在服務配置中通過dockerAuth來提供使用者名稱密碼資訊,詳情請參見部署模型服務章節的dockerAuth參數說明。
部署模型服務
將上述鏡像進行部署,相關參數取值如下:
鏡像地址:
crpi-***-vpc.cn-hangzhou.personal.cr.aliyuncs.com/***:flask-app
。鏡像的啟動執行命令:
python3 app.py
。鏡像中進程監聽的網路連接埠號碼:8000。
說明連接埠號碼在一些情境中為可選。例如,在使用者服務中不依賴由EAS網關匯入的流量,而是使用者在鏡像中自行通過訂閱訊息佇列的方式擷取訊息,則此情境中鏡像連接埠號碼可選填。
使用控制台部署
關鍵參數配置如下:
參數 | 樣本 |
部署方式 | 選擇鏡像部署 |
鏡像配置 | 選擇鏡像地址,填寫: |
運行命令 |
|
連接埠號碼 | 8000 |
使用用戶端工具部署
JSON設定檔如下:
{ "metadata": { "name": "flask_app_test", "instance": 1 }, "cloud": { "computing": { "instances": [ { "type": "ecs.c8y.large" } ] } }, "containers": [ { "image": "crpi-***-vpc.cn-hangzhou.personal.cr.aliyuncs.com/***:flask-app", "script": "python3 app.py", "port": 8000 } ] }
關於自訂鏡像部署的關鍵參數說明如下表所示。更多參數說明,詳情請參見服務模型所有相關參數說明。
參數
是否必選
描述
containers
image
是
用於部署模型服務的鏡像地址。
command
二者必選其一
鏡像的入口命令,只支援單一命令形式,不支援複雜指令碼,如:cd xxx && python app.py,這種形式請使用下面的script參數來指定,command欄位適應於鏡像中無/bin/sh命令的情境。
script
鏡像的入口執行的指令碼,可指定較為複雜的指令碼形式,多行以\n或分號分隔。
port
否
容器連接埠。
重要由於EAS引擎監聽固定的8080/9090連接埠,因此容器連接埠需要避開8080/9090連接埠。
該連接埠一定要和command中的xxx.py檔案配置的連接埠保持一致。
dockerAuth
否
如果使用私人倉庫中的鏡像,則需要通過該參數指定Docker Registry的認證資訊。目前,認證資訊僅支援
username:password
的Base 64編碼形式。例如,
username:password
取值為abcd:abcde12345
時,命令echo -n "abcd:abcde12345" | base64
返回YWJjZDphYmNkZTEy****
,即為dockerAuth的取值。通過用戶端工具的
create
命令部署模型服務。eascmd create image.json
其中image.json表示上一步中建立的服務配置JSON檔案。
系統返回如下類似結果,包括服務的訪問地址和訪問Token。
[RequestId]: BFFFE5F5-1F07-437E-B59A-AF1F2B66**** +-------------------+-----------------------------------------------------------------------------------+ | Internet Endpoint | http://182848887922***.cn-shanghai.pai-eas.aliyuncs.com/api/predict/image_test | | Intranet Endpoint | http://182848887922***.vpc.cn-shanghai.pai-eas.aliyuncs.com/api/predict/image_test| | Token | NjA4MzQxOWQ0MTY2M2Y4OGY0NjgwODkwZTZmYWJmZWU1ZmY0Njhk**** | +-------------------+-----------------------------------------------------------------------------------+ [OK] Service is now creating [OK] Waiting [Total: 2, Pending: 2, Running: 0] [OK] Running [Total: 2, Pending: 0, Running: 2] [OK] Service is running
如果需要修改服務配置,則通過用戶端工具的
modify
命令實現。修改上述服務的樣本命令如下,關於
modify
命令的詳情資訊,請參見修改服務配置。eascmd modify registry_test -s image.json
其中:registry_test表示服務名稱;image.json表示服務描述檔案。
服務要求
模型服務部署後,可在控制台服務詳情頁面中擷取到服務的訪問地址,通過eascmd desc
命令也可以擷取到服務的訪問地址。
上述flask-app鏡像提供了一個Web服務,訪問路徑為/hello/model
,則對於同步服務在進行訪問服務時,需要在該訪問地址後加上鏡像中的訪問路徑。
例如在服務調用頁面擷取到的服務的公網訪問地址為:http://182848887922***.cn-shanghai.pai-eas.aliyuncs.com/api/predict/image_test
。
則對於上述的鏡像服務要請求/hello/model
路徑時,最終的訪問地址為:
http://182848887922***.cn-shanghai.pai-eas.aliyuncs.com/api/predict/image_test/hello/model
。
關於服務要求的更多資訊,詳情請參見服務調用方式。
附錄:服務配置樣本
使用GRPC協議
{
"name": "image_test",
"containers": [
{
"image": "registry-vpc.cn-shanghai.aliyuncs.com/xxx/yyy:zzz",
"command": "python app.py",
"port": 8000
}
],
"metadata": {
"instance": 1,
"enable_grpc": true
}
}