Amazon SageMaker AI がトレーニングイメージを実行する方法 - Amazon SageMaker AI

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

Amazon SageMaker AI がトレーニングイメージを実行する方法

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

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

デフォルトでは、SageMaker AI はコンテナtrain内で というスクリプトを探します。また、AlgorithmSpecification API の ContainerArgumentsContainerEntrypoint のパラメータを使用して、独自のカスタムエントリポイントを手動で指定することもできます。

イメージを実行するように 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 から SIGTERMSIGKILL などのシグナルを受け取ることができます。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イニシャライザを使用することはできません。イニシャライザは 引数trainserve引数によって混乱するからです。

  • /opt/ml とすべてのサブディレクトリが SageMaker トレーニングによって予約されています。アルゴリズムの Docker イメージを構築する場合は、アルゴリズムに必要なデータをこのディレクトリに配置しないでください。そうすると、トレーニング中にデータが表示されなくなる可能性があるためです。

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

シェルスクリプトを Docker コンテナにバンドルします。

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/
  2. Amazon ECR ユーザーガイド」の「Pushing a Docker image」にある指示に従って、Docker コンテナをビルドして Amazon Elastic Container Registry (Amazon ECR) にプッシュします。

  3. 次の 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 スクリプトをバンドルする場合は、以下の手順に従ってください。

  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/
  2. 次の 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>
  • ContainerEntrypointContainerArguments の両方を指定した場合、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 パラメータを使用する場合は、以下が必要です。

次の例では、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}'