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

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

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 の子としてではなく、直接実行ファイルを開始します。これにより、 API SIGKILLから 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 を参照してください。

  • および 引trainserve数で混乱が生じるため、 SageMaker コンテナのエントリポイントスクリプトとしてtiniイニシャライザを使用することはできません。

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

シェルまたは Python スクリプトを Docker イメージ内にバンドルしたり、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
    注記

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

  • のみを指定するとContainerArguments、 は Docker コンテナにエントリポイントスクリプトが含まれている SageMaker と仮定します。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}'