原贴链接

嘿,r/LocalLLaMA社区的朋友们!几天前,u/TheKaitchup发布了一个问题,指出在大型语言模型(LLM)的训练和微调中使用梯度累积会导致训练损失不同。梯度累积(GA)本可以让人在不使用更多显存(VRAM)的情况下模拟全批次训练。从理论上讲,如果我们保持批次大小(bsz)乘以梯度累积(ga)为常数,那么使用梯度累积应该等同于全批次训练。但实际上训练损失出现了偏差。当bsz = 16且ga = 1时,训练损失似乎比bsz = 1且ga = 16时低得多,如下所示:https://llminfo.image.fangd123.cn/images/4mhpjn52nyud1.png!/format/webp。使用简单的梯度累积会导致在bsz = 16和ga = 16时低秩自适应(LoRA)权重之间的L2范数误差相当大,并且随着梯度累积步数的增加而增大。在Unsloth https://github.com/unslothai/unsloth中修复这个问题后,L2范数变得恒定,并且比使用标准梯度累积小一个数量级。https://preview.redd.it/ya4zipoonyud1.png?width = 1920&format = png&auto = webp&s = 9e1b4d2c834c1989e2ca664bbc3f161b064a7895。我们的博客文章https://unsloth.ai/blog/gradient有更多细节,但简而言之,在交叉熵损失计算期间的归一化因子是不正确的,特别是对于训练不同序列长度的数据集。一旦修复这个问题,我们得到如下训练损失(如预期的那样)在ba = 16和ga = 16时都匹配。https://preview.redd.it/06fskpv2oyud1.png?width = 1920&format = png&auto = webp&s = 0c76c87b262b6e1b2cdd107a596c58f94dc0b755。要使用Unsloth的修复后的梯度累积(GA)训练器,请调用:from unsloth import unsloth_train; trainer_stats = unsloth_train(trainer)。也别忘了通过pip install --upgrade --no - cache - dir unsloth更新Unsloth。我们还有一个免费的Colab笔记本,可以使用我们修复后的训练器对Llama 3.2 1/3B对话风格进行微调,速度提高2倍且显存(VRAM)使用量减少70%:[https://colab.research.google.com/drive/1z0XJU2FCzDC8oyXa2Nd4jCxylRMI - o0 -?usp = sharing](https://colab.research.google.com/drive/1z0XJU2FCzDC8oyXa2Nd4jCxylRMI - o0 -?usp = sharing)。还有一个免费的Kaggle笔记本:[https://www.kaggle.com/code/danielhanchen/fixed - kaggle - llama - 3 - 2 - 1b - 3b - conversation](https://www.kaggle.com/code/danielhanchen/fixed - kaggle - llama - 3 - 2 - 1b - 3b - conversation)。这个问题也会影响所有的多GPU训练,因为在梯度累积时必须累积梯度。使用简单梯度累积的训练器将必须修复这个问题。

讨论总结

原帖讲述LLM训练中梯度累积存在错误,Unsloth修复了这个问题,并介绍了修复后的情况以及相关资源。评论者们大多对原帖作者的修复工作表示赞赏和感谢,部分评论者还就该修复对多GPU训练、预训练、微调等的影响提出疑问并展开技术探讨,也涉及到一些如多模态/视觉支持等其他相关话题,整个讨论氛围积极。

主要观点

  1. 👍 对修复LLM训练中梯度累积问题的工作表示肯定和赞赏
    • 支持理由:解决了之前理论与实际训练损失差异等问题,工作完成迅速且给出详细解释。
    • 反对声音:无。
  2. 🔥 该bug对多GPU训练、预训练和微调有影响
    • 正方观点:错误会随着时间累积,对长序列训练产生不良影响,预训练和微调可能受影响。
    • 反方观点:无。
  3. 💡 不确定更新后重新训练微调模型的必要性以及对准确性的影响
    • 解释:更新后可能对准确性有影响,但不确定影响大小以及是否需要重新训练微调模型。
  4. 👍 在样本打包情况下,原帖提到的梯度累积问题仍然存在但不太明显
    • 支持理由:由技术讨论得出此结论。
    • 反对声音:无。
  5. 💡 目前多GPU训练还未在Unsloth的免费版本中实现,但即将实现
    • 解释:原帖提到影响多GPU训练,评论者询问免费版本情况,作者作出回应。

金句与有趣评论

  1. “😂 No wonder I always find batch size is better than the equal AC which in theory they should have the same effect!”
    • 亮点:指出实际中批处理大小和理论等效的梯度累积效果的差异,是引发讨论的现象之一。
  2. “🤔 TheKaitchup: Once again, incredible work!”
    • 亮点:直接表达对原帖作者修复工作的赞赏。
  3. “👀 nero10579:These are the moments I feel like I am really on the bleeding edge of this technology.”
    • 亮点:体现出技术更新时参与者对自己处于技术前沿的感受。
  4. “😂 UpperDog69: Now this I am very excited about. A lot of the current vision trainers seem very bad, for example llama factory by default uses nearest neighbor scaling to downsize images which is kinda insane in 2024.”
    • 亮点:对视觉训练器现状的有趣吐槽。
  5. “🤔 _sqrkl:Not often you see a "we were wrong about this fundamental thing everyone takes for granted".”
    • 亮点:强调发现基本事情上的错误是少见的。

情感分析

总体情感倾向为积极正面。主要分歧点较少,大部分评论者都认可原帖作者的工作成果。可能的原因是原帖提出的问题修复对LLM训练领域有积极意义,且原帖作者提供了较为详细的解释和有用的资源。

趋势与预测

  • 新兴话题:多模态/视觉支持即将到来可能引发关于这方面技术实现、性能表现等的后续讨论。
  • 潜在影响:对LLM训练领域的发展有积极推动作用,修复梯度累积问题可能提高LLM训练的准确性等相关性能,也可能促使更多训练库进行更新。

详细内容:

《LLM 训练中梯度累积错误的修复及影响》

在 Reddit 的 r/LocalLLaMA 版块,有一个备受关注的帖子。几天前,有人发布了一个关于在训练和微调 LLM 时使用梯度累积所导致训练损失不同的问题,并附上了相关issue。该帖子指出,理论上,在保持 bsz * ga 恒定的情况下,使用梯度累积应等同于全批次训练,但实际训练损失却出现了分歧。比如当 bsz=16 和 ga=1 时,训练损失明显低于 bsz=1 和 ga=16 的情况。

这个帖子获得了众多的点赞和大量的评论,引发了广泛而深入的讨论。主要观点包括: 有人表示“难怪我总觉得批大小比理论上应等效的 AC 效果好!干得漂亮!感谢修复!” 有人提出疑问:“这个错误对多 GPU 训练的影响是否不同?许多价值数百万美元的预训练和微调运行是否可能因此表现稍差?这个错误是否会随着更多步骤而累积并变得更糟?”对此,回复称“1. 有一点不同但相似,因为梯度会累积然后平均。2. 也许是的,虽然确切的精度差异不清楚,但输出肯定是不正确的。3. 错误会随时间累积。”

有人称赞“哇,基本上所有的训练库都需要用这个更新吗?”得到的回答是“不幸的是,没错”。

还有人对即将到来的多模态/视觉支持表示期待。

关于是否需要重新使用此更新训练微调模型以及对精度的影响,有人提问,目前尚未有确切的定论。

这个问题不仅影响了单 GPU 训练,也对多 GPU 训练产生了影响。虽然修复带来了希望,但仍有许多未知和需要探索的地方。这次的发现和修复,无疑为 LLM 训练的准确性和效率带来了新的思考和挑战。