翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Amazon SageMaker がトレーニングイメージを実行する方法
Amazon は、Docker SageMaker コンテナエントリポイントスクリプトを使用してトレーニングイメージを処理します。デフォルトでは、 SageMaker train
コンテナ内で呼び出されるスクリプトを探します。AlgorithmSpecificationAPIContainerArguments
ContainerEntrypoint
のおよびパラメータを使用して、独自のカスタムエントリポイントを提供することもできます。独自のカスタムエントリポイントを使用する場合は、イメージを再構築せずにスタンドアロンスクリプトとして実行できる柔軟性が高まります。
このセクションでは、SageMaker トレーニングツールキットライブラリを使用せずにトレーニングイメージを実行する方法を示します
イメージを実行するようにDockerコンテナを手動で設定する方法は2つあります。CreateTrainingJobAPI と、その中にエントリポイント命令が含まれている Docker コンテナを使用できます。または、CreateTrainingJob
API を使用して、トレーニングスクリプトを Docker コンテナの外部から渡すこともできます。
Docker コンテナにバンドルされたエントリポイントスクリプトを使用してトレーニングジョブを実行する
SageMaker Docker コンテナ内にバンドルされているエントリポイントスクリプトを実行できます。
-
デフォルトでは、Amazon SageMaker は次のコンテナを実行します。
docker run
image
train -
SageMaker
train
イメージ名の後に引数を指定して、コンテナ内のデフォルトの CMDステートメントを上書きします。Docker コンテナでは、 exec
ENTRYPOINT
次の形式の命令を使用してください。ENTRYPOINT ["
executable
", "param1
", "param2
", ...]次の例は、という名前の python エントリポイント命令を指定する方法を示しています
k-means-algorithm.py
。ENTRYPOINT ["python", "k-means-algorithm.py"]
exec
命令のENTRYPOINT
フォームは、/bin/sh
の子としてではなく、直接実行ファイルを開始します。これにより、APISIGTERM
のようなシグナルや SageMaker APISIGKILL
からのシグナルを受信できます。 SageMaker API を使用する場合は、次の条件が適用されます。-
CreateTrainingJob
API には、 SageMaker 特定の時間後にモデルトレーニングを停止するように指示する停止条件があります。 -
StopTrainingJob
以下はそのAPIを示しています。この API はdocker stop
、に相当するコマンドを 2 分のタイムアウトで発行して、指定されたコンテナを適切に停止します。docker stop -t 120
コマンドは、
SIGTERM
シグナルを送信することで実行中のコンテナの停止を試みます。2 分間のタイムアウト後、API はSIGKILL
を送信しコンテナを強制的に停止します。コンテナがSIGTERM
を正常に処理し、その受信時から 120 秒以内に終了する場合、SIGKILL
は送信されません。
SageMaker トレーニングを停止した後に中間モデルアーティファクトにアクセスする場合は、
SIGTERM
ハンドラにアーティファクトの保存を処理するコードを追加します。 -
-
モデルのトレーニングに GPU デバイスを使用する予定がある場合は、コンテナが
nvidia-docker
と互換であることを確認します。コンテナに含める必要があるのは CUDA ツールキットのみです。NVIDIA ドライバーをイメージにバンドルしないでください。nvidia-docker
の詳細については、NVIDIA/nvidia-dockerを参照してください。 -
tini
train
serve
イニシャライザはと引数で混乱するので、 SageMaker コンテナのエントリポイントスクリプトとしては使えません。 -
/opt/ml
そして、 SageMaker すべてのサブディレクトリはトレーニングによって予約されています。アルゴリズムの Docker イメージを構築する場合は、アルゴリズムに必要なデータをこのディレクトリに配置しないでください。これを行うと、トレーニング中にデータが表示されなくなる可能性があるためです。
Docker コンテナの外部にあるエントリポイントスクリプトを使用してトレーニングジョブを実行する
独自の Docker コンテナをトレーニングに使用して、Docker コンテナの外部からエントリポイントスクリプトを渡すことができます。エントリポイントスクリプトをコンテナの外で構造化することにはいくつかの利点があります。エントリポイントスクリプトを更新する場合は、Docker コンテナを再構築する必要はありません。複数の異なるスクリプトを使用して同じコンテナで実行することもできます。
AlgorithmSpecificationAPIContainerEntrypoint
ContainerArguments
のおよびパラメータを使用して、トレーニングスクリプトの場所を指定します。これらのエントリポイントと引数は、Docker のエントリポイントと引数と同じように動作します。これらのパラメータの値は、DockerENTRYPOINT
CMD
コンテナの一部として提供された対応する値または指定された値よりも優先されます。
カスタムエントリーポイントスクリプトを Docker トレーニングコンテナーに渡すとき、提供する入力によってコンテナーの動作が決まります。
-
たとえば、のみを提供する場合
ContainerEntrypoint
、 CreateTrainingJob API を使用したリクエスト構文は次のようになります。{ "AlgorithmSpecification": { "ContainerEntrypoint": ["
string
"], ... } }次に、 SageMaker トレーニングバックエンドがカスタムエントリポイントを次のように実行します。
docker run --entrypoint
<ContainerEntrypoint>
image注記 ContainerEntrypoint
が指定されている場合、 SageMaker トレーニングバックエンドは指定されたエントリポイントで画像を実行し、ENTRYPOINT
画像のデフォルトを上書きします。 -
のみを指定する場合は
ContainerArguments
、Docker SageMaker コンテナにエントリポイントスクリプトが含まれていると仮定します。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
APIInputDataConfig
でサポートされている任意のソースを使用して、トレーニングイメージを実行するためのエントリポイントスクリプトを提供できます。
シェルまたは Python スクリプトを Docker イメージ内にバンドルするか、Amazon S3 バケットまたはAWS Command Line Interface (CLI) を使用してスクリプトを提供するには、次のセクションに進んでください。
シェルスクリプトを Docker コンテナにバンドルする
カスタムシェルスクリプトを Docker イメージ内にバンドルする場合は、以下の手順を実行してください。
-
シェルスクリプトを Docker コンテナにバンドルします。次のコードスニペットは、
custom_entrypoint.sh
現在の作業ディレクトリからにある Dockermydir
コンテナにカスタムエントリポイントスクリプトをコピーします。次の例では、基本の Docker イメージに Python がインストールされている Docker のベースイメージにインストールされている Docker のベースイメージにインストールされています。FROM
<base-docker-image>
:<tag>
# Copy custom entrypoint from current dir to /mydir on container COPY./custom_entrypoint.sh /mydir/
-
Amazon ECR ユーザーガイドの「Docker イメージをプッシュする」の指示に従って、Docker コンテナを構築して Amazon エラスティックコンテナレジストリ (Amazon ECR) にプッシュします。
-
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 コンテナにバンドルしてください
カスタム Python スクリプトを Docker イメージ内にバンドルするには、以下の手順に従います。
-
Python スクリプトをドッカーファイルにバンドルします。次のコードスニペットは、
custom_entrypoint.py
現在の作業ディレクトリからにある Dockermydir
コンテナにカスタムエントリポイントスクリプトをコピーします。FROM
<base-docker-image>
:<tag>
# Copy custom entrypoint from current dir to /mydir on container COPY./custom_entrypoint.py /mydir/
-
AWS CLI次のコマンドを実行して、トレーニングジョブを開始します。
--algorithm-specification '{ \ "TrainingInputMode": "File", \ "TrainingImage": "
<your-ecr-image>
", \ "ContainerEntrypoint": ["python
"], \ "ContainerArguments": ["/mydir/custom_entrypoint.py
"]}' \
Amazon S3 バケットにエントリポイントスクリプトを入力
S3 バケットを使用してカスタムエントリポイントスクリプトを提供するには、DataSourceAPIS3DataSource
のパラメータを使用してスクリプトの場所を指定します。S3DataSource
パラメータを使用する場合、次のことが必須です。
-
InputModeはタイプでなければなりません
File
。 -
S3DataDistributionType はそうでなければなりません
FullyReplicated
。
次の例では、S3 バケットへのパスに custom_entrypoint.sh というスクリプトが置かれています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 ファイルを使用します。
JSONAWS CLI ファイルでの使用
JSONAWS CLI ファイルで使用するには、以下のすべてのフィールドが CreateTrainingJobAPI で定義されているリクエスト構文を使用していることを確認してください。
// run-my-training-job.json { "AlgorithmSpecification": { "ContainerEntrypoint": ["
/bin/sh
"], "ContainerArguments": ["/opt/ml/input/data/<your_channel_name>
/custom_entrypoint.sh
"], ... }, "InputDataConfig": [ { "ChannelName": "<your_channel_name>
", "DataSource": { "S3DataSource": { "S3DataDistributionType": "FullyReplicated", "S3DataType": "S3Prefix", "S3Uri": "s3://<bucket-name>
/<bucket_prefix>
" } }, "InputMode": "File", }, ...] }
次に、AWS CLI以下のようにコマンドを実行して JSON ファイルからトレーニングジョブを起動します。
aws sagemaker create-training-job --cli-input-json file:
//run-my-training-job.json
AWS CLI直接使用する
JSONAWS 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
}'