独自の処理コンテナを構築する (高度なシナリオ) - Amazon SageMaker

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

独自の処理コンテナを構築する (高度なシナリオ)

データ処理、特徴量エンジニアリング、モデル評価ワークロードを実行する独自のコードと依存関係を持つ 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.ImageUriCreateProcessingJob オペレーションで指定した 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 命令を使用して、エントリポイントおよびコマンドライン引数を設定できます。CreateProcessingJobContainerEntrypoint および ContainerArgument パラメータが Docker イメージのエントリポイントと引数を設定する方法は、Docker が Docker API を介してエントリポイントと引数を上書きする方法を反映しています

    • ContainerEntrypointContainerArguments も指定されていない場合、Processing はイメージ内のデフォルトの ENTRYPOINT または CMD を使います。

    • ContainerEntrypoint が指定され、ContainerArguments が指定されていない場合、Processing は指定されたエントリポイントを使ってイメージを実行し、イメージ内の ENTRYPOINT および CMD は無視されます。

    • ContainerArguments が指定され、ContainerEntrypoint が指定されていない場合、Processing はイメージ内のデフォルトの ENTRYPOINT と指定された引数を使ってイメージを実行します。

    • ContainerEntrypointContainerArguments の両方が指定されている場合、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 の場所を設定します。ProcessingInputProcessingOutput の両方で、処理コンテナ内のパスは /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 を使ってデータを処理する」を参照してください。