CUDA设备订单

Ale*_*lex 1 cuda tensorflow pytorch

我看到了这个解决方案,但是并不能完全回答我的问题。它也很老,所以我不确定它的相关性。

我不断收到有关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
Run Code Online (Sandbox Code Playgroud)

另一方面,nvidia-smi产生不同的顺序:

 0  NVS 315 

 1  Tesla K40m
Run Code Online (Sandbox Code Playgroud)

我觉得很困惑。我为Tensorflow(以及Pytorch的类似解决方案)找到的解决方案是使用

import os
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"  
os.environ["CUDA_VISIBLE_DEVICES"]="0"
Run Code Online (Sandbox Code Playgroud)

Tesla的PCI总线ID为4,NVS的PCI总线ID为3,因此应将其设置为3(NVS),对吗?

在火炬我设置

os.environ['CUDA_VISIBLE_DEVICES']='0'
...
device = torch.cuda.device(0)
print torch.cuda.get_device_name(0)
Run Code Online (Sandbox Code Playgroud)

要得到 Tesla K40m

当我改为

os.environ['CUDA_VISIBLE_DEVICES']='1'
device = torch.cuda.device(1)
print torch.cuda.get_device_name(0)
Run Code Online (Sandbox Code Playgroud)

要得到

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
Run Code Online (Sandbox Code Playgroud)

所以我很困惑:tf和pytorch使用的GPU设备的真正顺序是什么?

Oli*_*ene 8

默认情况下,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)
Run Code Online (Sandbox Code Playgroud)

默认顺序为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)
Run Code Online (Sandbox Code Playgroud)

PCI-E通道顺序,因此GPU:0是您的NVS总线ID最低的卡。