トランスフォーマーにおけるエキスパートの混合 (MoEs)
Hugging Face は transformers ライブラリを大幅に改良し、Mixture of Experts (MoE) アーキテクチャのファーストクラスサポートを提供します。この再設計は、MoE モデルがチェックポイントに保存される方法とハードウェア上で実行される方法の根本的な不一致に対処し、重みのロードを大幅に高速化し、プラガブルなバックエンドによる効率的な推論、エキスパート並列化によるスケーラブルな分散を実現します。
MoE の基本概念:容量 vs. アクティブパラメータ
Mixture of Experts モデルは、密なフィードフォワード層を「エキスパート」と呼ばれる学習可能なサブネットワークの集合に置き換えます。ルーターは各トークンを処理するためにこれらのエキスパートのうち小さなサブセットを選択し、モデル全体の容量と推論コストを切り離します。
- Total Parameters: モデル全体の容量と品質を決定します。
- Active Parameters: 推論速度とトークンあたりの計算コストを決定します。
例えば、gpt-oss-20b モデルは総パラメータ数が 21B ですが、トークンあたり約 3.6B のパラメータ(32 エキスパートのうち 4 つ)しかアクティブにしません。これにより、21B パラメータシステムの品質を保ちつつ、3.6B パラメータモデルと同等の速度で動作し、M3 Ultra Mac 上でおおよそ 115 トークン/秒を達成します。
重みロードのリファクタリングと WeightConverter
従来の transformers における重みロードは、チェックポイントテンソルとランタイムパラメータが 1 対 1 に対応していることを前提としていました。MoE のチェックポイントは通常、エキスパートを個別にシリアライズします(例:256 個の別々のテンソル)。しかし、最適化されたランタイムカーネルは、グループ化された GEMM 演算のためにエキスパートを単一の連続テンソルにパックすることを要求します。
この課題を解決するために、Hugging Face は WeightConverter 抽象化を通じて 変換パイプライン を導入しました。これにより、ロードプロセスは単純なキーごとのコピーから動的な変換へとシフトします。
MergeModulelist: 複数のエキスパートテンソルを単一の連続テンソルにスタックします。SplitModulelist: パックされたテンソルを個々のエキスパートに分割します。- Lazy Materialization(遅延実体化): ローダーはキーを一度だけスキャンし、依存関係が整った時点でスレッドプールを介してテンソルを実体化するため、メモリピークを削減し、再スキャンを回避します。
重みロードベンチマーク
Qwen/Qwen1.5-110B-Chat を単一の A100(80GB)で使用したベンチマークは、v4 に比べて v5 パイプラインで大幅な高速化が示されています。
| バージョン | 戦略 | ロードモード | 時間 |
| :--- | :--- | :--- |
| v4.57.6 | device_map="auto" | スレッドプール | 66.24s |
| v5 | device_map="auto" | 非同期(デフォルト) | 20.71s |
| v5 | TP | 非同期 | 10.1s |
プラガブルなエキスパートバックエンド
エキスパート計算をモデル実装から切り離すために、Hugging Face は @use_experts_implementation デコレータを使用した Experts Backend システムを導入しました。これにより、モデルは実行時に 3 つの実行戦略間で切り替えることができます。
eager: 選択されたエキスパートをループ処理します。主にデバッグと正確性の確認に使用されます。batched_mm:torch.bmmを使用してトークンごとにエキスパートの重みを複製します。小バッチや GPU 集中型ワークロードに最適化されています。grouped_mm:torch._grouped_mmを使用してトークンをエキスパート ID でソートし、単一のグループ化された GEMM を実行します。大バッチやメモリ制約のある環境に最適化されています。
エキスパート並列化 (EP)
エキスパート並列化は、数千億パラメータ規模のモデルがエキスパートをデバイス間で分散させることで複数の GPU にスケールできるようにします。標準的なテンソル並列化とは異なり、各デバイスは割り当てられたエキスパートのサブセット(num_experts / num_devices)のみをロードします。
これは DistributedConfig(enable_expert_parallel=True) によって実装され、以下の 2 つのコアコンポーネントに依存します。
GroupedGemmParallel: エキスパート次元(dim=0)に沿ったエキスパート重みのシャーディングを処理します。RouterParallel: グローバルエキスパートインデックスをローカルインデックスに再マップし、all-reduce 操作を使用してデバイス間で部分出力を結合します。
Unsloth を用いた最適化された MoE トレーニング
Unsloth との協業により、Hugging Face はエキスパートバックエンド抽象化と PyTorch の torch._grouped_mm API、さらにカスタム Triton グループ化 GEMM と LoRA カーネルを組み合わせて、より高速な MoE トレーニングを実現しました。これらの最適化により、以下が提供されます。
- MoE トレーニングが最大 12 倍高速化。
- VRAM 使用量が 35% 以上削減。
- コンテキストウィンドウが約 6 倍長くなります。
- v4 の
transformers実装と比較して、全体で 12〜30 倍の速度向上。