一、使用device控制使用CPU还是GPU
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") # 单GPU或者CPU.先判断机器上是否存在GPU,没有则使用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
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") if torch.cuda.device_count() > 1: model = nn.DataParallel(model,device_ids=[0,1,2])
.cuda() 只能指定GPU
os.environ['CUDA_VISIBLE_DEVICES']="1" os.environ['CUDA_VISIBLE_DEVICES'] = "0,1,2,3" net = torch.nn.Dataparallel(net, device_ids =device_ids) net = torch.nn.Dataparallel(net) # 默认使用所有的device_ids os.environment['CUDA_VISIBLE_DEVICES'] = '0,1,2,3' net = torch.nn.Dataparallel(net, device_ids =device_ids) net = torch.nn.Dataparallel(net) # 默认使用所有的device_ids
三、指定使用的GPU
使用方式
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" os.environ["CUDA_VISIBLE_DEVICES"] = '0,1,2,3' device_ids = [0, 1] #假设只用两张卡 model = torch.nn.DataParallel(model, device_ids=device_ids) 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博客
|