クラウド内でのモデルのトレーニングに GPU を使用する

グラフィック プロセッシング ユニット(GPU)は、多くのディープ ラーニング モデルのトレーニング プロセスを大幅に高速化します。画像分類、動画分析、自然言語処理などのタスクに使用するトレーニング モデルには、行列乗算などのコンピューティング集約型のオペレーションが必要になります。こうしたオペレーションでは、GPU の超並列アーキテクチャを利用できます。

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

始める前に

AI Platform では、あらゆる TensorFlow トレーニング アプリケーションを GPU 対応のマシン上で実行できます。利用可能な GPU をアプリケーションで使用するには、GPU の使用に関する TensorFlow ガイドGPU にオペレーションを割り当てる方法を説明している下記のセクションをご覧ください。

モデルによっては、GPU で実行するメリットがないこともあります。GPU をおすすめするのは、大規模で複雑なモデルで多数の数学的演算を行う場合です。この場合も、GPU の効果があるかどうかをテストするために、少数のサンプルデータでトレーニングを実行してください。

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

クラウド内で GPU を使用するには、トレーニング ジョブが GPU 対応のマシンにアクセスするように構成します。これには、BASIC_GPU スケール階層を使用する方法、GPU 対応の AI Platform マシンタイプを使用する方法、Compute Engine マシンタイプを使用して GPU を接続する方法の 3 つがあります。

基本的な GPU 対応マシン

AI Platform の使用方法を学んでいる場合や、GPU 対応のマシンを試すことを目的としている場合は、スケール階層を BASIC_GPU に設定できます。この設定では、NVIDIA Tesla K80 GPU が 1 個のワーカー インスタンスを 1 つだけします。

GPU が組み込まれたマシンタイプ

GPU の使用をカスタマイズするには、トレーニング ジョブを次のように構成し、GPU 対応のマシンタイプを指定します。

  • スケール階層を CUSTOM に設定します。
  • タスクに必要な GPUP の数とアクセラレータのタイプに基づいて、以下の 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 個
    • standard_v100: NVIDIA Tesla V100 GPU 1 個
    • large_model_v100: NVIDIA Tesla V100 GPU 1 個
    • complex_model_m_v100: NVIDIA Tesla V100 GPU 4 個
    • complex_model_l_v100: NVIDIA Tesla V100 GPU 8 個

以下は、gcloud コマンドを使用して、GPU 対応のマシンタイプを使用するジョブを送信する例です。

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

GPU が接続される Compute Engine マシンタイプ

または、デフォルトでは GPU が組み込まれていない Compute Engine マシンタイプを使用してトレーニング ジョブを構成する場合、ジョブを加速化するために任意の数の GPU を接続できます。

  • スケール階層を CUSTOM に設定します。
  • 各ワーカータイプ(マスター、ワーカー、パラメータ サーバー)が有効な Compute Engine マシンタイプを使用するように構成します。
  • 加速化する仮想マシンに応じて、使用する GPU のタイプと数を指定した acceleratorConfig フィールドmasterConfigworkerConfig または parameterServerConfig に追加します。次のタイプの GPU を使用できます。
    • NVIDIA_TESLA_K80
    • NVIDIA_TESLA_P4 (ベータ版)
    • NVIDIA_TESLA_P100
    • NVIDIA_TESLA_V100

有効な acceleratorConfig を作成するには、いくつかの制限事項を考慮する必要があります。

  1. 構成では特定の数の GPU のみを使用できます。たとえば NVIDIA Tesla K80 では、2 個または 4 個は接続できますが、3 個は接続できません。各 GPU タイプの接続可能な個数を確認するには、下記の互換性の表をご覧ください。

  2. それぞれの GPU 構成で、接続先のマシンタイプに十分な数の仮想 CPU とメモリ容量が提供される必要があります。たとえば、ワーカーとして n1-standard-32 を使用する場合、ワーカーあたりの仮想 CPU は 32 個、メモリ容量は 120 GB となります。各 NVIDIA Tesla V100 が提供する仮想 CPU は最大 8 個、メモリは最大 52 GB であるため、この要件をサポートするためには n1-standard-32 ワーカーごとに少なくとも 4 個の GPU を接続する必要があります。

    互換性を確認するには、マシンタイプの仕様表コンピューティング ワークロード用 GPU の比較、または下記の互換性の表をご覧ください。

    場合によっては、AI Platform の GPU リソースに次の制限事項も適用されることにご注意ください。

    • 8 個の NVIDIA Tesla K80 GPU を使用する構成で提供できるメモリ容量は、すべてのリージョンとゾーンで最大 208 GB に限られます
    • 4 個の NVIDIA Tesla P100 GPU を使用する構成では、すべてのリージョンとゾーンで最大 64 個の仮想 CPU と最大 208 GB のメモリのみがサポートされます。
  3. トレーニング ジョブの送信先は、GPU 構成をサポートしているリージョンでなければなりません。下記のリージョンのサポートについてお読みください。

次の表は、各 Compute Engine マシンタイプに接続できるタイプ別アクセラレータの数を記載したクイック リファレンスです。

各マシンタイプに有効な GPU の数
マシンタイプ NVIDIA Tesla K80 NVIDIA Tesla P4(ベータ版) NVIDIA Tesla P100 NVIDIA Tesla V100
n1-standard-4 1、2、4、8 1、2、4 1、2、4 1、2、4、8
n1-standard-8 1、2、4、8 1、2、4 1、2、4 1、2、4、8
n1-standard-16 2、4、8 1、2、4 1、2、4 2、4、8
n1-standard-32 4、8 2、4 2、4 4、8
n1-standard-64 4 8
n1-standard-96 4 8
n1-highmem-2 1、2、4、8 1、2、4 1、2、4 1、2、4、8
n1-highmem-4 1、2、4、8 1、2、4 1、2、4 1、2、4、8
n1-highmem-8 1、2、4、8 1、2、4 1、2、4 1、2、4、8
n1-highmem-16 2、4、8 1、2、4 1、2、4 2、4、8
n1-highmem-32 4、8 2、4 2、4 4、8
n1-highmem-64 4 8
n1-highmem-96 4 8
n1-highcpu-16 2、4、8 1、2、4 1、2、4 2、4、8
n1-highcpu-32 4、8 2、4 2、4 4、8
n1-highcpu-64 8 4 4 8
n1-highcpu-96 4 8

以下は、GPU が接続された Compute Engine マシンタイプを使用してジョブを送信する例です。

GPU をサポートしているリージョン

GPU をサポートしているリージョンでジョブを実行する必要があります。現在、次のリージョンで GPU にアクセスできます。

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

さらに、上記のリージョンの一部では、使用できる GPU が特定のタイプに限られています。モデル トレーニングやオンライン予測などの AI Platform サービスで利用可能なリージョンの詳細については、リージョンのガイドをご覧ください。

トレーニング ジョブで複数のタイプの GPU を使用する場合、それらの GPU のすべてがリージョン内の同じゾーンで使用可能でなければなりません。たとえば us-central1 内では、NVIDIA Tesla V100 GPU を使用するマスター ワーカー、NVIDIA Tesla K80 GPU を使用するワーカー、NVIDIA Tesla P100 GPU を使用するパラメータ サーバーによってジョブを実行することはできません。us-central1 内ではこれらすべての GPU をトレーニング ジョブに使用できますが、このリージョンには、3 タイプの GPU をすべて提供しているゾーンはありません。ゾーンでの GPU の可用性については、コンピューティング ワークロード用 GPU の比較をご覧ください。

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

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

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

    最初の例は、AI Platform マシンタイプと GPU が組み込まれた AI Platform マシンタイプを使用するトレーニング ジョブの構成ファイルを示しています。

    trainingInput:
      scaleTier: CUSTOM
      # Configure a master worker with 4 K80 GPUs
      masterType: complex_model_m_gpu
      # Configure 9 workers, each with 4 K80 GPUs
      workerCount: 9
      workerType: complex_model_m_gpu
      # Configure 3 parameter servers with no GPUs
      parameterServerCount: 3
      parameterServerType: large_model
    

    次の例に示す構成ファイルは、上記の例と同じように構成されたジョブを対象としていますが、この構成では GPU が接続される Compute Engine マシンタイプを使用しています。このタイプの構成はベータ版です。

    trainingInput:
      scaleTier: CUSTOM
      # Configure a master worker with 4 K80 GPUs
      masterType: n1-highcpu-16
      masterConfig:
        acceleratorConfig:
          count: 4
          type: NVIDIA_TESLA_K80
      # Configure 9 workers, each with 4 K80 GPUs
      workerCount: 9
      workerType: n1-highcpu-16
      workerConfig:
        acceleratorConfig:
          count: 4
          type: NVIDIA_TESLA_K80
      # Configure 3 parameter servers with no GPUs
      parameterServerCount: 3
      parameterServerType: n1-highmem-8
    
  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 beta コンポーネントをインストールすると、クラスタ構成の詳細を構成ファイル内に指定するのではなく、コマンドライン フラグを使用して指定できます。詳しくは、該当するフラグの使用方法をご覧ください。gcloud beta コンポーネントをインストールまたは更新するには、gcloud components install beta を実行します。

次の例は、前の例と同じ構成の(GPU が接続された Compute Engine マシンタイプを使用する)ジョブを送信する方法を示しています。ただし、この例では config.yaml ファイルは使用されていません。

gcloud beta ml-engine jobs submit training $JOB_NAME \
        --package-path $APP_PACKAGE_PATH \
        --module-name $MAIN_APP_MODULE \
        --job-dir $JOB_DIR \
        --region us-central1 \
        --scale-tier custom \
        --master-machine-type n1-highcpu-16 \
        --master-accelerator count=4,type=nvidia-tesla-k80 \
        --worker-server-count 9 \
        --worker-machine-type n1-highcpu-16 \
        --worker-accelerator count=4,type=nvidia-tesla-k80 \
        --parameter-server-count 3 \
        --parameter-server-machine-type n1-highmem-8 \
        -- \
        --user_arg_1 value_1 \
         ...
        --user_arg_n value_n

注:

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

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

GPU へのオペレーションの割り当て

マシン上で GPU を利用するには、そのための変更を TensorFlow トレーニング アプリケーションに加える必要があります。

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

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

GPU 対応マシンを AI Platform プロセスに割り当てると、そのプロセスはマシンの GPU に排他的にアクセスできます。クラスタ内の 1 台のマシンの 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 など)。

次のステップ

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

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

TensorFlow 用 AI Platform