执行摘要
- 一句话:修复 MTP 掩码错位,统一 input-aligned 契约
- 推荐动作:
功能与动机
PR body 明确指出:Miles builds full_loss_masks in next-token/prediction alignment, but calls Megatron with labels=None。Megatron 的 MTP 路径从 input_ids 推导 labels 并“shifts the supplied mask along with them before applying the additional MTP-depth shift”,因此“Passing an already prediction-aligned mask ... advances the mask one token too far relative to the MTP targets”。例如目标监督区间 4–8 会实际选中 3–7,辅助损失作用于错误边界位置。
实现拆解
该变更按以下 4 步落地:
-
新增掩码构造函数:在 miles/backends/training_utils/data.py 中新增 _prepare_loss_masks(),把 response 掩码先做 prompt_length 的左补零(去掉了原先 prediction-aligned 的 prompt_length - 1 左补 + 1 右补),得到 mask[i] == 1 iff tokens[i] 是受监督 response token 的 input-aligned 掩码,随后用与 tokens 完全相同的 packing/CP 切片逻辑处理(slice_with_cp、F.pad、chunk(cp_size)),保证在 CP 分片后仍与 tokens 形状一致。
-
替换批处理键:get_batch() 中调用 _prepare_loss_masks() 产出 `batch[
关键文件:
miles/backends/training_utils/data.py(模块 miles/backends;类别 source;类型 core-logic;符号 _prepare_loss_masks): 源码主路径;涉及符号 _prepare_loss_masks;包含 控制流调整、配置键调整、符号定义调整;+59/-34
tests/fast/backends/megatron_utils/test_mtp_loss_mask_alignment.py(模块 mtp/loss/mask/alignment;类别 test;类型 test-coverage;符号 test_actual_mtp_loss_selects_intended_targets, output_layer): 测试配套;涉及符号 test_actual_mtp_loss_selects_intended_targets, output_layer;包含 测试覆盖调整、导入关系调整、控制流调整;+115/-0
tests/fast/backends/training_utils/test_input_loss_masks.py(模块 input/loss/masks;类别 test;类型 test-coverage;符号 _parallel_state, test_mask_alignment_survives_packing_and_cp): 测试配套;涉及符号 _parallel_state, test_mask_alignment_survives_packing_and_cp;包含 测试覆盖调整、导入关系调整、控制流调整;+86/-0
miles/backends/megatron_utils/model.py(模块 miles/backends;类别 source;类型 data-contract): 源码主路径;包含 配置键调整;+5/-3
关键符号:_prepare_loss_masks, test_actual_mtp_loss_selects_intended_targets, output_layer, _parallel_state, test_mask_alignment_survives_packing_and_cp
评论区精华
风险与影响
关联脉络
参与讨论