当前位置: 首页 > news >正文

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

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

device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") 
# 单GPU或者CPU.先判断机器上是否存在GPU,没有则使用CPU训练
model = model.to(device)
data = data.to(device)#或者在确定有GPU的情况下,直接使用
model = model.cuda()
data = data.cuda()#在确定没有GPU的情况下,直接使用
model = model.cpu()
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

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

.cuda() 只能指定GPU

#指定某个GPU
os.environ['CUDA_VISIBLE_DEVICES']="1"
model.cuda()
#如果是多GPU
os.environ['CUDA_VISIBLE_DEVICES'] = "0,1,2,3"
device_ids = [0,1,2,3]
net  = torch.nn.Dataparallel(net, device_ids =device_ids)
net  = torch.nn.Dataparallel(net) # 默认使用所有的device_ids 
net = net.cuda()model.cuda()
#如果是多GPU
os.environment['CUDA_VISIBLE_DEVICES'] = '0,1,2,3'
device_ids = [0,1,2,3]
net  = torch.nn.Dataparallel(net, device_ids =device_ids)
net  = torch.nn.Dataparallel(net) # 默认使用所有的device_ids 
net = net.cuda()

三、指定使用的GPU

使用方式

import os# 给服务器上的GPU编号
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = '0,1,2,3'# 指定要使用哪张卡
device_ids = [0, 1] #假设只用两张卡# 将模型搬到GPU上,并行化处理
model = torch.nn.DataParallel(model, device_ids=device_ids)
model = model.cuda()
# 或者直接
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博客

http://www.lryc.cn/news/256321.html

相关文章:

  • SpringBoot3-实现和注册拦截器
  • Ubuntu 22.04源码安装yasm 1.3.0
  • LeetCode [中等]矩阵置零
  • 十一、了解分布式计算
  • 数据结构和算法专题---2、算法思想
  • 在AWS Lambda上部署标准FFmpeg工具——自定义层的方案
  • prometheus服务发现之consul
  • 基于SSM的鞍山职业技术学院图书借阅管理系统
  • 分布式数据库HBase
  • 快捷切换raw页面到repo页面-Raw2Repo插件
  • web:[GXYCTF2019]BabyUpload(文件上传、一句话木马、文件过滤)
  • C++ Div3、Sqrt 函数高性能实现(带汇编指令集)
  • 西南科技大学模拟电子技术实验四(集成运算放大器的线性应用)预习报告
  • 【五分钟】学会利用cv2.resize()函数实现图像缩放
  • vuepress-----18、图片缩放
  • 前端开发_移动Web+动画
  • 【Python】 生成二维码
  • Qt与Sqlite3
  • 在idea中使用maven创建dynamic web project
  • 【外观模式】SpringBoot集成mail发送邮件
  • GUAVA 工具类
  • 高云GW1NSR-4C开发板上手使用
  • androidstudio设置内存
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • flask web学习之flask与http(一)
  • 蓝桥杯日期问题
  • 每天一点python——day90
  • 《巫师3》缺失vcomp110.dll如何解决,如何快速修复vcomp110.dll丢失问题
  • LangChain学习二:提示-实战(上半部分)
  • SpringBoot集成i18n(多语言)