梯度累积的隐藏陷阱:Transformer库中梯度累积机制的缺陷与修正

在本地环境下对大规模语言模型(LLMs)进行微调时,由于GPU显存限制,采用大批量训练通常难以实现。为解决此问题,一般普遍会采用梯度累积技术来模拟较大的批量规模。该方法不同于传统的每批次更新模型权重的方式,而是通过在多个小批量上累积梯度,在达到预设的累积次数后才执行权重更新。这种方法有效地实现了大批量训练的效果,同时避免了常见的内存开销问题。

理论上设置批量大小为1并在32个批次上累积梯度,其效果应等同于直接使用批量大小32进行训练。但是实际研究发现,在使用主流深度学习框架(如Transformers)时,梯度累积方法往往导致模型性能显著低于直接使用大批量训练的结果。

这一问题在reddit上引起了广泛讨论,并且Unsloth AI的Daniel Han成功复现了该问题。他发现这一问题不仅影响单机梯度累积,还影响多GPU训练环境。在多GPU配置中,由于梯度在多设备间隐式累积,会导致模型训练效果不达预期。并且这个问题可能在过去多年的模型训练中一直存在且未被发现。

本文将从以下几个方面展开讨论:首先阐述梯度累积的基本原理,通过实例说明问题的具体表现和错误累积过程;其次分析不同训练场景下该问题的影响程度;最后评估Unsloth提出并已被Hugging Face在Transformers框架中实现的修正方案的有效性。

https://avoid.overfit.cn/post/abe2d4a766f343d3b7d3906cd2e807a1

posted @ 2024-10-24 09:40  deephub  阅读(34)  评论(0编辑  收藏  举报