深度学习训练中的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显存占用较高而利用率较低时,通常涉及以下几个方面的原因: #### 1. **数据加载速度不足** 如果`Dataloader`中的`num_workers`设置过低,可能导致CPU的数据预处理能力无法满足GPU的需求。这使得GPU大部分时间处于等待状态,从而导致利用率低下[^5]。 #### 2. **内存访问模式不优** 显卡性能受内存访问模式影响显著。非连续的内存访问会增加延迟并降低带宽利用效率。此外,频繁访问全局内存而非共享内存也会加剧这一问题[^3]。 #### 3. **批大小(Batch Size)不合适** 较小的批大小虽然能减少显存消耗,但也可能使计算资源得不到充分利用。这是因为现代GPU架构设计倾向于大规模并行运算,在小批量情况下难以发挥其优势[^1]。 #### 4. **模型复杂度与硬件匹配不当** 某些模型结构可能存在大量轻量级操作或控制流分支,这些特性不适合高度并行化的GPU执行环境,进而造成资源浪费[^4]。 ### 解决方案 针对上述原因,可采取如下措施提升多GPU场景下的整体效能: #### 调整数据管道配置 合理设定`Dataloader`参数,特别是将`num_workers`调整至接近于系统可用CPU核心数量的一半左右,并启用`pin_memory=True`选项以加速主机到设备间的数据传递过程[^2]。 #### 优化存储子系统交互方式 重构代码逻辑以便更多采用连续区块式的访存策略;对于重复使用的中间结果考虑缓存在本地快速暂存区(shared memory)内而不是每次都重新从远程较慢位置(global memory)获取。 #### 修改训练超参组合 尝试增大batch size直至达到合理的平衡点——既能有效填充所有SM单元又能维持足够的剩余空间用于其他必要开销如梯度累积等。 #### 审视网络定义细节 检查是否存在过多串行依赖关系的操作节点以及不必要的条件判断语句,尽可能简化拓扑连接形式使之更加适合当前所选用的具体型号规格之特点。 通过综合运用以上几种手段往往能够显著改善实际运行效果。 ```python import torch from torch.utils.data import DataLoader, Dataset class CustomDataset(Dataset): def __init__(self, data): self.data = data def __len__(self): return len(self.data) def __getitem__(self, idx): sample = self.data[idx] # Add any necessary preprocessing here return sample dataset = CustomDataset(your_data) # Optimize dataloader settings data_loader = DataLoader( dataset, batch_size=your_optimal_batch_size, shuffle=True, num_workers=min(16, os.cpu_count()), # Adjust based on your system's CPU core count pin_memory=True # Enable pinned (page-locked) memory to speed up host-to-device transfers ) ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

毋小黑

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

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

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

打赏作者

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

抵扣说明:

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

余额充值