我的笔记本电脑是Thinkpad T470P,它似乎具有双GPU-一个是集成的Intel HD图形630,另一个是GeForce 940MX。
我安装了CUDA版本。在这台机器上的10.1成功,现在我想在Tensorflow中进行培训。我想知道培训使用的是哪个GPU,所以我尝试了以下方法:
from tensorflow.python.client import device_lib
device_lib.list_local_devices()
这就是我得到的:
[name: "/device:CPU:0"
device_type: "CPU"
memory_limit: 268435456
locality {
}
incarnation: 17770480900406893487, name: "/device:GPU:0"
device_type: "GPU"
memory_limit: 1462163865
locality {
bus_id: 1
links {
}
}
incarnation: 5306128727345722238
physical_device_desc: "device: 0, name: GeForce 940MX, pci bus id: 0000:02:00.0, compute capability: 5.0"]
我很好奇为什么会有两个化身?一个叫/device:GPU:0
,另一个叫GeForce 940MX
。
据我所知,CUDA和tensorflow只能在GeForce上运行,这是真的吗,因为CUDA甚至不支持集成GPU吗?
在这种情况下,如何指定在GeForce 940MX上运行的tensorflow?由于有两个名称,因此我不确定它们是否指向不同的GPU。非常感谢您的输入!
答案 0 :(得分:2)
首先,CUDA仅与NVIDIA显卡兼容,因此TensorFlow不会使用您的集成Intel HD图形630,也不会使用device_lib.list_local_devices()
来列出您的集成Intel HD图形630。
使用的唯一GPU设备是device_type: "GPU"
中列出的项目,它代表您的GeForce 940MX卡。我相信列出的其他项目
指同一张GPU卡-我通常只注意设备类型= GPU的项目。要专门打印这些项目,可以使用https://stackoverflow.com/a/38580201/9672143中的以下脚本:
from tensorflow.python.client import device_lib
local_device_protos = device_lib.list_local_devices()
print([x.name for x in local_device_protos if x.device_type == 'GPU'])
一个有用的工具是命令行上的nvidia-smi
。这列出了可用的NVIDIA GPU,以及正在使用每个GPU的进程。启动TensorFlow / Keras程序时,您应该看到python进程出现在nvidia-smi
输出的底部。
要回答您的最后一个问题,您可以在导入TF / Keras之前,使用以下代码强制TensorFlow使用特定的GPU:
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0' # gpu ID
可以从nvidia-smi
的输出中找到GPU ID,该输出显示每个GPU及其关联的ID。