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 クラスでこの機能を利用するには、以下を行います:

  1. attn_implementation="flash_attention_2" でモデルをインスタンス化する。
  2. DataCollatorWithFlattening コラレータを使用する。

TRL SFTTrainer を使用する場合

TRL ライブラリの SFTTrainerDataCollatorForCompletionOnlyLM と共に使用するユーザーは、次の要件を満たします:

  1. Flash Attention 2 でモデルをインスタンス化する。
  2. DataCollatorForCompletionOnlyLM を呼び出す際に padding_free=True フラグを設定する。

結論

パディングトークンを排除し、境界認識注意を実装することで、Hugging Face は指示チューニングの効率を大幅に向上させました。スループットとメモリの最も大きな改善は、サンプル長のばらつきが大きいデータセットでのトレーニング時に実現されます。

Sources