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 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
リソースと同じ構造を持つ辞書に構成情報を設定します。この辞書には、jobId
と trainingInput
の 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_inputs
と job_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 と Prediction API を呼び出すことができます。次のサンプルコードを実行する前に、認証を設定する必要があります。
API で必要とされる形式('projects/_projectname')でプロジェクト ID を保存します。
project_name = 'my_project_name' project_id = 'projects/{}'.format(project_name)
AI Platform Training サービスの Python 表現を取得します。
cloudml = discovery.build('ml', 'v1')
リクエストを作成して送信します。
job_spec
は、構成パラメータの形式を指定した前のステップで作成したものです。request = cloudml.projects().jobs().create(body=job_spec, parent=project_id) response = request.execute()
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())
次のステップ
- 実行中のトレーニング ジョブをモニタリングまたは可視化する。
- マシンタイプの指定の詳細を参照する。
- ハイパーパラメータ調整ジョブの構成方法を参照する。
- 予測用のトレーニング済みモデルをデプロイする準備を行う。