本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
建立演算法映像
Amazon SageMaker AI 演算法要求買方在進行預測之前,先攜帶自己的資料進行訓練。身為 AWS Marketplace 賣方,您可以使用 SageMaker AI 來建立機器學習 (ML) 演算法和模型,供買方部署 AWS。以下章節說明如何建立演算法映像 AWS Marketplace。這包括建立 Docker 訓練映像以訓練您的演算法,以及包含推論邏輯的推論映像。發佈演算法產品時,需要訓練和推論影像。
概觀
演算法包含下列元件:
-
存放在 Amazon ECR
的訓練映像 -
儲存在 Amazon Elastic Container Registry (Amazon ECR) 中的推論映像
注意
對於演算法產品,訓練容器會產生模型成品,這些成品會在模型部署時載入推論容器中。
下圖顯示發佈和使用演算法產品的工作流程。
為 建立 SageMaker AI 演算法的工作流程 AWS Marketplace 包括以下步驟:
-
賣方會建立訓練映像和推論映像 (部署時無法存取網路),並將其上傳至 Amazon ECR 登錄檔。
-
賣方接著會在 Amazon SageMaker AI 中建立演算法資源,並發佈其 ML 產品 AWS Marketplace。
-
買方訂閱 ML 產品。
-
買方會使用相容的資料集和適當的超參數值來建立訓練任務。SageMaker AI 會執行訓練映像,並將訓練資料和超參數載入訓練容器。當訓練任務完成時,位於 中的模型成品
/opt/ml/model/會壓縮並複製到買方的 Amazon S3儲存貯體。 -
買方會建立模型套件,其中包含 Amazon S3 中所存放訓練的模型成品,並部署模型。
-
SageMaker AI 會執行推論映像、擷取壓縮的模型成品,並將檔案載入推論容器目錄路徑
/opt/ml/model/,供推論的程式碼使用。 -
無論模型部署為端點或批次轉換任務,SageMaker AI 都會代表買方將資料傳遞至容器的 HTTP 端點,並傳回預測結果。
注意
如需詳細資訊,請參閱訓練模型。
建立演算法的訓練映像
本節提供將訓練程式碼封裝至訓練影像的逐步解說。需要訓練影像才能建立 演算法產品。
訓練映像 是包含訓練演算法的 Docker 映像。容器遵循特定的檔案結構,以允許 SageMaker AI 在您的容器之間複製資料。
發佈演算法產品時,需要訓練和推論映像。建立訓練映像 之後,您必須建立推論映像。 這兩個映像可以合併為一個映像或保留為個別映像。是否合併或分隔影像由您決定。一般而言,推論比訓練更簡單,您可能想要個別的影像來協助推論效能。
注意
以下是訓練影像的封裝程式碼範例。如需詳細資訊,請參閱使用您自己的演算法和模型搭配 AWS Marketplace GitHub 上的 和 AWS Marketplace SageMaker AI 範例
步驟 1:建立容器映像
為了使訓練映像與 Amazon SageMaker AI 相容,它必須遵守特定檔案結構,以允許 SageMaker AI 將訓練資料和組態輸入複製到容器中的特定路徑。訓練完成時,產生的模型成品會存放在 SageMaker AI 複製來源容器中的特定目錄路徑中。
以下使用安裝在 Linux Ubuntu 發行版本開發環境中的 Docker CLI。
準備您的程式以讀取組態輸入
如果您的訓練計畫需要任何買方提供的組態輸入,則以下是在執行時將這些輸入複製到容器中的位置。如有必要,您的程式必須讀取這些特定檔案路徑。
-
/opt/ml/input/config是 目錄,其中包含控制程式執行方式的資訊。-
hyperparameters.json是超參數名稱和值的 JSON 格式字典。這些值是字串,因此您可能需要轉換它們。 -
resourceConfig.json是 JSON 格式的檔案,描述用於分散式訓練的網路配置。 如果您的訓練映像不支援分散式訓練,您可以忽略此檔案。
-
注意
如需組態輸入的詳細資訊,請參閱 Amazon SageMaker AI 如何提供訓練資訊。
準備您的程式以讀取資料輸入
訓練資料可以透過下列兩種模式之一傳送到容器。您在容器中執行的訓練程式會以這兩種模式之一來摘要訓練資料。
檔案模式
-
/opt/ml/input/data/<channel_name>/包含該頻道的輸入資料。這些頻道是根據對CreateTrainingJob操作的呼叫建立的,但頻道通常必須符合演算法預期的內容。每個頻道的檔案會從 Amazon S3複製到此目錄,保留 Amazon S3 金鑰結構所指示的樹狀結構。
管道模式
-
/opt/ml/input/data/<channel_name>_<epoch_number>是指定 epoch 的管道。Epoch 從零開始,每次讀取時都會增加 1。您可以執行的 epoch 數目沒有限制,但您必須先關閉每個管道,才能讀取下一個 epoch。
準備您的程式以撰寫訓練輸出
訓練的輸出會寫入下列容器目錄:
-
/opt/ml/model/是您撰寫模型的目錄,或訓練演算法產生的模型成品。您的模型可以是您想要的任何格式。它可以是單一檔案或整個目錄樹狀目錄。SageMaker AI 會將此目錄中的任何檔案封裝為壓縮檔案 (.tar.gz)。此檔案可在DescribeTrainingJobAPI 操作傳回的 Amazon S3 位置取得。 -
/opt/ml/output/是一個目錄,其中演算法可以撰寫描述任務失敗原因failure的檔案。此檔案的內容會在DescribeTrainingJob結果的FailureReason欄位中傳回。對於成功的任務,沒有理由寫入此檔案,因為它會被忽略。
建立容器執行的指令碼
建立 SageMaker AI 在執行 Docker 容器映像時執行的 train Shell 指令碼。當訓練完成且模型成品寫入其個別的目錄時,請結束指令碼。
./train
#!/bin/bash # Run your training program here # # # #
建立 Dockerfile
在建置內容Dockerfile中建立 。此範例使用 Ubuntu 18.04 作為基礎映像,但您可以從適用於架構的任何基礎映像開始。
./Dockerfile
FROM ubuntu:18.04 # Add training dependencies and programs # # # # # # Add a script that SageMaker AI will run # Set run permissions # Prepend program directory to $PATH COPY /train /opt/program/train RUN chmod 755 /opt/program/train ENV PATH=/opt/program:${PATH}
會將先前建立的train指令碼Dockerfile新增至映像。指令碼的目錄會新增至 PATH,以便在容器執行時執行。
在上一個範例中,沒有實際的訓練邏輯。針對您的實際訓練影像,將訓練相依性新增至 Dockerfile,並新增邏輯以讀取訓練輸入,以訓練和產生模型成品。
您的訓練映像必須包含所有必要的相依性,因為它將無法存取網際網路。
如需詳細資訊,請參閱使用您自己的演算法和模型搭配 AWS Marketplace GitHub 上的 和 AWS Marketplace SageMaker AI 範例
步驟 2:在本機建置和測試映像
在建置內容中,現在存在下列檔案:
-
./Dockerfile -
./train -
您的訓練相依性和邏輯
接下來,您可以建置、執行和測試此容器映像。
建置映像
在建置內容中執行 Docker 命令,以建置和標記映像。此範例使用標籤 my-training-image。
sudo docker build --tag my-training-image ./
執行此 Docker 命令來建置映像後,您應該會看到輸出,因為 Docker 會根據 中的每行建置映像Dockerfile。完成後,您應該會看到類似以下內容的內容。
Successfully built abcdef123456
Successfully tagged my-training-image:latest
在本機執行
完成後,請在本機測試映像,如下列範例所示。
sudo docker run \ --rm \ --volume '<path_to_input>:/opt/ml/input:ro' \ --volume '<path_to_model>:/opt/ml/model' \ --volume '<path_to_output>:/opt/ml/output' \ --name my-training-container \ my-training-image \ train
以下是命令詳細資訊:
-
--rm– 停止後自動移除容器。 -
--volume '<path_to_input>:/opt/ml/input:ro'– 讓容器可使用測試輸入目錄做為唯讀。 -
--volume '<path_to_model>:/opt/ml/model'– 訓練測試完成時,繫結掛載模型成品存放在主機機器的路徑。 -
--volume '<path_to_output>:/opt/ml/output'– 繫結掛載在主機機器上寫入failure檔案中失敗原因的路徑。 -
--name my-training-container– 為此執行中的容器命名。 -
my-training-image– 執行建置的映像。 -
train– 在執行容器時執行相同的指令碼 SageMaker AI 執行。
執行此命令後,Docker 會從您建置的訓練映像建立容器並執行它。容器會執行train指令碼,以啟動您的訓練程式。
訓練程式完成且容器結束之後,請檢查輸出模型成品是否正確。此外,請檢查日誌輸出以確認它們未產生您不希望的日誌,同時確保提供有關訓練任務的足夠資訊。
這會完成演算法產品的訓練程式碼封裝。由於演算法產品也包含推論影像,請繼續前往下一節 建立演算法的推論映像。
建立演算法的推論映像
本節提供逐步解說,將您的推論程式碼封裝到演算法 產品的推論映像中。
推論映像是包含推論邏輯的 Docker 映像。執行時間的容器公開 HTTP 端點,以允許 SageMaker AI 將資料傳入和傳出您的容器。
發佈演算法產品時,需要訓練和推論映像。 如果您尚未這麼做,請參閱上一節關於 建立演算法的訓練映像。這兩個影像可以合併為一個影像,或保留為個別影像。是否合併或分隔影像由您決定。一般而言,推論比訓練更簡單,您可能想要個別的影像來協助推論效能。
注意
以下是推論映像的封裝程式碼範例。如需詳細資訊,請參閱使用您自己的演算法和模型搭配 AWS Marketplace GitHub 上的 和 AWS Marketplace SageMaker AI 範例
下列範例使用 Web 服務 Flask
步驟 1:建立推論映像
若要讓推論映像與 SageMaker AI 相容,Docker 映像必須公開 HTTP 端點。當您的容器執行時, SageMaker AI 會將買方提供的推論輸入傳遞到容器的 HTTP 端點。推論的結果會在 HTTP 回應的內文中傳回。
以下使用安裝在 Linux Ubuntu 發行版本開發環境中的 Docker CLI。
建立 Web 伺服器指令碼
此範例使用稱為 Flask
注意
為了簡化起見,此處使用 Flask
建立 Flask Web 伺服器指令碼,在 SageMaker AI 使用的 TCP 連接埠 8080 上提供兩個 HTTP 端點。以下是兩個預期的端點:
-
/ping– SageMaker AI 向此端點發出 HTTP GET 請求,以檢查您的容器是否已準備就緒。當您的容器準備就緒時,它會使用 HTTP 200 回應碼來回應此端點的 HTTP GET 請求。 -
/invocations– SageMaker AI 向此端點發出 HTTP POST 請求以進行推論。推論的輸入資料會在請求的內文中傳送。使用者指定的內容類型會在 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 here. # # # # # # Add your inference code here. # Return a response with a prediction response = {"prediction":"a","text":input_str} return json.dumps(response)
在先前的範例中,沒有實際的推論邏輯。針對您的實際推論影像,將推論邏輯新增至 Web 應用程式,以便處理輸入並傳回預測。
您的推論映像必須包含所有必要的相依性,因為它將無法存取網際網路。
建立容器執行的指令碼
建立名為 SageMaker AI serve 在執行 Docker 容器映像時執行的指令碼。在此指令碼中,啟動 HTTP Web 伺服器。
./serve
#!/bin/bash # Run flask server on port 8080 for SageMaker AI 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 AI 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,以便在容器執行時執行。
準備您的程式以動態載入模型成品
對於演算法產品,買方會使用自己的資料集搭配您的訓練映像來產生唯一的模型成品。當訓練程序完成時,您的訓練容器會將模型成品輸出至容器目錄 /opt/ml/model/。SageMaker AI 會將該目錄中的內容壓縮為 .tar.gz 檔案,並將其存放在買方的 Amazon S3 AWS 帳戶 中。
當模型部署時,SageMaker AI 會執行您的推論映像、從存放在 Amazon S3 中買方帳戶中的 .tar.gz 檔案擷取模型成品,並將其載入 /opt/ml/model/目錄中的推論容器中。在執行時間,您的推論容器程式碼會使用模型資料。
注意
若要保護模型成品檔案中可能包含的任何智慧財產權,您可以選擇先加密檔案再輸出。如需詳細資訊,請參閱Amazon SageMaker AI 的安全性和智慧財產權。
步驟 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 \ --volume '<path_to_model>:/opt/ml/model:ro' \ --detach \ --name my-inference-container \ my-inference-image \ serve
以下是命令詳細資訊:
-
--rm– 停止後自動移除容器。 -
--publish 8080:8080/tcp– 公開連接埠 8080 以模擬 SageMaker AI 傳送 HTTP 請求的連接埠。 -
--volume '<path_to_model>:/opt/ml/model:ro'– 將測試模型成品存放在主機機器上的路徑繫結為唯讀,以便可供容器中的推論程式碼使用。 -
--detach– 在背景執行容器。 -
--name my-inference-container– 為此執行中的容器命名。 -
my-inference-image– 執行建置的映像。 -
serve– 在執行容器時執行相同的指令碼 SageMaker AI 執行。
執行此命令後,Docker 會從推論映像建立容器,並在背景執行。容器會執行serve指令碼,這會啟動您的 Web 伺服器以進行測試。
測試 ping HTTP 端點
當 SageMaker AI 執行您的容器時,它會定期 ping 端點。 當端點傳回狀態碼為 200 的 HTTP 回應時,它會向 SageMaker AI 發出訊號,表示容器已準備好進行推論。
執行下列命令來測試端點並包含回應標頭。
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 狀態碼表示已準備好時,SageMaker AI 會透過POST請求將推論資料傳遞至 /invocations HTTP 端點。
執行下列命令來測試推論端點。
curl \ --request POST \ --data "hello world" \ http://127.0.0.1:8080/invocations
範例輸出如下列範例所示。
{"prediction": "a", "text": "hello world"}
當這兩個 HTTP 端點正常運作時,推論映像現在與 SageMaker AI 相容。
注意
演算法產品的模型有兩種部署方式:即時和批次。對於這兩種部署,SageMaker AI 在執行 Docker 容器時使用相同的 HTTP 端點。
若要停止容器,請執行下列命令。
sudo docker container stop my-inference-container
準備好並測試演算法產品的訓練和推論映像後,請繼續 將映像上傳至 Amazon Elastic Container Registry。