NVML工具nvidia-smi按设备的PCI Bus ID 为设备分配索引序号,由于PCI Bus ID 是硬件相关的,我们把设备的 PCI Bus ID 或者按该ID分配的索引号为物理ID。
CUDA应用运行时进行设备查询(比如deviceQuery)返回的设备ID可能与物理ID不一致,譬如下面这位网友遇到的情况:
## NVML id 是 物理ID,CUDA index是CUDA应用查询返回的设备ID
NVML id 0 maps to Cuda index 4
NVML id 1 maps to Cuda index 5
NVML id 2 maps to Cuda index 6
NVML id 3 maps to Cuda index 7
NVML id 4 maps to Cuda index 0
NVML id 5 maps to Cuda index 1
NVML id 6 maps to Cuda index 2
NVML id 7 maps to Cuda index 3
NVML id 8 maps to Cuda index 8
NVML id 9 maps to Cuda index 9
NVML id 10 maps to Cuda index 10
NVML id 11 maps to Cuda index 11
NVML id 12 maps to Cuda index 12
NVML id 13 maps to Cuda index 13
NVML id 14 maps to Cuda index 14
NVML id 15 maps to Cuda index 15
在CUDA_VISIBLE_DEVICES 环境变量说明和TensorFlow知识点 我们讲过可以设置 CUDA_VISIBLE_DEVICES 变量来根据设备ID选择性地使用设备。注意到设备ID 与物理ID不一致的可能性,实际使用的未必是想要使用的设备,将会导致CUDA应用崩溃,见Tensorflow issue #152。
我们可以通过设置 CUDA_DEVICE_ORDER = PCI_BUS_ID 来要求运行时设备查询按照 PCI_BUS_ID 的顺序索引,从而使得 设备ID=物理ID 保证CUDA应用按期望使用指定设备。目前最佳的设置方法是同时设置 CUDA_DEVICE_ORDER = PCI_BUS_ID 和 CUDA_VISIBLE_DEVICES 。