翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Amazon がトレーニングイメージ SageMaker を実行する方法
カスタムエントリポイントスクリプトを使用して、本番環境でトレーニングするインフラストラクチャを自動化できます。エントリポイントスクリプトを Docker コンテナに渡す場合は、イメージを再構築せずにスタンドアロンスクリプトとして実行することもできます。 SageMaker は、Docker コンテナエントリポイントスクリプトを使用してトレーニングイメージを処理します。
このセクションでは、トレーニングツールキットを使用せずにカスタムエントリポイントを使用する方法を示します。カスタムエントリポイントを使用するが、Docker コンテナを手動で設定する方法に慣れていない場合は、代わりにSageMaker トレーニングツールキットライブラリ
デフォルトでは、 はコンテナtrain
内で というスクリプト SageMaker を探します。AlgorithmSpecification API の ContainerArguments
および ContainerEntrypoint
パラメータを使用して、独自のカスタムエントリポイントを手動で指定することもできます。
イメージを実行するように Docker コンテナを手動で構成するには、次の 2 つの方法があります。
-
CreateTrainingJob API と Docker コンテナを使用し、その中にエントリポイント命令を含めます。
-
CreateTrainingJob
API を使用して、Docker コンテナの外部からトレーニングスクリプトを渡す。
Docker コンテナの外部からトレーニングスクリプトを渡す場合は、スクリプトを更新するときに Docker コンテナを再構築する必要はありません。さらに、同じコンテナで複数の異なるスクリプトを実行することもできます。
エントリポイントスクリプトには、イメージ用のトレーニングコードが含まれている必要があります。推定器source_dir
パラメータを使用する場合、エントリポイントスクリプトを含むフォルダへの Amazon S3 の相対パスを参照する必要があります。source_dir
パラメータを使用して複数のファイルを参照できます。source_dir
を使用しない場合は、entry_point
パラメータを使用してエントリポイントを指定できます。推定器を含むカスタムエントリポイントスクリプトの例については、 SageMaker 「スクリプトモードで独自のモデルを使用する
SageMaker モデルトレーニングは、ファイルモード、高速ファイルモード、パイプモードのデータ入力場所として高性能な S3 Express One Zone ディレクトリバケットをサポートします。S3 Express One Zone ディレクトリバケットを使用して、トレーニング出力を保存することもできます。S3 Express One Zone を使用するには、Amazon S3 汎用バケットの代わりに S3 Express One Zone ディレクトリバケットの URI を指定します。 Amazon S3 詳細については、「S3 Express One Zone」を参照してください。
Docker コンテナ内でバンドルされたエントリポイントスクリプトを使ってトレーニングジョブを実行する
SageMaker は、Docker コンテナ内にバンドルされたエントリポイントスクリプトを実行できます。
-
デフォルトでは、Amazon は次のコンテナ SageMaker を実行します。
docker run
image
train -
SageMaker は、イメージ名の後に
train
引数を指定することで、コンテナ内のデフォルトの CMDステートメントを上書きします。Docker コンテナで、以下の ENTRYPOINT
命令のexec
形式を使用します。ENTRYPOINT ["
executable
", "param1
", "param2
", ...]次の例は、
k-means-algorithm.py
という Python エントリポイント命令を指定する方法を示しています。ENTRYPOINT ["python", "k-means-algorithm.py"]
exec
命令のENTRYPOINT
フォームは、/bin/sh
の子としてではなく、直接実行ファイルを開始します。これにより、 APISIGKILL
からSIGTERM
や などのシグナルを受信できます。 SageMaker APIs SageMaker APIs を使用する場合、次の条件が適用されます。-
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を参照してください。 -
および 引
train
serve
数で混乱が生じるため、 SageMaker コンテナのエントリポイントスクリプトとしてtini
イニシャライザを使用することはできません。 -
/opt/ml
およびすべてのサブディレクトリは SageMaker トレーニングによって予約されます。アルゴリズムの Docker イメージを構築する場合は、アルゴリズムに必要なデータをこのディレクトリに配置しないでください。そうすると、トレーニング中にデータが表示されなくなる可能性があるためです。
シェルまたは Python スクリプトを Docker イメージ内にバンドルしたり、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注記
が指定されている場合、 SageMaker トレーニングバックエンド
ContainerEntrypoint
は指定されたエントリポイントでイメージを実行し、イメージ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
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
}'