モデルパッケージイメージの作成 - AWS Marketplace

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

モデルパッケージイメージの作成

Amazon SageMaker AI モデルパッケージは、予測を行う事前トレーニング済みのモデルであり、購入者による追加のトレーニングは必要ありません。SageMaker AI でモデルパッケージを作成し、機械学習製品を公開できます AWS Marketplace。以下のセクションでは、 のモデルパッケージを作成する方法について説明します AWS Marketplace。これには、コンテナイメージの作成、イメージのローカルでのビルドとテストが含まれます。

概要

モデルパッケージには、次のコンポーネントが含まれています。

注記

モデルアーティファクトは、モデルが予測を行うために使用するファイルであり、通常は独自のトレーニングプロセスの結果です。アーティファクトは、モデルが必要とするどのようなファイルタイプでも構いませんが、.tar.gz 圧縮を使用する必要があります。モデルパッケージの場合、推論イメージ内にバンドルすることも、Amazon SageMaker AI に個別に保存することもできます。Amazon S3 に保存されているモデルアーティファクトは、実行時に推論コンテナにロードされます。モデルパッケージを公開すると、これらのアーティファクトは購入者が直接アクセスできない AWS Marketplace 所有の Amazon S3 バケットに公開され、保存されます。

ヒント

推論モデルが Gluon、Keras、MXNet、PyTorch、TensorFlow、TensorFlow-Lite、ONNX などの深層学習フレームワークで構築されている場合は、Amazon SageMaker AI Neo の使用を検討してください。Neo は、ml.c4ml.p2 などの、クラウドインスタンスタイプの特定のファミリーにデプロイする推論モデルを自動的に最適化できます。詳細については、Amazon SageMaker AI デベロッパーガイド」の「Neo を使用してモデルのパフォーマンスを最適化する」を参照してください。

次の図は、モデルパッケージ製品を公開して使用するワークフローを示しています。

販売者がモデルパッケージイメージを作成する方法と購入者がそれを使用する方法を示す図。

の SageMaker AI モデルパッケージを作成するためのワークフロー AWS Marketplace には、次のステップが含まれます。

  1. 販売者は推論イメージ (デプロイ時のネットワークアクセス不可) を作成し、Amazon ECR レジストリにプッシュします。

    モデルアーティファクトは推論イメージにバンドルすることも S3 に個別に保存することもできます。

  2. 次に、販売者は Amazon SageMaker AI でモデルパッケージリソースを作成し、ML 製品を公開します AWS Marketplace。

  3. 購入者は ML 製品をサブスクライブしてモデルをデプロイします。

    注記

    このモデルは、リアルタイムの推論を行うエンドポイントとしてデプロイすることも、データセット全体の予測を一度に取得するバッチジョブとしてデプロイすることもできます。詳細については、「推論のためのモデルをデプロイする」を参照してください。

  4. SageMaker AI は推論イメージを実行します。推論イメージにバンドルされていない販売者提供のモデルアーティファクトは、ランタイムに動的に読み込まれます。

  5. SageMaker AI は、コンテナの HTTP エンドポイントを使用して購入者の推論データをコンテナに渡し、予測結果を返します。

モデルパッケージ用の推論イメージの作成

このセクションでは、推論コードをモデルパッケージ製品の推論イメージにパッケージ化する手順を説明します。そのプロセスは、以下のステップで構成されています。

推論イメージは、推論ロジックを含む Docker イメージです。実行時にコンテナは HTTP エンドポイントを公開し、SageMaker AI がコンテナとの間でデータを送受信できるようにします。

注記

以下は、推論イメージのパッケージコードの一例です。詳細については、GitHub のSageMaker AI での Docker コンテナの使用」およびAWS Marketplace SageMaker AI の例」を参照してください。

以下の例ではわかりやすくするために Flask というウェブサービスを使用していますが、本番環境に対応しているとは見なされていません。

ステップ 1: コンテナイメージを作成する

推論イメージを SageMaker AI と互換性を持たせるには、Docker イメージが HTTP エンドポイントを公開する必要があります。コンテナの実行中、SageMaker AI は推論のために購入者入力をコンテナの HTTP エンドポイントに渡します。推論結果は HTTP レスポンスの本文で返されます。

次のチュートリアルでは、Linux Ubuntu ディストリビューションを使用する開発環境で Docker CLI を使用します。

ウェブサーバースクリプトを作成する

この例では Flask という Python サーバーを使用していますが、フレームワークに適した任意のウェブサーバーを使用できます。

注記

ここではわかりやすくするために Flask を使用しています。本番環境に対応するウェブサーバーとは見なされません。

SageMaker AI が使用する TCP ポート 8080 で 2 つの HTTP エンドポイントを提供する Flask ウェブサーバースクリプトを作成します。想定されるエンドポイントは次の 2 つです。

  • /ping – SageMaker AI はこのエンドポイントに HTTP GET リクエストを行い、コンテナの準備が整っているかどうかを確認します。コンテナの準備が完了すると、コンテナはこのエンドポイントでの HTTP GET リクエストに HTTP 200 レスポンスコードで応答します。

  • /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 between these comments.   #   #   #   #   #   # Add your inference code above this comment.      # Return a response with a prediction   response = {"prediction":"a","text":input_str}   return json.dumps(response)

前の例には、実際の推論ロジックはありません。実際の推論イメージについては、ウェブアプリに推論ロジックを追加し、入力を処理して実際の予測を返します。

推論イメージには、インターネットアクセスも、 への呼び出しもできないため、必要な依存関係がすべて含まれている必要があります AWS のサービス。

注記

これと同じコードがリアルタイム推論とバッチ推論の両方で呼び出されます。

コンテナ実行用のスクリプトを作成する

Docker コンテナイメージの実行時に SageMaker AI serveが実行する という名前のスクリプトを作成します。次のスクリプトは 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 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 は、以前に作成した 2 つのスクリプトをイメージに追加します。serve スクリプトのディレクトリが PATH に追加されると、コンテナの実行時にそれを実行できるようになります。

モデルアーティファクトをパッケージ化またはアップロードする

モデルのトレーニングから推論イメージまで、モデルアーティファクトを提供する方法には、以下の 2 つがあります。

  • 推論イメージと共に静的にパッケージ化します。

  • ランタイムに動的にロードします。動的に読み込まれるため、同じイメージをさまざまな機械学習モデルのパッケージ化に使用できます。

モデルのアーティファクトを推論イメージと一緒にパッケージ化する場合は、アーティファクトを Dockerfile に含めてください。

モデルアーティファクトを動的にロードする場合は、それらのアーティファクトを Amazon S3 の圧縮ファイル (.tar.gz) に個別に保存します。モデルパッケージを作成するときは、圧縮ファイルの場所を指定します。SageMaker AI は、コンテナの実行/opt/ml/model/時にコンテンツを抽出してコンテナディレクトリにコピーします。モデルパッケージを公開すると、それらのアーティファクトは、購入者が直接アクセスできない、 AWS Marketplace 所有の Amazon S3 バケットに公開および保存されます。

ステップ 2: イメージをローカルでビルドしてテストする

ビルドコンテキストには、現在、以下のファイルが存在します。

  • ./Dockerfile

  • ./web_app_serve.py

  • ./serve

  • 推論ロジックと (オプションの) 依存関係

次に、コンテナイメージをビルド、実行、テストします。

イメージを構築する

ビルドコンテキストで Docker コマンドを実行し、イメージをビルドしてタグ付けします。この例ではタグ my-inference-image を使用します。

sudo docker build --tag my-inference-image ./

この Docker コマンドを実行してイメージをビルドすると、Dockerfile の各行に基づいて Docker がイメージをビルドするときの出力が表示されます。終了すると、次のようなものが表示されます。

Successfully built abcdef123456 Successfully tagged my-inference-image:latest

をローカルで実行する

ビルドが完了したら、イメージをローカルでテストできます。

sudo docker run \   --rm \   --publish 8080:8080/tcp \   --detach \   --name my-inference-container \   my-inference-image \   serve

コマンドの詳細は次のとおりです。

  • --rm - コンテナが停止したら自動的に削除します。

  • --publish 8080:8080/tcp – ポート 8080 を公開して、SageMaker AI が HTTP リクエストを送信するポートをシミュレートします。

  • --detach - コンテナをバックグラウンドで実行します。

  • --name my-inference-container - 実行中のこのコンテナに名前を付けます。

  • my-inference-image - ビルドされたイメージを実行します。

  • serve – コンテナの実行時に SageMaker AI が実行するのと同じスクリプトを実行します。

このコマンドを実行すると、Docker は、ビルドした推論イメージからコンテナを作成してバックグラウンドで実行します。コンテナは serve スクリプトを実行し、テスト目的でウェブサーバーを起動します。

HTTP エンドポイントへの ping をテストします。

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 エンドポイントをテストします。

コンテナが ping に 200 のステータスコードを返すことで準備が整っていることを示すと、SageMaker AI はPOSTリクエストを介して推論データを HTTP /invocations エンドポイントに渡します。以下のコマンドを実行して、推論ポイントをテストします。

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

出力例は次のとおりです。

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

これら 2 つの HTTP エンドポイントが機能するので、推論イメージは SageMaker AI と互換性があります。

注記

モデルパッケージ製品のモデルは、リアルタイムとバッチの 2 つの方法でデプロイできます。どちらのデプロイでも、SageMaker AI は Docker コンテナの実行中に同じ HTTP エンドポイントを使用します。

コンテナを停止するには、次のコマンドを実行します。

sudo docker container stop my-inference-container

推論イメージの準備とテストが完了したら、次の「Amazon Elastic Container Registry へのイメージのアップロード」に進むことができます。