1. 改变系统变量使得仅目标显卡可见

1、在程序开头设置 os.environ["CUDA_VISIBLE_DEVICES"] = '0,1,2,3'
2、 CUDA_VISIBLE_DEVICES=0,1,2,3 python xxx.py 来设置该程序可见的gpu
设置完,代码中直接用model.cuda(),input.cuda()即可

2. 使用 torch.cuda 接口

在生成网络对象之前执行:torch.cuda.set_device(0)

3. 使用pytorch的并行GPU接口

net = torch.nn.DataParallel(model, device_ids=[0])

4. 初始化模型时

net = Net.cuda(0)

5、使用.to(device)

对于单个gpu

  1. device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
  2. model.to(device)
  3. # 这里需要注意的是,仅仅调用Tensor.to()只会在GPU上返回一个新的copy,并不会对原来的引用造成变化,因此需要通过赋值rewrite
  4. x.to(device)

对于多个gpu

  1. model = Model(input_size, output_size)
  2. print("Let's use", torch.cuda.device_count(), "GPUs!\n")
  3. model = nn.DataParallel(model)
  4. model.to(device)
  5. print(model)
  6. # output
  7. # Let's use 2 GPUs!
  8. DataParallel(
  9. (module): Model(
  10. (fc): Linear(in_features=5, out_features=2, bias=True)
  11. )
  12. )

具体例子参考:https://blog.csdn.net/xxboy61/article/details/97973288https://blog.csdn.net/weixin_36670529/article/details/104349669

深度学习pytorch,tensorflow中gpu利用率较低,使用率周期性变化的问题

GPU在等待CPU读取,预处理,并传输数据过来,因此要提高GPU的使用率,降低GPU的等待时间,需要加快CPU的处理速度.
在PYTORCH中的解决方案是用torch.utils.data.DataLoader,用num_workers设置线程数。

  1. torch.utils.data.DataLoader(image_datasets[x],
  2. batch_size=batch_size,
  3. shuffle=True,
  4. num_workers=8,
  5. pin_memory=True)

pytorch训练时,gpu利用率不稳定

参考:https://blog.csdn.net/qq_32768679/article/details/108522049
Q:单主机四gpu利用torch.nn.DataParallel进行多gpu的训练;gpu的内存占有率没问题,但使用率很低,很长一段时间在百分之零。
问题原因:读取每个batch size的图像时,cpu读取时间较长。(batch_size = 1024, 设置DataLoader线程4、8、16、32的改善都不大,且pin_memory=true),开始的dataset为下面方式,显然每次读取时io的耗时比较长。于是,将图像全部读出(硬件支持…),然后再进行每次的变量赋值。

  • 实际上,参考文章的解决方案就是,在定义DataSet时, __init__ 里面就打开、读取了全部图像,在 __getitem__ 里面只是按index取图像而已。

    提高训练速度GPU利用率较低,CPU利用率很低,且模型训练速度很慢的问题总结

    参考:深度学习PyTorch,TensorFlow中GPU利用率较低,CPU利用率很低,且模型训练速度很慢的问题总结与分析

  • 对上面的分析总结一下,第一是增加batch size,增加GPU的内存占用率,尽量用完内存,而不要剩一半,空的内存给另外的程序用,两个任务的效率都会非常低。第二,在数据加载时候,将num_workers线程数设置稍微大一点,推荐是8,16等,且开启pin_memory=True。不要将整个任务放在主进程里面做,这样消耗CPU,且速度和性能极为低下。 :::info 个人总结:

  • 如果GPU内存占用率低,可以适当增大batch

  • 如果GPU利用率低,可以在dataloader上做优化,设置nmum_workers(线程数),pin_memory=True,解决好数据传输的带宽瓶颈。
    • 这个是Volatile GPU-Util表示,当没有设置好CPU的线程数时,这个参数是在反复的跳动的,0%,20%,70%,95%,0%。这样停息1-2 秒然后又重复起来。其实是GPU在等待数据从CPU传输过来,当从总线传输到GPU之后,GPU逐渐起计算来,利用率会突然升高,但是GPU的算力很强大,0.5秒就基本能处理完数据,所以利用率接下来又会降下去,等待下一个batch的传入。因此,这个GPU利用率瓶颈在内存带宽和内存介质上以及CPU的性能上面。最好当然就是换更好的四代或者更强大的内存条,配合更好的CPU。 :::