Transformer 中的專家混合(MoEs)

Hugging Face 已徹底改造 transformers 函式庫,以提供對混合專家(MoE)架構的一等支援。此重新設計解決了 MoE 模型在檢查點儲存方式與硬體執行方式之間的根本不匹配,從而實現了顯著更快的權重載入、透過可插拔後端的更高效推論,以及透過專家平行化的可擴展分配。

MoE 基礎:容量 vs. 活躍參數

混合專家模型以一組稱為專家的可學習子網路取代密集前饋層。路由器會為每個 token 選擇少量的專家進行處理,將模型的總容量與推論成本解耦。

  • Total Parameters: 決定模型的整體容量與品質。
  • Active Parameters: 決定每個 token 的推論速度與計算成本。

例如,gpt-oss-20b 模型擁有 21B 總參數,但每個 token 只啟用約 3.6B 參數(使用 32 個專家中的 4 個)。這使得模型在保持 21B 參數系統品質的同時,能以 3.6B 參數模型的速度運行,在 M3 Ultra Mac 上達到約每秒 115 個 token。

權重載入重構與 WeightConverter

傳統的 transformers 權重載入假設檢查點張量與執行時參數之間是一對一的映射。MoE 檢查點通常會獨立序列化各個專家(例如,256 個獨立張量),但最佳化的執行時核心需要將專家打包成單一連續張量,以進行分組 GEMM 操作。

為了解決此問題,Hugging Face 透過 WeightConverter 抽象引入了 轉換管線。此舉將載入流程從簡單的逐鍵複製轉變為動態轉換:

  • MergeModulelist:將多個專家張量堆疊成單一連續張量。
  • SplitModulelist:將打包的張量拆分回各個獨立的專家。
  • Lazy Materialization:載入器僅掃描一次鍵,並在依賴就緒時透過執行緒池實例化張量,降低記憶體峰值並避免重複掃描。

權重載入基準測試

使用單張 A100(80GB)上的 Qwen/Qwen1.5-110B-Chat 進行的基準測試顯示,v5 管線相較於 v4 有顯著的加速:

| 版本 | 策略 | 載入模式 | 時間 | | :--- | :--- | :--- | | v4.57.6 | device_map="auto" | Threadpool | 66.24s | | v5 | device_map="auto" | Async (default) | 20.71s | | v5 | TP | Async | 10.1s |

可插拔的專家後端

為了將專家計算與模型實作解耦,Hugging Face 引入了使用 @use_experts_implementation 裝飾器的專家後端系統。這使得模型能在執行時切換三種執行策略:

  1. eager:對選取的專家進行迴圈;主要用於除錯與正確性驗證。
  2. batched_mm:使用 torch.bmm 為每個 token 複製專家權重;針對小批次與 GPU 密集工作負載進行最佳化。
  3. grouped_mm:使用 torch._grouped_mm 依專家 ID 排序 token,並執行單一分組 GEMM;針對大批次與記憶體受限環境進行最佳化。

專家平行化(EP)

專家平行化允許擁有數千億參數的模型透過在多個 GPU 之間分配專家來擴展。與標準張量平行化不同,每個裝置僅載入其分配到的專家子集(num_experts / num_devices)。

此功能透過 DistributedConfig(enable_expert_parallel=True) 實作,並依賴兩個核心元件:

  • 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 倍。
  • 整體速度提升 12 至 30 倍,相較於 v4 transformers 實作。

Sources