深度学习训练中的GPU利用率和显存占用问题、num_workers&batch_size设置问题

前言

在跑数据集时碰到了GPU利用率浮动的问题,上网查了查解决方案。随手看了一下相关内容。。。深度学习就那么几个参数,调多了总能碰到合适的吧。
但我的GPU利用率浮动问题仍然没解决(50%-100%之间)
本篇文章参考:深度学习训练中的GPU利用率和显存占用问题、num_workers&batch_size设置问题
linux下查看GPU参数可参考:JC-Linux系统下常用命令

GPU显存

占GPU显存的主要是两部分,一是模型网络的加载,而是batch_size大小的设置。模型的加载很难控制(但是考虑到部署的话就要考虑模型加载需要的显存问题了),一般调节batch_size来控制显存的占用(若出现out of memry,那就调batch_size就完事了)

GPU利用率

GPU只是在数据在网络的流通下使用。而数据的加载,预处理,后处理等都是在CPU上进行(了解一下CPU的核心、线程、超线程等)。GPU利用的好不好,主要是看和CPU配合的怎么样,还有就是内存带宽等。如果衔接流畅就能有一个不错的利用率。

GPU利用率低的因素有很多,一般情况下,通过调节num_workers数量调节GPU利用率。设置在一个比较大的范围内比较好(可以考虑8-16),但不是越大越好。因为越大,虽然线程多了,但是切分到每一个线程消耗也大了,所以会增加CPU的负荷,从而降低对GPU的利用。num_workers数一般和batch_size数配合使用。

再者可能是因为打印日志、计算eta等无关数据处理和计算的操作占用了CPU处理时间。
还要注意的一个问题就是,你的网络训练结束的标准是什么。是以epoch还是iteration为标准。如果是以iteration为标准,那么你加大batch_size大小,网络训练时间自然就会增加,此时需要在batch_size翻倍时iteration打对折。如果是以epoch为标准,那么更改batch_size时不需要做其他更改。
“但是如果你的网络本身就是一个小网络,可能GPU的利用率就是上不去。因为你的batch中的数据很小,又不能用过大的batch_size(一般选取2-32),也不能用过大的num_workers,所以GPU利用率就是很低。”这样说可能不太正确,因为时间消耗相对变大可能只是浪费在多次传输数据上,而CPU的处理速度还是不变的。
参考:深度学习PyTorch,TensorFlow中GPU利用率较低,CPU利用率很低,且模型训练速度很慢的问题总结与分析
训练效率低?GPU利用率上不去?快来看看别人家的tricks吧~

batch_size不能选取过大来占据显存

如果你的batch_size选择已经达到了32了还没能占完显存,那可能是你的数据单个样本占存本来就很小。此时再增大batch_size就要慎重了。
参考:batch_size是否越大越好?

总结

粗略的讲,batch_size管显存,num_workers管GPU利用率。batch_size设置一般为2-32,num_workers一般为8、16。

### 如何降低李沐深度学习教程中的GPU资源占用 在实际操作中,可以通过调整模型参数、优化数据处理流程以及合理配置硬件资源等方式来减少GPU资源的占用。以下是几种具体方法: #### 调整Batch Size 减小批量大小(batch size)可以显著降低显存需求。虽然较小的批处理可能导致收敛速度下降,但在某些情况下这是权衡性能资源的有效手段[^2]。 #### 使用混合精度训练 (Mixed Precision Training) 采用半精度浮点数(float16)代替标准的单精度浮点数(float32)能够有效节省显存空间,并加快计算过程。PyTorch 提供了 `torch.cuda.amp` 自动混合精度工具包用于简化这一设置[^3]。 ```python from torch.cuda.amp import GradScaler, autocast scaler = GradScaler() for input, target in data_loader: optimizer.zero_grad() with autocast(): output = model(input) loss = criterion(output, target) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update() ``` #### 启用梯度裁剪 (Gradient Checkpointing) 当网络层数较多时,保存每一层激活值所需的额外内存会迅速增加。启用梯度检查点技术可以让框架重新计算这些中间状态而不是将其缓存下来,从而大幅削减显存量的需求。 #### 利用分布式训练策略 如果存在多个可用设备,则应考虑实施分布式的训练方式如 DDP 来平衡各节点间的负担。相比简单的 Data Parallelism 方法,它更高效地利用每一块 GPU 的潜力而不至于让某几片承担过多的任务负荷。 另外值得注意的是,在Windows环境下借助WSL2也可以很好地完成上述提到的各种任务由于其良好的兼容性对最新CUDA版本的支持[^4]。 最后还可以尝试引入自动化调参库比如 PyCaret 这样的高级API封装好的平台来进行快速原型设计阶段的工作流构建以便更快找到合适的超参数组合进而间接达到节约计算成本的目的[^5]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

毋小黑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值