翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
独自の処理コンテナを構築する (高度なシナリオ)
データ処理、特徴量エンジニアリング、モデル評価ワークロードを実行する独自のコードと依存関係を持つ Docker イメージを Amazon SageMaker Processing に提供できます。
次の Dockerfile の例では、処理ジョブとして実行できる Python ライブラリ scikit-learn と pandas を持つコンテナを構築します。
FROM python:3.7-slim-buster # Install scikit-learn and pandas RUN pip3 install pandas==0.25.3 scikit-learn==0.21.3 # Add a Python script and configure Docker to run it ADD processing_script.py / ENTRYPOINT ["python3", "/processing_script.py"]
この Docker イメージを構築して Amazon Elastic Container Registry (Amazon ECR) リポジトリにプッシュし、SageMaker IAM ロールが Amazon ECR からイメージをプルできるようにします。そうすると、Amazon SageMaker Processing でこのイメージを実行できます。
Amazon SageMaker Processing が独自の処理コンテナイメージを実行する方法
Amazon SageMaker Processing は、次のコマンドと同様の方法で処理コンテナイメージを実行します。ここでは AppSpecification.ImageUri
は CreateProcessingJob
オペレーションで指定した Amazon ECR イメージの URI です。
docker run [AppSpecification.ImageUri]
このコマンドは、Docker イメージで設定された ENTRYPOINT
コマンドを実行します。
また、イメージ内の entrypoint コマンドを上書きしたり、CreateProcessingJob
リクエストの AppSpecification.ContainerEntrypoint
および AppSpecification.ContainerArgument
パラメータを使用して entrypoint コマンドにコマンドライン引数を指定することもできます。これらのパラメータを指定すると、次のコマンドと同様の方法でコンテナを実行するよう Amazon SageMaker Processing が設定されます。
docker run --entry-point [AppSpecification.ContainerEntrypoint] [AppSpecification.ImageUri] [AppSpecification.ContainerArguments]
例えば、CreateProcessingJob
リクエストで、ContainerEntrypoint
を [python3, -v, /processing_script.py]
に、ContainerArguments
を [data-format, csv]
に指定すると、Amazon SageMaker Processing は次のコマンドを使ってコンテナを実行します。
python3 -v /processing_script.py data-format csv
処理コンテナを構築するときは、次の詳細に注意してください。
-
Amazon SageMaker Processing は、コマンド実行の終了コードに応じて、ジョブが完了しているか失敗しているかを判断できます。処理ジョブは、すべての処理コンテナが終了コード 0 で正常に終了すると完了し、いずれかのコンテナが 0 以外の終了コードで終了すると失敗します。
-
Amazon SageMaker Processing では、Docker API の場合と同じように、処理コンテナのエントリポイントを上書きし、コマンドライン引数を設定できます。Docker イメージは、
ENTRYPOINT
および CMD 命令を使用して、エントリポイントおよびコマンドライン引数を設定できます。CreateProcessingJob
のContainerEntrypoint
およびContainerArgument
パラメータが Docker イメージのエントリポイントと引数を設定する方法は、Docker が Docker API を介してエントリポイントと引数を上書きする方法を反映しています-
ContainerEntrypoint
もContainerArguments
も指定されていない場合、Processing はイメージ内のデフォルトのENTRYPOINT
または CMD を使います。 -
ContainerEntrypoint
が指定され、ContainerArguments
が指定されていない場合、Processing は指定されたエントリポイントを使ってイメージを実行し、イメージ内のENTRYPOINT
および CMD は無視されます。 -
ContainerArguments
が指定され、ContainerEntrypoint
が指定されていない場合、Processing はイメージ内のデフォルトのENTRYPOINT
と指定された引数を使ってイメージを実行します。 -
ContainerEntrypoint
とContainerArguments
の両方が指定されている場合、Processing は指定されたエントリポイントと引数を使ってイメージを実行し、イメージ内のENTRYPOINT
および CMD は無視されます。
-
-
Dockerfile の
ENTRYPOINT
命令の exec 形式 (shell 形式 (ENTRYPOINT
command param1 param2
) ではなくENTRYPOINT
["executable", "param1", "param2"])
) を使用する必要があります。これにより、処理コンテナはSIGINT
信号およびSIGKILL
信号を受信できます。これらの信号は、Processing がStopProcessingJob
API を使ってジョブの処理を停止するために使います。 -
/opt/ml
およびそのすべてのサブディレクトリは SageMaker によって予約されています。Processing の Docker イメージを構築する際は、処理コンテナが必要とするデータをこれらのディレクトリに配置しないでください。 -
GPU デバイスを使用する場合は、コンテナが nvidia-docker と互換性があることを確認してください。CUDA ツールキットのみをコンテナに含めます。NVIDIA ドライバーをイメージにバンドルしないでください。nvidia-docker の詳細については、NVIDIA/nvidia-docker
を参照してください。
Amazon SageMaker Processing が処理コンテナの入出力を設定する方法
CreateProcessingJob
オペレーションを使用して処理ジョブを作成する場合、複数の ProcessingInput
および ProcessingOutput
の値を指定できます。
ProcessingInput
パラメータを使って、データのダウンロード元の Amazon Simple Storage Service (Amazon S3) URI と、データのダウンロード先となる処理コンテナのパスを指定します。ProcessingOutput
パラメータは、データのアップロード元となる処理コンテナ内のパスと、そのデータのアップロード先となる Amazon S3 の場所を設定します。ProcessingInput
と ProcessingOutput
の両方で、処理コンテナ内のパスは /opt/ml/processing/
から始まる必要があります。
たとえば、s3://your-data-bucket/path/to/input/csv/data
から処理コンテナの /opt/ml/processing/csv
にデータをダウンロードする 1 つの ProcessingInput
パラメータ、または /opt/ml/processing/processed_csv
から s3://your-data-bucket/path/to/output/csv/data
にデータをアップロードする ProcessingOutput
パラメータで処理ジョブを作成するとします。処理ジョブは入力データを読み取り、出力データを /opt/ml/processing/processed_csv
に書き込みます。次に、処理ジョブはこのパスに書き込まれたデータを、指定された Amazon S3 の出力場所にアップロードします。
シンボリックリンク (symlinks) は Amazon S3 への出力データのアップロードに使えません。出力データのアップロード時に、シンボリックリンクはフォローされません。
Amazon SageMaker Processing が処理コンテナにログとメトリクスを提供する方法
処理コンテナが stdout
または stderr
に書き込むと、Amazon SageMaker Processing は各処理コンテナからの出力を保存し、それを Amazon CloudWatch のログに記録します。ログ作成の詳細については、「Amazon CloudWatch で Amazon SageMaker イベントをログ記録する」を参照してください。
Amazon SageMaker Processing は、処理コンテナを実行する各インスタンスの CloudWatch メトリクスも提供します。メトリクスの詳細については、「Amazon CloudWatch で Amazon SageMaker イベントをモニタリングする」を参照してください。
Amazon SageMaker Processing が処理コンテナを設定する方法
Amazon SageMaker Processing は、環境変数と、コンテナ内で事前に定義された場所にある 2 つの JSON ファイル (/opt/ml/config/processingjobconfig.json
および /opt/ml/config/resourceconfig.json
) を使って、処理コンテナに設定情報を提供します。
処理ジョブが開始されると、CreateProcessingJob
リクエスト内の Environment
マップで指定した環境変数が使用されます。/opt/ml/config/processingjobconfig.json
ファイルには、処理コンテナのホスト名に関する情報が含まれています。この情報は CreateProcessingJob
リクエストでも指定されています。
以下の例は、/opt/ml/config/processingjobconfig.json
ファイル形式を示しています。
{ "ProcessingJobArn": "<processing_job_arn>", "ProcessingJobName": "<processing_job_name>", "AppSpecification": { "ImageUri": "<image_uri>", "ContainerEntrypoint": null, "ContainerArguments": null }, "Environment": { "KEY": "VALUE" }, "ProcessingInputs": [ { "InputName": "input-1", "S3Input": { "LocalPath": "/opt/ml/processing/input/dataset", "S3Uri": "<s3_uri>", "S3DataDistributionType": "FullyReplicated", "S3DataType": "S3Prefix", "S3InputMode": "File", "S3CompressionType": "None", "S3DownloadMode": "StartOfJob" } } ], "ProcessingOutputConfig": { "Outputs": [ { "OutputName": "output-1", "S3Output": { "LocalPath": "/opt/ml/processing/output/dataset", "S3Uri": "<s3_uri>", "S3UploadMode": "EndOfJob" } } ], "KmsKeyId": null }, "ProcessingResources": { "ClusterConfig": { "InstanceCount": 1, "InstanceType": "ml.m5.xlarge", "VolumeSizeInGB": 30, "VolumeKmsKeyId": null } }, "RoleArn": "<IAM role>", "StoppingCondition": { "MaxRuntimeInSeconds": 86400 } }
/opt/ml/config/resourceconfig.json
ファイルには、処理コンテナのホスト名に関する情報が含まれています。分散処理コードを作成または実行するときは、以下のホスト名を使います。
{ "current_host": "algo-1", "hosts": ["algo-1","algo-2","algo-3"] }
/etc/hostname
または /etc/hosts
に含まれているホスト名に関する情報は、正確ではない可能性があるため、使わないでください。
ホスト名の情報は、処理コンテナですぐに利用できない場合があります。ノードがクラスター内で使用可能になった時点で、ホスト名解決操作に再試行ポリシーを追加することをお勧めします。
処理ジョブに関するメタデータ情報の保存とアクセス
終了後に処理コンテナからメタデータを保存するために、コンテナは UTF-8 でエンコードされたテキストを /opt/ml/output/message
ファイルに書き込むことができます。処理ジョブが終了ステータス (「Completed
」、「Stopped
」または「Failed
」) に変わった後、DescribeProcessingJob
の [ExitMessage
] フィールドには、このファイルの最初の 1 KB が含まれます。DescribeProcessingJob
を呼び出して、ファイルの最初の部分にアクセスします。これにより、ExitMessage
パラメータを通じてその部分が返されます。失敗した処理ジョブの場合、このフィールドを使用して、処理コンテナが失敗した理由に関する情報を伝えることができます。
/opt/ml/output/message
ファイルに機密データを書き込まないでください。
このファイルのデータが UTF-8 でエンコードされていない場合、ジョブは失敗し、ClientError
を返します。複数のコンテナが ExitMessage,
で終了すると、各処理コンテナのExitMessage
の内容が連結され、1 KB に切り捨てられます。
SageMaker Python SDK を使って処理コンテナを実行する
SageMaker Python SDK を使って、独自の処理イメージを、Processor
クラスを使うことで実行できます。次の例は、Amazon Simple Storage Service (Amazon S3) から 1 つ入力し、Amazon S3 に 1 つ出力する、独自の処理コンテナを実行する方法を示しています。
from sagemaker.processing import Processor, ProcessingInput, ProcessingOutput processor = Processor(image_uri='<your_ecr_image_uri>', role=role, instance_count=1, instance_type="ml.m5.xlarge") processor.run(inputs=[ProcessingInput( source='<s3_uri or local path>', destination='/opt/ml/processing/input_data')], outputs=[ProcessingOutput( source='/opt/ml/processing/processed_data', destination='<s3_uri>')], ))
処理コードを処理イメージに組み込む代わりに、実行するイメージとコマンドを含む ScriptProcessor
と、コンテナ内で実行するコードを提供することができます。例については、独自の処理コンテナを使用したスクリプトの実行 を参照してください。
Amazon SageMaker Processing が、scikit-learn スクリプトを実行するため SKLearnProcessor
を介して提供する scikit-learn イメージを使うこともできます。例については、「scikit-learn を使ってデータを処理する」を参照してください。