【问题标题】:When would I use model.to("cuda:1") as opposed to model.to("cuda:0")?我什么时候使用 model.to(\"cuda:1\") 而不是 model.to(\"cuda:0\")?
【发布时间】:2022-08-09 13:58:43
【问题描述】:

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

在这种情况下,“cuda:0”是否意味着第一个可以运行 CUDA 的设备,所以即使他们的第一个设备是 AMD,它也会工作?还是我需要说“cuda:1”?我如何检测哪个号码是第一个支持 CUDA 的设备?

  • 您始终可以使用nvidia-smi 来检查 Nvidia GPU 上是否正在运行任何东西。
  • 您是否知道如何使用它来帮助我或回答我的问题?我没有任何带有多个 GPU 的测试计算机。 nvidia-smi 或任何其他实用程序对我的计算机所说的内容与该用户的情况无关。

标签: pytorch


【解决方案1】:

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 B2G(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))}')

【讨论】:

  • 如果用户的第 1 个 GPU 是 AMD GPU,而第 2 个 GPU 是 NVIDIA GPU,并且我调用此代码并将 cuda_idx 设置为 0,它会返回 AMD 卡的信息(即使它不能运行 CUDA)或 NVIDIA 卡的信息信息?
  • 首先,我刚刚编辑了以下行的答案:model.to(to_cuda),nvidia_smi 应该检查与模型相同的 GPU,model.cuda() 会将模型移动到默认 GPU。其次,GPU的索引从0开始排列,所以在你的情况下,cuda_idx应该是1(GPU1,AMD:0;GPU2,NVIDIA GPU:1)
  • 我只需要找到第一个可以运行 CUDA 的 GPU。如果 AMD GPU 即使无法运行 CUDA 也作为合格设备返回,那么我需要一种方法来检查给定索引的 GPU 是否可以运行 CUDA。你知道调用正确的函数吗?如果 AMD GPU 一开始就不能运行 CUDA,那么它有多少 VRAM 都没关系。
  • 我刚刚编辑了答案,使用该功能,您可以检查 cuda 设备的索引,然后将其用作cuda_idx 到上述功能中,以检查您的模型所需的内存量。我没有使用 AMD GPU 的经验,所以我不知道 cuda 索引是否包含 AMD。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    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 的输出返回:

    '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

    【讨论】:

    • 我想知道“cuda:0”是第一个 GPU,还是第一个符合 cuda 要求的 GPU?例如,如果第一个 gpu 是 AMD 会发生什么?它会返回 AMD 卡的内存和信息,还是不会被检测到?
    • @pete 我猜你必须在你的机器上用两个 GPU 运行这些命令,然后自己看看。但本质上,torch.cuda 为您提供了您需要检查的所有方法以编程方式您的 GPU 并决定您要在哪个设备上工作。
    • 我没有两个 GPU 或一个 AMD GPU 来测试。这就是我问这个问题的原因。我同意其中一些方法可以以编程方式使用,但我的程序仍然需要知道非 CUDA GPU 是否作为设备列表的一部分返回。如果包含非 CUDA GPU,那么我需要一种以编程方式检查它是否可以运行 CUDA 的方法。如果不包括在内,我的程序可以假设 GPU 0 是合法的。
    猜你喜欢
    • 2021-03-18
    • 2015-01-16
    • 2016-07-03
    • 1970-01-01
    • 2012-07-01
    • 2020-01-10
    • 1970-01-01
    • 2021-10-07
    • 2021-08-24
    相关资源
    最近更新 更多