Copyright 2018 The TensorFlow Authors.
TensorFlow のコードとtf.keras
モデルは、コードを変更することなく単一の GPU で透過的に実行されます。
注意: tf.config.list_physical_devices('GPU')
を使用して、TensorFlow が GPU を使用していることを確認してください。
単一または複数のマシンで複数の GPU を実行する最も簡単な方法は、分散ストラテジーの使用です。
このガイドは、これらのアプローチを試し、TensorFlow の GPU 使用方法を細かく制御する必要があることに気づいたユーザーを対象としています。シングル GPU とマルチ GPU のシナリオにおいてパフォーマンスをデバッグする方法については、「TensorFlow GPU パフォーマンスを最適化する」ガイドをご覧ください。
セットアップ
最新リリースの TensorFlow GPU がインストールされていることを確認します。
概要
TensorFlow は、CPU や GPU など、さまざまなタイプのデバイスでの計算の実行をサポートしています。それらは、例えば文字列の識別子で表されています。
"/device:CPU:0"
: マシンの CPU。"/GPU:0"
: TensorFlow が認識するマシンの最初の GPU の簡略表記。"/job:localhost/replica:0/task:0/device:GPU:1"
: TensorFlow が認識するマシンの 2 番目の GPU の完全修飾名。
TensorFlow 演算に CPU と GPU 実装の両方を持つ場合、演算がデバイスに割り当てられるときに、デフォルトでは GPU デバイスが優先されます。たとえば、tf.matmul
は CPU と GPU カーネルの両方を持ちます。デバイス CPU:0
と GPU:0
を持つシステム上では、それを他のデバイス上で実行することを明示的に要求しない限りは、GPU:0
デバイスが tf.matmul
の実行に選択されます。
TensorFlow 演算に対応する GPU 実装がない場合は、演算は CPU デバイスにフォールバックします。たとえば、tf.cast
には CPU カーネルしかないため、デバイス CPU:0
と GPU:0
のあるシステムでは、CPU:0
デバイスが tf.cast
の実行に選択され、GPU:0
デバイスでの実行をリクエストされても無視されます。
デバイスの配置をログに記録する
演算と tensor がどのデバイスに割り当てられたかを確認するには、tf.debugging.set_log_device_placement(True)
をプログラムの最初のステートメントとして置きます。デバイス配置ログを有効にすると、テンソルの割り当てや演算が出力されます。
上記のコードの出力は、GPU:0
でMatMul
演算が実行されたことを示します。
手動でデバイスを配置する
自動的に選択されたものの代わりに、自分が選択したデバイスで特定の演算を実行する場合は、デバイスコンテキストの作成にwith tf.device
を使用すると、そのコンテキスト内のすべての演算は同じ指定されたデバイス上で実行されます。
これでa
とb
はCPU:0
に割り当てられたことが分かります。MatMul
演算に対してデバイスが明示的に指定されていないため、TensorFlow ランタイムは演算と利用可能なデバイスに基づいてデバイスを選択し(この例ではGPU:0
)、必要に応じて自動的にデバイス間でテンソルをコピーします。
GPU のメモリ増加を制限する
デフォルトでは、TensorFlow は(CUDA_VISIBLE_DEVICES
に従い)プロセスが認識する全 GPU の ほぼ全てのGPU メモリをマップします。これはメモリの断片化を減らしてデバイス上のかなり貴重な GPU メモリリソースをより効率的に使用するために行われます。TensorFlow を特定の GPU セットに制限するには、tf.config.set_visible_devices
メソッドを使用します。
場合によりますが、プロセスが使用可能なメモリのサブセットのみを割り当てるか、またはプロセスに必要とされるメモリ使用量のみを増やすことが望ましいです。TensorFlow は、これを制御する 2 つのメソッドを提供します。
最初のオプションは、tf.config.experimental.set_memory_growth
を呼び出してメモリ増大を有効にすることです。これはランタイムの割り当てに必要な GPU メモリだけを割り当てようと試みます。非常に小さいメモリの割り当てから始め、プログラムが実行されてより多くの GPU メモリが必要になってくるにつれて、TensorFlow プロセスに割り当てられる GPU メモリ領域を拡張します。メモリの断面化につながる可能性があるため、メモリは解放されません。特定の GPU のメモリ増大を有効にするためには、テンソルの割り当てや演算の実行の前に次のコードを使用してください。
このオプションを有効にするもう 1 つの方法は、環境変数TF_FORCE_GPU_ALLOW_GROWTH
をtrue
に設定するというものです。この構成はプラットフォーム固有です。
2 番目のメソッドは、tf.config.set_logical_device_configurartion
で仮想 GPU デバイスを構成し、GPU に割り当てられるメモリ総量を固定することです。
これは TensorFlow プロセスに利用可能な GPU メモリの量を正確に抑制する場合に有用です。これは GPU がワークステーション GUI などの他のアプリケーションと共有されている場合のローカル開発では一般的な方法です。
マルチ GPU システムで単一 GPU を使用する
システムに 2 つ以上の GPU が搭載されている場合、デフォルトでは最小の ID を持つ GPU が選択されます。異なる GPU 上で実行する場合には、その選択を明示的に指定する必要があります。
指定したデバイスが存在しない場合には、RuntimeError
: .../device:GPU:2 unknown device
が表示されます。
指定されたデバイスが存在しない場合に TensorFlow に既に演算の実行をサポートしているデバイスを自動的に選択させたければ、tf.config.set_soft_device_placement(True)
を呼び出すことができます。
マルチ GPU を使用する
マルチ GPU 向けの開発は、追加リソースでのモデルのスケーリングを可能にします。単一 GPU システム上で開発している場合は、仮想デバイスで複数の GPU をシミュレートできます。これにより、追加のリソースがなくてもマルチ GPU セットアップの簡単なテストが可能になります。
ランタイムで利用可能な複数の論理 GPU を取得したら、tf.distribute.Strategy
または手動配置でマルチ GPU を利用できます。
tf.distribute.Strategy
を使用する
マルチ GPU を使用するベストプラクティスは、tf.distribute.Strategy
を使用することです。次に単純な例を示します。
手動で配置する
tf.distribute.Strategy
は、内部的には複数のデバイスに渡って計算を複製することによって動作しています。各 GPU 上でモデルを構築することにより、複製を手動で実装することができます。例を示します。