全部產品
Search
文件中心

Platform For AI:服務部署:自訂鏡像

更新時間:Nov 29, 2024

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

  1. 編寫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"]
  2. 本地構建鏡像。在命令列中,進入目錄flask_app,執行以下命令構建一個名為flask-app的Docker鏡像。

    docker build -t flask-app . 

鏡像推送倉庫

EAS從鏡像倉庫拉取鏡像進行部署,下面將本地構建的鏡像推送到鏡像倉庫。

  1. 執行命令docker images可以擷取剛剛構建的鏡像ID。

  2. 假設使用ACR鏡像倉庫,倉庫地址為crpi-***.cn-hangzhou.personal.cr.aliyuncs.com/***/***。不同的鏡像倉庫對EAS部署時網路設定有不同要求,詳情請參見鏡像倉庫選擇

  3. 執行以下命令,將鏡像推送到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網關匯入的流量,而是使用者在鏡像中自行通過訂閱訊息佇列的方式擷取訊息,則此情境中鏡像連接埠號碼可選填。

使用控制台部署

關鍵參數配置如下:

參數

樣本

部署方式

選擇鏡像部署

鏡像配置

選擇鏡像地址,填寫:crpi-***-vpc.cn-hangzhou.personal.cr.aliyuncs.com/***:flask-app。樣本使用ACR鏡像倉庫,不需要填寫使用者名稱密碼。

運行命令

python3 app.py

連接埠號碼

8000

使用用戶端工具部署

  1. 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的取值。

  2. 通過用戶端工具的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
  3. 如果需要修改服務配置,則通過用戶端工具的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
  }
}

相關文檔

  • 自訂鏡像部署支援使用健全狀態檢查功能,詳情請參見健全狀態檢查

  • 關於服務部署原理,詳情請參見服務部署概述

  • 服務部署成功後,在業務負載出現顯著的波峰波穀時,您可以開啟水平自動擴縮容功能,詳情請參見水平自動擴縮容功能