クラウド中のトレーニング モデルに GPU を使用

グラフィック プロセッシング ユニット(GPU)は、多くのディープ ラーニング モデルのトレーニング プロセスを大幅に高速化します。GPU によるトレーニング プロセスの高速化の例としては、画像分類、動画分析、自然言語処理などのディープ ラーニング モデルがあります。これらのモデルのトレーニング プロセスでは、行列乗算などの演算に大量の計算を必要としますが、GPU の超並列アーキテクチャはこのような場合に有利です。このアーキテクチャは、驚異的並列(embarrassingly parallel)ワークロードに対処するために設計されたアルゴリズムに適しています。

極端に大きなデータセットに対して大量の計算タスクを必要とするディープ ラーニング モデルをトレーニングする場合に、プロセッサが 1 つだけでは実行に何日もかかることがあります。しかし、このようなタスクを 1 つまたは複数の GPU にオフロードするようにプログラムを設計すれば、トレーニングに要する時間を日単位から時間単位に短縮できます。

GPU を使用した計算高速化の全般的な情報については、NVIDIA のアクセラレーテッド コンピューティングに関するページをご覧ください。GPU を TensorFlow とともに使用する方法の詳細については、TensorFlow のドキュメントの GPU の使用法をご覧ください。

GPU が有効なマシンのリクエスト

クラウドで GPU を使用するには、GPU が有効なマシンにアクセスするようにトレーニング ジョブを構成します。

  • スケール階層を CUSTOM に設定します。
  • タスクに必要な GPU の数とアクセラレータのタイプに基づいて、以下の GPU が有効なマシンタイプのいずれかを使用するように各タスク(マスター、ワーカー、またはパラメータ サーバー)を構成します。
    • standard_gpu: NVIDIA Tesla K80 GPU 1 個
    • complex_model_m_gpu: NVIDIA Tesla K80 GPU 4 個
    • complex_model_l_gpu: NVIDIA Tesla K80 GPU 8 個
    • standard_p100: NVIDIA Tesla P100 GPU 1 個(ベータ版
    • complex_model_m_p100: NVIDIA Tesla P100 GPU 4 個(ベータ版

以下は、gcloud コマンドを使用してジョブを送信する例です。

Cloud ML Engine の使い方を学習している場合や、GPU が有効なマシンを試してみる場合に、スケール階層を BASIC_GPU に設定して、NVIDIA Tesla K80 GPU が 1 個のワーカー インスタンスを 1 つだけ取得することもできます。

詳しくは、マシンタイプの比較をご覧ください。

それに加えて、ジョブを、GPU がサポートされるリージョンで実行する必要があります。次のリージョンは現在 GPU へのアクセス権を提供します。

  • us-east1
  • us-central1
  • asia-east1
  • europe-west1

モデル トレーニングやオンライン / バッチ予測など、Cloud ML Engine サービスの利用可能なリージョンを完全に理解するには、リージョン ガイドをお読みください。

トレーニング ジョブの送信

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

  1. 必要な GPU オプションを記述した config.yaml ファイルを定義します。YAML ファイルの構造は Job リソースを表します。次に例を示します。

    trainingInput:
      scaleTier: CUSTOM
      masterType: complex_model_m_gpu
      workerType: complex_model_m_gpu
      parameterServerType: large_model
      workerCount: 9
      parameterServerCount: 3
    
  2. gcloud コマンドを使用してジョブを送信します。--config 引数を使用して config.yaml ファイルを指定します。次の例では、いくつかの引数の値に対して、$ 記号と大文字で示される環境変数を設定していることを前提としています。

    gcloud ml-engine jobs submit training $JOB_NAME \
            --package-path $APP_PACKAGE_PATH \
            --module-name $MAIN_APP_MODULE \
            --job-dir $JOB_DIR \
            --region us-central1 \
            --config config.yaml \
            -- \
            --user_arg_1 value_1 \
             ...
            --user_arg_n value_n
    

注:

  • 空の -- 引数は、アプリケーションに渡す 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 が空の -- 引数の前に来ている場合でも、コマンドライン引数としてアプリケーションに渡されます。

ジョブ送信オプションの詳細については、トレーニング ジョブの開始のガイドをご覧ください。

GPU への ops の割り当て

マシン上で GPU を利用するには、それに応じた変更を TensorFlow トレーナー アプリケーションに加えます。

  • High-Level Estimator API: ClusterSpec が正しく構成されていれば、コードの変更は必要ありません。1 つのクラスタで CPU と GPU が混在している場合は、ps ジョブ名を CPU にマッピングし、worker ジョブ名を GPU にマッピングしてください。

  • Core Tensorflow API: GPU が有効なマシンで実行するには、ops を割り当てる必要があります。このプロセスは、ローカルで GPU を TensorFlow とともに使用する場合と同じです。tf.train.replica_device_setter を使用してデバイスに ops を割り当てることができます。

GPU が有効なマシンを Cloud ML Engine プロセスに割り当てると、そのプロセスにそのマシンの GPU への排他的アクセス権が付与されます。クラスタ内の単一マシンの GPU を複数のプロセスで共有することはできません。プロセスは、クラスタ仕様の分散 TensorFlow タスクに対応します。分散 TensorFlow のドキュメントで、クラスタ仕様とタスクについて説明しています。

GPU デバイス文字列

standard_gpu マシンの単一の GPU は "/gpu:0" として識別されます。複数の GPU を持つマシンは、"/gpu:0"、次に "/gpu:1" のように続く ID を使用します。たとえば、complex_model_m_gpu のマシンには GPU が 4 個あり、ID は "/gpu:0" から "/gpu:3" までとなります。

GPU が有効なマシンの Python パッケージ

GPU が有効なマシンには、GPU をサポートする Tensorflow Python パッケージの tensorflow-gpu がプリインストールされています。プリインストールされているすべてのパッケージのリストについては、Cloud ML ランタイム バージョン リストをご覧ください。

メンテナンス イベント

トレーニング ジョブで GPU マシンを使用する場合は、基礎となる仮想マシンが Compute Engine のホスト メンテナンスの対象となる場合があることに注意してください。トレーニング ジョブで使用される GPU が有効な仮想マシンは、こうしたメンテナンス イベントの後に自動的に再起動するように構成されていますが、トレーナーがこれらのシャットダウンに対して復元性があることを確認するために、定期的にモデル チェックポイントを保存し(通常、Cloud Storage パスに沿って、gcloud ml-engine jobs submit training--job-dir 引数で指定します)、チェックポイントがすでに存在する場合に最新のチェックポイントを復元するようにトレーナーが構成されていることを確認する必要があります。

TensorFlow Estimator API はこの機能を実装しています。そのため、モデルがすでに Estimator にラップされている場合、GPU ワーカーのメンテナンス イベントについて心配する必要はありません。

TensorFlow Estimator にモデルをラップすることができず、GPU が有効なトレーニング ジョブにメンテナンス イベントに対する復元性を持たせたい場合は、チェックポイントの保存と復元機能をモデルに書き込む必要があります。TensorFlow は、tf.train モジュールでこうした実装に有用ないくつかのリソースを提供します(具体的には、tf.train.checkpoint_existstf.train.latest_checkpoint など)。

次のステップ

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

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

Cloud Machine Learning Engine(Cloud ML Engine)