本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用託管服務的自訂推論程式碼
本節說明 Amazon SageMaker AI 如何與 Docker 容器互動,該容器會執行您自己的推論程式碼來託管服務。請運用本文資訊來撰寫推論程式碼和建立 Docker 映像。
主題
SageMaker AI 如何執行您的推論映像
欲設定容器做為可執行檔來執行,請使用 Dockerfile 的 ENTRYPOINT
指示。注意下列事項:
-
針對模型推論,SageMaker AI 會以下列方式執行容器:
docker run
image
serveSageMaker AI 透過在映像名稱後面指定
serve
引數來覆寫容器中的預設CMD
陳述式。您在 Dockerfile 中搭配CMD
指令提供的引數,會被serve
引數覆寫。 -
SageMaker AI 預期所有容器都會與根使用者一起執行。建立您的容器,使其僅使用根使用者。當 SageMaker AI 執行您的容器時,沒有根層級存取權的使用者可能會導致許可問題。
-
建議使用
ENTRYPOINT
指示的exec
格式:ENTRYPOINT ["executable", "param1", "param2"]
例如:
ENTRYPOINT ["python", "k_means_inference.py"]
ENTRYPOINT
指示的exec
格式會直接做為可執行檔啟動,而非/bin/sh
的子項。如此其便能自 SageMaker API 作業接收SIGTERM
和SIGKILL
等訊號,而這是一項要求。例如,當您使用
CreateEndpoint
API 建立端點時,SageMaker AI 會佈建端點組態所需的 ML 運算執行個體數目,您在請求中指定。SageMaker AI 會在這些執行個體上執行 Docker 容器。如果您減少支援端點的執行個體數量 (透過呼叫
UpdateEndpointWeightsAndCapacities
API),SageMaker AI 會執行命令來停止正在終止的執行個體上的 Docker 容器。該命令會傳送出SIGTERM
訊號,三十秒後再傳送SIGKILL
訊號。如果您更新端點 (透過呼叫
UpdateEndpoint
API),SageMaker AI 會啟動另一組 ML 運算執行個體,並執行包含您的推論程式碼的 Docker 容器。然後會執行命令,將前一個 Docker 容器停止。若要停止 Docker 容器,命令會傳送SIGTERM
訊號,30 秒後再傳送SIGKILL
訊號。 -
SageMaker AI 使用您在
CreateModel
請求中提供的容器定義來設定環境變數和容器的 DNS 主機名稱,如下所示:-
使用
ContainerDefinition.Environment
字串對字串的映射來設定環境變數。 -
它使用
ContainerDefinition.ContainerHostname
設定 DNS 主機名稱。
-
-
如果您計劃使用 GPU 裝置進行模型推論 (在您的
CreateEndpointConfig
請求中指定以 GPU 為基礎的機器學習 (ML) 運算執行個體),請確保您的容器與nvidia-docker
相容。請勿將 NVIDIA 驅動程式與映像整合成套件。如需nvidia-docker
的詳細資訊,請參閱 NVIDIA/nvidia-docker。 -
您無法在 SageMaker AI 容器中使用
tini
初始化器作為進入點,因為它會受到train
和serve
引數的混淆。
SageMaker AI 如何載入模型成品
在 CreateModel
API 請求中,您可以使用 ModelDataUrl
或 S3DataSource
參數來識別存放模型成品的 S3 位置。SageMaker AI 會將模型成品從 S3 位置複製到 /opt/ml/model
目錄,以供推論程式碼使用。您的容器只有 /opt/ml/model
的唯讀存取權限。請勿寫入此目錄。
ModelDataUrl
必須指向 tar.gz 檔案。否則,SageMaker AI 不會下載檔案。
如果您在 SageMaker AI 中訓練模型,模型成品會儲存為 Amazon S3 中的單一壓縮 tar 檔案。如果您在 SageMaker AI 之外訓練模型,則需要建立此單一壓縮 tar 檔案,並將其儲存在 S3 位置。SageMaker AI 會在容器啟動之前將此 tar 檔案解壓縮至 /opt/ml/model 目錄。
對於部署大型模型,我們建議您依照 部署未壓縮的模型。
容器對推論請求應有的回應方式
若要取得推論,用戶端應用程式會將 POST 請求傳送至 SageMaker AI 端點。SageMaker AI 會將請求傳遞至容器,並將推論結果從容器傳回給用戶端。
如需有關容器將接收之推論請求的詳細資訊,請參閱 Amazon SageMaker AI API 參考中的下列動作:
推論容器的需求
若要回應推論請求,您的容器須符合下列要求:
-
SageMaker AI 會分割除 支援的所有
POST
標頭。InvokeEndpoint
SageMaker AI 可能會新增其他標頭。推論容器必須能安全地忽略這類額外的標題。 -
為了接收推論請求,容器須擁有可以監聽 8080 連接埠的 Web 伺服器,且需接受傳至
/invocations
和/ping
端點的POST
請求。 -
客戶的模型容器必須在 250 毫秒內接受插槽連線請求。
-
客戶的模型容器必須在 60 秒內回應請求。模型本身在回應
/invocations
之前的處理時間上限為 60 秒。如果您的模型處理時間需要 50-60 秒,則 SDK 的插槽逾時應設為 70 秒。
範例 調用函式
下列範例示範容器中的程式碼如何處理推論請求。這些範例處理用戶端應用程式使用 InvokeEndpoint 動作傳送的請求。
範例 串流請求的調用函式
下列範例示範推論容器中的程式碼如何處理串流推論請求。這些範例處理用戶端應用程式使用 InvokeEndpointWithResponseStream 動作傳送的請求。
容器處理串流推論請求時,在模型產生推論時會以遞增方式連續傳回一部分的模型推論。用戶端應用程式在可用時立即開始接收回應。該應用程式不需要等待模型產生整個回應。您可以實作串流以支援快速互動體驗,例如聊天機器人、虛擬助理和音樂產生器。
容器對運作狀態檢查 (Ping) 請求應有的回應方式
SageMaker AI 在下列情況中啟動新的推論容器:
-
回應
CreateEndpoint
、UpdateEndpoint
和UpdateEndpointWeightsAndCapacities
API 呼叫 -
安全性修補程式
-
取代狀態不佳的執行個體
容器啟動後不久,SageMaker AI 就會開始定期傳送 GET 請求到/ping
端點。
容器上最簡單的請求是以 HTTP 200 狀態碼和空內文做為回應。這會向 SageMaker AI 指出容器已準備好在/invocations
端點接受推論請求。
如果容器在啟動後 8 分鐘內持續以 200 秒回應,未開始通過運作狀態檢查,則新執行個體啟動會失敗。這會導致 CreateEndpoint
故障,使端點處於失敗狀態。UpdateEndpoint
請求的更新未完成,未套用安全修補程式,且不會取代運作狀態不佳的執行個體。
雖然容器的最低標準是傳回靜態的 200,容器開發人員也能運用此功能來進行更加深入的檢查。/ping
嘗試的請求逾時為 2 秒。