| 名称 | nemo-mbridge-perf-sequence-packing |
| 描述 | 验证并使用 Megatron-Bridge 中的打包序列和长上下文训练,包括离线 LLM 打包、collate 时 VLM 打包、Energon 在线打包以及 CP 约束。 |
| 开源协议 | Apache-2.0 |
序列打包技能
稳定背景和建议等级,请参见:
- @docs/training/packed-sequences.md
- @skills/nemo-mbridge-perf-sequence-packing/card.yaml
启用方法
离线打包 SFT 用于 LLM 微调
配置离线打包的示例代码(代码略)。要求:模型序列长度、数据集序列长度和打包长度一致;需要微批次大小为 1;全局批次大小需可被数据并行大小整除且不小于数据并行大小。
选择离线打包长度
在不同 packed_sequence_size 下进行基准测试,比较每个优化器步的 token slot 数等于 packed_sequence_size * global_batch_size。例如 2K/GBS32、4K/GBS16、8K/GBS8 都提供 65,536 token slots/step。更长的打包可能降低步数开销,但也增加激活内存并受 kernel 宽度约束;应选择实测可容纳的最大配置。
离线打包需要 MBS=1。更改打包长度后必须使用新的输出根,并检查解析后的配置。
启用 CP 的微调需设置:
- context_parallel_size = 2
- calculate_per_token_loss = True
- ddp.average_in_collective = False
使用 SFT 和 PEFT 相同的 pad_seq_to_mult 对齐公式,需根据 CP/TP/SP 推导。若调度器或 kernel 要求固定宽度,设置 pad_to_max_length=True;若启用 CUDA 图,还需设置 pad_cu_seqlens=True,并需要元数据 JSON 文件。
批内打包(GPT SFT 和支持的 VLM)
设置 enable_in_batch_packing=True,dataloader_type=‘single’ 或 ‘cyclic’,micro_batch_size>1。它保留 mmap 数据集,延迟 tokenization,保持损失掩码语义。不支持 ‘batch’ dataloader。
Energon 在线打包(Qwen-VL)
设置 dataset.packing_buffer_size=16、micro_batch_size=1、model.calculate_per_token_loss=True、ddp.average_in_collective=False。使用 vlm_step。缓冲区按 worker 计算候选样本数,高分辨率/视频数据从 8-16 开始测量。此路径不写离线打包。支持 eager Qwen-VL MBS1,拒绝 MTP、CUDA graphs、Qwen3-VL DistTrain、PP。MoE EP overlap 默认禁用;Qwen3.6-35B-A3B 有功能覆盖。
长上下文基线
设置 seq_length=16384,context_parallel_size=2。
代码锚点
LLM 打包 SFT 配置表面:代码位置 src/megatron/bridge/recipes/utils/dataset_utils.py 128-143(代码略)。
Bridge 验证:src/megatron/bridge/training/config.py 1220-1248(代码略)。
Collate 时间批内运行时:src/megatron/bridge/data/sequence_batching.py 397-449(代码略)。
GPT-SFT 直接行打包:src/megatron/bridge/data/datasets/gpt_sft.py 627-671(代码略)。
打包 THD 运行时约束:src/megatron/bridge/training/gpt_step.py 94-108(代码略)。
陷阱
- 离线打包 SFT、运行时批内打包、Energon 在线打包是不同的功能;对应 MBS 不同。
- GPT-SFT 批内打包不支持 ‘batch’ dataloader。
- CP 启用时,序列长度必须是 2*CP size 的倍数。
- CP 微调必须设置 calculate_per_token_loss=True 和 ddp.average_in_collective=False。
- pad_cu_seqlens=True 需要 pad_to_max_length=True。
- 打包支持因模型系列而异;Qwen3-Next、GLM-4.5、Qwen3.5-VL 有显式 opt-out。
- MTP 微调与打包序列不兼容。
- 合成填充行必须保持全零损失掩码。
- GBS 必须可被 DP size 整除且不小于 DP size(MBS1 时)。
- 对 SFT 和 PEFT 从 CP/TP/SP 推导 pad_seq_to_mult,不要硬编码。
- pad_to_max_length 仅在需要固定形状执行时设置。
- Energon packing_buffer_size 是 per-worker 的,也影响验证;计数指物理 pack。
- 精确恢复需保持分片/拓扑/shuffle等配置不变。
验证
使用已检入的单元测试覆盖(命令列表略)。
成功标准:
- 所有选中测试通过
- 离线与批内配置互斥验证
- 打包元数据以 MCore THD 形式到达训练步骤
- GPT-SFT 批内打包拒绝 ‘batch’ dataloader
- Energon 原生打包精确恢复 pending groups 并刷新部分缓冲不丢样本
- 映射的填充行不贡献损失