Prhub

#1742 Support qwen3.5 loss mask for multi-turn SFT

原始 PR 作者 huang3eng 合并时间 2026-03-22 16:24 文件变更 5 提交数 2 评论 1 代码增减 +481 / -2

执行摘要

为 Qwen3.5 添加专用的多轮 SFT 损失掩码,修复兼容性问题并优化训练效率。

PR body 指出:默认的 --loss-mask-type qwen 在 Qwen3.5 SFT 中会导致 jinja2.exceptions.TemplateError: No user query found in messages.,而 --loss-mask-type qwen3 可能重建额外推理内容并监督不必要的思考 token,增加 token 计数和减慢 SFT。因此,需要添加专用的 Qwen3.5 损失掩码以匹配其聊天模板行为。

建议精读 slime/utils/mask_utils.py 中的 gen_multi_turn_loss_mask_qwen3_5 函数,学习其基于 offset_mapping 的 token 级监督推导方法,以及验证 tokenization 一致性的设计。对于涉及多轮对话 SFT 的开发者,此 PR 提供了处理聊天模板差异的参考方案。

讨论亮点

Review 中只有 Zhuohao-Li 的评论 'lgtm, thanks!',表示批准 PR,没有技术争议或深入讨论。Issue 评论中作者请求 review,但无进一步交互。

实现拆解

实现包括:

1) 在 slime/utils/arguments.py 中添加 qwen3_5 作为 --loss-mask-type 的选项;
2) 在 slime/utils/mask_utils.py 中实现 gen_multi_turn_loss_mask_qwen3_5 函数,使用渲染文本的 offset_mapping 推导字符级掩码到 token 级掩码,并验证 tokenization 一致性;
3) 在 slime/rollout/sft_rollout.py 中添加防御性检查确保 token_idsloss_mask 长度一致;
4) 添加 scripts/run-qwen3.5-35B-A3B-sft.sh 脚本作为示例,指定使用新选项;
5) 添加 tests/utils/test_loss_mask_type_qwen35.py 单元测试覆盖单轮和多轮场景。

文件 模块 状态 重要度
scripts/run-qwen3.5-35B-A3B-sft.sh SFT configuration added 5.0
slime/utils/mask_utils.py loss mask generation modified 8.0
slime/utils/arguments.py argument parsing modified 4.0
slime/rollout/sft_rollout.py SFT rollout modified 4.0
tests/utils/test_loss_mask_type_qwen35.py testing added 5.0

关键符号

gen_multi_turn_loss_mask_qwen3_5

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

Review approval other

Zhuohao-Li 评论 'lgtm, thanks!',表示批准 PR。

结论:PR 被批准合并。 · 已解决

风险与影响

风险包括:

1) gen_multi_turn_loss_mask_qwen3_5 依赖 tokenizer 的 offset_mapping 属性,要求 fast tokenizer 支持,否则会引发 ValueError
2) 字符级掩码映射到 token 级的逻辑可能复杂,需确保与 apply_chat_template 输出一致,验证步骤中添加了检查但可能存在边缘情况;
3) 防御性检查增加运行时验证开销,但影响小;
4) 新脚本依赖环境变量如 BASE_FOLDERMASTER_ADDR,需用户正确配置。

影响范围:

1) 用户:Qwen3.5 用户需更新 SFT 脚本使用 --loss-mask-type qwen3_5 以避免失败并提高效率;
2) 系统:修复了 SFT rollout 崩溃问题,减少不必要的 token 监督,提升训练速度;
3) 团队:增加了代码维护点,但通过单元测试和防御性检查降低风险。

依赖 fast tokenizer 的 offset_mapping 新生成器正确性验证 脚本配置依赖

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论