层1: 修复 HF 梯度累积契约坑——compute_loss 按新式契约返回 sum/num_items_in_batch
根因(探针定案):预训练模型真实 CE≈0.85,训练日志 7.5≈0.94×8(累积步数)。 Qwen3 forward 接受 loss_kwargs → Trainer 走新式契约不再除以累积步数,我们 返回裸 mean 导致日志与梯度同放大 8 倍。sft_loss 纯函数不动,适配收口在 compute_loss;docs/02 §5 勘误起点预期(~0.85)并记录此坑。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -133,6 +133,14 @@ class SFTTrainer(Trainer):
|
||||
inputs["labels"],
|
||||
inputs["attention_mask"],
|
||||
)
|
||||
# 非显然约束:HF 梯度累积契约(transformers 4.46 修正后的新式)。模型
|
||||
# forward 接受 loss_kwargs(Qwen3 是)时,Trainer 不再帮你除以累积步数,
|
||||
# 而是期望 compute_loss 返回 sum/num_items_in_batch(整个累积组的总有效
|
||||
# token 数),各微批直接相加得到精确的全局 per-token 均值。返回裸 mean
|
||||
# 会导致日志与梯度同时放大"累积步数"倍——2026-07-18 远程 sanity 的
|
||||
# loss 7.5 ≈ 0.94×8 正是此坑(诊断记录见 docs/02 §5)
|
||||
if num_items_in_batch is not None:
|
||||
loss = loss * num_tokens / num_items_in_batch # mean → sum/N_total
|
||||
self._token_counts.append(num_tokens)
|
||||
return (loss, outputs) if return_outputs else loss
|
||||
|
||||
|
||||
Reference in New Issue
Block a user