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

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

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

始める前に

AI Platform Training では、TensorFlow トレーニング アプリケーションを GPU 対応のマシン上で実行できます。利用可能な GPU をアプリケーションで使用するには、GPU の使用に関する TensorFlow ガイドGPU を利用するトレーニング コードの調整方法を説明しているこのドキュメントのセクションをご覧ください。

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

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

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

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

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

基本的な GPU 対応マシン

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

Compute Engine マシンタイプに GPU を接続する

Compute Engine マシンタイプを使用してトレーニング ジョブを構成する場合、任意の数の GPU を接続するとジョブを加速化できます。

  • スケール階層を CUSTOM に設定します。
  • 有効な Compute Engine マシンタイプを使用するジョブの一部であるマスター ワーカーとその他のタスクタイプ(ワーカー、パラメータ サーバー、または評価ツール)を構成します。
  • 加速する仮想マシン(VM)インスタンスに応じて、使用する GPU のタイプと数を指定した acceleratorConfig フィールドmasterConfigworkerConfigparameterServerConfig、または evaluatorConfig に追加します。次のタイプの 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 Training の 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-west2
  • us-central1
  • us-east1
  • us-east4
  • europe-west1
  • europe-west2
  • europe-west4
  • asia-south1
  • asia-southeast1
  • asia-east1
  • asia-northeast1
  • asia-northeast3

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

トレーニング ジョブで複数のタイプの GPU を使用する場合、それらの GPU のすべてがリージョン内の同じゾーンで使用可能でなければなりません。たとえば us-central1 内では、NVIDIA Tesla T4 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 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 などをアプリケーションに渡します。

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

GPU を利用するためにトレーニング コードを調整

TensorFlow トレーニング ジョブに Keras または Estimator を使用して、1 つの GPU で単一の VM を使用してトレーニングする場合は、GPU のコードをカスタマイズする必要はありません。

トレーニング クラスタに複数の GPU が含まれている場合は、トレーニング コードで tf.distribute.Strategy API を使用します。

  • 複数の GPU を使用する単一の VM でのトレーニングには、TensorFlow 2.1 以降の Keras で完全にサポートされている MirroredStrategy を使用することをおすすめします。
  • GPU での複数の VM でのトレーニングについては、分散トレーニングでの推奨事項をご覧ください。

TensorFlow で GPU に特定のオペレーションを割り当てる方法をカスタマイズするには、GPU の使用に関する TensorFlow ガイドをご覧ください。この場合、AI Platform Training で各 VM に TF_CONFIG 環境変数を設定する方法が役立つこともあります。

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 がプリインストールされています。プリインストールされているすべてのパッケージの一覧については、ランタイム バージョン リストをご覧ください。

メンテナンス イベント

AI Platform Training ジョブを実行する GPU 対応の VM に、Compute Engine ホスト メンテナンスが適用される場合があります。こうした VM は、こうしたメンテナンス イベントの後に自動的に再起動するように構成されていますが、シャットダウンに対して復元性があることを確認するために、追加の作業が必要になることがあります。具体的には、定期的にモデル チェックポイントを保存し(通常は、Cloud Storage パスに沿って gcloud ai-platform jobs submit training--job-dir 引数で指定します)、既存のチェックポイントがある場合は最新のチェックポイントを復元するようにトレーニング アプリケーションを構成します。

model_dir を指定している限り、TensorFlow Estimator でこの機能が実装されます。Estimator ではチェックポイントが model_dir に定期的に保存され、最新のチェックポイントからの読み込みが試行されるため、GPU ワーカーに対するメンテナンス イベントを気にする必要はありません。

Keras を使用してトレーニングする場合は、ModelCheckpoint コールバックを使用してトレーニングの進捗状況を定期的に保存します。Keras で tf.distribute.Strategy を使用している場合、VM でチェックポイントを使用して、再起動から自動的に復元します。それ以外の場合は、トレーニング コードに最近のチェックポイントの存在を確認するロジックを追加し、存在する場合はチェックポイントから復元します。

高度なケースについては、チェックポイントに関する TensorFlow ガイドをご覧ください。

次のステップ