CUDA 设备的顺序 [重复]
Posted
技术标签:
【中文标题】CUDA 设备的顺序 [重复]【英文标题】:Order of CUDA devices [duplicate] 【发布时间】:2019-03-19 19:41:59 【问题描述】:我看到了this 解决方案,但它并不能完全回答我的问题;它也很旧,所以我不确定它有多相关。
我不断收到 GPU 单元顺序的冲突输出。其中有两个:Tesla K40 和 NVS315(从未使用过的旧设备)。当我运行deviceQuery
时,我得到了
Device 0: "Tesla K40m"
...
Device PCI Domain ID / Bus ID / location ID: 0 / 4 / 0
Device 1: "NVS 315"
...
Device PCI Domain ID / Bus ID / location ID: 0 / 3 / 0
另一方面,nvidia-smi
产生不同的顺序:
0 NVS 315
1 Tesla K40m
我觉得这很令人困惑。我为 Tensorflow(和 Pytorch 的类似解决方案)找到的解决方案是使用
import os
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"]="0"
Tesla 的 PCI 总线 ID 为 4,NVS 的 PCI 总线 ID 为 3,所以应该将其设置为 3 (NVS),对吗?
在pytorch中我设置了
os.environ['CUDA_VISIBLE_DEVICES']='0'
...
device = torch.cuda.device(0)
print torch.cuda.get_device_name(0)
获取Tesla K40m
当我改为设置时
os.environ['CUDA_VISIBLE_DEVICES']='1'
device = torch.cuda.device(1)
print torch.cuda.get_device_name(0)
得到
UserWarning:
Found GPU0 NVS 315 which is of cuda capability 2.1.
PyTorch no longer supports this GPU because it is too old.
warnings.warn(old_gpu_warn % (d, name, major, capability[1]))
NVS 315
所以我很困惑:tf 和 pytorch 使用的 GPU 设备的 true 顺序是什么?
【问题讨论】:
如果你打算使用pytorch或者tensorflow,你需要的顺序是nvidia-smi
显示的。因为 nvidia 驱动程序将帮助您在 GPU 上“运行”深度神经网络,所以您需要这个顺序。
我编辑了问题,第二种情况应该是os.environ['CUDA_VISIBLE_DEVICES']='1'。所以这是默认的顺序:Tesla=0,NVS=1。只有当我设置 os.environ['CUDA_DEVICE_ORDER'] = 'PCI_BUS_ID' 时,顺序才会反转
【参考方案1】:
默认情况下,CUDA 按计算能力对 GPU 排序。 GPU:0 将是您主机上最快的 GPU,在您的情况下是 K40m。
如果您设置 CUDA_DEVICE_ORDER='PCI_BUS_ID' 则 CUDA 根据您设置机器的方式订购您的 GPU,这意味着 GPU:0 将是您第一个 PCI-E 通道上的 GPU。
Tensorflow 和 PyTorch 都使用 CUDA GPU 顺序。这与您展示的内容一致:
os.environ['CUDA_VISIBLE_DEVICES']='0'
...
device = torch.cuda.device(0)
print torch.cuda.get_device_name(0)
默认顺序,因此 GPU:0 是 K40m,因为它是您主机上最强大的显卡。
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"
os.environ['CUDA_VISIBLE_DEVICES']='0'
...
device = torch.cuda.device(0)
print torch.cuda.get_device_name(0)
PCI-E 通道顺序,因此 GPU:0 是 NVS 中总线 ID 最低的卡。
【讨论】:
以上是关于CUDA 设备的顺序 [重复]的主要内容,如果未能解决你的问题,请参考以下文章