NVML工具nvidia-smi按設備的PCI Bus ID 為設備分配索引序號讼呢,由于PCI Bus ID 是硬件相關的剩拢,我們把設備的 PCI Bus ID 或者按該ID分配的索引號為物理ID百姓。
CUDA應用運行時進行設備查詢(比如deviceQuery)返回的設備ID可能與物理ID不一致,譬如下面這位網(wǎng)友遇到的情況:
## 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 環(huán)境變量說明和TensorFlow知識點 我們講過可以設置 CUDA_VISIBLE_DEVICES 變量來根據(jù)設備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 。