

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

# Amazon SageMaker AI がトレーニングイメージを実行する方法
<a name="your-algorithms-training-algo-dockerfile"></a>

カスタムエントリポイントスクリプトを使用して、本番環境でトレーニングするインフラストラクチャを自動化できます。エントリポイントスクリプトを Docker コンテナに渡すと、イメージを再構築せずにスタンドアロンのスクリプトとして実行することもできます。SageMaker AI は Docker コンテナのエントリポイントスクリプトを使用してトレーニングイメージを処理します。

このセクションでは、トレーニングツールキットを使用せずにカスタムエントリポイントを使用する方法を示します。カスタムエントリポイントの使用を希望しているものの、Docker コンテナを手動で設定する方法に慣れていない場合は、代わりに [SageMaker トレーニングツールキットライブラリ](https://github.com/aws/sagemaker-training-toolkit)を使用することをお勧めします。ツールキットをトレーニングする方法の詳細については、「[独自のトレーニングコンテナの適応](adapt-training-container.md)」を参照してください。

デフォルトでは、SageMaker AI はコンテナ内の `train` と呼ばれるスクリプトを探します。また、[AlgorithmSpecification](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_AlgorithmSpecification.html) API の `ContainerArguments` と `ContainerEntrypoint` のパラメータを使用して、独自のカスタムエントリポイントを手動で指定することもできます。

イメージを実行するように Docker コンテナを手動で構成するには、次の 2 つの方法があります。
+ [CreateTrainingJob](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html) API と、内部にエントリポイント命令が含まれている Docker コンテナを使用する。
+ `CreateTrainingJob` API を使用して、Docker コンテナの外部からトレーニングスクリプトを渡す。

Docker コンテナの外部からトレーニングスクリプトを渡す場合は、スクリプトを更新するときに Docker コンテナを再構築する必要はありません。さらに、同じコンテナで複数の異なるスクリプトを実行することもできます。

エントリポイントスクリプトには、イメージ用のトレーニングコードが含まれている必要があります。[推定器](https://sagemaker.readthedocs.io/en/stable/api/training/estimators.html)内でオプションの `source_dir` パラメータを使用する場合、エントリポイントスクリプトを含むフォルダへの Amazon S3 の相対パスを参照する必要があります。`source_dir` パラメータを使用して複数のファイルを参照できます。`source_dir` を使用しない場合は、`entry_point` パラメータを使用してエントリポイントを指定できます。estimator を含むカスタムエントリポイントスクリプトの例については、「[Bring Your Own Model with SageMaker AI Script Mode](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-script-mode/sagemaker-script-mode.html)」を参照してください。

SageMaker AI モデルトレーニングは、ファイルモード、高速ファイルモード、パイプモードのデータ入力場所として、高性能の S3 Express One Zone ディレクトリバケットをサポートしています。S3 Express One Zone ディレクトリバケットを使用して、トレーニング出力を保存することもできます。S3 Express One Zone を使用するには、Amazon S3 汎用バケットの代わりに、S3 Express One Zone ディレクトリバケットの URI を指定します。SageMaker AI 出力データは、Amazon S3 マネージドキー (SSE-S3) を使用するサーバー側の暗号化でのみディレクトリバケットで暗号化できます。 AWS KMS キーによるサーバー側の暗号化 (SSE-KMS) は現在、SageMaker AI 出力データをディレクトリバケットに保存するためにサポートされていません。詳細については、「[S3 Express One Zone](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-one-zone.html)」を参照してください。

## Docker コンテナ内でバンドルされたエントリポイントスクリプトを使ってトレーニングジョブを実行する
<a name="your-algorithms-training-algo-dockerfile-api-ep-in"></a>

SageMaker AI は Docker コンテナ内にバンドルされたエントリポイントスクリプトを実行できます。
+ デフォルトでは、Amazon SageMaker AI は次のコンテナを実行します。

  ```
  docker run {{image}} train
  ```
+ SageMaker AI はイメージ名の後に `train` 引数を指定して、コンテナ内のデフォルトの [CMD](https://docs.docker.com/engine/reference/builder/#cmd) ステートメントを上書きします。Docker コンテナで、以下の `ENTRYPOINT` 命令の `exec` 形式を使用します。

  ```
  ENTRYPOINT ["{{executable}}", "{{param1}}", "{{param2}}", ...]
  ```

  次の例は、`k-means-algorithm.py` という Python エントリポイント命令を指定する方法を示しています。

  ```
  ENTRYPOINT ["python", "k-means-algorithm.py"]
  ```

  `exec` 命令の `ENTRYPOINT` フォームは、`/bin/sh` の子としてではなく、直接実行ファイルを開始します。これにより、SageMaker API から `SIGTERM` や `SIGKILL` などのシグナルを受け取ることができます。SageMaker API を使用する場合には、以下の条件が適用されます。
  + [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html) API には、特定の時間後にモデルトレーニングを停止するよう SageMaker AI に指示する停止条件があります。
  + 以下に [https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_StopTrainingJob.html](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_StopTrainingJob.html) API を示します。この API は、`docker stop` に相当するコマンドを 2 分のタイムアウトで発行して、指定されたコンテナを適切に停止します。

    ```
    docker stop -t 120
    ```

    コマンドは、`SIGTERM` シグナルを送信することで実行中のコンテナの停止を試みます。2 分間のタイムアウト後、API は `SIGKILL` を送信しコンテナを強制的に停止します。コンテナが `SIGTERM` を正常に処理し、その受信時から 120 秒以内に終了する場合、`SIGKILL` は送信されません。

  SageMaker AI がトレーニングを停止した後に中間モデルアーティファクトへのアクセスが必要な場合は、`SIGTERM` ハンドラにアーティファクトの保存を処理するコードを追加します。
+ モデルのトレーニングに GPU デバイスを使用する予定がある場合は、コンテナが `nvidia-docker` と互換であることを確認します。コンテナに含める必要があるのは CUDA ツールキットのみです。NVIDIA ドライバーをイメージにバンドルしないでください。`nvidia-docker` の詳細については、[NVIDIA/nvidia-docker](https://github.com/NVIDIA/nvidia-docker) を参照してください。
+ `tini` 引数と `train` 引数で混乱が生じるため、SageMaker AI コンテナでは、`serve` イニシャライザをエントリポイントスクリプトとして使用することはできません。
+ `/opt/ml` とすべてのサブディレクトリが SageMaker トレーニングによって予約されています。アルゴリズムの Docker イメージを構築する場合は、アルゴリズムに必要なデータをこのディレクトリに配置しないでください。そうすると、トレーニング中にデータが表示されなくなる可能性があるためです。

Docker イメージ内にシェルまたは Python スクリプトをバンドルしたり、Amazon S3 バケットまたは AWS Command Line Interface (CLI) を使用してスクリプトを提供したりするには、次のセクションに進みます。

### シェルスクリプトを Docker コンテナにバンドルします。
<a name="your-algorithms-training-algo-dockerfile-script-sh"></a>

 Docker イメージ内にカスタムシェルスクリプトをバンドルする場合は、以下の手順に従ってください。

1. シェルスクリプトを作業ディレクトリから Docker コンテナ内にコピーします。次のコードスニペットは、カスタムエントリポイントスクリプト `custom_entrypoint.sh` を現在の作業ディレクトリから `mydir` にある Docker コンテナにコピーします。次の例では、ベースの Docker イメージに Python がインストールされていることを前提としています。

   ```
   FROM {{<base-docker-image>}}:{{<tag>}}
   
   # Copy custom entrypoint from current dir to /mydir on container
   COPY {{./custom_entrypoint.sh /mydir/ }}
   ```

1. 「*Amazon ECR ユーザーガイド*」の「[Pushing a Docker image](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-ecr-image.html)」にある指示に従って、Docker コンテナをビルドして [Amazon Elastic Container Registry (Amazon ECR)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) にプッシュします。

1. 次の AWS CLI コマンドを実行して、トレーニングジョブを起動します。

   ```
   aws --region {{<your-region>}} sagemaker create-training-job \
   --training-job-name {{<your-training-job-name>}} \
   --role-arn {{<your-execution-role-arn>}} \
   --algorithm-specification '{ \ 
       "TrainingInputMode": "File", \
       "TrainingImage": "{{<your-ecr-image>}}", \
       "ContainerEntrypoint": ["{{/bin/sh}}"], \
       "ContainerArguments": ["{{/mydir/custom_entrypoint.sh}}"]}' \
   --output-data-config '{"S3OutputPath": "{{s3://custom-entrypoint-output-bucket/}}"}' \
   --resource-config '{"VolumeSizeInGB":{{10}},"InstanceCount":{{1}},"InstanceType":"{{ml.m5.2xlarge}}"}' \
   --stopping-condition '{"MaxRuntimeInSeconds": {{180}}}'
   ```

### Python スクリプトを Docker コンテナにバンドルします。
<a name="your-algorithms-training-algo-dockerfile-script-py"></a>

Docker イメージ内にカスタム Python スクリプトをバンドルする場合は、以下の手順に従ってください。

1. Python スクリプトを作業ディレクトリから Docker コンテナ内にコピーします。次のコードスニペットは、カスタムエントリポイントスクリプト `custom_entrypoint.py` を現在の作業ディレクトリから `mydir` にある Docker コンテナにコピーします。

   ```
   FROM {{<base-docker-image>}}:{{<tag>}}
   # Copy custom entrypoint from current dir to /mydir on container
   COPY {{./custom_entrypoint.py /mydir/}}
   ```

1. 次の AWS CLI コマンドを実行して、トレーニングジョブを起動します。

   ```
   --algorithm-specification '{ \ 
       "TrainingInputMode": "File", \
       "TrainingImage": "{{<your-ecr-image>}}", \
       "ContainerEntrypoint": ["{{python}}"], \
       "ContainerArguments": ["{{/mydir/custom_entrypoint.py}}"]}' \
   ```

## Docker コンテナ外のエントリポイントスクリプトを使用してトレーニングジョブを実行します。
<a name="your-algorithms-training-algo-dockerfile-api-pass-ep"></a>

独自の Docker コンテナをトレーニングに使用し、Docker コンテナの外部からエントリポイントスクリプトを渡すことができます。エントリポイントスクリプトをコンテナの外部で構築することには、いくつかの利点があります。エントリポイントスクリプトを更新する場合は、Docker コンテナを再構築する必要はありません。さらに、同じコンテナで複数の異なるスクリプトを実行することもできます。

[AlgorithmSpecification](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_AlgorithmSpecification.html) API の `ContainerEntrypoint` および `ContainerArguments` パラメータを使用してトレーニングスクリプトの場所を指定します。これらのエントリポイントと引数は Docker のエントリポイントと引数と同じように動作します。これらのパラメーターの値は、Docker コンテナーの一部として対応する `ENTRYPOINT` または `CMD` をオーバーライドします。

カスタムエントリポイントスクリプトを Docker トレーニングコンテナに渡すと、指定した入力によってコンテナの動作が決まります。
+ 例えば、`ContainerEntrypoint` のみを指定した場合、CreateTrainingJob API を使用するリクエスト構文は次のようになります。

  ```
  {
      "AlgorithmSpecification": {
          "ContainerEntrypoint": ["{{string}}"],   
          ...     
          }       
  }
  ```

  次に、SageMaker トレーニングバックエンドがカスタムエントリポイントを次のように実行します。

  ```
  docker run --entrypoint {{<ContainerEntrypoint>}} image
  ```
**注記**  
`ContainerEntrypoint` が指定されている場合、SageMaker トレーニングバックエンドは指定されたエントリポイントでイメージを実行し、イメージ内のデフォルト `ENTRYPOINT` をオーバーライドします。
+ `ContainerArguments` のみを指定した場合、SageMaker AI は Docker コンテナにエントリポイントスクリプトが含まれていると仮定します。`CreateTrainingJob` API を使用するリクエスト構文は以下のとおりです。

  ```
  {
      "AlgorithmSpecification": {
          "ContainerArguments": ["{{arg1}}", "{{arg2}}"],
          ...
      }
  }
  ```

  SageMaker トレーニングバックエンドがカスタムエントリポイントを次のように実行します。

  ```
  docker run image {{<ContainerArguments>}}
  ```
+ `ContainerEntrypoint` と `ContainerArguments` の両方を指定した場合、`CreateTrainingJob` API を使用するリクエスト構文は次のようになります。

  ```
  {
      "AlgorithmSpecification": {
          "ContainerEntrypoint": ["{{string}}"],
          "ContainerArguments": ["{{arg1}}", "{{arg2}}"],
          ...
      }
  }
  ```

   SageMaker トレーニングバックエンドがカスタムエントリポイントを次のように実行します。

  ```
  docker run --entrypoint {{<ContainerEntrypoint>}} image {{<ContainerArguments>}}
  ```

`CreateTrainingJob` API でサポートされている任意の `InputDataConfig` ソースを使用して、トレーニングイメージを実行するエントリポイントスクリプトを提供できます。

### エントリポイントスクリプトを Amazon S3 バケットに提供する
<a name="your-algorithms-training-algo-dockerfile-script-s3"></a>

 S3 バケットを使用してカスタムエントリポイントスクリプトを提供するには、[DataSource](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DataSource.html#sagemaker-Type-DataSource-S3DataSource) API `S3DataSource` のパラメータを使用してスクリプトの場所を指定します。この `S3DataSource` パラメータを使用する場合は、以下が必要です。
+ [InputMode](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_Channel.html#sagemaker-Type-Channel-InputMode) は `File` タイプでなければなりません。
+ [S3DataDistributionType](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DataSource.html#sagemaker-Type-DataSource-S3DataSource) は `FullyReplicated` でなければなりません。

次の例では、custom\_entrypoint.sh というスクリプトを S3 バケット `s3://<bucket-name>/<bucket prefix>/custom_entrypoint.sh` へのパスに配置しています。

```
#!/bin/bash
echo "Running custom_entrypoint.sh"
echo "Hello you have provided the following arguments: " "$@"
```

次に、トレーニングジョブを実行するための入力データチャネルの設定を行う必要があります。これを行うには、 AWS CLI を直接使用するか、JSON ファイルを使用します。

#### JSON ファイル AWS CLI で を使用して入力データチャネルを設定する
<a name="your-algorithms-training-algo-dockerfile-script-s3-json"></a>

JSON ファイルを使用して入力データチャネルを設定するには、次のコード構造 AWS CLI に示すように を使用します。以下のすべてのフィールドが [CreateTrainingJob](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html#API_CreateTrainingJob_RequestSyntax) API で定義されているリクエスト構文を使用していることを確認してください。

```
// run-my-training-job.json
{
 "[AlgorithmSpecification](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html#sagemaker-CreateTrainingJob-request-AlgorithmSpecification)": { 
        "ContainerEntrypoint": ["{{/bin/sh}}"],
        "ContainerArguments": ["/opt/ml/input/data/{{<your_channel_name>}}/{{custom_entrypoint.sh}}"],
         ...
   },
  "[InputDataConfig](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html#sagemaker-CreateTrainingJob-request-InputDataConfig)": [ 
    { 
        "[ChannelName](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_Channel.html#sagemaker-Type-Channel-ChannelName)": "{{<your_channel_name>}}",
        "[DataSource](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_Channel.html#sagemaker-Type-Channel-DataSource)": { 
            "[S3DataSource](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_DataSource.html#sagemaker-Type-DataSource-S3DataSource)": { 
                "[S3DataDistributionType](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_S3DataSource.html#sagemaker-Type-S3DataSource-S3DataDistributionType)": "FullyReplicated",
                "[S3DataType](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_S3DataSource.html#sagemaker-Type-S3DataSource-S3DataType)": "S3Prefix",
                "[S3Uri](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_S3DataSource.html#sagemaker-Type-S3DataSource-S3Uri)": "s3://{{<bucket-name>}}/{{<bucket_prefix>}}"
            }
        },
        "[InputMode](https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_Channel.html#sagemaker-Type-Channel-InputMode)": "File",
    },
    ...]
}
```

次に、 AWS CLI コマンドを実行して、次のように JSON ファイルからトレーニングジョブを起動します。

```
aws sagemaker create-training-job --cli-input-json file:{{//run-my-training-job.json}}
```

#### を使用して入力データチャネル AWS CLI を直接設定する
<a name="your-algorithms-training-algo-dockerfile-script-s3-directly"></a>

JSON ファイルなしで入力データチャネルを設定するには、次の AWS CLI コード構造を使用します。

```
aws --region {{<your-region>}} sagemaker create-training-job \
--training-job-name {{<your-training-job-name>}} \
--role-arn {{<your-execution-role-arn>}} \
--algorithm-specification '{ \
    "TrainingInputMode": "File", \
    "TrainingImage": "{{<your-ecr-image>}}", \
    "ContainerEntrypoint": ["{{/bin/sh}}"], \
    "ContainerArguments": ["{{/opt/ml/input/data/<your_channel_name>/custom_entrypoint.sh"]}}}' \
--input-data-config '[{ \
    "ChannelName":"{{<your_channel_name>}}", \
    "DataSource":{ \
        "S3DataSource":{ \
            "S3DataType":"S3Prefix", \
            "S3Uri":"s3://{{<bucket-name>}}/{{<bucket_prefix>}}", \
            "S3DataDistributionType":"FullyReplicated"}}}]' \
--output-data-config '{"S3OutputPath": "{{s3://custom-entrypoint-output-bucket/}}"}' \
--resource-config '{"VolumeSizeInGB":{{10}},"InstanceCount":{{1}},"InstanceType":"{{ml.m5.2xlarge}}"}' \
--stopping-condition '{"MaxRuntimeInSeconds": {{180}}}'
```