Algorithm - AWS Marketplace

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

Algorithm

一個 Amazon SageMaker 算法要求買方在進行預測之前帶來自己的數據進行培訓。

Algorithm 包含下列元件:

  • 訓練影像儲存於Amazon ECR

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

注意

對於演算法產品,訓練容器會產生模型加工品,這些成品會載入到模型部署的推論容器中。

下圖顯示發行和使用 Algorithm 的工作流程。


      賣方如何創建算法包圖像以及買方如何使用它的圖表。
  1. 賣方建立訓練映像和推論映像 (部署時無法存取網路),並將其上傳到 Amazon ECR 登錄。

  2. 然後賣方在亞馬遜創建一個算法資源 SageMaker 並在上發布其 ML 產品AWS Marketplace。

  3. 買方訂閱 ML 產品。

  4. 購買者建立具有相容資料集和適當超參數值的訓練工作。 SageMaker 執行訓練影像,並將訓練資料和超參數載入訓練容器。訓練工作完成時,模型人工因素位於/opt/ml/model/被壓縮並複製到買方的Simple Storage Service (Amazon Simple Storage Service (Amazon S3))儲存貯體。

  5. 購買者使用 Amazon S3 中存放的訓練中的模型成品建立模型套件,並部署模型。

  6. SageMaker 執行推論影像、擷取壓縮的模型加工品,並將檔案載入推論容器目錄路徑/opt/ml/model/服務於推論的代碼所使用的位置。

  7. 無論模型部署為端點還是批次轉換工作, SageMaker 透過容器的 HTTP 端點,將代表購買者的推論資料傳送至容器,並傳回預測結果。

注意

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

建立演算法的訓練影像

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

一個訓練形象是包含訓練演算法的 Docker 映像檔。容器附著於特定的文件結構以允許 SageMaker 將資料複製到容器和從容器中複製資料。

發佈演算法產品時,需要訓練和推論影像。 建立訓練影像後,您必須建立推論影像。 這兩個影像可以合併為一個影像,或保留為單獨的影像。是否合併圖像還是將它們分開取決於您。一般而言,推論比訓練更簡單,而且您可能需要個別的影像來協助提升推論效能。

注意

以下是訓練映像檔封裝程式碼的一個範例。如需詳細資訊,請參閱「」使用您自己的演算法和模型AWS MarketplaceAWS Marketplace SageMaker 例子上 GitHub。

步驟 1:建容器映像

為了培訓圖像與亞馬遜兼容 SageMaker,它必須堅持特定的文件結構才能允許 SageMaker ,將訓練資料和組態輸入複製到容器中的特定路徑。訓練完成後,產生的模型人工因素會儲存在容器中的特定目錄路徑中, SageMaker 從 COPY。

以下使用安裝在 Linux 的 Ubuntu 發行版的開發環境中的碼頭 CLI。

準備您的程序以讀取配置輸入

如果您的訓練計畫需要任何買家提供的組態輸入,則以下是在執行時將這些設定複製到容器內的位置。如果需要,您的程序必須從這些特定的文件路徑中讀取。

  • /opt/ml/input/config是包含控制程序運行方式的信息的目錄。

    • hyperparameters.json是 JSON 格式的超參數名稱和值字典。這些值是字符串,因此您可能需要轉換它們。

    • resourceConfig.json為 JSON 格式檔案,描述使用的網路佈局分散式訓練。 如果您的訓練影像不支援分散式訓練,您可以忽略此檔案。

注意

如需組態輸入的詳細資訊,請參閱Amazon 如何 SageMaker 提供訓練資訊

準備您的程序以讀取數據輸入

訓練資料可以透過下列兩種模式之一傳遞到容器中。在容器中執行的訓練計畫會以這兩種模式中的其中一種摘要訓練資料。

檔案模式

  • /opt/ml/input/data/<channel_name>/包含該通道的輸入資料。通道是根據呼叫創建的CreateTrainingJob操作,但通常重要的是通道與算法期望的匹配。每個通道的文件都從中複製Simple Storage Service (Amazon Simple Storage Service (Amazon S3))至此目錄,保留 Amazon S3 金鑰結構所指示的樹狀結構。

輸送模式

  • /opt/ml/input/data/<channel_name>_<epoch_number>是給定時代的管道。時代從零開始,每次閱讀時都會增加一個。您可以運行的時代數量沒有限制,但是您必須在讀取下一個時代之前關閉每個管道。

準備您的程序來編寫培訓成果

訓練的輸出會寫入下列容器目錄:

  • /opt/ml/model/是您撰寫模型或訓練演算法所產生之模型加工品的目錄。您的模型可以是您想要的任何格式。它可以是單個文件或整個目錄樹。 SageMaker 將此目錄中的任何檔案封裝到壓縮檔案 (.tar.gz) 中。此檔案可在傳回的 Amazon S3 位置取得DescribeTrainingJobAPI 操作。

  • /opt/ml/output/是算法可以寫入的目錄failure描述任務失敗原因的檔案。此檔案的內容會傳回FailureReason欄位DescribeTrainingJob結果。對於成功的工作,沒有理由寫入此文件,因為它被忽略。

為容器運行創建腳本

建立trainShell 指令碼 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}

所以此Dockerfile添加以前創建的train腳本到圖像。該腳本的目錄被添加到 PATH,以便它可以在容器運行時運行。

在上一個範例中,沒有實際的訓練邏輯。針對您的實際訓練影像,請將訓練相依性新增至Dockerfile,並新增邏輯以讀取訓練輸入,以訓練和產生模型成品。

您的訓練映像檔必須包含所有必要的相依性,因為它無法存取網際網路。

如需詳細資訊,請參閱「」使用您自己的演算法和模型AWS MarketplaceAWS 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腳本,它會啟動您的訓練計畫。

訓練計畫完成且容器結束後,請檢查輸出模型加工品是否正確。此外,請檢查記錄輸出以確認它們不會產生您不需要的記錄,同時確保提供有關訓練工作的足夠資訊。

這樣就完成了演算法產品的訓練程式碼封裝完成。由於 Algorithm 也包含推論影像,請繼續前往下一節, 建立演算法的推論影像

建立演算法的推論影像

本節提供逐步解說,將您的推論程式碼封裝到演算法產品的推論影像中。

推論影像是包含您的推論邏輯的 Docker 映像檔。執行階段的容器會公開 HTTP 端點以允許 SageMaker 將數據傳遞到容器和從容器傳遞數據。

發佈演算法產品時,需要訓練和推論影像。 若您尚未這麼做,請參閱上一節建立演算法的訓練影像。這兩個影像可以合併為一個影像,或保留為單獨的影像。是否合併圖像還是將它們分開取決於您。一般而言,推論比訓練更簡單,而且您可能需要個別的影像來協助提升推論效能。

注意

以下是推論影像封裝程式碼的其中一個範例。如需詳細資訊,請參閱「」使用您自己的演算法和模型AWS MarketplaceAWS Marketplace SageMaker 例子上 GitHub。

下面的例子使用了一個 Web 服務,Flask,為了簡單起見,並且不被認為是生產就緒。

步驟 1:建立推論影像

對於推論圖像兼容 SageMaker,碼頭映像必須公開 HTTP 端點。當您的容器正在運行時,SageMaker 將購買者提供的推論輸入傳遞至容器的 HTTP 端點。推論的結果會在 HTTP 回應內文中傳回。

以下使用安裝在 Linux 的 Ubuntu 發行版的開發環境中的碼頭 CLI。

建 Web 伺服器指令碼

這個例子使用了一個名為的 Python 服務器Flask,但您可以使用適用於框架的任何 Web 服務器。

注意

Flask為了簡單起見,在這裡使用。它不被視為生產就緒的 Web 服務器。

創建在 TCP 端口 8080 上為兩個 HTTP 端點提供服務的瓶 Web 服務器腳本 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 文件,並將其存儲在購買者的文件中AWS 帳戶在 Amazon S3 中。

當模型部署時, 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 運行您的容器,它會定期 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 狀態碼指示已準備就緒時, SageMaker 將推論資料傳遞至/invocationsHTTP 端點透過指令碼POST請求。

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

curl \   --request POST \   --data "hello world" \   http://127.0.0.1:8080/invocations

範例輸出顯示在下列範例中。

{"prediction": "a", "text": "hello world"}

在這兩個 HTTP 端點工作的情況下,推論映像現在與 SageMaker。

注意

算法產品的模型可以通過兩種方式進行部署:實時和批量。對於這兩個部署, SageMaker 在運行碼頭容器時使用相同的 HTTP 端點。

若要停止容器,請執行下列命令。

sudo docker container stop my-inference-container

在演算法產品的訓練和推論影像都已準備就緒並測試完畢之後,請繼續:上傳您的圖片