NVML工具nvidia-smi按設(shè)備的PCI Bus ID 為設(shè)備分配索引序號,由于PCI Bus ID 是硬件相關(guān)的,我們把設(shè)備的 PCI Bus ID 或者按該ID分配的索引號為物理ID。
CUDA應(yīng)用運(yùn)行時(shí)進(jìn)行設(shè)備查詢(比如deviceQuery)返回的設(shè)備ID可能與物理ID不一致,譬如下面這位網(wǎng)友遇到的情況:
## NVML id 是 物理ID,CUDA index是CUDA應(yīng)用查詢返回的設(shè)備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知識點(diǎn) 我們講過可以設(shè)置 CUDA_VISIBLE_DEVICES 變量來根據(jù)設(shè)備ID選擇性地使用設(shè)備。注意到設(shè)備ID 與物理ID不一致的可能性,實(shí)際使用的未必是想要使用的設(shè)備,將會導(dǎo)致CUDA應(yīng)用崩潰,見Tensorflow issue #152。
我們可以通過設(shè)置 CUDA_DEVICE_ORDER = PCI_BUS_ID 來要求運(yùn)行時(shí)設(shè)備查詢按照 PCI_BUS_ID 的順序索引,從而使得 設(shè)備ID=物理ID 保證CUDA應(yīng)用按期望使用指定設(shè)備。目前最佳的設(shè)置方法是同時(shí)設(shè)置 CUDA_DEVICE_ORDER = PCI_BUS_ID 和 CUDA_VISIBLE_DEVICES 。