什么时候使用 model.to("cuda:1") 而不是 model.to("cuda:0")?

When would I use model.to("cuda:1") as opposed to model.to("cuda:0")?

我有一个用户有两个 GPU;第一个是不能 运行 CUDA 的 AMD,第二个是支持 cuda 的 NVIDIA GPU。我正在使用代码 model.half().to("cuda:0")。我不确定调用是否成功使用了 GPU,我也无法对其进行测试,因为我没有任何备用计算机有超过 1 个 GPU。

在这种情况下,“cuda:0”是否表示第一台可以 运行 CUDA 的设备,所以即使他们的第一台设备是 AMD 也能正常工作?或者我需要说“cuda:1”吗?我如何检测哪个数字是第一个支持 CUDA 的设备?

nvidia-smi 可以帮助在 运行 运行您的代码时跟踪 GPU 的内存。 要安装,运行 pip install nvidia-ml-py3。看看这个代码片段:

import nvidia_smi

cuda_idx = 0 # edit device index that you want to track
to_cuda = f'cuda:{cuda_idx}' # 'cuda:0' in this case

nvidia_smi.nvmlInit()
handle = nvidia_smi.nvmlDeviceGetHandleByIndex(cuda_idx)

def b2gb(num):
    return round(num/(1024**3),2)

def print_memory(name, handle, pre_used):
    info = nvidia_smi.nvmlDeviceGetMemoryInfo(handle)
    used = info.used
    print(f'{name}: {B2G(used)}')
    print(f'This step use: {B2G(used-pre_used)}')
    print('------------')
    return used

# start
mem = print_memory('Start', handle, 0)

model = ... # init your model
model.to(to_cuda)

mem = print_memory('Init model', handle, mem)

上面是nvidia-smi的例子,可以帮助追踪模型每个部分需要的内存,并以GB为单位打印。

已编辑:检查 GPU 列表:

def check_gpu():
    for i in range(torch.cuda.device_count()):
        device_name = f'cuda:{i}'
        print(f'{i} device name:{torch.cuda.get_device_name(torch.device(device_name))}')

torch.cuda有很多查询和监控GPU设备的方法。
例如,您可以查看每个设备的类型:

torch.cuda.get_device_name(torch.device('cuda:0'))
% or
torch.cuda.get_device_name(torch.device('cuda:1'))

在我的例子中,get_device_name returns 的输出:

'Quadro RTX 6000'

如果您想要一种更加程序化的方式来探索设备的属性,您可以使用 torch.cuda.get_device_properties

一旦您正在使用设备(或相信您正在使用),您可以使用 [torch.cuda] 的 memory management functions 来监控 GPU 内存使用情况。 例如,您可以使用以下方法获得有关设备内存当前状态的非常详细的说明:

torch.cuda.memory_stats(torch.device('cuda:0'))
% or
torch.cuda.memory_stats(torch.device('cuda:0'))

如果您想要 nvidia-smi 类似的利用率统计信息,您可以使用 torch.cuda.utilization

我测试了它,我怀疑 model.half().to("cuda:0") 会把你的模型放在第一个支持 CUDA 的可用 GPU 中,即在你的情况下是 NVIDIA GPU,AMD GPU 作为 cuda 设备是不可见的,感觉可以安全地假设 cuda:0 只是启用了 CUDA 的 GPU,而您的程序不会看到 AMD GPU。 祝你有个美好的一天。