シーケンスパッキング(シーケンスパッキング)
LLM学習時に複数の短いシーケンスを1つの長いシーケンスに詰め込み、パディングによる計算の無駄を排除する手法。スループットを大幅に向上させる。
シーケンスパッキング(Sequence Packing)とは
LLM(大規模言語モデル)の学習において、複数の短いシーケンス(学習サンプル)を1つの長いコンテキストウィンドウ内に詰め込み、パディングによる計算コストを削減する手法。2023〜2025年にかけてLLMファインチューニングの標準最適化の一つとなった。
パディング問題の本質
従来のバッチ学習ではバッチ内の全シーケンスを最長サンプルに合わせてパディングする。パディングトークンはforward passで計算されるが損失に寄与しない。短いサンプルが多いデータセット(QA/会話形式など)ではGPU使用率が50%以下に落ちるケースもある。
シーケンスパッキングの仕組み
複数のサンプルをBOS(Begin of Sequence)/EOS(End of Sequence)トークンで区切りながら連結し、コンテキスト長いっぱいまで詰め込む。Attention Mask管理として、異なるサンプル間でアテンションが漏れないよう、サンプル境界を示すattention_mask(またはdocument_mask)を付与する。FlashAttentionのvarlen(可変長)モードと組み合わせることで境界を正確に管理できる。
実装方法
Axolotlでの設定例: sample_packing: true pad_to_sequence_len: true
Hugging Face TRL SFTTrainerでの設定: packing=True を指定するだけで自動的にシーケンスパッキングが有効になる。
効果
スループット向上: データセットに依存するが、短いサンプルが多い場合に2〜4倍のスループット改善が報告されている。Instruction tuningデータ(平均256トークン程度)をmax_length=2048でパックすると8サンプル/ウィンドウになり、GPUの実質利用率が著しく向上する。
注意点
境界リーク: attention maskの実装が不正確だと、サンプルAのラストトークンがサンプルBの先頭トークンに不当にアテンションしてしまう(context contamination)。FlashAttention-2以降のvarlenモードを使用することで防止できる。
ロス計算: パディングトークンはロス計算から除外するが、パッキング後はlabels=-100マスキングでサンプル境界を正確に管理する必要がある。
主要フレームワーク対応状況(2025年)
Axolotl: 標準機能(sample_packing: true)。TRL SFTTrainer: 標準機能(packing=True)。LLaMA-Factory: 標準機能(neat_packingオプション)。Megatron-LM: 標準機能(--reset-position-ids)。Unsloth: 高速実装済み。
まとめ
シーケンスパッキングはLLMファインチューニングにおける費用対効果の高い最適化手法。特にInstruction tuning・SFT(Supervised Fine-Tuning)フェーズで短いサンプルが多い場合に大きな効果を発揮する。現代の主要フレームワークはすべて対応済みで、設定1行で有効化できる。