Chapter 11

PC:トレーニングジョブ発行

kazuhito
kazuhito
2021.12.22に更新

概要

このチャプターではローカルPCからトレーニングジョブの発行を行います。

ディレクトリ構成

このチャプターで必要なファイル構成は以下です。
前チャプターまでと比較して「create_training_job.py」を追加しています。

├── scripts
│   ├── road_segmentation.py
│   └── train
├── model
│   └── road_segmentation.onnx
├── build_and_push.sh
├── Dockerfile
├── requirements.txt
├── create_training_job.py
├── sample.mp4
└── local_test
    ├── train_local.sh
    └── test_dir
        ├── input
        │   └── data
        │       └── movie
        │           └── sample.mp4
        └── config
            └── hyperparameters.json

このチャプターで使用するソースコード一式は以下リポジトリでも公開しています。

https://github.com/Kazuhito00/Zenn-Book-S3-SageMaker-S3-Sample/tree/main/Chapter-11

AWS SDK for Python(Boto3)インストール

Python向けの AWS SDKをインストールします。

pip3 install boto3

ロール作成

トレーニングジョブを発行する際に、SageMakerにアタッチするロールを作成します。
IAMから「ロールを作成」をクリックします。

信頼されたエンティティの種類は「AWSサービス」を選択します。

「SageMaker」を選択し「次のステップ:アクセス権限」をクリックします。

「次のステップ:タグ」をクリックします。

「次のステップ:確認」をクリックします。

任意のロールを入力し「ロールの作成」をクリックします。

ロールの一覧から、先ほど作成したロールを選択します。

「ポリシーをアタッチします」をクリックします。

「AmazonS3FullAccess」を選択し「ポリシーのアタッチ」をクリックします。

トレーニングジョブ発行スクリプト

以下のようなスクリプトを用意しました。

create_training_job.py
from datetime import datetime

from boto3.session import Session

# SageMakerクライアント作成
client = Session().client("sagemaker", region_name="ap-northeast-1")

# トレーニングジョブ名
training_job_name = "zenn-sample-" + datetime.now().strftime('%Y%m%d-%H%M%S')
# 入力ファイルパス
input_s3uri = "s3://zenn-sample/input/" + "sample.mp4"
# 出力パス
output_s3uri = "s3://zenn-sample/output"

# トレーニングパラメータ
training_params = {
    # トレーニングのジョブ名
    "TrainingJobName": training_job_name,  
    # ハイパーパラメータ
    "HyperParameters": {
        'max_save_frames': '10',
    },
    # Dockerイメージ
    "AlgorithmSpecification": {
        'TrainingImage': "200822241028.dkr.ecr.ap-northeast-1.amazonaws.com/zenn_sample:latest",
        'TrainingInputMode': 'File'
    },
    # SageMakerにアタッチするロール
    "RoleArn": "arn:aws:iam::200822241028:role/zenn_sample", 
    # 入力チャネル
    "InputDataConfig": [
        # 動画格納パス
        {
            'ChannelName': 'movie',
            'DataSource': {
                'S3DataSource': {
                    'S3DataType': 'S3Prefix',
                    'S3Uri': input_s3uri
                }
            }
        }
    ],
    # 出力パス
    "OutputDataConfig": {
        'S3OutputPath': output_s3uri
    },
    # 学習インスタンス指定
    "ResourceConfig": {
        'InstanceType': 'ml.m4.xlarge',
        'InstanceCount': 1,
        'VolumeSizeInGB': 10
    },
    # タイムアウト時間指定
    "StoppingCondition": {
        'MaxRuntimeInSeconds': 60 * 60
    }
}

# トレーニングジョブ発行
response = client.create_training_job(**training_params)
print(response)

以下のように実行します。

python3 create_training_job.py 

SageMakerのサイドバーの「トレーニング」から「トレーニングジョブ」をクリックします。

ステータスInProgressのジョブが追加されています。

暫く待つとステータスがCompletedになります。

S3のoutputフォルダ見に行くとトレーニングジョブ名と同じ名前のフォルダが出来ています。
中には「model.tar.gz」が格納されています。

「model.tar.gz」をダウンロードして中身を見てみると、推論結果が格納されています。

create_training_job.py 詳細

# SageMakerクライアント作成
client = Session().client("sagemaker", region_name="ap-northeast-1")

# トレーニングパラメータ
training_params = {
    # (省略)
}

# トレーニングジョブ発行
response = client.create_training_job(**training_params)

ザックリ言うと SageMakerクライアントを作成して、create_training_job()を実行しているだけです。

パラメータの中身を見ていきます。

    # トレーニングのジョブ名
    "TrainingJobName": training_job_name,  

トレーニングのジョブ名を指定しています。
SageMakerのトレーニングジョブ名の他、S3の出力フォルダ名にもなります。

    # ハイパーパラメータ
    "HyperParameters": {
        'max_save_frames': '10',
    },

ハイパーパラメータの指定です。
ここに指定した内容がDockerコンテナ内の/opt/ml/input/config/hyperparameters.json にコピーされます。

    # Dockerイメージ
    "AlgorithmSpecification": {
        'TrainingImage': "200822241028.dkr.ecr.ap-northeast-1.amazonaws.com/zenn_sample:latest",
        'TrainingInputMode': 'File'
    },

ECRのイメージを指定します。
指定する文字列はECRの「URIのコピー」をクリックするか詳細画面から確認できます。

    # SageMakerにアタッチするロール
    "RoleArn": "arn:aws:iam::200822241028:role/zenn_sample", 

IAMロールのロールARNをコピーして指定します。

    # 入力チャネル
    "InputDataConfig": [
        # 動画格納パス
        {
            'ChannelName': 'movie',
            'DataSource': {
                'S3DataSource': {
                    'S3DataType': 'S3Prefix',
                    'S3Uri': input_s3uri
                }
            }
        }
    ],

入力データを指定します。
ここで指定した内容がDockerコンテナ内の/opt/ml/input/data/<channel_name>/にコピーされます。
S3Uriの指定はファイル単体でもワイルドカード指定も可能です。

    # 出力パス
    "OutputDataConfig": {
        'S3OutputPath': output_s3uri
    },

出力パスを指定します。
Dockerコンテナ内の/opt/ml/modelの中身がアップロードされます。

    # 学習インスタンス指定
    "ResourceConfig": {
        'InstanceType': 'ml.m4.xlarge',
        'InstanceCount': 1,
        'VolumeSizeInGB': 10
    },

学習インスタンスのタイプと個数、ボリュームサイズが指定できます。

    # タイムアウト時間指定
    "StoppingCondition": {
        'MaxRuntimeInSeconds': 60 * 60
    }

ジョブのタイムアウト時間が指定できます。