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

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

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

始める前に

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

カスタム コンテナをトレーニングに使用する場合は、TensorFlow 以外の機械学習フレームワークで GPU を使用することもできます。

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

GPU 対応マシンのリクエスト

クラウドで GPU を使用するには、次のいずれかの方法で GPU 対応マシンにアクセスするようにトレーニング ジョブを構成します。

  • BASIC_GPU スケール階層を使用します。
  • Compute Engine のマシンタイプを使用し、GPU を接続します。
  • GPU 対応のレガシー マシンタイプを使用します。

基本的な GPU 対応マシン

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

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_T4
    • NVIDIA_TESLA_V100

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

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

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

    互換性を確認するには、マシンタイプの仕様表コンピューティング ワークロード用 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 T4 NVIDIA Tesla V100
n1-standard-4 1、2、4、8 1、2、4 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 1、2、4、8
n1-standard-16 2、4、8 1、2、4 1、2、4 1、2、4 2、4、8
n1-standard-32 4、8 2、4 2、4 2、4 4、8
n1-standard-64 4 4 8
n1-standard-96 4 4 8
n1-highmem-2 1、2、4、8 1、2、4 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 1、2、4、8
n1-highmem-8 1、2、4、8 1、2、4 1、2、4 1、2、4 1、2、4、8
n1-highmem-16 2、4、8 1、2、4 1、2、4 1、2、4 2、4、8
n1-highmem-32 4、8 2、4 2、4 2、4 4、8
n1-highmem-64 4 4 8
n1-highmem-96 4 4 8
n1-highcpu-16 2、4、8 1、2、4 1、2、4 1、2、4 2、4、8
n1-highcpu-32 4、8 2、4 2、4 2、4 4、8
n1-highcpu-64 8 4 4 4 8
n1-highcpu-96 4 4 8

GPU が接続された Compute Engine マシンタイプを使用してジョブを送信する例については後述します。

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

代わりに、acceleratorConfig 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 個
    • 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 をサポートしているリージョン

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

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

さらに、上記のリージョンの一部では、使用できる 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 ai-platform jobs submit training コマンドを実行します。

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

    最初の例は、Compute Engine マシンタイプと 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
    

    次の例に示す構成ファイルは、上記の例と同じように構成されたジョブを対象としています。ただし、この構成では、acceleratorConfig で GPU を接続する代わりに、GPU を含むレガシー マシンタイプを使用します。

    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
    
  2. gcloud コマンドを使用してジョブを送信します。--config 引数を使用して config.yaml ファイルを指定します。次の例では、いくつかの引数の値に対して環境変数が設定されていることを前提としています。環境変数は、$ 記号の後に大文字が続く形式で示されています。

    gcloud ai-platform 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
    

コマンドラインのフラグに構成ファイルではなく、クラスタ構成の詳細を指定することもできます。詳しくは、該当するフラグの使用方法をご覧ください。

次の例では、最初の例と同じ構成を使用してジョブを送信していますが(GPU を含む Compute Engine マシンタイプを使用しています)、config.yaml ファイルは使用していません。

gcloud ai-platform 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-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 フラグは、空の -- の前に指定されている場合でも、コマンドライン フラグとしてアプリケーションに渡されます。
  • 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 ai-platform jobs submit training--job-dir 引数で指定します)、既存のチェックポイントがある場合は最新のチェックポイントを復元するようにトレーニング アプリケーションを構成します。

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

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

次のステップ