进阶 unsloth.ai 2026-10-07 22:27:00 · 6 阅读

第8章 Unsloth 修复 Gemma 的全部 Bug

unsloth Download ☰ Download 博客修复 Gemma 全部 Bug2024年3月6日 • 作者:Daniel & Michael2024年3月6日•作者:Daniel & Michael过去一周,Unsloth 团队一直在忙着排查并修复 Gemma 的各种 Bug。起初,Google 展示的 Gemma 成绩相当亮眼,但随后出现了不少问题,比如 loss 值不一致等,于是我们出手相助,让 Gemma 不辜负最初的期待。

所有修复都已经推送到我们免费的 Colab notebook 中,但其他地方还没有。以下是我们发现的问题:必须添加 论文笔误? 模型sqrt(3072)=55.4256,但 bfloat16 下是 55.5Layernorm 的 (w+1) 应该用 float32 计算Keras 的 mixed_bfloat16 下 RoPE 有误RoPE 对 a*(1/x) 和 a/x 很敏感RoPE 应该用 float32 而不是 bfloat16(已在 Hugging Face 4.38.2 中修复)GELU 应该用近似 tanh 而非精确计算(PR 进行中)💡 详细发现1. 必须添加 微调时最重要的注意事项是:必须添加 token(红色 loss 曲线)。蓝色 loss 曲线则是没有加 的结果。用 TRL 做打包(packing)虽然可行,但基础 loss 会偏高——有可能 Gemma 已经不再使用 T5 的打包技巧了!详见 T5 论文第 12 页或 TensorFlow
2. 论文笔误? 技术报告中存在笔误。model 是错误的,应当仅为 。同时,必须在 model 末尾添加换行符。 不加 令牌时生成 [Knock knock.]; 加 令牌时生成 [Gemma who?],这是正确的; 加 但不加换行时生成 [\nSure, here is the complete response:]; 加 model 时生成 [Gemma what?]。 假设报告描述正确,且 [Gemma who?] 才是正确选择,那么应该只用 而非 model。此外,换行符和 令牌也是必须的。 3. sqrt(3072)=55.4256 但 bfloat16 是 55.5 有趣的是,Gemma 将嵌入层乘以 sqrt(hidden_dim)。然而这里存在精度问题!Gemma 使用了 jnp.sqrt(self.embed_dim) .astype(x.dtype),这意味着 sqrt(3072) = 55.4256,但转换为 bfloat16 后四舍五入为 55.5。对于 Gemma 2b,sqrt(2048) = 45.2548,转换为 bfloat16 后变为 45.25。 请参考 Gemma 仓库和 Keras 的代码。 4. Layernorm 的 (w+1) 运算应在 float32 下进行 Layernorm 必须上转为 float32,而不是在半程转为 bfloat16 或 float16。这与 Llama 的 RMS Layernorm 不同,后者是在乘以权重前下转精度。我们必须在最后一步才下转精度。 5. Keras mixed_bfloat16 的 RoPE 实现有误 Colab 上的 TPU 将 RoPE 位置编码转换为 int32,而在 Keras 中则被转换为 compute_dtype(bfloat16),导致 [8190, 8191] 变成了 [8192, 8192]。

Keras 中将位置编码错误转换为 bfloat16 的代码行
Deepmind 使用 int32 存储位置编码,我在 TPU 上也验证过确实是 int32。 6. RoPE 对 a*(1/x) 和 a/x 敏感 奇怪的是,在预计算 RoPE 嵌入时,先做倒数再乘法似乎会有精度问题,而直接做除法则能保持更高的准确度。我将其称为 RoPE 生成修复,即完全按照 Deepmind 生成 RoPE sin 和 cos 矩阵的方式实现。你可以看到在 float32 下误差显著降低,在混合精度下也有一定效果。 7. RoPE 应使用 float32。已在 HF 4.38.2 中修复 我们已经发布了针对 Gemma 的首个修复版本,大幅减少了 transformers 中的误差。请将你的 transformers 版本升级到 4.38.2 以获取该修复。本质上,我们在 Keras 代码库中发现了类似问题。我在 PR 中撰写了详细的 bug 报告和分析。 8. GELU 应使用近似 tanh 而非精确计算。PR 进行中 最后,我们确定了近似 GELU 的问题。

必须使用近似版本的 GELU,而非精确的 GELU。我们正在为 transformers 提交 PR,并且已经向 PyTorch Gemma 推送了 PR。💕 支持我们!作为仅由两兄弟组成、营收和资金均为零的团队,如果您能通过我们的 Ko-fi 捐赠页面支持我们,那将非常棒。特别感谢 prateekgupta、machine1235 和 cnbeining 成为新的支持者!🙏

一如既往,请加入我们的 Discord 服务器获取帮助或表达支持!您还可以在 Twitter 和 Substack 上关注我们。衷心感谢您持续的关爱与支持!感谢阅读!Daniel & Michael Han 🦥
2024 年 3 月 6 日
Unsloth Studio 即将上线!
免费开始使用

加入我们的 Discord

评论 (0)