私は分散型TensorFlowを使用する計画があり、TensorFlowはトレーニングやテストにGPUを使用できることがわかりました。クラスタ環境では、各マシンは0個または1個以上のGPUを持つことができ、私はTensorFlowグラフをできるだけ多くのマシン上のGPUに実行したいと思います。
tf.Session()
TensorFlowを実行すると、以下のようなログメッセージにGPUに関する情報が表示されることがわかりました。
I tensorflow/core/common_runtime/gpu/gpu_init.cc:126] DMA: 0
I tensorflow/core/common_runtime/gpu/gpu_init.cc:136] 0: Y
I tensorflow/core/common_runtime/gpu/gpu_device.cc:838] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 1080, pci bus id: 0000:01:00.0)
私の質問は、TensorFlowから現在入手可能なGPUに関する情報をどのように入手するのですか?ログからロードされたGPU情報を取得できますが、より洗練された、プログラム的な方法でそれをしたいです。また、CUDA_VISIBLE_DEVICES環境変数を使用して意図的にGPUを制限することもできるため、OSカーネルからGPU情報を取得する方法を知りたくありません。
手短に言えば、私はマシンに2つのGPUがある場合に['/gpu:0', '/gpu:1']
を返すtf.get_available_gpus()
のような関数が欲しいです。どうやってこれを実装できますか?
文書化されていない device_lib.list_local_devices()
というメソッドがあり、これを使ってローカルプロセスで利用可能なデバイスを一覧表示できます。 ( N.B. 文書化されていないメソッドとして、これは後方互換性のない変更を受けることがあります。)この関数は DeviceAttributes
プロトコルバッファ オブジェクトのリストを返します。次のようにして、GPUデバイスの文字列デバイス名のリストを抽出できます。
from tensorflow.python.client import device_lib
def get_available_gpus():
local_device_protos = device_lib.list_local_devices()
return [x.name for x in local_device_protos if x.device_type == 'GPU']
(少なくともTensorFlow 1.4まで)device_lib.list_local_devices()
を呼び出すと、初期設定コードが実行され、デフォルトで、すべてのデバイスにすべてのGPUメモリが割り当てられます( GitHub issue )。これを回避するには、最初に明示的に小さいper_process_gpu_fraction
またはallow_growth=True
を使用してセッションを作成し、すべてのメモリが割り当てられないようにします。詳細については この質問 を参照してください。
次のコードを使ってすべてのデバイスリストを確認できます。
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
test util にもメソッドがあります。それで、やらなければならないことは次のとおりです。
tf.test.is_gpu_available()
および/または
tf.test.gpu_device_name()
引数についてはTensorflowのドキュメントを調べてください。
Mrryがdevice_lib.list_local_devices()
を使うことを提案した素晴らしい説明とは別に、コマンドラインからGPU関連の情報をチェックする方法を紹介します。
現在NvidiaのgpusだけがNNフレームワークのために働くので、答えはそれらだけをカバーします。 Nvidiaには というページがあり、そこには/ procファイルシステムインタフェースを使ってドライバ、インストールされたNVIDIAグラフィックスカード、およびAGPステータスに関する実行時情報を取得する方法が記載されています。
/proc/driver/nvidia/gpus/0..N/information
インストールされている各NVIDIAグラフィックスアダプタに関する情報(モデル名、IRQ、BIOSバージョン、バスタイプ)を入力します。 BIOSのバージョンはXが動作している間だけ利用可能であることに注意してください。
そのため、これをコマンドラインcat /proc/driver/nvidia/gpus/0/information
から実行して、最初のGPUに関する情報を見ることができます。 pythonからこれを実行するのは簡単です また、失敗するまで2、3、4番目のGPUをチェックできます。
間違いなくMrryの答えはもっと堅牢で、私の答えがLinux以外のマシンでもうまくいくかどうかはわかりませんが、Nvidiaのページには他にも興味深い情報があり、あまり知られていません。
受け入れられた答え はあなたにGPUの数を与えますが、それはまたそれらのGPU上のすべてのメモリを割り当てます。これを回避するには、device_lib.list_local_devices()を呼び出す前に低い固定メモリでセッションを作成します。これは一部のアプリケーションでは不要な場合があります。
メモリを割り当てずにGPUの数を取得するために、nvidia-smiを使用しました。
import subprocess
n = str(subprocess.check_output(["nvidia-smi", "-L"])).count('UUID')
TensorFlow 2.0では、tf.config.experimental.list_physical_devices('GPU')
を使用できます。
import tensorflow as tf
gpus = tf.config.experimental.list_physical_devices('GPU')
for gpu in gpus:
print("Name:", gpu.name, " Type:", gpu.device_type)
2つのGPUがインストールされている場合、次のように出力されます。
Name: /physical_device:GPU:0 Type: GPU
Name: /physical_device:GPU:1 Type: GPU
詳細については このドキュメントページ をご覧ください。