关于 nemo-mbridge-perf-sequence-packing
介绍在 Megatron Bridge 中为 LLM 监督微调和 VLM 微调使用序列打包的技能,涵盖配置要求、上下文并行限制、CUDA graphs 前提及已知不兼容情况。
主要功能
- 01配置 LLM 离线打包式 SFT
- 02启用 VLM 微调的批内打包
- 03设置上下文并行所需的填充条件
- 04检查打包数据与 CUDA graphs 限制
- 05了解模型系列及 MTP 的限制
适用场景
- 01为 LLM 微调配置序列打包
- 02为 VLM 微调启用批内打包
- 03验证上下文并行或 CUDA graphs 下的打包设置
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ promptingcompany/ nv-skills --skill nemo-mbridge-perf-sequence-packing安装后在 Claude Code 中输入/nemo-mbridge-perf-sequence-packing确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
BENCHMARK.mdcard.yamlskill-card.mdskill.oms.sigevals/evals.json详细介绍
序列打包技能
如需了解稳定的背景信息和推荐级别,请参阅:
- @docs/training/packed-sequences.md
- @skills/nemo-mbridge-perf-sequence-packing/card.yaml
启用
用于 LLM 微调的离线打包 SFT:
from megatron.bridge.data.datasets.packed_sequence import PackedSequenceSpecs
cfg.train.micro_batch_size = 1
cfg.dataset.seq_length = 4096
cfg.model.seq_length = 4096
cfg.dataset.dataset_kwargs = {"pad_to_max_length": True}
cfg.dataset.packed_sequence_specs = PackedSequenceSpecs(
packed_sequence_size=4096,
pad_seq_to_mult=1,
)
如果启用了 CP:
cfg.model.context_parallel_size = 2
cfg.model.calculate_per_token_loss = True
cfg.ddp.average_in_collective = False
cfg.dataset.packed_sequence_specs.pad_seq_to_mult = cfg.model.context_parallel_size * 2
# If sequence_parallel is also enabled, use lcm(2*CP, CP*TP):
# import math
# cfg.dataset.packed_sequence_specs.pad_seq_to_mult = math.lcm(2 * CP, CP * TP)
# See src/megatron/bridge/training/vlm_step.py for reference logic.
如果为此打包路径启用了 CUDA graphs:
cfg.dataset.packed_sequence_specs.pad_cu_seqlens = True
cfg.dataset.dataset_kwargs["pad_to_max_length"] = True
注意:pad_cu_seqlens = True 还要求打包数据集旁边有一个元数据 JSON 文件(在 src/megatron/bridge/data/datasets/sft.py 中断言)。缺少元数据文件的自定义打包数据集会在数据集初始化时触发断言。
用于 VLM 微调的批内打包:
cfg.dataset.pack_sequences_in_batch = True
cfg.train.micro_batch_size = 2
长上下文基线:
cfg.model.seq_length = 16384
cfg.dataset.seq_length = 16384
cfg.model.context_parallel_size = 2
代码锚点
LLM 打包 SFT 配置项:
if packed_sequence:
dataset_kwargs = {"pad_to_max_length": True}
packed_sequence_specs = PackedSequenceSpecs(packed_sequence_size=seq_length, pad_seq_to_mult=pad_seq_to_mult)
else:
dataset_kwargs = {}
packed_sequence_specs = None
Bridge 验证:
if self.model.context_parallel_size > 1:
assert self.model.seq_length % (self.model.context_parallel_size * 2) == 0, ...
if isinstance(self.dataset, FinetuningDatasetConfig):
assert self.model.calculate_per_token_loss, ...
assert not self.ddp.average_in_collective, ...
...
if ... packed_sequence_size > 0 and self.train.micro_batch_size > 1:
raise ValueError(...)
...
if getattr(self.dataset, "pack_sequences_in_batch", False) and self.train.micro_batch_size == 1:
raise ValueError(...)
VLM 批内运行时:
if enable_packing:
...
) = pack_batch_sequences(
...
pad_token_id=0,
pad_to_multiple_of=cp_size * 2 if cp_size > 1 else 1,
)
打包 THD 运行时限制:
if cu_seqlens.dim() > 1 and cu_seqlens.size(0) != 1:
raise ValueError("Packed THD batches expect micro-batch size 1 for context-parallel slicing (THD layout)")
注意事项
- 离线打包 SFT 和 VLM 批内打包是不同的功能,对微批次规则的要求正好相反。
- 启用 CP 时,打包后的序列长度必须满足可被
2 * context_parallel_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在不同路径中有明确的禁用设置。 - 文档说明 MTP 微调与打包序列不兼容。
验证
使用仓库中已有的单元测试覆盖:
uv run python -m pytest tests/unit_tests/training/utils/test_packed_seq_utils.py -v && \
uv run python -m pytest tests/unit_tests/training/test_config.py -k "packed_sequence or pack_sequences_in_batch or context_parallel_seq_length_divisibility or context_parallel_finetuning_validations" -v && \
uv run python -m pytest tests/unit_tests/training/test_vlm_step.py -k "enable_packing" -v
成功标准:
- 第一条命令报告
8 passed - 第二条命令报告
14 passed - 第三条命令报告
2 passed
评论
支持 Markdown