快速结论:该报错通常出现在使用 LoRA 微调 Gemma 4 31B 模型时,表现为梯度裁剪前的梯度范数异常偏大(可能达到正常值的数十到数百倍)。优先排查 Gemma 4 注意力机制中的 scaling=1.0 设置,这是导致梯度尖峰的主要诱因,而非代码 bug。
适用环境:Transformers + PEFT 框架,Gemma 4 31B 模型,PyTorch ≥2.6.0,CUDA 环境(H200/A100 或 ≥80GB 显存),bf16 精度,未量化。
最快修复方案:暂无确认的一步修复方案。Issue 讨论确认这并非 transformers 实现的 bug,而是 Gemma 4 模型设计固有的行为。可通过梯度裁剪(max_grad_norm)控制实际更新幅度,或在微调时接受梯度范数偏大的现象。
注意事项:不要修改 scaling=1.0 值——模型预训练时已按此配置,修改会破坏与预训练权重的对应关系。LoRA 会放大梯度尖峰效应,这是设计固有的,不是代码缺陷。
问题场景
用户在 transformers.Trainer + peft 环境下对 google/gemma-4-31B-it 进行 LoRA 微调,发现梯度裁剪前的梯度范数异常:步骤 1–5 达到 11–30,步骤 8 甚至高达 312,而同脚本在 Qwen3-32B、Llama-3.3-70B 等类似模型上梯度范数始终低于 2.0。该现象在 Unsloth 和自定义 FSDP-2 环境中也能复现,说明可能根源在 transformers 的 Gemma 4 建模代码。
报错原文
Gemma 4: Exploding pre-clip gradient norms during LoRA fine-tuning of `gemma-4-31B-it`
STEP LOSS GRAD_NORM LR
1 4.0690 29.16 0.00e+00
2 4.9466 11.40 2.00e-05
3 3.5648 30.76 4.00e-05
4 4.3582 23.92 6.00e-05
5 3.3984 21.58 8.00e-05
6 3.2813 5.39 1.00e-04
7 3.2394 5.26 9.96e-05
8 2.7875 312.30 9.84e-05 <-- 312 PRE-CLIP, ~70× the running mean
原因分析
可能原因:Gemma 4 文本注意力使用 scaling=1.0 与 QK-RMSNorm 组合。由于 RMSNorm 强制 ||q|| = ||k|| = sqrt(head_dim),pre-softmax logit 方差变为 scaling² × head_dim。在 head_dim=256 的滑动注意力层(L27、L32、L33),logit 标准差为 16 而非标准的 1,导致注意力熵极低(约 0.4 bits,健康情况约为 6 bits),softmax 近乎 one-hot。
这种结构在训练中当 Q 和 K 对齐增强时容易进入饱和区,softmax 反向传播会产生不成比例的 dK 梯度。LoRA 的低秩更新协调性不足,更容易使特定注意力头漂移到不稳定区域。梯度尖峰在 loss 上不可见(step 8 loss=2.79 并不异常),因为 loss 是 token 平均,单个不稳定头的影响被掩盖。
环境排查
- PyTorch ≥ 2.6.0
- transformers + peft + accelerate + datasets + bitsandbytes
- GPU:H200/A100,显存 ≥ 80GB(bf16 下运行 31B 模型)
- 注意力实现:sdpa(scaled dot-product attention)
- 验证:在 CPU-only 配置下也可复现 dK/dV 不对称现象,无需完整模型
解决步骤
- 确认现象是否影响实际训练:检查
max_grad_norm=1.0下 optimizer 实际更新是否仍在合理范围。Issue 中确认 clipping 后更新有界,训练仍可正常进行。 - 复现 dK/dV 不对称:使用最小化配置(仅 CPU)重现 Gemma4TextAttention(Q/K RMSNorm、v_norm 无 scale、GQA、RoPE),验证 scaling=1.0 时 dK/dV≈1.82x,熵≈0.62 bits。
- 尝试替代 scaling:可优先尝试将 scaling 设为 1/√head_dim 测试梯度变化(注意:这仅供诊断,非修复方案)。结果会反向过度校正(dK/dV≈0.23x),说明不是直接解决方案。
- 接受默认行为:Issue 最终结论是这不是代码 bug,而是 Gemma 4 设计固有的。保持
scaling=1.0不变,使用梯度裁剪保证训练稳定。 - 如需进一步排查:检查是否特定层(L27、L32、L33 的 head_dim=256 层)出现尖峰,对比其他层的梯度贡献情况。
验证方法
确认问题“解决”的方式:1)理解梯度尖峰的机制后,确认训练仍能正常收敛(loss 下降趋势正常);2)在 CPU 最小复现脚本中验证 dK/dV 非对称性与 scaling 的对应关系;3)对比修改 scaling 前后的梯度范数变化,确认 1/√head_dim 只是过校正而非修复。
参考来源
huggingface/transformers #45676
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[Bug]: parsing markdown error: failed to encode response: json: unsupported value: NaN (status code: 500)](https://www.chat-gpts.plus/wp-content/uploads/2026/08/15392-bea47837-768x403.jpg)

