當EAS提供的官方鏡像無法滿足特定業務或環境需求時,可通過自訂鏡像來封裝完整的運行環境,實現靈活、可靠的模型服務部署。
快速開始:製作並部署自訂鏡像
本節在阿里雲ECS執行個體上構建一個基於Gunicorn和Flask的Web服務鏡像,通過內網地址推送至ACR鏡像倉庫,並部署為EAS線上服務。
步驟一:環境準備
在開始之前,請確保已在同一地區(如杭州)準備好以下環境和資源:
1.1 Virtual Private Cloud
準備一個VPC(例如 VPC_HZ),如需建立,請參見專用網路與交換器。
ECS執行個體和EAS服務都將使用該VPC,以確保鏡像推送拉取的穩定性和安全性。
1.2 容器鏡像倉庫 (ACR)
建立一個阿里雲ACR企業版執行個體,用於儲存和管理自訂鏡像。更多鏡像倉庫說明請參見選擇鏡像倉庫。
主要操作步驟如下,詳情請參見使用企業版執行個體推送和拉取鏡像:
-
建立企業版執行個體。本文地區選擇杭州,執行個體規格選擇基礎版,其餘參數保持預設。
-
建立命名空間(如
pai-demo)。 -
建立鏡像倉庫(如
flask-app),代碼源選擇本地倉庫。 -
配置專用網路的存取控制。
-
在企業版執行個體管理頁面左側導覽列選擇。
-
在专有网络頁簽下,單擊添加專有網絡。專用網路選擇
VPC_HZ。
-
1.3 開發環境(ECS)
建立一個配置如下的ECS執行個體來製作鏡像。
-
執行個體規格:
ecs.u1-c1m2.large -
鏡像:Alibaba Cloud Linux 3.2104 LTS 64位
-
擴充程式:Docker社區版
-
網路:選擇
VPC_HZ(選擇的VPC需在ACR企業版執行個體的”存取控制”中添加,否則無法推送鏡像到ACR鏡像倉庫 )。
也可以使用本地或其他開發環境。
-
本地開發環境:安裝並運行 Docker,用於在本地構建鏡像。
-
使用DSW開發環境:在DSW執行個體的操作列中單擊制作镜像,系統將構建Docker鏡像並儲存到阿里雲Container RegistryACR中,部署時選擇自定义镜像即可下拉選擇。詳情請參見製作DSW執行個體鏡像。
步驟二:檔案準備
登入ECS執行個體,建立一個專案檔夾(例如 my-app),並包含以下三個檔案:
-
requirements.txt(應用依賴)flask gunicorn -
app.py(Web應用代碼)from flask import Flask app = Flask(__name__) @app.route('/hello/model') def hello_world(): # 此處可以整合您的模型推理或其他商務邏輯 return 'Hello World from Gunicorn!' # 注意:無需 app.run(),應用將由 Gunicorn 啟動 -
Dockerfile(鏡像構建指令)# 1. 使用輕量級的官方Python鏡像作為基礎 FROM python:3.9-slim # 2. 設定工作目錄 WORKDIR /app # 3. 複製依賴檔案並安裝,利用Docker緩衝機制加速後續構建 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ # 4. 複製應用代碼 COPY app.py . # 5. 聲明服務連接埠 EXPOSE 8000 # 6. 定義容器預設啟動命令(可被EAS控制台的“運行命令”覆蓋) CMD ["gunicorn", "-w", "4", "-b", "0.0.0.0:8000", "app:app"]
步驟三:構建並推送鏡像
-
開啟終端,進入專案檔夾(
my-app)。 -
登入到您的ACR執行個體。將命令中的預留位置替換為實際資訊。
說明進入ACR鏡像倉庫的詳情頁可擷取登入、拉取推送的命令樣本,注意樣本為公網地址,請修改為內網地址。
# 樣本: docker login --username=your_user my-registry-vpc.cn-hangzhou.aliyuncs.com docker login --username=<使用者名稱> <ACR倉庫內網網域名稱> -
構建Docker鏡像並為其打上完整的標籤。
# 樣本: docker build -t my-registry-vpc.cn-hangzhou.aliyuncs.com/pai-demo/flask-app:v1 . # <ACR倉庫內網網域名稱>/<命名空間>/<鏡像倉庫名>:<版本號碼> 即為鏡像地址 docker build -t <ACR倉庫內網網域名稱>/<命名空間>/<鏡像倉庫名>:<版本號碼> . -
(推薦)推送前本地驗證鏡像:將鏡像推送到 ACR 之前,建議先在本地運行以下命令驗證鏡像啟動是否正常,避免將問題鏡像推送至倉庫。
# 將 <連接埠號碼> 替換為 Dockerfile 中 EXPOSE 的連接埠(本樣本為 8000) docker run -p <連接埠號碼>:<連接埠號碼> <ACR倉庫內網網域名稱>/<命名空間>/<鏡像倉庫名>:<版本號碼>若應用正常響應,則說明鏡像可用,可繼續推送。
-
將構建好的鏡像推送到ACR。
# 樣本:docker push my-registry-vpc.cn-hangzhou.aliyuncs.com/pai-demo/flask-app:v1 docker push <ACR倉庫網域名稱>/<命名空間>/<鏡像倉庫名>:<版本號碼>
步驟四:部署服務
登入PAI控制台,在頁面上方選擇目標地區,並在右側選擇目標工作空間,然後單擊進入EAS。
-
單擊部署服务,選擇。
-
配置以下關鍵參數:
-
部署方式:選擇镜像部署。
-
镜像配置:選擇镜像地址,填寫上一步中推送的完整鏡像地址,即
my-registry-vpc.cn-hangzhou.aliyuncs.com/pai-demo/flask-app:v1。由於本樣本使用同一阿里雲帳號下的ACR,EAS可免密拉取鏡像,無需提供使用者名稱和密碼。
-
运行命令:
gunicorn -w 4 -b 0.0.0.0:8000 app:appEAS控制台填寫的
運行命令會覆蓋 Dockerfile中的CMD指令。建議將啟動命令填寫在此處,便於後續調試和修改。 -
端口号:8000。
-
部署资源:本樣本使用CPU資源即可。如選擇公共资源下的
ecs.c6.large。 -
专有网络配置:選擇一個VPC(
VPC_HZ)、交換器和安全性群組。請確保此處選擇的VPC已在ACR執行個體的“存取控制”中添加,否則將因網路不通導致鏡像拉取失敗(常見錯誤為
ImagePullBackOff)。
-
-
單擊部署,當服務狀態變為运行中,表示部署成功。
修改鏡像地址或更新服務配置:服務詳情頁展示的 JSON 配置為唯讀狀態,無法直接編輯。如需修改,請通過服務列表中的更新入口操作。
步驟五:服務測試
服務部署成功後,擷取訪問地址和Token,使用以下命令測試Flask服務:
# <endpoint>和<token>替換為服務的實際調用地址和Token
curl <endpoint>/hello/model -H "Authorization: <token>"
如果返回 Hello World from Gunicorn!,則表示服務已成功部署並可正常訪問。
關於服務調用的更多資訊,請參見服務調用方式。
核心概念與限制
-
網路限制:EAS 服務通過VPC地址訪問內網資源,通常需要配置VPC。如果需要訪問公網資源(例如,使用
pip從公用源安裝依賴、調用外部 API 或通過公網拉取鏡像),還需為VPC配置NAT Gateway。詳情請參見EAS訪問公網或內網資源。成本提示:NAT Gateway是付費服務,會產生額外費用。
-
連接埠限制:
-
EAS服務引擎會佔用
8080和9090連接埠。您的應用程式監聽的連接埠必須避開這兩個連接埠,否則服務將因連接埠衝突啟動失敗。 -
當服務包含多個容器時,各容器監聽的連接埠還必須互不相同。例如,若主容器使用
8000連接埠,Sidecar 容器也不能使用8000連接埠,否則將因連接埠衝突導致服務啟動失敗。
-
-
CUDA 版本:線上服務的 CUDA 版本由所選機型和基礎鏡像共同決定,無法在運行中直接更改。如需切換 CUDA 版本,需重新部署服務,並在部署時選擇支援目標 CUDA 版本的鏡像或機型。
-
Sidecar注入:為實現認證、鑒權和監控,EAS以Sidecar模式在服務執行個體中注入一個代理容器。這個代理是透明的,但會佔用少量資源,並負責將外部請求安全地轉寄到您配置的服務連接埠。
-
API協議支援:鏡像部署支援在鏡像中以HTTP、WebSocket、gRPC(HTTP2)三種協議提供API服務。
選擇鏡像倉庫
鏡像倉庫類型
EAS部署服務時需要從鏡像倉庫拉取鏡像,推薦使用阿里雲Container RegistryACR儲存鏡像。拉取鏡像時使用VPC地址,以獲得更好的效能和安全性。
公網拉取鏡像存在安全風險,且速度會特別慢,不建議使用。
|
鏡像倉庫類型 |
說明 |
|
ACR個人版 |
|
|
ACR企業版 |
|
|
自建鏡像倉庫 |
如果在阿里雲VPC中使用Harbor等自建鏡像倉庫,地址僅支援在VPC中訪問,與ACR企業版類似,需要為EAS服務配置VPC,讓鏡像倉庫與EAS服務處於同一VPC中。 |
鏡像倉庫身份認證
使用需要認證的私人鏡像倉庫,需在服務部署時提供使用者名稱密碼資訊。
在JSON設定檔中通過dockerAuth參數指定認證資訊,值為username:password的Base64編碼形式。
例如,對於abcd:abcde12345,執行命令echo -n "abcd:abcde12345" | base64得到YWJjZDphYmNkZTEy****,即為dockerAuth的取值。
{"dockerAuth": "YWJjZDphYmNkZTEy****"}
使用同一阿里雲帳號下同地區的ACR鏡像倉庫時,EAS可免密拉取鏡像,無需填寫使用者名稱密碼。
生產應用建議
-
鏡像與模型分離:始終將代碼和模型檔案分離。代碼打包進鏡像,模型存放在Object Storage Service或Apsara File Storage NAS上,在EAS部署頁面通過儲存掛載功能將模型掛載到容器內使用。這能縮短服務更新和擴容時的鏡像拉取時間。
-
使用內網拉取鏡像:為安全和效能,務必為服務配置專用網路,使其能通過 VPC 地址從 ACR 拉取鏡像。
-
預裝依賴以最佳化啟動速度:若服務每次重啟都需要重新下載 Python 依賴包或大體積模型檔案,會顯著增加冷啟動時間。建議在製作鏡像時將 Python 環境、依賴包(如 PyTorch、Transformers 等架構)及模型檔案直接預裝到鏡像中,確保容器啟動後立即提供服務,避免運行時動態下載。
-
註冊鏡像為AI資產:如果自訂的鏡像可在其他多種情境下應用,可使用PAI AI資產的鏡像功能,將其沉澱為AI資產統一管理。
-
配置健全狀態檢查:為服務配置健全狀態檢查,EAS 會據此自動重啟不健康的執行個體,保障服務穩定性。詳情請參見健全狀態檢查。
-
啟用自動擴縮容:當業務負載有明顯波動時,開啟水平自動擴縮容功能,以彈性、經濟的方式應對流量變化。
常見問題
Q:鏡像拉取失敗(ImagePullBackOff)
請依次排查:
-
鏡像地址正確性:請檢查鏡像地址、命名空間和版本號碼(Tag)是否正確,且鏡像已成功推送到倉庫。
-
系統硬碟空間:如有報錯
no space left on device,請擴容系統硬碟。 -
網路連通性:
-
使用鏡像公網地址:請確認已為EAS配置能訪問公網的VPC,且為ACR開通公網訪問(跨地區使用公網地址速度特別慢,容易因網路問題失敗)。
-
使用鏡像內網地址:如果跨地區,僅支援使用ACR企業版,且需打通VPC。詳情請參見跨地區或從IDC訪問ACR企業版執行個體。
-
-
ACR存取控制:根據使用的鏡像地址類型檢查是否為ACR配置公網的存取控制、配置專用網路的存取控制。
-
倉庫認證:如果使用需要認證的私人鏡像倉庫(非本帳號下ACR),請檢查在鏡像配置中填寫的認證資訊是否正確。
Q:如何跨地區使用 ACR 鏡像?
EAS服務預設能通過 VPC 內網地址拉取同地區 ACR 倉庫中的鏡像。如果 ACR 執行個體與 EAS 服務不在同一地區,內網直連不可用。可通過以下方法解決:
-
方法一(推薦):在 EAS 服務所在地區重新建立 ACR 執行個體,將鏡像推送到同地區倉庫後再部署,從根本上避免跨地區問題。
-
方法二:通過 CEN(雲企業網)打通兩個地區的 VPC,實現跨地區內網拉取。具體操作參見跨地區或從IDC訪問企業版執行個體。
-
方法三(測試情境):通過公網地址拉取鏡像,需確認已為 ACR 開通公網訪問,並為 EAS 服務配置能訪問公網的 NAT Gateway。速度較慢且存在安全風險,僅建議用於測試情境。
Q:部署自訂鏡像報錯"no match for platform in manifest"怎麼辦?
該錯誤表示推送的鏡像架構(如arm64)與 EAS 執行個體的運行環境(通常為amd64/x86_64)不匹配,EAS 無法在該機型上運行此鏡像。常見於在 M 系列晶片 Mac(arm64)上構建鏡像後部署到 EAS(amd64)執行個體的情境。解決方案如下:
-
確認 EAS 目標執行個體的 CPU 架構(大多數 EAS 執行個體為
amd64)。 -
在本地重新構建與 EAS 執行個體架構匹配的鏡像:
# 構建 amd64 架構鏡像(適用於大多數EAS執行個體) docker build --platform linux/amd64 -t <ACR倉庫網域名稱>/<命名空間>/<鏡像倉庫名>:<版本號碼> . -
將新鏡像推送到 ACR 後,重新部署服務。
Q:ACK 能串連EAS專屬鏡像庫(PAI官方鏡像)嗎?
EAS專屬鏡像庫不支援 ACK 直連,ACK 無法直接拉取EAS專屬鏡像庫中的鏡像。
更多問題,請參見EAS常見問題。