Prhub

#2132 fix(mtp): support multi-head MTP loss logging (mtp-num-layers > 1)

原始 PR 作者 ZiyiTsang 合并时间 2026-08-12 13:42 文件变更 1 提交数 1 评论 0 代码增减 +6 / -4

执行摘要

修复多 head MTP 训练日志崩溃

关联Issue #2131明确指出:当--mtp-num-layers > 1且启用--enable-mtp-training时,训练在日志阶段崩溃,因为代码硬编码了单MTP层的假设。Issue提供了详细的复现条件和日志,期望行为是正常运行并记录日志。

该PR值得精读,因为它修复了多head MTP训练的关键bug。设计决策上,采用保留向量并分别记录每个head loss的方式,为后续分析提供了更细粒度的信息。建议补充单元测试覆盖多head MTP场景,防止回归。

讨论亮点

该PR无review评论和讨论线程,因此无显著讨论。

实现拆解

  1. 修改slime/backends/megatron_utils/model.pytrain函数的MTP loss日志部分。
  2. mtp_losses = (tracker["values"] * mtp_loss_scale).item()改为保留向量:mtp_losses = tracker["values"] * mtp_loss_scale,避免对向量调用.item()
  3. 在日志字典中循环添加每个head的loss,键为train/{role_tag}mtp_{_i+1}_loss,同时添加求和后的train/{role_tag}mtp_loss
  4. CI检查check_mtp_loss参数改为mtp_losses.sum().item()
  5. 无测试文件变更,风险集中在日志路径。
文件 模块 状态 重要度
slime/backends/megatron_utils/model.py 后端 modified 5.92

关键符号

train

关键源码片段

slime/backends/megatron_utils/model.py data-contract

核心改动文件,修复多 head MTP loss 日志逻辑。

# slime/backends/megatron_utils/model.py
# Multi-head MTP: tracker["values"] 是 [num_mtp_layers] 向量
mtp_losses = tracker["values"] * mtp_loss_scale# 在日志字典中分别记录每个 head 的 loss,并记录总和
if args.enable_mtp_training:
    for _i in range(mtp_losses.shape[0]):
        log_dict[f"train/{role_tag}mtp_{_i + 1}_loss"] = mtp_losses[_i].item()
    log_dict[f"train/{role_tag}mtp_loss"] = mtp_losses.sum().item()# CI 检查使用总和,避免向量传入造成类型错误
check_mtp_loss(mtp_losses.sum().item())

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

主要风险在于修复仅覆盖日志路径,若MTPLossLoggingHelper的values形状在不同配置下不一致(如标量或更高维),可能仍会出错。此外,未添加测试,回归风险存在。代码改动集中在model.pytrain函数,影响训练日志记录。

影响范围限于启用--enable-mtp-training--mtp-num-layers > 1的多head MTP训练场景。修复后,这些场景的训练将不会在日志阶段崩溃,并输出每个head的loss。对单head MTP无影响(mtp_losses形状为1,循环输出一个值,求和相同)。对用户和系统的影响是正面的,提升了多head MTP训练的可用性。

缺少测试覆盖 日志路径变更

关联 Issue

#2131 [Bug] Multi-head MTP (`--mtp-num-layers > 1`) crashes at training-step logging

完整报告

参与讨论