Hugging Face トレーニング効率: Flash Attention 2 を用いたパッキング
Hugging Face は、指示チューニング用サンプルの境界認識パッキングを導入し、これが Flash Attention 2 と互換性を持つようになりました。このアップデートにより、パディングなしでシーケンスを連結でき、トレーニングスループットが最大 2 倍に向上し、ピークメモリ使用量が 20% 削減されます(収束品質への影響はありません)。
トレーニングスループットとメモリ効率の向上
パディングなしでサンプルをパックすることで、無関係なパディングトークンに伴う計算オーバーヘッドが大幅に削減されます。改善度合いは、トレーニングデータセット内のシーケンス長のばらつきに依存します。
- 高ばらつきデータセット(例: FLAN): FLAN データセットでのトレーニングでは、Llama 2-7B、Mistral-7B、Granite-8B-code などのモデルでスループットが 2 倍に向上し、ピークメモリ使用量が 20% 減少しました。
- 低ばらつきデータセット(例: OrcaMath): 例が長くばらつきが低い OrcaMath データセットでのトレーニングでは、スループットが 1.4 倍に向上し、ピークメモリが 6% 減少しました。
新しい実装はミニバッチを保持し、パディングありトレーニングと同じ最適化ステップ数を維持するため、検証ロスは同一であり、トレーニング収束の劣化はありません。
技術的実装: 境界認識
従来のパッキング実装は Flash Attention 2 を使用する際にサンプル境界を無視することが多く、クロスサンプルの注意が発生してモデル品質を損なっていました。Hugging Face はパッキング中に境界認識を保持することでこれを解決します。
この実装は position_ids を Flash Attention 2 に渡し、flash_attn_varlen_func を利用して各ミニバッチの累積シーケンス長(cu_seqlens)を計算することで実現されます。このアプローチにより、シーケンスを単一テンソルに連結しつつ、注意が正しいシーケンス境界に限定されます。
対応モデル
このソリューションはモデルが position_ids を公開していることが前提です。現在、以下の 14 モデルが対応しています:
- Llama 2 と 3
- Mistral と Mixtral
- Granite
- DBRX
- Falcon
- Gemma
- OLMo
- Phi 1、2、3(phi3 を含む)
- Qwen 2 と 2 MoE
- StableLM
- StarCoder 2
統合と使用方法
ユーザーは使用しているライブラリに応じて、2 つの主要な方法で Flash Attention 2 を用いたパッキングを実装できます。
Hugging Face Trainer を使用する場合
Transformers ライブラリの Trainer クラスでこの機能を利用するには、以下を行います:
attn_implementation="flash_attention_2"でモデルをインスタンス化する。DataCollatorWithFlatteningコラレータを使用する。
TRL SFTTrainer を使用する場合
TRL ライブラリの SFTTrainer を DataCollatorForCompletionOnlyLM と共に使用するユーザーは、次の要件を満たします:
- Flash Attention 2 でモデルをインスタンス化する。
DataCollatorForCompletionOnlyLMを呼び出す際にpadding_free=Trueフラグを設定する。
結論
パディングトークンを排除し、境界認識注意を実装することで、Hugging Face は指示チューニングの効率を大幅に向上させました。スループットとメモリの最も大きな改善は、サンプル長のばらつきが大きいデータセットでのトレーニング時に実現されます。