tensorflowで現在利用可能なGPUを取得するにはどうすればよいですか?


165

分散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が利用可能であれば、そのような関数tf.get_available_gpus()が返さ['/gpu:0', '/gpu:1']れるようにしたいのです。どうすれば実装できますか?

回答:


244

文書化されていないメソッドが呼び出さdevice_lib.list_local_devices()れ、ローカルプロセスで使用可能なデバイスを一覧表示できます。(NBは文書化されていないメソッドであるため、これは下位互換性のない変更の影響を受ける可能性があります。)関数は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の問題)。これを回避するには、最初に明示的に小さいper_process_gpu_fraction、またはを使用してセッションを作成し、allow_growth=Trueすべてのメモリが割り当てられないようにします。詳細については、この質問を参照してください。


12
PS、このメソッドが移動/名前変更された場合、tensorflow / python / platform / test.py:is_gpu_availableがかなり使用されているため、内部を調べます
Yaroslav Bulatov

1
デバイスを無料および合計メモリにする方法はありますか?DeviceAttributesにmemory_limitフィールドがあり、合計ではなく空きメモリであると思います
aarbelle

2
1より前のバージョンの場合、pythonにインポートしたときに、tensorflowがgpusに関する情報を出力することを覚えています。これらのメッセージは新しいtensorflowバージョンで削除されましたか?(したがって、あなたの提案はGPUのものをチェックする唯一の方法です)?
チャーリーパーカー

@CharlieParker TF1.1では、起動時にまだGPUデバイスごとに1つのログ行を出力すると思います。
mrry

1
@aarbelle-上記のメソッドを使用してすべての属性を返すにはFree memory、を使用してフィールドが含まれていますtensorflow1.1。Pythonの場合:from tensorflow.python.client import device_lib、その後device_lib.list_local_devices()
n1k31t4

123

次のコードを使用して、すべてのデバイスリストを確認できます。

from tensorflow.python.client import device_lib

device_lib.list_local_devices()

11
@Kulbearには、既存の回答よりも厳密に少ない情報が含まれているためです。
Davidmh

3
単純であるため、この回答を好む。私はbashから直接使用しています:python3 -c "from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())"
aboettcher

1
同意します。この回答により時間を節約できました。私はコードをコピー/貼り付けただけで、長い公式の回答を読む必要はありません。詳細はわかっていますが、必要なのはコード行だけです。それはすでに答えとして選ばれていませんでした、そしてそれで十分です。反対投票する必要はありません。
Steven

1
エラーが発生するcannot import name 'format_exc' from 'traceback'
Siddharth Das、

43

test utilにはメソッドもあります。したがって、実行する必要があるのは次のとおりです。

tf.test.is_gpu_available()

および/または

tf.test.gpu_device_name()

引数については、Tensorflowドキュメントを検索してください。


2
これはGPU:0のみを返します
Trisoloriansunscreen

@Talは、1つのGPUが使用可能であることを意味します(PCIスロットID 0)。それでtf.test.is_gpu_available()戻るTrue
18

4
OPは、使用可能なGPUSのリストを返すメソッドを要求しました。少なくとも私のマルチGPUセットアップでは、tf.test.gpu_device_name()は最初の名前だけを返します。
Trisoloriansunscreen

AttributeError:モジュール 'tensorflow'に属性 'test'がありません
Siddharth Das

27

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

2.1から、以下をドロップできますexperimental

gpus = tf.config.list_physical_devices('GPU')

見る:


コマンドは素晴らしかった。に変更する必要があり'GPU'ました'XLA_GPU'
Vivek Subramanian

19

受け入れ答えあなたのGPUの数を示しますが、それはまた、これらのGPU上のすべてのメモリを割り当てます。一部のアプリケーションでは望ましくない可能性があるdevice_lib.list_local_devices()を呼び出す前に固定メモリ容量の少ないセッションを作成することで、これを回避できます。

結局、nvidia-smiを使用して、メモリを割り当てずにGPUの数を取得しました。

import subprocess

n = str(subprocess.check_output(["nvidia-smi", "-L"])).count('UUID')

8

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のページには他の興味深い情報があり、多くの人は知りません。


3

以下はtensorflow 2で機能します。

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.1から、以下をドロップできますexperimental

    gpus = tf.config.list_physical_devices('GPU')

https://www.tensorflow.org/api_docs/python/tf/config/list_physical_devices


BASIC_GPUのscaleTierを使用している場合、これは機能しますか?このコードを実行すると、CPUのみが表示されます
shivas

MiniQuarkの重複した回答(ただし、詳細は少なくなります。)
FluxLemur

1

NVIDIA GTX GeForce 1650 Ti私のマシンでGPUが呼び出されましたtensorflow-gpu==2.2.0

次の2行のコードを実行します。

import tensorflow as tf
print("Num GPUs Available: ", len(tf.config.experimental.list_physical_devices('GPU')))

出力:

Num GPUs Available:  1

0

この方法を使用して、すべてのパーツを確認します。

from __future__ import absolute_import, division, print_function, unicode_literals

import numpy as np
import tensorflow as tf
import tensorflow_hub as hub
import tensorflow_datasets as tfds


version = tf.__version__
executing_eagerly = tf.executing_eagerly()
hub_version = hub.__version__
available = tf.config.experimental.list_physical_devices("GPU")

print("Version: ", version)
print("Eager mode: ", executing_eagerly)
print("Hub Version: ", h_version)
print("GPU is", "available" if avai else "NOT AVAILABLE")

0

GPU対応マシンに最新のTensorFlow 2.x GPUがインストールされていることを確認し、Pythonで次のコードを実行します。

from __future__ import absolute_import, division, print_function, unicode_literals

import tensorflow as tf 

print("Num GPUs Available: ", len(tf.config.experimental.list_physical_devices('GPU')))

次のような出力が得られます。

2020-02-07 10:45:37.587838:私はtensorflow / stream_executor / cuda / cuda_gpu_executor.cc:1006] SysFSから正常に読み込まれたNUMAノードに負の値(-1)がありましたが、少なくとも1つのNUMAノードが必要なので、戻りますNUMAノードゼロ2020-02-07 10:45:37.588896:I tensorflow / core / common_runtime / gpu / gpu_device.cc:1746]可視のGPUデバイスを追加:0、1、2、3、4、5、6、7 Num利用可能なGPU:8


1
この回答は既に投稿されています。
ビョルンLindqvist
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.