本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
演算法影像
Amazon SageMaker 算法要求買方在進行預測之前帶來自己的數據進行培訓。
演算法包含下列元件:
-
儲存在 Amazon EC
R 中的訓練映像檔 -
存儲在 Amazon Elastic Container Registry (Amazon ECR) 中的推論映像
注意
對於演算法產品,訓練容器會產生模型加工品,這些成品會載入到模型部署的推論容器中。
下圖顯示發佈和使用演算法產品的工作流程。
-
賣方建立訓練映像和推論映像 (部署時無法存取網路),並將其上傳到 Amazon ECR 登錄。
-
然後,賣方在 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:建立容器映像檔
若要讓 SageMaker 訓練映像與 Amazon 相容 SageMaker,它必須遵守特定的檔案結構,才能將訓練資料和組態輸入複製到容器中的特定路徑。訓練完成後,產生的模型人工因素會儲存在容器中的特定目錄路徑中, SageMaker 複製來源。
以下使用安裝在 Linux 的 Ubuntu 發行版的開發環境中的碼頭 CLI。
準備您的程序以讀取配置輸入
如果您的訓練計畫需要任何買家提供的組態輸入,則以下是在執行時將這些設定複製到容器內的位置。如果需要,您的程序必須從這些特定的文件路徑中讀取。
-
/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>
是給定時代的管道。時代從零開始,每次閱讀時都會增加一個。您可以運行的時代數量沒有限制,但是您必須在讀取下一個時代之前關閉每個管道。
準備您的程序來編寫培訓成果
訓練的輸出會寫入下列容器目錄:
-
/opt/ml/model/
是您撰寫模型或訓練演算法所產生之模型加工品的目錄。您的模型可以是您想要的任何格式。它可以是單個文件或整個目錄樹。 SageMaker 將此目錄中的任何檔案封裝到壓縮檔案 (.tar.gz) 中。此檔案可在DescribeTrainingJob
API 作業傳回的 Amazon S3 位置取得。 -
/opt/ml/output/
是演算法可以寫入描述工作失敗原因的failure
檔案的目錄。此檔案的內容會在DescribeTrainingJob
結果FailureReason
欄位中傳回。對於成功的工作,沒有理由寫入此文件,因為它被忽略。
為容器運行創建腳本
建立在執行 Docker 容器映像時 SageMaker 執行的train
殼層指令碼。訓練完成並將模型加工品寫入各自的目錄時,請結束指令碼。
./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}
會Dockerfile
將先前建立的train
指令碼新增至映像。該腳本的目錄被添加到 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'
— Bind 掛載在主機上寫入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 回應主體中。
以下使用安裝在 Linux 的 Ubuntu 發行版的開發環境中的碼頭 CLI。
建立 Web 伺服器指令碼
這個例子使用了一個名為 Flask
注意
為了簡單起見,瓶
創建瓶網絡服務器腳本,該腳本為使用的 TCP 端點 8080 上的兩個 HTTP 端點提供服務。 SageMaker 以下是兩個預期的端點:
-
/ping
— SageMaker 向此端點發出 HTTP GET 要求,以檢查您的容器是否已準備就緒。當您的容器準備就緒時,它會使用 HTTP 200 回應碼來回應此端點上的 HTTP GET 要求。 -
/invocations
— SageMaker 向此端點發出 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 應用程序中,以便處理輸入並返回預測。
您的推論映像檔必須包含所有必要的相依性,因為它無法存取網際網路。
為容器運行創建腳本
建立命名為的指令碼serve
,該指令碼 SageMaker 會在執行 Docker 容器映像時執行。在此指令碼中,啟動 HTTP 網頁伺服器。
./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/
在執行階段,您的推論容器程式碼會使用模型資料。
注意
若要保護模型人工因素檔案中可能包含的任何智慧財產權,您可以選擇在輸出檔案之前先加密檔案。如需詳細資訊,請參閱 安全性和智慧財產權。
步驟 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 服務器進行測試。
測試偵測 HTTP 端點
當 SageMaker 執行您的容器時,它會定期偵測端點。 當端點傳回狀態碼為 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 端點
當容器透過 SageMaker 傳回 200 狀態碼指示已就緒時,會透過POST
要求將推論資料傳遞至 /invocations
HTTP 端點。
執行下列命令以測試推論端點。
curl \ --request POST \ --data "hello world" \ http://127.0.0.1:8080/invocations
範例輸出示於下列範例中。
{"prediction": "a", "text": "hello world"}
在這兩個 HTTP 端點正常運作的情況下,推論映像現在與 SageMaker.
注意
算法產品的模型可以通過兩種方式進行部署:實時和批量。對於這兩種部署,在執行 Docker 容器時,都 SageMaker 會使用相同的 HTTP 端點。
若要停止容器,請執行下列命令。
sudo docker container stop my-inference-container
在演算法產品的訓練和推論影像都已準備就緒並測試完畢之後,請繼續執行上傳您的圖片。