nemo-mbridge-perf-sequence-packing について
Megatron Bridge で LLM の教師ありファインチューニングや VLM のファインチューニングにシーケンスパッキングを使う方法を示すスキルです。設定要件、コンテキスト並列の制約、CUDA graphs の前提条件、既知の非互換性を扱います。
主な機能
- 01LLM のオフライン packed SFT 設定
- 02VLM ファインチューニングのバッチ内パッキング
- 03コンテキスト並列向けのパディング条件設定
- 04パックデータと CUDA graphs の制約確認
- 05モデル系列と MTP の制限確認
活用シーン
- 01LLM ファインチューニングのシーケンスパッキング設定
- 02VLM ファインチューニングでのバッチ内パッキング有効化
- 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 グラフが有効な場合:
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と表示される - 2 番目のコマンドで
14 passedと表示される - 3 番目のコマンドで
2 passedと表示される
コメント
Markdown 対応