本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
建立演算法映像
Amazon SageMaker 演算法要求買方在進行預測之前,先攜帶自己的資料進行訓練。身為 AWS Marketplace 賣方,您可以使用 SageMaker 來建立機器學習 (ML) 演算法和模型,讓買家可以在 中部署 AWS。下列各節說明如何為 建立演算法映像 AWS Marketplace。這包括建立 Docker 訓練映像來訓練演算法,以及包含推論邏輯的推論映像。發佈演算法產品時,需要訓練和推論映像。
概觀
演算法包含下列元件:
-
儲存在 Amazon ECR
的訓練映像 -
儲存在 Amazon Elastic Container Registry (Amazon ECR) 中的推論映像
注意
對於演算法產品,訓練容器會產生模型成品,這些成品會在模型部署時載入推論容器。
下圖顯示發佈和使用演算法產品的工作流程。
建立 SageMaker 演算法的工作流程 AWS Marketplace 包括下列步驟:
-
賣方會建立訓練映像和推論映像 (部署時無法存取網路),並將其上傳至 Amazon ECR Registry。
-
然後,賣方在 Amazon 中建立演算法資源, SageMaker 並在 上發佈 ML 產品 AWS Marketplace。
-
買方訂閱 ML 產品。
-
買方會使用相容的資料集和適當的超參數值建立訓練任務。 會 SageMaker 執行訓練映像,並將訓練資料和超參數載入訓練容器。當訓練任務完成時,位於 中的模型成品
/opt/ml/model/
會壓縮並複製到買方的 Amazon S3儲存貯體。 -
購買者會建立模型套件,其中包含 Amazon S3 中存放之訓練的模型成品,並部署模型。
-
SageMaker 會執行推論映像、擷取壓縮的模型成品,並將檔案載入推論容器目錄路徑,
/opt/ml/model/
由提供推論的程式碼使用。 -
無論模型部署為端點或批次轉換任務, 都會透過容器的HTTP端點,將代表買方推論的資料 SageMaker 傳遞至容器,並傳回預測結果。
注意
如需詳細資訊,請參閱訓練模型 。
建立演算法的訓練映像
本節提供將訓練程式碼封裝至訓練映像的逐步解說。建立演算法產品需要訓練映像。
訓練映像是包含訓練演算法的 Docker 映像。容器會遵守特定的檔案結構, SageMaker 允許 將資料複製到容器或從容器複製資料。
發佈演算法產品時,需要訓練和推論映像。建立訓練映像之後,您必須建立推論映像。這兩個映像可以合併為一個映像或保留為個別映像。是否合併或分隔影像由您決定。一般而言,推論比訓練更簡單,而且您可能需要個別的影像來協助推論效能。
注意
下列只是訓練映像的封裝程式碼範例之一。如需詳細資訊,請參閱使用您自己的演算法和模型搭配 AWS Marketplace和 上的AWS Marketplace SageMaker 範例
步驟 1:建立容器映像
為了使訓練映像與 Amazon 相容 SageMaker,它必須遵守特定檔案結構, SageMaker 允許 將訓練資料和組態輸入複製到容器中的特定路徑。訓練完成時,產生的模型成品會儲存在容器內 SageMaker 複製所在的特定目錄路徑中。
下列使用CLI安裝在 Linux Ubuntu 發行版本開發環境中的 Docker。
準備您的程式以讀取組態輸入
如果您的訓練計畫需要任何買家提供的組態輸入,則下列是在執行時複製到容器內部的位置。如果需要,您的程式必須從這些特定檔案路徑中讀取。
-
/opt/ml/input/config
是包含控制程式執行方式的資訊的目錄。-
hyperparameters.json
是超參數名稱和值的 JSON格式化字典。這些值是字串,因此您可能需要將其轉換。 -
resourceConfig.json
是 JSON格式化的檔案,描述用於分散式訓練 的網路配置。如果您的訓練映像不支援分散式訓練,您可以忽略此檔案。
-
注意
如需組態輸入的詳細資訊,請參閱 Amazon 如何 SageMaker 提供訓練資訊 。
準備您的程式以讀取資料輸入
訓練資料可以下列兩種模式之一傳送到容器。您在容器中執行的訓練程式會在這兩個模式中之一摘要訓練資料。
檔案模式
-
/opt/ml/input/data/<channel_name>/
包含該頻道的輸入資料。這些頻道是根據對CreateTrainingJob
操作的呼叫建立的,但頻道通常必須符合演算法預期的內容。每個頻道的檔案會從 Amazon S3複製到此目錄,保留 Amazon S3 金鑰結構所指示的樹狀結構。
管道模式
-
/opt/ml/input/data/<channel_name>_<epoch_number>
是指定 epoch 的管道。Epoch 從零開始,每次讀取時都會增加一個。您可以執行的 epoch 數目沒有限制,但您必須先關閉每個管道,才能讀取下一個 epoch。
準備您的程式以撰寫訓練輸出
訓練的輸出會寫入下列容器目錄:
-
/opt/ml/model/
是您撰寫模型或訓練演算法產生的模型成品的目錄。您的模型可以是您想要的任何格式。它可以是單一檔案或整個目錄樹狀目錄。將此目錄中的任何檔案 SageMaker 封裝為壓縮檔案 (.tar.gz)。此檔案可在DescribeTrainingJob
API操作傳回的 Amazon S3 位置使用。 -
/opt/ml/output/
是一個目錄,其中演算法可以撰寫描述任務失敗原因failure
的檔案。此檔案的內容會傳回DescribeTrainingJob
結果的FailureReason
欄位。對於成功的任務,沒有理由寫入此檔案,因為其已被忽略。
建立容器執行的指令碼
建立 train
Shell 指令碼,該指令碼會在 SageMaker 執行 Docker 容器映像時執行。當訓練完成且模型成品寫入其個別目錄時,請結束指令碼。
./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 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和 上的AWS Marketplace SageMaker 範例
步驟 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 執行相同的指令碼。
執行此命令後,Docker 會從您建置的訓練映像建立容器並執行它。容器會執行train
指令碼,以啟動您的訓練程式。
訓練程式完成並結束容器後,請檢查輸出模型成品是否正確。此外,請檢查日誌輸出以確認它們未產生您不希望的日誌,同時確保提供有關訓練任務的足夠資訊。
如此即完成演算法產品的訓練程式碼封裝。由於演算法產品也包含推論映像,請繼續下一個區段: 建立演算法的推論映像。
建立演算法的推論映像
本節提供逐步解說,以將推論程式碼封裝到演算法產品的推論映像中。
推論映像是包含推論邏輯的 Docker 映像。執行階段的容器會公開HTTP端點, SageMaker 以允許在容器之間傳遞資料。
發佈演算法產品時,需要訓練和推論映像。如果您尚未這樣做,請參閱上一節關於 建立演算法的訓練映像。這兩個影像可以合併為一個影像,或保留為個別影像。是否合併或分隔影像由您決定。一般而言,推論比訓練更簡單,而且您可能需要個別的影像來協助推論效能。
注意
以下是推論映像的封裝程式碼範例。如需詳細資訊,請參閱使用您自己的演算法和模型搭配 AWS Marketplace和 上的AWS Marketplace SageMaker 範例
下列範例使用 Web 服務 Flask
步驟 1:建立推論映像
若要讓推論映像與 相容 SageMaker,Docker 映像必須公開HTTP端點。當您的容器正在執行時, 會將買家提供的推論輸入SageMaker 傳遞至容器的HTTP端點。推論的結果會在HTTP回應的內文中傳回。
下列使用CLI安裝在 Linux Ubuntu 發行版本開發環境中的 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 here. # # # # # # Add your inference code here. # Return a response with a prediction response = {"prediction":"a","text":input_str} return json.dumps(response)
在上一個範例中,沒有實際推論邏輯。針對您的實際推論映像,將推論邏輯新增至 Web 應用程式,以便其處理輸入並傳回預測。
您的推論映像必須包含所有必要的相依性,因為它將無法存取網際網路。
建立容器執行的指令碼
建立名為 的指令碼serve
,該指令碼會在執行 Docker 容器映像 SageMaker 時執行。在此指令碼中,啟動 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以便在容器執行時執行。
準備您的程式以動態載入模型成品
對於演算法產品,買方會使用自己的資料集搭配訓練映像來產生唯一的模型成品。當訓練程序完成時,您的訓練容器會將模型成品輸出至容器目錄 /opt/ml/model/
。 會將該目錄中的內容 SageMaker 壓縮為 .tar.gz 檔案,並將其存放在 Amazon S3 中的買方 AWS 帳戶 中。
當模型部署時, 會 SageMaker 執行您的推論映像, 從存放在 Amazon S3 中買家帳戶中的 .tar.gz 檔案擷取模型成品,並將其載入/opt/ml/model/
目錄中的推論容器中。在執行階段,您的推論容器程式碼會使用模型資料。
注意
若要保護模型成品檔案中可能包含的任何智慧財產權,您可以選擇在輸出檔案之前加密檔案。如需詳細資訊,請參閱Amazon 的安全性和智慧財產權 SageMaker。
步驟 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 傳送HTTP請求至 。 -
--volume '<path_to_model>:/opt/ml/model:ro'
– 繫結將測試模型成品存放在主機機器的路徑作為唯讀,以便將其用於容器中的推論程式碼。 -
--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 狀態碼表示已準備就緒時, 會透過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。