翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Amazon SageMaker AI がトレーニングイメージを実行する方法
カスタムエントリポイントスクリプトを使用して、本番環境でトレーニングするインフラストラクチャを自動化できます。エントリポイントスクリプトを Docker コンテナに渡すと、イメージを再構築せずにスタンドアロンのスクリプトとして実行することもできます。SageMaker AI は、Docker コンテナエントリポイントスクリプトを使用してトレーニングイメージを処理します。
このセクションでは、トレーニングツールキットを使用せずにカスタムエントリポイントを使用する方法を示します。カスタムエントリポイントの使用を希望しているものの、Docker コンテナを手動で設定する方法に慣れていない場合は、代わりに SageMaker トレーニングツールキットライブラリ
デフォルトでは、SageMaker AI はコンテナtrain
内で というスクリプトを探します。また、AlgorithmSpecification API の ContainerArguments
と ContainerEntrypoint
のパラメータを使用して、独自のカスタムエントリポイントを手動で指定することもできます。
イメージを実行するように Docker コンテナを手動で構成するには、次の 2 つの方法があります。
-
CreateTrainingJob API と、内部にエントリポイント命令が含まれている Docker コンテナを使用する。
-
CreateTrainingJob
API を使用して、Docker コンテナの外部からトレーニングスクリプトを渡す。
Docker コンテナの外部からトレーニングスクリプトを渡す場合は、スクリプトを更新するときに Docker コンテナを再構築する必要はありません。さらに、同じコンテナで複数の異なるスクリプトを実行することもできます。
エントリポイントスクリプトには、イメージ用のトレーニングコードが含まれている必要があります。推定器source_dir
パラメータを使用する場合、エントリポイントスクリプトを含むフォルダへの Amazon S3 の相対パスを参照する必要があります。source_dir
パラメータを使用して複数のファイルを参照できます。source_dir
を使用しない場合は、entry_point
パラメータを使用してエントリポイントを指定できます。推定器を含むカスタムエントリポイントスクリプトの例については、「Bring Your Own Model with SageMaker AI Script Mode
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」を参照してください。
Docker コンテナ内でバンドルされたエントリポイントスクリプトを使ってトレーニングジョブを実行する
SageMaker AI は、Docker コンテナ内にバンドルされたエントリポイントスクリプトを実行できます。
-
デフォルトでは、Amazon SageMaker AI は次のコンテナを実行します。
docker run
image
train -
SageMaker AI は、イメージ名の後に
train
引数を指定することで、コンテナ内のデフォルトの 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 を使用する場合には、以下の条件が適用されます。-
CreateTrainingJob
API には、SageMaker AI に特定の時間後にモデルトレーニングを停止するように指示する停止条件があります。 -
以下に
StopTrainingJob
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を参照してください。 -
SageMaker AI コンテナのエントリポイントスクリプトとして
tini
イニシャライザを使用することはできません。イニシャライザは 引数train
とserve
引数によって混乱するからです。 -
/opt/ml
とすべてのサブディレクトリが SageMaker トレーニングによって予約されています。アルゴリズムの Docker イメージを構築する場合は、アルゴリズムに必要なデータをこのディレクトリに配置しないでください。そうすると、トレーニング中にデータが表示されなくなる可能性があるためです。
Docker イメージ内にシェルまたは Python スクリプトをバンドルしたり、Amazon S3 バケットにスクリプトを提供したり、 AWS Command Line Interface (CLI) を使用してスクリプトを提供したりするには、次のセクションに進みます。
シェルスクリプトを Docker コンテナにバンドルします。
Docker イメージ内にカスタムシェルスクリプトをバンドルする場合は、以下の手順に従ってください。
-
シェルスクリプトを作業ディレクトリから 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/
-
「Amazon ECR ユーザーガイド」の「Pushing a Docker image」にある指示に従って、Docker コンテナをビルドして Amazon Elastic Container Registry (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 コンテナにバンドルします。
Docker イメージ内にカスタム Python スクリプトをバンドルする場合は、以下の手順に従ってください。
-
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/
-
次の AWS CLI コマンドを実行してトレーニングジョブを起動します。
--algorithm-specification '{ \ "TrainingInputMode": "File", \ "TrainingImage": "
<your-ecr-image>
", \ "ContainerEntrypoint": ["python
"], \ "ContainerArguments": ["/mydir/custom_entrypoint.py
"]}' \
Docker コンテナ外のエントリポイントスクリプトを使用してトレーニングジョブを実行します。
独自の Docker コンテナをトレーニングに使用し、Docker コンテナの外部からエントリポイントスクリプトを渡すことができます。エントリポイントスクリプトをコンテナの外部で構築することには、いくつかの利点があります。エントリポイントスクリプトを更新する場合は、Docker コンテナを再構築する必要はありません。さらに、同じコンテナで複数の異なるスクリプトを実行することもできます。
AlgorithmSpecification 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 バケットに提供する
S3 バケットを使用してカスタムエントリポイントスクリプトを提供するには、DataSource API S3DataSource
のパラメータを使用してスクリプトの場所を指定します。この S3DataSource
パラメータを使用する場合は、以下が必要です。
-
InputMode は
File
タイプでなければなりません。 -
S3DataDistributionType は
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 で を使用して入力データチャネルを設定する
JSON ファイルを使用して入力データチャネルを設定するには、次のコード構造 AWS CLI に示すように を使用します。以下のすべてのフィールドが CreateTrainingJob API で定義されているリクエスト構文を使用していることを確認してください。
// 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 を直接設定する
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
}'