建立演算法映像 - AWS Marketplace

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

建立演算法映像

Amazon SageMaker 演算法要求買方在進行預測之前,先攜帶自己的資料進行訓練。身為 AWS Marketplace 賣方,您可以使用 SageMaker 來建立機器學習 (ML) 演算法和模型,讓買家可以在 中部署 AWS。下列各節說明如何為 建立演算法映像 AWS Marketplace。這包括建立 Docker 訓練映像來訓練演算法,以及包含推論邏輯的推論映像。發佈演算法產品時,需要訓練和推論映像。

概觀

演算法包含下列元件:

  • 儲存在 Amazon ECR的訓練映像

  • 儲存在 Amazon Elastic Container Registry (Amazon ECR) 中的推論映像

注意

對於演算法產品,訓練容器會產生模型成品,這些成品會在模型部署時載入推論容器。

下圖顯示發佈和使用演算法產品的工作流程。

賣方如何建立演算法套件映像以及買方如何使用該映像的圖表。

建立 SageMaker 演算法的工作流程 AWS Marketplace 包括下列步驟:

  1. 賣方會建立訓練映像和推論映像 (部署時無法存取網路),並將其上傳至 Amazon ECR Registry。

  2. 然後,賣方在 Amazon 中建立演算法資源, SageMaker 並在 上發佈 ML 產品 AWS Marketplace。

  3. 買方訂閱 ML 產品。

  4. 買方會使用相容的資料集和適當的超參數值建立訓練任務。 會 SageMaker 執行訓練映像,並將訓練資料和超參數載入訓練容器。當訓練任務完成時,位於 中的模型成品/opt/ml/model/會壓縮並複製到買方的 Amazon S3 儲存貯體。

  5. 購買者會建立模型套件,其中包含 Amazon S3 中存放之訓練的模型成品,並部署模型。

  6. SageMaker 會執行推論映像、擷取壓縮的模型成品,並將檔案載入推論容器目錄路徑,/opt/ml/model/由提供推論的程式碼使用。

  7. 無論模型部署為端點或批次轉換任務, 都會透過容器的HTTP端點,將代表買方推論的資料 SageMaker 傳遞至容器,並傳回預測結果。

注意

如需詳細資訊,請參閱訓練模型

建立演算法的訓練映像

本節提供將訓練程式碼封裝至訓練映像的逐步解說。建立演算法產品需要訓練映像。

訓練映像是包含訓練演算法的 Docker 映像。容器會遵守特定的檔案結構, SageMaker 允許 將資料複製到容器或從容器複製資料。

發佈演算法產品時,需要訓練和推論映像。建立訓練映像之後,您必須建立推論映像。這兩個映像可以合併為一個映像或保留為個別映像。是否合併或分隔影像由您決定。一般而言,推論比訓練更簡單,而且您可能需要個別的影像來協助推論效能。

注意

下列只是訓練映像的封裝程式碼範例之一。如需詳細資訊,請參閱使用您自己的演算法和模型搭配 AWS Marketplace和 上的AWS Marketplace SageMaker 範例 GitHub。

步驟 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)。此檔案可在 DescribeTrainingJobAPI操作傳回的 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 範例 GitHub。

步驟 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 範例 GitHub。

下列範例使用 Web 服務 Flask ,以求簡化,且不被視為可立即生產。

步驟 1:建立推論映像

若要讓推論映像與 相容 SageMaker,Docker 映像必須公開HTTP端點。當您的容器正在執行時, 會將買家提供的推論輸入SageMaker 傳遞至容器的HTTP端點。推論的結果會在HTTP回應的內文中傳回。

下列使用CLI安裝在 Linux Ubuntu 發行版本開發環境中的 Docker。

建立 Web 伺服器指令碼

此範例使用名為 Flask 的 Python 伺服器,但您可以使用適用於架構的任何 Web 伺服器。

注意

Flask 用於簡化。它不被視為生產就緒的 Web 伺服器。

在 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 傳遞至/invocationsHTTP端點。

執行下列命令來測試推論端點。

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