翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Amazon SageMaker AI がトレーニングイメージを実行する方法
カスタムエントリポイントスクリプトを使用して、本番環境でトレーニングするインフラストラクチャを自動化できます。エントリポイントスクリプトを Docker コンテナに渡すと、イメージを再構築せずにスタンドアロンのスクリプトとして実行することもできます。SageMaker AI は、Docker コンテナエントリポイントスクリプトを使用してトレーニングイメージを処理します。
このセクションでは、トレーニングツールキットを使用せずにカスタムエントリポイントを使用する方法を示します。カスタムエントリポイントの使用を希望しているものの、Docker コンテナを手動で設定する方法に慣れていない場合は、代わりに SageMaker トレーニングツールキットライブラリ
デフォルトでは、SageMaker AI はコンテナtrain内で というスクリプトを探します。また、AlgorithmSpecification API の ContainerArguments と ContainerEntrypoint のパラメータを使用して、独自のカスタムエントリポイントを手動で指定することもできます。
イメージを実行するように Docker コンテナを手動で構成するには、次の 2 つの方法があります。
-
CreateTrainingJob API と、内部にエントリポイント命令が含まれている Docker コンテナを使用する。
-
CreateTrainingJobAPI を使用して、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 runimagetrain -
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 を使用する場合には、以下の条件が適用されます。-
CreateTrainingJobAPI には、SageMaker AI に特定の時間後にモデルトレーニングを停止するように指示する停止条件があります。 -
以下に
StopTrainingJobAPI を示します。この 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 コンテナにエントリポイントスクリプトが含まれていると見なします。CreateTrainingJobAPI を使用するリクエスト構文は以下のとおりです。{ "AlgorithmSpecification": { "ContainerArguments": ["arg1", "arg2"], ... } }SageMaker トレーニングバックエンドがカスタムエントリポイントを次のように実行します。
docker run image<ContainerArguments> -
ContainerEntrypointとContainerArgumentsの両方を指定した場合、CreateTrainingJobAPI を使用するリクエスト構文は次のようになります。{ "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}'