トレーニング ジョブの実行

AI Platform Training は、モデル トレーニングを非同期(バッチ)サービスとして提供します。このページでは、コマンドラインから gcloud ai-platform jobs submit training を実行するか、projects.jobs.create で API にリクエストを送信して、トレーニング ジョブを構成して送信する方法について説明します。

始める前に

トレーニング ジョブを送信する前に、アプリケーションをパッケージ化し、Cloud Storage バケットにアップロードする必要があります。特殊な依存関係がある場合はそれもアップロードします。注: Google Cloud CLI を使用してジョブを送信する場合は、アプリケーションのパッケージ化とジョブの送信を同じ手順で行うことができます。

ジョブを構成する

トレーニング サービスにパラメータを渡すには、Job リソースのメンバーを設定します。このリソースの中に TrainingInput リソースの項目が含まれます。

Google Cloud CLI を使用してトレーニング ジョブを送信する場合は、次のことができます。

  • gcloud ai-platform jobs submit training コマンドのフラグとして、最も一般的なトレーニング パラメータを指定します。
  • YAML 構成ファイルで残りのパラメータを渡す。このファイルには、慣例では config.yaml という名前を付けます。この構成ファイルは、Job リソースの JSON 表現の構造をそのまま反映したものです。構成ファイルのパスは gcloud ai-platform jobs submit training コマンドの --config フラグで渡します。したがって、構成ファイルのパスが config.yaml の場合は --config=config.yaml と設定する必要があります。

ジョブ構成データを収集する

ジョブを定義するとき、次に示すプロパティを使用します。

ジョブ名(jobId
ジョブに使用する名前(英大文字と小文字の混在、数字、アンダースコアのみ、先頭は文字)。
クラスタ構成(scaleTier
ジョブを実行する処理クラスタのタイプを指定するスケール階層CUSTOM スケール階層を指定することもでき、その場合は使用するマシンの数とタイプも明示的に指定します。
ディスク構成(diskConfig
各トレーニング VM のブートディスク構成。このフィールドはオプションです。デフォルトでは、各 VM は 100 GB の pd-ssd ブートディスクで実行されます。このフィールドを指定すると、追加のディスク料金が発生する可能性があります。
トレーニング アプリケーション パッケージ(packageUris
パッケージ化され、Cloud Storage 上の場所にステージングされたトレーニング アプリケーション。Google Cloud CLI を使用している場合、アプリケーションのパッケージ化はほぼ自動化されます。詳細については、アプリケーションのパッケージ化に関するガイドをご覧ください。
モジュール名(pythonModule
パッケージのメイン モジュールの名前。メイン モジュールとは、アプリケーションを起動するときに呼び出す Python ファイルです。gcloud コマンドを使用してジョブを送信する場合は、--module-name フラグにメイン モジュール名を指定します。アプリケーションのパッケージ化に関するガイドをご覧ください。
リージョン(region
ジョブを実行する Compute Engine リージョン。トレーニング ジョブを実行するリージョンは、トレーニング データが格納されている Cloud Storage バケットのリージョンと同一となるようにしてください。AI Platform Training サービスに利用可能なリージョンをご覧ください。
ジョブ ディレクトリ(jobDir
Cloud Storage 上の場所へのパス。ジョブ出力に使用されます。多くのトレーニング アプリケーションは、トレーニング中にはチェックポイントを保存し、ジョブの最後ではトレーニング済みのモデルをファイルに保存します。これらの保存先にする Cloud Storage の場所が必要です。Google Cloud プロジェクトには、このバケットへの書き込みアクセス権が必要です。ジョブ ディレクトリのパスを設定しておくと、そのパスが自動的に job_dir というコマンドライン引数としてトレーニング アプリケーションに渡されます。この引数を、アプリケーションの他の引数と一緒に解析してコード内で使用できます。ジョブ ディレクトリの利点は、アプリケーションを開始する前にトレーニング サービスがディレクトリを検証することです。
ランタイム バージョン(runtimeVersion
ジョブに使用する AI Platform Training のランタイム バージョン
Python バージョン(pythonVersion
ジョブに使用する Python バージョン。Python 3.5 は、ランタイム バージョン 1.13~1.14 で使用できます。Python 3.7 は、ランタイム バージョン 1.15 以上で使用できます。
最大待機時間(scheduling.maxWaitTime
最大待機時間(秒)。サフィックス s を付けて 3600s のように指定します。ジョブが QUEUED 状態や PREPARING 状態を維持できる時間を指定します。AI Platform Training では、リソースの制約により、毎回すぐにジョブを開始するわけではありません。ジョブが実行されるまで一定時間以上待ちたくない場合は、このフィールドを指定します。この制限期間は、ジョブが作成されると始まります。ジョブがこの制限期間内に RUNNING 状態にならなかった場合は、AI Platform Training はジョブをキャンセルします。このフィールドはオプションであり、デフォルトでは無制限になります。このフィールドを指定する場合は、値を 1800s(30 分)以上に設定する必要があります。
最大実行時間(scheduling.maxRunningTime
トレーニング ジョブの最大実行時間(秒)。サフィックス s を付けて 7200s のように指定します。この制限期間は、ジョブが RUNNING 状態になると始まります。この時間の経過後もジョブが実行されている場合、AI Platform Training はジョブをキャンセルします。このフィールドはオプションで、デフォルトは 7 日間(604800s)です。
サービス アカウント(serviceAccount
トレーニング アプリケーションの実行時に AI Platform Training で使用するサービス アカウントのメールアドレス。これにより、プロジェクトの AI Platform にある Google が管理するサービス アカウントに直接アクセス権を付与することなく、トレーニング アプリケーションに Google Cloud リソースへのアクセス権を付与できます。このフィールドは省略可能です。カスタム サービス アカウントの要件の詳細を確認します。

構成パラメータの形式

構成の詳細を指定する方法は、トレーニング ジョブをどのように起動するかによって異なります。

gcloud

ジョブ構成の詳細情報を gcloud ai-platform jobs submit training コマンドに渡します。次の 2 つの方法があります。

  • コマンドライン フラグを使用する。
  • Job リソースを表す YAML ファイルで指定する。このファイルの名前は任意ですが、config.yaml とするのが慣例です。

YAML ファイルを使用する場合でも、コマンドライン フラグで特定の詳細情報を指定する必要があります。たとえば、--module-name フラグに加えて、少なくとも --package-path--packages のどちらかを指定する必要があります。--package-path を使用する場合は、--job-dir--staging-bucket も含める必要があります。また、--region フラグを指定するか、gcloud クライアントのデフォルト リージョンを設定する必要があります。これらのオプションや、コマンドライン フラグとして指定するその他のオプションは、構成ファイル内のオプションの値よりも優先されます。

例 1: この例では、事前構成済みのマシンクラスタを選択し、ジョブの送信時にすべての必要な詳細情報をコマンドライン フラグとして指定します。構成ファイルは必要ありません。次のセクションにあるジョブの送信のガイドをご覧ください。

例 2: 次の例は、カスタム処理クラスタを使用するジョブの構成ファイルの内容です。この構成ファイルには、構成の詳細情報の一部が含まれています(すべてではありません)。ジョブの送信時に、その他の必要な詳細情報をコマンドライン フラグとして指定することが前提となっています。

trainingInput:
  scaleTier: CUSTOM
  masterType: complex_model_m
  workerType: complex_model_m
  parameterServerType: large_model
  workerCount: 9
  parameterServerCount: 3
  runtimeVersion: '2.11'
  pythonVersion: '3.7'
  scheduling:
    maxWaitTime: 3600s
    maxRunningTime: 7200s

上記の例では Python バージョン 3.7 を指定しています。Python バージョン 3.7 は、AI Platform Training ランタイム バージョン 1.15 以上を使用している場合に限り使用できます。また、ワーカーとパラメータ サーバーの仮想マシンも構成します。TensorFlow またはカスタム コンテナを使用して分散トレーニングを実行する場合にのみ、これらのマシンを構成します。詳細については、マシンタイプをご覧ください。

Python

Python 用 Google API クライアント ライブラリを使用してトレーニング ジョブを送信する場合は、Job リソースと同じ構造を持つ辞書に構成情報を設定します。この辞書には、jobIdtrainingInput の 2 つのキーがあります。最初のキーに対応するデータはジョブの名前です。2 つ目のキーに対応するデータは、TrainingInput リソース内のオブジェクトに対応するキーを持つ第 2 の辞書です。

次の例は、カスタム処理クラスタを持つジョブの Job 表現を作成する方法です。

training_inputs = {
    'scaleTier': 'CUSTOM',
    'masterType': 'complex_model_m',
    'workerType': 'complex_model_m',
    'parameterServerType': 'large_model',
    'workerCount': 9,
    'parameterServerCount': 3,
    'packageUris': ['gs://my/trainer/path/package-0.0.0.tar.gz'],
    'pythonModule': 'trainer.task',
    'args': ['--arg1', 'value1', '--arg2', 'value2'],
    'region': 'us-central1',
    'jobDir': 'gs://my/training/job/directory',
    'runtimeVersion': '2.11',
    'pythonVersion': '3.7',
    'scheduling': {'maxWaitTime': '3600s', 'maxRunningTime': '7200s'},
}

job_spec = {'jobId': 'my_job_name', 'trainingInput': training_inputs}

training_inputsjob_spec は任意の識別子です。これらの辞書には任意の名前を付けることができます。ただし、辞書のキーの名前はここに示しているとおりにする必要があります(Job リソースや TrainingInput リソース内の名前と対応させるため)。

上記の例では Python バージョン 3.7 を指定しています。Python バージョン 3.7 は、AI Platform Training ランタイム バージョン 1.15 以上を使用している場合に限り使用できます。また、ワーカーとパラメータ サーバーの仮想マシンも構成します。TensorFlow またはカスタム コンテナを使用して分散トレーニングを実行する場合にのみ、これらのマシンを構成します。詳細については、マシンタイプをご覧ください。

ジョブを送信する

トレーニング ジョブを送信するときは、2 つのフラグセットを指定します。

  • ジョブ構成パラメータ。AI Platform Training は、これらの値を使用してクラウド内にリソースを設定し、処理クラスタ内の各ノードにアプリケーションをデプロイします。
  • ユーザー引数、またはアプリケーション パラメータ。AI Platform Training は、このフラグの値をアプリケーションに渡します。

次のようにしてジョブを作成します。

gcloud

gcloud ai-platform jobs submit training コマンドを使用して、トレーニング ジョブを送信します。

最初に、構成の詳細情報が含まれる環境変数を定義すると便利です。次のコードでは、ジョブ名を作成するためにモデル名に日付と時刻を付加しています。

PACKAGE_PATH="/path/to/your/application/sources"
now=$(date +"%Y%m%d_%H%M%S")
JOB_NAME="your_name_$now"
MODULE_NAME="trainer.task"
JOB_DIR="gs://your/chosen/job/output/path"
REGION="us-east1"
RUNTIME_VERSION="2.11"

次のジョブ送信は、上記の例 1 の構成に対応しています。ここでは、事前構成済みのスケール階層(basic)を選択し、構成に関するすべての詳細情報をコマンドライン フラグで指定しています。config.yaml ファイルは必要ありません。

gcloud ai-platform jobs submit training $JOB_NAME \
        --scale-tier basic \
        --package-path $PACKAGE_PATH \
        --module-name $MODULE_NAME \
        --job-dir $JOB_DIR \
        --region $REGION \
        -- \
        --user_first_arg=first_arg_value \
        --user_second_arg=second_arg_value

次のジョブ送信は、上記の例 2 の構成に対応しています。構成情報の一部はファイルに含まれており、その他の詳細情報はコマンドライン フラグで指定します。

gcloud ai-platform jobs submit training $JOB_NAME \
        --package-path $PACKAGE_PATH \
        --module-name $MODULE_NAME \
        --job-dir $JOB_DIR \
        --region $REGION \
        --config config.yaml \
        -- \
        --user_first_arg=first_arg_value \
        --user_second_arg=second_arg_value

注:

  • 構成ファイル(config.yaml)とコマンドライン フラグの両方でオプションを指定した場合、構成ファイルの値よりもコマンドラインの値が優先されます。
  • 空の -- フラグは、gcloud 固有のフラグの末尾、およびアプリケーションに渡す USER_ARGS の先頭を示します。
  • --module-name--runtime-version--job-dir などの AI Platform Training 固有のフラグは、空の -- フラグの前に指定する必要があります。AI Platform Training サービスがこれらのフラグを解釈します。
  • AI Platform Training はパスの検証に --job-dir を使用するため、--job-dir フラグを指定する場合は、空の -- フラグの前に指定する必要があります。
  • --job-dir フラグが指定されている場合、アプリケーションはこれも処理する必要があります。--job-dir フラグは、空の -- の前に指定されている場合でも、コマンドライン フラグとしてアプリケーションに渡されます。
  • USER_ARGS は必要な数だけ定義できます。AI Platform Training は、--user_first_arg--user_second_arg などをアプリケーションに渡します。

Python

Python 用 Google API クライアント ライブラリを使用すると、HTTP リクエストを手動で作成しなくても、AI Platform Training and Prediction API を呼び出すことができます。次のコードサンプルを実行する前に、認証を設定する必要があります。

  1. API で必要とされる形式('projects/_projectname')でプロジェクト ID を保存します。

    project_name = 'my_project_name'
    project_id = 'projects/{}'.format(project_name)
    
  2. AI Platform Training サービスの Python 表現を取得します。

    cloudml = discovery.build('ml', 'v1')
    
  3. リクエストを作成して送信します。job_spec は、構成パラメータの形式を指定した前のステップで作成したものです。

    request = cloudml.projects().jobs().create(body=job_spec,
                  parent=project_id)
    response = request.execute()
    
  4. HTTP エラーがある場合はキャッチします。最も簡単な方法は、上記のコマンドを try ブロックの中に置くことです。

    try:
        response = request.execute()
        # You can put your code for handling success (if any) here.
    
    except errors.HttpError, err:
        # Do whatever error response is appropriate for your application.
        # For this example, just send some text to the logs.
        # You need to import logging for this to work.
        logging.error('There was an error creating the training job.'
                      ' Check the details:')
        logging.error(err._get_reason())
    

次のステップ