mcpField
N
nemo-mbridge-perf-sequence-packing

nemo-mbridge-perf-sequence-packing

github.com/promptingcompany开发039 次安装17 周前更新
代码仓库

关于 nemo-mbridge-perf-sequence-packing

介绍在 Megatron Bridge 中为 LLM 监督微调和 VLM 微调使用序列打包的技能,涵盖配置要求、上下文并行限制、CUDA graphs 前提及已知不兼容情况。

主要功能

  1. 01配置 LLM 离线打包式 SFT
  2. 02启用 VLM 微调的批内打包
  3. 03设置上下文并行所需的填充条件
  4. 04检查打包数据与 CUDA graphs 限制
  5. 05了解模型系列及 MTP 的限制

适用场景

  1. 01为 LLM 微调配置序列打包
  2. 02为 VLM 微调启用批内打包
  3. 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.md
card.yaml
skill-card.md
skill.oms.sig
evals/
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)")

注意事项

  1. 离线打包 SFT 和 VLM 批内打包是不同的功能,对微批次规则的要求正好相反。
  2. 启用 CP 时,打包后的序列长度必须满足可被 2 * context_parallel_size 整除的要求。
  3. 使用 CP 进行微调时,必须设置 calculate_per_token_loss=True 和 ddp.average_in_collective=False。
  4. pad_cu_seqlens=True 还要求 pad_to_max_length=True。
  5. 打包支持因模型系列而异。Qwen3-Next、GLM-4.5 和 Qwen3.5-VL 在不同路径中有明确的禁用设置。
  6. 文档说明 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