

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

# SageMaker 用のカスタム Docker コンテナイメージを作成し、AWS Step Functions のモデルトレーニングに使用する
<a name="create-a-custom-docker-container-image-for-sagemaker-and-use-it-for-model-training-in-aws-step-functions"></a>

*Amazon Web Services、Julia Bluszcz、Aubrey Oosthuizen、Mohan Gowda Purushothama、Neha Sharma、および Mateusz Zaremba*

## 概要
<a name="create-a-custom-docker-container-image-for-sagemaker-and-use-it-for-model-training-in-aws-step-functions-summary"></a>

このパターンは、[Amazon SageMaker](https://docs.aws.amazon.com/sagemaker/latest/dg/whatis.html) 用の Docker コンテナイメージを作成し、それを [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html) のトレーニングモデルに使用する方法を示しています。アルゴリズムをコンテナにパッケージ化することにより、プログラミング言語、フレームワーク、依存関係に関係なく、ほぼすべてのコードを SageMaker 環境で実行できます。

提供されている [SageMaker ノートブック](https://docs.aws.amazon.com/sagemaker/latest/dg/nbi.html)の例では、カスタム Docker コンテナイメージが [Amazon Elastic Container Registry (Amazon ECR)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) に保存されています。Step Functions は Amazon ECR に保存されているコンテナを使用して、SageMaker 用の Python 処理スクリプトを実行します。その後、コンテナは [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) にモデルをエクスポートします。

## 前提条件と制限事項
<a name="create-a-custom-docker-container-image-for-sagemaker-and-use-it-for-model-training-in-aws-step-functions-prereqs"></a>

**前提条件**
+ アクティブなAWS アカウント
+ Amazon S3 アクセス許可を持つ [SageMaker 用 AWS アイデンティティとアクセス管理 (IAM) ロール](https://docs.aws.amazon.com/sagemaker/latest/dg/sagemaker-roles.html)
+ [Step Functions 用の IAM ロール](https://sagemaker-examples.readthedocs.io/en/latest/step-functions-data-science-sdk/step_functions_mlworkflow_processing/step_functions_mlworkflow_scikit_learn_data_processing_and_model_evaluation.html#Create-an-Execution-Role-for-Step-Functions)
+ Python に精通
+ Amazon SageMaker Python SDK に精通していること
+ AWS Command Line Interface (AWS CLI) に精通していること
+ AWS SDK for Python (Boto3) に精通していること
+ Amazon ECR に精通している
+ Docker に精通していること

**製品バージョン**
+ AWS Step Functions データサイエンス SDK バージョン 2.3.0
+ Amazon SageMaker Python SDK バージョン 2.78.0

## アーキテクチャ
<a name="create-a-custom-docker-container-image-for-sagemaker-and-use-it-for-model-training-in-aws-step-functions-architecture"></a>

次の図は、SageMaker 用の Docker コンテナイメージを作成し、それを Step Functions のトレーニングモデルに使用するためのワークフローの例を示しています。

![SageMaker 用の Docker コンテナイメージを作成し、それを Step Functions でトレーニングモデルに使用するためのワークフロー](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/7857d57f-3077-4b06-8971-fb5846387693/images/37755e38-0bc4-4dd0-90c7-135d95b00053.png)


この図表は、次のワークフローを示しています:

1. データサイエンティストまたは DevOps エンジニアは、Amazon SageMaker ノートブックでカスタム Docker コンテナイメージを作成します。

1. データサイエンティストまたは DevOps エンジニアは、Docker コンテナイメージをプライベートレジストリにおける Amazon ECR プライベートリポジトリに保存します。

1. データサイエンティストまたは DevOps エンジニアは、Docker コンテナで、Step Functions ワークフロー内の Python SageMaker 処理ジョブを実行します。

**自動化とスケール**

このパターンの SageMaker ノートブックの例としては、`ml.m5.xlarge` ノートブックインスタンスタイプを使用します。ユースケースに応じて、インスタンスタイプを変更することができます。SageMaker ノートブックインスタンスタイプの詳細については、「[Amazon SageMaker の料金表](https://aws.amazon.com/sagemaker/pricing/)」を参照してください。

## ツール
<a name="create-a-custom-docker-container-image-for-sagemaker-and-use-it-for-model-training-in-aws-step-functions-tools"></a>
+ [Amazon Elastic Container Registry (Amazon ECR)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) は、セキュリティ、スケーラビリティ、信頼性を備えたマネージドコンテナイメージレジストリサービスです。
+ [「Amazon SageMaker」](https://docs.aws.amazon.com/sagemaker/latest/dg/whatis.html) はマネージド型の機械学習 (ML) サービスで、ML モデルの構築とトレーニングを行い、それらを本番稼働環境に対応したホスティング環境にデプロイします。
+ [Amazon SageMaker Python SDK](https://github.com/aws/sagemaker-python-sdk) は、SageMaker で機械学習モデルのトレーニングおよびそれを展開するためのオープンソースライブラリです。
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html)は、AWS Lambda 関数と他のAWS サービスを組み合わせてビジネスクリティカルなアプリケーションを構築できるサーバーレスオーケストレーションサービスです。
+ [AWS Step Functions データサイエンス Python SDK](https://aws-step-functions-data-science-sdk.readthedocs.io/en/stable/index.html) は、機械学習モデルを処理および公開する Step Functions のワークフローの作成を支援するオープンソースライブラリです。

## エピック
<a name="create-a-custom-docker-container-image-for-sagemaker-and-use-it-for-model-training-in-aws-step-functions-epics"></a>

### カスタム Docker コンテナイメージを作成して Amazon ECR に保存します。
<a name="create-a-custom-docker-container-image-and-store-it-in-amazon-ecr"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Amazon ECR をセットアップし、新しいプライベートレジストリを作成します。 | まだ Amazon ECR をセットアップしていない場合は、「*Amazon ECR ユーザーガイド*」の「[Amazon ECR のセットアップ](https://docs.aws.amazon.com/AmazonECR/latest/userguide/get-set-up-for-amazon-ecr.html)」に記載されている指示に従ってください。各 AWS アカウントには、デフォルトのプライベート Amazon ECR レジストリが提供されます。 | DevOps エンジニア | 
| Amazon ECR プライベートリポジトリを作成します。 | 「*Amazon ECR ユーザーガイド*」の「[プライベートリポジトリの作成](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)」に記載されている指示に従ってください。作成したリポジトリは、カスタム Docker コンテナイメージを保存する場所です。 | DevOps エンジニア | 
| SageMaker 処理ジョブの実行に必要な仕様を含む Docker ファイルを作成します。 | Dockerfile を設定して、SageMaker 処理ジョブの実行に必要な仕様を含む Dockerfile を作成します。手順については、Amazon SageMaker 開発者ガイドの「[独自のトレーニングコンテナの調整](https://docs.aws.amazon.com/sagemaker/latest/dg/adapt-training-container.html)」を参照してください。<br />Docker ファイルの詳細については、「Docker ドキュメント」の「[Dockerfile ファイルリファレンス](https://docs.docker.com/engine/reference/builder/)」を参照してください。<br />**例：Jupyter Notebookのコードセルで［Dockerfile］を作成**<br />セル 1<pre># Make docker folder<br />!mkdir -p docker</pre><br />セル 2<pre>%%writefile docker/Dockerfile<br /><br />FROM python:3.7-slim-buster<br /><br />RUN pip3 install pandas==0.25.3 scikit-learn==0.21.3<br />ENV PYTHONUNBUFFERED=TRUE<br /><br />ENTRYPOINT ["python3"]</pre> | DevOps エンジニア | 
| Docker コンテナイメージを構築し、Amazon ECR にプッシュします。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/create-a-custom-docker-container-image-for-sagemaker-and-use-it-for-model-training-in-aws-step-functions.html)詳細については、GitHub での独自のアルゴリズムコンテナの構築の「[コンテナの構築と登録](https://sagemaker-examples.readthedocs.io/en/latest/advanced_functionality/scikit_bring_your_own/scikit_bring_your_own.html#Building-and-registering-the-container)」を参照してください。<br />**Docker イメージを構築して登録する Jupyter Notebookのコードセルの例**次のセルを実行する前に、Docker ファイルを作成し、`docker` というディレクトリに保存していることを確認します。また、Amazon ECR リポジトリが作成されたことを確認し、最初のセルの `ecr_repository` 値をリポジトリの名前に置き換えてください。<br />セル 1<pre>import boto3<br />tag = ':latest'<br />account_id = boto3.client('sts').get_caller_identity().get('Account')<br />region = boto3.Session().region_name<br />ecr_repository = 'byoc'<br /><br />image_uri = '{}.dkr.ecr.{}.amazonaws.com/{}'.format(account_id, region, ecr_repository + tag)</pre><br />セル 2<pre># Build docker image<br />!docker build -t $image_uri docker</pre><br />セル 3<pre># Authenticate to ECR<br />!aws ecr get-login-password --region {region} | docker login --username AWS --password-stdin {account_id}.dkr.ecr.{region}.amazonaws.com</pre><br />セル 4<pre># Push docker image<br />!docker push $image_uri</pre>[Docker クライアントをプライベートレジストリに認証](https://docs.aws.amazon.com/AmazonECR/latest/userguide/registry_auth.html)して、`docker push` と `docker pull` コマンドを使用できるようにする必要があります。これらのコマンドは、レジストリ内のリポジトリにイメージをプッシュし、またはレジストリのリポジトリからイメージをプルします。 | DevOps エンジニア | 

### カスタム Docker コンテナイメージを使用する Step Functions ワークフローを作成
<a name="create-a-step-functions-workflow-that-uses-your-custom-docker-container-image"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| カスタム処理とモデルトレーニングロジックを含む Python スクリプトを作成します。 | カスタム処理ロジックを書き込んでデータ処理スクリプトで実行します。その後、これを Python スクリプトとして、`training.py` という名前で保存します。<br />詳細については、GitHub の「[SageMaker スクリプトモードでモデルを自作](https://sagemaker-examples.readthedocs.io/en/latest/sagemaker-script-mode/sagemaker-script-mode.html)」を参照してください。<br />カスタム処理とモデルトレーニングロジックを含む Python スクリプトの例<pre>%%writefile training.py<br />from numpy import empty<br />import pandas as pd<br />import os<br />from sklearn import datasets, svm<br />from joblib import dump, load<br /><br /><br />if __name__ == '__main__':<br />    digits = datasets.load_digits()<br />    #create classifier object<br />    clf = svm.SVC(gamma=0.001, C=100.)<br />    <br />    #fit the model<br />    clf.fit(digits.data[:-1], digits.target[:-1])<br />    <br />    #model output in binary format<br />    output_path = os.path.join('/opt/ml/processing/model', "model.joblib")<br />    dump(clf, output_path)</pre> | データサイエンティスト | 
| SageMaker 処理ジョブをステップの 1 つとして含むステップファンクションワークフローを作成します。 | [AWS Step Functions データサイエンス SDK](https://aws-step-functions-data-science-sdk.readthedocs.io/en/stable/readmelink.html)をインストールしてインポートし、**training.py** ファイルを Amazon S3 にアップロードします。その後、「[Amazon SageMaker Python SDK](https://github.com/aws/sagemaker-python-sdk)」 でステップファンクションの処理ステップを定義します。AWS アカウントで [Step Functions 用の IAM 実行ロールを作成](https://sagemaker-examples.readthedocs.io/en/latest/step-functions-data-science-sdk/step_functions_mlworkflow_processing/step_functions_mlworkflow_scikit_learn_data_processing_and_model_evaluation.html#Create-an-Execution-Role-for-Step-Functions)していることを確認してください。<br />Amazon S3 にアップロードする環境設定例とカスタムトレーニングスクリプト<pre>!pip install stepfunctions<br /><br />import boto3<br />import stepfunctions<br />import sagemaker<br />import datetime<br /><br />from stepfunctions import steps<br />from stepfunctions.inputs import ExecutionInput<br />from stepfunctions.steps import (<br />    Chain<br />)<br />from stepfunctions.workflow import Workflow<br />from sagemaker.processing import ScriptProcessor, ProcessingInput, ProcessingOutput<br /><br />sagemaker_session = sagemaker.Session()<br />bucket = sagemaker_session.default_bucket() <br />role = sagemaker.get_execution_role()<br />prefix = 'byoc-training-model'<br /><br /># See prerequisites section to create this role<br />workflow_execution_role = f"arn:aws:iam::{account_id}:role/AmazonSageMaker-StepFunctionsWorkflowExecutionRole"<br /><br />execution_input = ExecutionInput(<br />    schema={<br />        "PreprocessingJobName": str})<br /><br /><br />input_code = sagemaker_session.upload_data(<br />    "training.py",<br />    bucket=bucket,<br />    key_prefix="preprocessing.py",<br />)</pre><br />カスタム Amazon ECR イメージと Python スクリプトを使用する SageMaker 処理ステップ定義の例`execution_input` パラメータを使用してジョブ名を指定していることを確認してください。パラメータの値は、ジョブを実行するたびに一意でなければなりません。また、**training.py** ファイルのコードは `input` パラメータとして`ProcessingStep` に渡されます。つまり、このコードはコンテナ内にコピーされるということです。`ProcessingInput` コードの宛先は、`container_entrypoint` 内の 2 番目の引数と同じです。<pre>script_processor = ScriptProcessor(command=['python3'],<br />                image_uri=image_uri,<br />                role=role,<br />                instance_count=1,<br />                instance_type='ml.m5.xlarge')<br /><br /><br />processing_step = steps.ProcessingStep(<br />    "training-step",<br />    processor=script_processor,<br />    job_name=execution_input["PreprocessingJobName"],<br />    inputs=[<br />        ProcessingInput(<br />            source=input_code,<br />            destination="/opt/ml/processing/input/code",<br />            input_name="code",<br />        ),<br />    ],<br />    outputs=[<br />        ProcessingOutput(<br />            source='/opt/ml/processing/model', <br />            destination="s3://{}/{}".format(bucket, prefix), <br />            output_name='byoc-example')<br />    ],<br />    container_entrypoint=["python3", "/opt/ml/processing/input/code/training.py"],<br />)</pre><br />SageMaker 処理ジョブを実行するStep Functions ワークフローの例このサンプルワークフローに含まれているのは、SageMaker 処理ジョブステップのみであり、Step Functions ワークフローのすべてのステップが含まれているわけではありません。完全なワークフローの例については、「AWS Step Functions データサイエンス SDK ドキュメント」の「[SageMaker のノートブック例](https://aws-step-functions-data-science-sdk.readthedocs.io/en/stable/readmelink.html#example-notebooks-in-sagemaker)」を参照してください。<pre>workflow_graph = Chain([processing_step])<br /><br />workflow = Workflow(<br />    name="ProcessingWorkflow",<br />    definition=workflow_graph,<br />    role=workflow_execution_role<br />)<br /><br />workflow.create()<br /># Execute workflow<br />execution = workflow.execute(<br />    inputs={<br />        "PreprocessingJobName": str(datetime.datetime.now().strftime("%Y%m%d%H%M-%SS")),  # Each pre processing job (SageMaker processing job) requires a unique name,<br />    }<br />)<br />execution_output = execution.get_output(wait=True)</pre> | データサイエンティスト | 

## 関連リソース
<a name="create-a-custom-docker-container-image-for-sagemaker-and-use-it-for-model-training-in-aws-step-functions-resources"></a>
+ 「[データのプロセス](https://docs.aws.amazon.com/sagemaker/latest/dg/processing-job.html)」(「*Amazon SageMaker デベロッパーガイド*」)
+ 「[独自のトレーニングコンテナを調整する](https://docs.aws.amazon.com/sagemaker/latest/dg/adapt-training-container.html)」(「*Amazon SageMaker 開発者ガイド*」)