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

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

始める前に

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

ジョブを構成する

Job リソースのメンバーを設定することによって、トレーニング サービスにパラメータを渡します。構成内容には TrainingInput リソース内の項目も含まれます。

gcloud コマンドライン ツールを使用してトレーニング ジョブを送信する場合、次を行うことができます。

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

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

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

ジョブ名(jobId
ジョブに使用する名前(英大文字と小文字の混在、数字、アンダースコアのみ、先頭は文字)。
クラスタ構成(scaleTier
ジョブを実行する処理クラスタのタイプを指定するスケール階層CUSTOM スケール階層を指定することもでき、その場合は使用するマシンの数とタイプも明示的に指定します。
トレーニング アプリケーション パッケージ(packageUris
パッケージ化され、Cloud Storage 上の場所にステージングされたトレーニング アプリケーション。gcloud コマンドライン ツールを使用する場合、アプリケーションのパッケージ化手順はほぼ自動化されます。詳細については、アプリケーションのパッケージ化に関するガイドをご覧ください。
モジュール名(pythonModule
パッケージのメイン モジュールの名前。メイン モジュールとは、アプリケーションを起動するときに呼び出す Python ファイルです。gcloud コマンドを使用してジョブを送信する場合は、--module-name フラグにメイン モジュール名を指定します。アプリケーションのパッケージングに関するガイドをご覧ください。
リージョン(region
ジョブを実行する Compute Engine リージョン。トレーニング ジョブを実行するリージョンは、トレーニング データが格納されている Cloud Storage バケットのリージョンと同一となるようにしてください。Cloud ML Engine サービスの利用可能なリージョンをご覧ください。
ジョブ ディレクトリ(jobDir
Cloud Storage 上の場所へのパス。ジョブ出力に使用されます。多くのトレーニング アプリケーションは、トレーニング中にはチェックポイントを保存し、ジョブの最後ではトレーニング済みのモデルをファイルに保存します。これらの保存先にする Cloud Storage の場所が必要です。Google Cloud Platform プロジェクトには、このバケットへの書き込みアクセス権が必要です。ジョブ ディレクトリのパスを設定しておくと、そのパスが自動的に job_dir というコマンドライン引数としてトレーニング アプリケーションに渡されます。この引数を、アプリケーションの他の引数と一緒に解析してコード内で使用することができます。ジョブ ディレクトリの利点は、アプリケーションを開始する前にトレーニング サービスがディレクトリを検証することです。
ランタイム バージョン(runtimeVersion

ジョブに使用する Cloud ML Engine バージョン

Python バージョン(pythonVersion

ジョブに使用する Python バージョン。Python 3.5 は、Cloud ML Engine ランタイム バージョン 1.4 以上で使用できます。Python バージョンを指定しない場合、Python 2.7 が使用されます。

構成パラメータの形式

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

gcloud

gcloud ml-engine 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
  runtimeVersion: '1.10'
  pythonVersion: '3.5'

上記の例では Python バージョン 3.5 を指定しています。Python バージョン 3.5 は、Cloud ML Engine ランタイム バージョン 1.4 以上を使用している場合に限り使用できます。

Python

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

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

training_inputs = {'scaleTier': 'CUSTOM',
    'masterType': 'complex_model_m',
    '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': '1.10',
    'pythonVersion': '3.5'}

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

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

上記の例では Python バージョン 3.5 を指定しています。Python バージョン 3.5 は、Cloud ML Engine ランタイム バージョン 1.4 以上を使用している場合に限り使用できます。

ジョブを送信する

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

  • ジョブ構成パラメータ。Cloud ML Engine では、クラウドでリソースを設定し、処理クラスタ内の各ノードにアプリケーションをデプロイするために、これらの値が必要です。
  • ユーザー引数、またはアプリケーション パラメータ。Cloud ML Engine は、これらのフラグの値をアプリケーションに渡します。

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

gcloud

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

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

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

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

gcloud ml-engine jobs submit training $JOB_NAME \
        --scale-tier basic \
        --package-path $TRAINER_PACKAGE_PATH \
        --module-name $MAIN_TRAINER_MODULE \
        --job-dir $JOB_DIR \
        --region $REGION \
        -- \
        --user_first_arg=first_arg_value \
        --user_second_arg=second_arg_value

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

gcloud ml-engine jobs submit training $JOB_NAME \
        --package-path $TRAINER_PACKAGE_PATH \
        --module-name $MAIN_TRAINER_MODULE \
        --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 などの Cloud ML Engine 固有のフラグは、空の -- フラグの前に指定する必要があります。Cloud ML Engine サービスが、これらのフラグを解釈します。
  • Cloud ML Engine は --job-dir を使用してパスを検証するため、--job-dir フラグを指定する場合は、空の -- フラグの前に指定する必要があります。
  • --job-dir フラグが指定されている場合、アプリケーションはこれも処理する必要があります。--job-dir フラグが空の -- の前に来ている場合でも、コマンドライン フラグとしてアプリケーションに渡されます。
  • USER_ARGS は必要な数だけ定義できます。Cloud ML Engine は、--user_first_arg--user_second_arg などをアプリケーションに渡します。

Python

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

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

    cloudml = discovery.build('ml', 'v1')
    
  3. リクエストを作成して送信します。

    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())
    

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

scikit-learn と XGBoost の Cloud ML Engine