本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
建立模型套件映像
Amazon SageMaker 模型套件是預先訓練的模型,可進行預測,不需要買家進行任何進一步訓練。您可以在 中建立模型套件, SageMaker 並在 上發佈機器學習產品 AWS Marketplace。下列各節說明如何為 建立模型套件 AWS Marketplace。這包括建立容器映像,以及在本機建置和測試映像。
概觀
模型套件包含下列元件:
-
儲存在Amazon Elastic Container Registry
(Amazon ECR) 中的推論映像 -
(選用) 模型成品,分別儲存在 Amazon S3
中
注意
模型成品是模型用來進行預測的檔案,通常是您訓練程序的結果。偽影可以是模型所需的任何檔案類型,但必須使用.tar.gz 壓縮。對於模型套件,它們可以在推論映像中綁定,或單獨存放在 Amazon 中 SageMaker。Amazon S3 中存放的模型成品會在執行階段載入推論容器。發佈模型套件時,這些成品會發佈並存放在買方無法直接存取的 AWS Marketplace 擁有 Amazon S3 儲存貯體中。
提示
如果您的推論模型是使用 Gluon、Keras、MXNet、 PyTorch TensorFlow、 TensorFlowLite 或 等深度學習架構建置ONNX,請考慮使用 Amazon SageMaker Neo。Neo 可以自動最佳化部署到特定雲端執行個體類型的推論模型,例如 ml.c4
、 ml.p2
和其他。如需詳細資訊,請參閱 Amazon SageMaker 開發人員指南 中的使用 Neo 最佳化模型效能。
下圖顯示發佈和使用模型套件產品的工作流程。
為 建立 SageMaker 模型套件的工作流程 AWS Marketplace 包括下列步驟:
-
賣方會建立推論映像 (部署時無法存取網路),並將其推送至 Amazon ECR Registry。
模型成品可以綁定在推論映像中,也可以單獨存放在 S3 中。
-
然後,賣方在 Amazon 中建立模型套件資源, SageMaker 並在 上發佈 ML 產品 AWS Marketplace。
-
購買者訂閱 ML 產品並部署模型。
注意
模型可以部署為即時推論的端點,也可以部署為批次工作,以同時取得整個資料集的預測。如需詳細資訊,請參閱部署推論模型。
-
SageMaker 會執行推論映像。推論映像中未綁定的任何賣方提供的模型成品都會在執行階段動態載入。
-
SageMaker 會使用容器的HTTP端點將買方的推論資料傳遞至容器,並傳回預測結果。
建立模型套件的推論映像
本節提供逐步解說,用於將您的推論程式碼封裝到模型套件產品的推論映像中。程序包含下列步驟:
推論映像是包含推論邏輯的 Docker 映像。執行階段的容器會公開HTTP端點, SageMaker 以允許在容器之間傳遞資料。
注意
以下是推論映像的封裝程式碼範例。如需詳細資訊,請參閱搭配使用 Docker 容器和 SageMaker 上的AWS Marketplace SageMaker 範例
下列範例使用 Web 服務 Flask
步驟 1:建立容器映像
若要讓推論映像與 相容 SageMaker,Docker 映像必須公開HTTP端點。當您的容器正在執行時, 會將要推論的買方輸入SageMaker 傳遞至容器的HTTP端點。推論結果會在HTTP回應的內文中傳回。
下列逐步解說會使用 Linux Ubuntu 分佈CLI在開發環境中的 Docker。
建立 Web 伺服器指令碼
此範例使用名為 Flask
注意
Flask
在 SageMaker 連接埠 8080 TCP 上建立 Flask Web 伺服器指令碼,該指令碼為使用的兩個HTTP端點提供服務。以下是兩個預期的端點:
-
/ping
–對此端點 SageMaker 提出HTTPGET請求,以檢查您的容器是否已準備就緒。當您的容器準備就緒時,它會使用 HTTP 200 個回應碼來回應此端點的HTTPGET請求。 -
/invocations
–針對推論對此端點 SageMaker 提出HTTPPOST請求。推論的輸入資料會在請求的內文中傳送。使用者指定的內容類型會在HTTP標頭中傳遞。回應的內文是推論輸出。如需逾時的詳細資訊,請參閱 建立機器學習產品的需求和最佳實務。
./web_app_serve.py
# Import modules import json import re from flask import Flask from flask import request app = Flask(__name__) # Create a path for health checks @app.route("/ping") def endpoint_ping(): return "" # Create a path for inference @app.route("/invocations", methods=["POST"]) def endpoint_invocations(): # Read the input input_str = request.get_data().decode("utf8") # Add your inference code between these comments. # # # # # # Add your inference code above this comment. # Return a response with a prediction response = {"prediction":"a","text":input_str} return json.dumps(response)
在上一個範例中,沒有實際推論邏輯。針對您的實際推論映像,將推論邏輯新增至 Web 應用程式,以便其處理輸入並傳回實際預測。
您的推論映像必須包含所有必要的相依性,因為其將無法存取網際網路,也無法呼叫任何 AWS 服務。
注意
即時和批次推論都會呼叫相同的程式碼
建立容器執行的指令碼
建立名為 的指令碼serve
,該指令碼會在 SageMaker 執行 Docker 容器映像時執行。下列指令碼會啟動 HTTP Web 伺服器。
./serve
#!/bin/bash # Run flask server on port 8080 for SageMaker flask run --host 0.0.0.0 --port 8080
建立 Dockerfile
在建置內容Dockerfile
中建立 。此範例使用 Ubuntu 18.04,但您可以從適用於架構的任何基礎映像開始。
./Dockerfile
FROM ubuntu:18.04 # Specify encoding ENV LC_ALL=C.UTF-8 ENV LANG=C.UTF-8 # Install python-pip RUN apt-get update \ && apt-get install -y python3.6 python3-pip \ && ln -s /usr/bin/python3.6 /usr/bin/python \ && ln -s /usr/bin/pip3 /usr/bin/pip; # Install flask server RUN pip install -U Flask; # Add a web server script to the image # Set an environment to tell flask the script to run COPY /web_app_serve.py /web_app_serve.py ENV FLASK_APP=/web_app_serve.py # Add a script that Amazon SageMaker will run # Set run permissions # Prepend program directory to $PATH COPY /serve /opt/program/serve RUN chmod 755 /opt/program/serve ENV PATH=/opt/program:${PATH}
會將先前建立的兩個指令碼Dockerfile
新增至映像。serve
指令碼的目錄會新增至 ,PATH以便在容器執行時執行。
封裝或上傳模型成品
從訓練模型到推論映像提供模型成品的兩種方式如下:
-
使用推論映像靜態封裝。
-
在執行階段動態載入。由於其是動態載入的,因此您可以使用相同的映像來封裝不同的機器學習模型。
如果您想要使用推論映像包裝模型成品,請在 中包含成品Dockerfile
。
如果您想要動態載入模型成品,請將這些成品分別存放在 Amazon S3 的壓縮檔案 (.tar.gz) 中。建立模型套件時,請指定壓縮檔案的位置,並在執行容器/opt/ml/model/
時 SageMaker 擷取內容並將其複製到容器目錄。發佈模型套件時,這些成品會發佈並存放在買方無法直接存取的擁有 Amazon S3 儲存貯體中 AWS Marketplace 。
步驟 2:在本機建置和測試映像
在建置內容中,現在存在下列檔案:
-
./Dockerfile
-
./web_app_serve.py
-
./serve
-
您的推論邏輯和 (選用) 相依性
接下來建置、執行和測試容器映像。
建置映像
在建置內容中執行 Docker 命令,以建置和標記映像。此範例使用標籤 my-inference-image
。
sudo docker build --tag my-inference-image ./
執行此 Docker 命令以建置映像後,您應該會看到輸出,因為 Docker 會根據 中的每行建置映像Dockerfile
。完成時,您應該會看到類似下列內容的內容。
Successfully built abcdef123456
Successfully tagged my-inference-image:latest
在本機執行
建置完成後,您可以在本機測試映像。
sudo docker run \ --rm \ --publish 8080:8080/tcp \ --detach \ --name my-inference-container \ my-inference-image \ serve
以下是 命令的詳細資訊:
-
--rm
– 停止後自動移除容器。 -
--publish 8080:8080/tcp
– 公開連接埠 8080 以模擬 SageMaker 傳送HTTP請求的連接埠。 -
--detach
– 在背景中執行容器。 -
--name my-inference-container
– 為這個執行中的容器命名。 -
my-inference-image
– 執行建置的映像。 -
serve
– 執行執行容器時 SageMaker 執行的相同指令碼。
執行此命令後,Docker 會從您建置的推論映像建立容器,並在背景中執行。容器會執行serve
指令碼,這會啟動您的 Web 伺服器以供測試之用。
測試 ping HTTP端點
SageMaker 執行容器時,它會定期 Ping 端點。當端點傳回狀態碼為 200 的HTTP回應時,它會向容器發出訊號 SageMaker ,表示容器已準備好進行推論。您可以執行下列命令來測試這一點,該命令會測試端點並包含回應標頭。
curl --include http://127.0.0.1:8080/ping
輸出範例如下。
HTTP/1.0 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 0
Server: MyServer/0.16.0 Python/3.6.8
Date: Mon, 21 Oct 2019 06:58:54 GMT
測試推論HTTP端點
當容器將 200 狀態碼傳回 ping 表示已準備就緒時, 會透過POST
請求將推論資料 SageMaker 傳遞至/invocations
HTTP端點。執行下列命令來測試推論點。
curl \ --request POST \ --data "hello world" \ http://127.0.0.1:8080/invocations
輸出範例如下所示。
{"prediction": "a", "text": "hello
world"}
這兩個HTTP端點運作時,推論映像現在與 相容 SageMaker。
注意
模型套件產品的模型可以透過兩種方式部署:即時和批次。在這兩個部署中, SageMaker 會在執行 Docker 容器時使用相同的HTTP端點。
若要停止容器,請執行下列命令。
sudo docker container stop my-inference-container
當您的推論映像準備就緒並經過測試時,您可以繼續 將映像上傳至 Amazon Elastic Container Registry。