我有计划使用分布式TensorFlow,我看到TensorFlow可以使用GPU进行训练和测试。 在群集环境中,每台计算机可能有0个或1个或更多GPU,我想在尽可能多的计算机上运行我的TensorFlow Graph到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信息的方法。

简而言之,我想要一个像tf.get_available_gpus()这样的函数,如果机器中有两个可用的GPU,它将返回[’/ gpu:0’,’/ gpu:1’]。 我该如何实现呢?

我在特拉字节这个网址 ​​https://telabytes.com/question/preview?qid=7​​ 上找到了答案

确实有一个函数,就是device_lib.list_local_devices(),它是非官方方法,使您可以列出本地进程中可用的设备。 (注意:作为非官方的方法,这会受到向后不兼容的更改。)该函数返回DeviceAttributes Protocal Buffer对象的列表。 您可以按如下方式提取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的会话,以防止分配所有内存。

或者

tf.test.is_gpu_available()

或者

tf.test.gpu_device_name()

这个是在TensorFlow官方文档中有提到