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

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

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

Amazon は、Docker SageMaker コンテナエントリポイントスクリプトを使用してトレーニングイメージを処理します。デフォルトでは、 SageMaker trainコンテナ内で呼び出されるスクリプトを探します。AlgorithmSpecificationAPIContainerArgumentsContainerEntrypoint のおよびパラメータを使用して、独自のカスタムエントリポイントを提供することもできます。独自のカスタムエントリポイントを使用する場合は、イメージを再構築せずにスタンドアロンスクリプトとして実行できる柔軟性が高まります。

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

イメージを実行するようにDockerコンテナを手動で設定する方法は2つあります。CreateTrainingJobAPI と、その中にエントリポイント命令が含まれている Docker コンテナを使用できます。または、CreateTrainingJob API を使用して、トレーニングスクリプトを Docker コンテナの外部から渡すこともできます。

Docker コンテナにバンドルされたエントリポイントスクリプトを使用してトレーニングジョブを実行する

SageMaker Docker コンテナ内にバンドルされているエントリポイントスクリプトを実行できます。

  • デフォルトでは、Amazon SageMaker は次のコンテナを実行します。

    docker run image train
  • SageMaker trainイメージ名の後に引数を指定して、コンテナ内のデフォルトの CMD ステートメントを上書きします。Docker コンテナでは、execENTRYPOINT次の形式の命令を使用してください。

    ENTRYPOINT ["executable", "param1", "param2", ...]

    次の例は、という名前の python エントリポイント命令を指定する方法を示していますk-means-algorithm.py

    ENTRYPOINT ["python", "k-means-algorithm.py"]

    exec 命令の ENTRYPOINT フォームは、/bin/sh の子としてではなく、直接実行ファイルを開始します。これにより、APISIGTERM のようなシグナルや SageMaker APISIGKILL からのシグナルを受信できます。 SageMaker API を使用する場合は、次の条件が適用されます。

     

    • CreateTrainingJobAPI には、 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 を参照してください。

  • tinitrainserveイニシャライザはと引数で混乱するので、 SageMaker コンテナのエントリポイントスクリプトとしては使えません。

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

Docker コンテナの外部にあるエントリポイントスクリプトを使用してトレーニングジョブを実行する

独自の Docker コンテナをトレーニングに使用して、Docker コンテナの外部からエントリポイントスクリプトを渡すことができます。エントリポイントスクリプトをコンテナの外で構造化することにはいくつかの利点があります。エントリポイントスクリプトを更新する場合は、Docker コンテナを再構築する必要はありません。複数の異なるスクリプトを使用して同じコンテナで実行することもできます。

AlgorithmSpecificationAPIContainerEntrypointContainerArguments のおよびパラメータを使用して、トレーニングスクリプトの場所を指定します。これらのエントリポイントと引数は、Docker のエントリポイントと引数と同じように動作します。これらのパラメータの値は、DockerENTRYPOINTCMD コンテナの一部として提供された対応する値または指定された値よりも優先されます。

カスタムエントリーポイントスクリプトを Docker トレーニングコンテナーに渡すとき、提供する入力によってコンテナーの動作が決まります。

  • たとえば、のみを提供する場合ContainerEntrypoint、 CreateTrainingJob API を使用したリクエスト構文は次のようになります。

    { "AlgorithmSpecification": { "ContainerEntrypoint": ["string"], ... } }

    次に、 SageMaker トレーニングバックエンドがカスタムエントリポイントを次のように実行します。

    docker run --entrypoint <ContainerEntrypoint> image
    注記

    ContainerEntrypointが指定されている場合、 SageMaker トレーニングバックエンドは指定されたエントリポイントで画像を実行し、ENTRYPOINT画像のデフォルトを上書きします。

  • のみを指定する場合はContainerArguments、Docker SageMaker コンテナにエントリポイントスクリプトが含まれていると仮定します。CreateTrainingJobAPI を使ったリクエストの構文は以下の通りです。

    { "AlgorithmSpecification": { "ContainerArguments": ["arg1", "arg2"], ... } }

    SageMaker トレーニングバックエンドは、カスタムエントリポイントを次のように実行します。

    docker run image <ContainerArguments>
  • ContainerEntrypointとの両方を指定した場合ContainerArgumentsCreateTrainingJob API を使用したリクエスト構文は次のようになります。

    { "AlgorithmSpecification": { "ContainerEntrypoint": ["string"], "ContainerArguments": ["arg1", "arg2"], ... } }

    SageMaker トレーニングバックエンドは、カスタムエントリポイントを次のように実行します。

    docker run --entrypoint <ContainerEntrypoint> image <ContainerArguments>

CreateTrainingJobAPIInputDataConfig でサポートされている任意のソースを使用して、トレーニングイメージを実行するためのエントリポイントスクリプトを提供できます。

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

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

カスタムシェルスクリプトを Docker イメージ内にバンドルする場合は、以下の手順を実行してください。

  1. シェルスクリプトを 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/
  2. Amazon ECR ユーザーガイドの「Docker イメージをプッシュする」の指示に従って、Docker コンテナを構築して Amazon エラスティックコンテナレジストリ (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 コンテナにバンドルしてください

カスタム Python スクリプトを Docker イメージ内にバンドルするには、以下の手順に従います。

  1. 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/
  2. AWS CLI次のコマンドを実行して、トレーニングジョブを開始します。

    --algorithm-specification '{ \ "TrainingInputMode": "File", \ "TrainingImage": "<your-ecr-image>", \ "ContainerEntrypoint": ["python"], \ "ContainerArguments": ["/mydir/custom_entrypoint.py"]}' \

Amazon S3 バケットにエントリポイントスクリプトを入力

S3 バケットを使用してカスタムエントリポイントスクリプトを提供するには、DataSourceAPIS3DataSource のパラメータを使用してスクリプトの場所を指定します。S3DataSourceパラメータを使用する場合、次のことが必須です。

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