分享

深度模型训练时CPU或GPU的使用model.to(device)

 netouch 2024-05-16 发布于北京

一、使用device控制使用CPU还是GPU

  1. device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
  2. # 单GPU或者CPU.先判断机器上是否存在GPU,没有则使用CPU训练
  3. model = model.to(device)
  4. data = data.to(device)
  5. #或者在确定有GPU的情况下,直接使用
  6. model = model.cuda()
  7. data = data.cuda()
  8. #在确定没有GPU的情况下,直接使用
  9. model = model.cpu()
  10. data = data.cpu()

注意:

1.tensor和numpy都是矩阵,前者能在GPU上运行,后者只能在CPU运行,所以要注意数据类型的转换。

2.当你使用model.to(device)时,它会将模型的参数和缓冲区移动到指定的设备上。而当你使用model = model.to(device)时,它会将整个模型移动到指定的设备上。

二、.to(device)和.cuda()设置GPU的区别

建议使用model.to(device)的方式,这样可以显示指定需要使用的计算资源,特别是有多个GPU的情况下,可以并行处理,加快速度。

参考.to(device)和.cuda()设置GPU的区别_.cuda()和to(device)-CSDN博客

.to(device) 可以指定CPU 或者GPU

  1. device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
  2. # 单GPU或者CPU
  3. model.to(device)
  4. #如果是多GPU
  5. if torch.cuda.device_count() > 1:
  6. model = nn.DataParallel(model,device_ids=[0,1,2])
  7. model.to(device)

.cuda() 只能指定GPU

  1. #指定某个GPU
  2. os.environ['CUDA_VISIBLE_DEVICES']="1"
  3. model.cuda()
  4. #如果是多GPU
  5. os.environ['CUDA_VISIBLE_DEVICES'] = "0,1,2,3"
  6. device_ids = [0,1,2,3]
  7. net = torch.nn.Dataparallel(net, device_ids =device_ids)
  8. net = torch.nn.Dataparallel(net) # 默认使用所有的device_ids
  9. net = net.cuda()
  10. model.cuda()
  11. #如果是多GPU
  12. os.environment['CUDA_VISIBLE_DEVICES'] = '0,1,2,3'
  13. device_ids = [0,1,2,3]
  14. net = torch.nn.Dataparallel(net, device_ids =device_ids)
  15. net = torch.nn.Dataparallel(net) # 默认使用所有的device_ids
  16. net = net.cuda()

三、指定使用的GPU

使用方式

  1. import os
  2. # 给服务器上的GPU编号
  3. os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
  4. os.environ["CUDA_VISIBLE_DEVICES"] = '0,1,2,3'
  5. # 指定要使用哪张卡
  6. device_ids = [0, 1] #假设只用两张卡
  7. # 将模型搬到GPU上,并行化处理
  8. model = torch.nn.DataParallel(model, device_ids=device_ids)
  9. model = model.cuda()
  10. # 或者直接
  11. model = torch.nn.DataParallel(model, device_ids=device_ids).cuda()

四、GPU利用率很低的可能原因分析

训练中GPU利用率很低4%,CPU利用率很高80%左右,原因分析:

(1)CPU性能不足,没有ssd加速;

(2)电脑只有一张显卡,无法并行训练model;——转移到服务器上多卡一起并行训练

(3)模型太复杂,要训练的参数多;——优化模型

(4)且Dataloader读入数据的时候numworks=0,单线程读入比较慢;——numworks=4,适当增大,观察GPU的提升,但CPU跑满就没法再继续增加了

(5)程序中每次迭代训练都采用日志保存所有的训练结果,频繁I/O读取;——先不记录,调好参数之后再训练时记录;

小结:主要考虑优化数据读取(I/O速度);数据传输;数据GPU上预处理;优化算法;调整硬件资源;

在不改变硬件条件的情况下,最能够努力的就是增加数据读取的进程,以及尽量把数据预处理操作能移到GPU上进行的就都移到GPU上

GPU利用率低解决方案

跑深度学习模型的时候我的gpu利用率很低_mob64ca12d2a342的技术博客_51CTO博客

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多