知识积累(一):显存不足

本文探讨了大模型训练中如何应对内存不足问题,包括梯度累积技术、不同精度格式的使用、以及ZeRO-offload技术的应用。文章还介绍了模型训练的梯度更新原理和在多个GPU上的数据并行与分布式数据并行方法。
摘要由CSDN通过智能技术生成

1. 大模型训练时,运行时内存不足:

减少内存使用的技术:
1)减小batch大小
2)减少参数
3)梯度累积
4)梯度检查点(只更新部分神经元梯度)
5)混合精度训练(FP16是标准FP32精度的一半,占用内存也是一半)
6)ZeRO-offload

1.1 梯度累积原理:

如果我们只有一个 GPU 但仍想使用更大的批量大小,另一种选择是累积一定数量的步骤的梯度,有效地累积一定数量的小批量的梯度,从而增加有效的批量大小。从上面的例子中,我们可以通过 3 次迭代累积 10 个数据点的梯度,以达到与我们在有效批量大小为 30 的 DDP 训练中描述的结果相同的结果。

1.2 数值精度:

1)单精度浮点数(fp32):占4个字节
2)半精度浮点数(fp16):与单精度浮点数相比,它的优点是只需要一半的存储空间和带宽(但是会牺牲精度和数值范围)
3)BF16(brain floating point)
  在这里的混合精度训练,指代的是单精度 float和半精度 float16 混合。

1.3 ZeRO-offload技术:

ZeRO Offload 允许将优化器内存、梯度和模型权重卸载到 CPU 或 NVMe,从而释放 GPU 内存并支持对超出设备内存的模型进行训练。

2. 模型训练的梯度更新原理:

模型的参数更新以Batch为单位,每个batch更新一次参数。每个batch分别在跑完前一个batch的参数基础上跑,并在这一基础上更新。
某参数更新梯度 = 某参数更新前梯度 - 学习率*(损失函数在该参数处导数)
简单的损失函数:均方差(平均平方误差),平均是指对于一个batch中的m个数据,平方是指每个数据实际-y 和 gold-y之间的误差平方

3. 多个GPU的梯度更新原理:

1)数据并行(DP)
   a)数据和模型由主GPU发送到其他GPU
   b)在每个 GPU 上进行前向传递并将输出传递给主 GPU
   c)在主 GPU 上计算总损失,然后将损失发送回每个 GPU 以计算参数的梯度
   d) 将梯度发送回Master GPU(这些是所有训练示例的梯度平均值),将它们相加得到整批30个的平均梯度
   e)更新主 GPU 上的参数并将这些更新发送到其他 2 个 GPU 以进行下一次迭代
2)分布式数据并行(DDP)(目前优先使用)
   a)(缓解GIL限制)在DDP模式下,会有N个进程被启动,每个进程在一张卡上加载一个模型,这些模型的参数在数值上是相同的。
   b)(Ring-Reduce加速)在模型训练时,各个进程通过一种叫Ring-Reduce的方法与其他进程通讯,交换各自的梯度,从而获得所有进程的梯度;
   c)(实际上就是Data Parallelism)各个进程用平均后的梯度更新自己的参数,因为各个进程的初始参数、更新梯度是一致的,所以更新后的参数也是完全相同的。

参考资料:

【1】显存不足:https://dataroots.io/blog/runtimeerror-cuda-out-of-memory
【2】梯度:https://blog.csdn.net/qq_41608408/article/details/127396096#:~:text=%E6%8A%8A%E6%8D%9F%E5%A4%B1%E5%87%BD%E6%95%B0%E5%B8%A6%E5%85%A5%E6%A2%AF%E5%BA%A6%E4%B8%8B%E9%99%8D%E5%85%AC%E5%BC%8F%EF%BC%9A%20%CE%B8j%20%3A%3D%20%CE%B8j,%E2%88%92%CE%B1d%CE%B8%CE%B8jd%20m1%20i%3D1%E2%88%91m%20%28h%28xi%29%E2%88%92yi%292
【3】DP和DDP:https://zhuanlan.zhihu.com/p/647124338
【4】DDP更新梯度:https://zhuanlan.zhihu.com/p/178402798
【5】数据精度:https://zhuanlan.zhihu.com/p/657886517?theme=dark
【6】fp32表示数据举例:https://zhuanlan.zhihu.com/p/632347955
【7】zero-offload:https://zhuanlan.zhihu.com/p/657946200
【8】混合精度训练:https://zhuanlan.zhihu.com/p/103685761
【9】batch—size:https://zhuanlan.zhihu.com/p/408321973#:~:text=%E9%A6%96%E5%85%88%EF%BC%8C%E8%A6%81%E6%B8%85%E6%A5%9A%E7%9A%84%E6%98%AF%EF%BC%9Aloss.back%20%28%29%E7%94%A8%E4%BA%8E%E8%AE%A1%E7%AE%97%E6%A2%AF%E5%BA%A6%EF%BC%8C%E8%80%8Coptimizer.step,%28%29%E7%9A%84%E4%BD%BF%E7%94%A8%E6%98%AF%E5%9F%BA%E4%BA%8E%E6%A2%AF%E5%BA%A6%E6%9D%A5%E6%9B%B4%E6%96%B0%E5%8F%82%E6%95%B0%E3%80%82%20%E8%AE%AD%E7%BB%83%E9%9B%86%E4%B8%AD%E7%9A%84%E6%AF%8F%E4%B8%80%E6%9D%A1%E6%95%B0%E6%8D%AE%E9%83%BD%E6%98%AF%E5%8F%AF%E4%BB%A5%E7%94%A8%E6%9D%A5%E6%9B%B4%E6%96%B0%E6%A8%A1%E5%9E%8B%E5%8F%82%E6%95%B0%E7%9A%84%E3%80%82%20%E5%A6%82%E6%9E%9C%E4%B8%80%E4%B8%AAepoch%E6%9B%B4%E6%96%B0%E4%B8%80%E6%AC%A1%E5%8F%82%E6%95%B0%EF%BC%8C%E5%88%99%E4%BC%9A%E5%85%88%E5%B0%86%E6%89%80%E6%9C%89%E8%AE%AD%E7%BB%83%E9%9B%86%E6%95%B0%E6%8D%AE%E8%AE%A1%E7%AE%97%E5%87%BA%E6%9D%A5%E7%9A%84%E6%A2%AF%E5%BA%A6%E5%85%88%E4%BF%9D%E5%AD%98%E8%B5%B7%E6%9D%A5%EF%BC%8C%E7%AD%89%E7%BB%8F%E5%8E%86%E4%BA%86%E4%B8%80%E4%B8%AAepoch%E5%90%8E%EF%BC%8C%E5%B0%B1%E4%BC%9A%E5%88%A9%E7%94%A8%E6%95%B4%E4%B8%AAepoch%E6%95%B0%E6%8D%AE%E8%AE%A1%E7%AE%97%E5%87%BA%E6%9D%A5%E7%9A%84%E6%A2%AF%E5%BA%A6%E4%B8%80%E6%AC%A1%E6%80%A7%E4%BD%BF%E7%94%A8%E6%89%80%E6%9C%89%E8%AE%AD%E7%BB%83%E9%9B%86%E6%95%B0%E6%8D%AE%E4%B8%BA%E5%8F%82%E6%95%B0%E6%9B%B4%E6%96%B0%E6%96%BD%E5%8A%A0%E7%9A%84%E8%B4%A1%E7%8C%AE%E3%80%82

  • 18
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值