

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

# モデルパッケージイメージの作成
<a name="ml-model-package-images"></a>

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

**Topics**
+ [概要:](#ml-model-package-images-overview)
+ [モデルパッケージ用の推論イメージの作成](#ml-creating-an-inference-image-for-model-packages)

## 概要:
<a name="ml-model-package-images-overview"></a>

 モデルパッケージには、次のコンポーネントが含まれています。
+  [Amazon Elastic Container Registry](https://aws.amazon.com/ecr/) (Amazon ECR) に保存された推論イメージ 
+  (オプション) [Amazon S3](https://aws.amazon.com/s3/) に個別に保存されているモデルアーティファクト 

**注記**  
モデルアーティファクトは、モデルが予測を行うために使用するファイルであり、通常は独自のトレーニングプロセスの結果です。アーティファクトは、モデルが必要とするどのようなファイルタイプでも構いませんが、.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.c4`、`ml.p2` などの、クラウドインスタンスタイプの特定のファミリーにデプロイする推論モデルを自動的に最適化できます。詳細については、「*Amazon SageMaker AI デベロッパーガイド*」の「[Neo を使用してモデルのパフォーマンスを最適化する](https://docs.aws.amazon.com/sagemaker/latest/dg/neo.html)」を参照してください。

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

![販売者がモデルパッケージイメージを作成する方法と購入者がそれを使用する方法を示す図。](http://docs.aws.amazon.com/ja_jp/marketplace/latest/userguide/images/ml-model-package-images.png)


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

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

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

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

1. 購入者は ML 製品をサブスクライブしてモデルをデプロイします。
**注記**  
 このモデルは、リアルタイムの推論を行うエンドポイントとしてデプロイすることも、データセット全体の予測を一度に取得するバッチジョブとしてデプロイすることもできます。詳細については、「[推論のためのモデルをデプロイする](https://docs.aws.amazon.com/sagemaker/latest/dg/deploy-model.html)」を参照してください。

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

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

## モデルパッケージ用の推論イメージの作成
<a name="ml-creating-an-inference-image-for-model-packages"></a>

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

**Topics**
+ [ステップ 1: コンテナイメージを作成する](#ml-step-1-creating-the-container-image)
+ [ステップ 2: イメージをローカルでビルドしてテストする](#ml-step-2-building-and-testing-the-image-locally)

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

**注記**  
 以下は、推論イメージのパッケージコードの一例です。詳細については、「[SageMaker AI で Docker コンテナを使用する](https://docs.aws.amazon.com/sagemaker/latest/dg/your-algorithms.html)」と GitHub の「[AWS Marketplace SageMaker AI example](https://github.com/aws/amazon-sagemaker-examples/tree/master/aws_marketplace)」を参照してください。  
以下の例ではわかりやすくするために [Flask](https://pypi.org/project/Flask/) というウェブサービスを使用していますが、本番環境に対応しているとは見なされていません。

### ステップ 1: コンテナイメージを作成する
<a name="ml-step-1-creating-the-container-image"></a>

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

 次のチュートリアルでは、Linux Ubuntu ディストリビューションを使用する開発環境で Docker CLI を使用します。
+ [ウェブサーバースクリプトを作成する](#ml-create-the-web-server-script)
+ [コンテナ実行用のスクリプトを作成する](#ml-create-the-script-for-the-container-run)
+ [`Dockerfile` の作成](#ml-create-the-dockerfile)
+ [モデルアーティファクトをパッケージ化またはアップロードする](#ml-package-or-upload-the-model-artifacts)

#### ウェブサーバースクリプトを作成する
<a name="ml-create-the-web-server-script"></a>

 この例では [Flask](https://pypi.org/project/Flask/) という Python サーバーを使用していますが、フレームワークに適した任意のウェブサーバーを使用できます。

**注記**  
ここではわかりやすくするために [Flask](https://pypi.org/project/Flask/) を使用しています。本番環境に対応するウェブサーバーとは見なされません。

 SageMaker AI が使用する TCP ポート 8080 で 2 つの HTTP エンドポイントを処理する Flask ウェブサーバースクリプトを作成します。想定されるエンドポイントは次の 2 つです。
+  `/ping` - SageMaker AI は、このエンドポイントに HTTP GET リクエストを送信して、コンテナが準備できているかどうかを確認します。コンテナの準備が完了すると、コンテナはこのエンドポイントでの HTTP GET リクエストに HTTP 200 レスポンスコードで応答します。
+  `/invocations` - SageMaker AI は、推論のためにこのエンドポイントに HTTP POST リクエストを送ります。推論用の入力データはリクエストの本文で送信されます。ユーザー指定のコンテンツタイプは HTTP ヘッダーで渡されます。レスポンスの本文は推論出力です。タイムアウトの詳細については、「[機械学習製品を作成するための要件とベストプラクティス](ml-listing-requirements-and-best-practices.md)」を参照してください。

 **`./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 のサービス。

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

#### コンテナ実行用のスクリプトを作成する
<a name="ml-create-the-script-for-the-container-run"></a>

 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` の作成
<a name="ml-create-the-dockerfile"></a>

 ビルドコンテキストに `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 に追加されると、コンテナの実行時にそれを実行できるようになります。

#### モデルアーティファクトをパッケージ化またはアップロードする
<a name="ml-package-or-upload-the-model-artifacts"></a>

 モデルのトレーニングから推論イメージまで、モデルアーティファクトを提供する方法には、以下の 2 つがあります。
+  推論イメージと共に静的にパッケージ化します。
+  ランタイムに動的にロードします。動的に読み込まれるため、同じイメージをさまざまな機械学習モデルのパッケージ化に使用できます。

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

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

### ステップ 2: イメージをローカルでビルドしてテストする
<a name="ml-step-2-building-and-testing-the-image-locally"></a>

 ビルドコンテキストには、現在、以下のファイルが存在します。
+  `./Dockerfile` 
+  `./web_app_serve.py` 
+  `./serve` 
+  推論ロジックと (オプションの) 依存関係 

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

#### イメージを構築する
<a name="ml-build-the-image"></a>

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

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

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

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

#### をローカルで実行する
<a name="ml-run-locally"></a>

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

```
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 をテストします。
<a name="ml-test-the-ping-http-endpoint"></a>

 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 エンドポイントをテストします。
<a name="ml-test-the-inference-http-endpoint"></a>

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

```
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 へのイメージのアップロード](ml-uploading-your-images.md)」に進むことができます。