Quanto:用於 Optimum 的 PyTorch 量化後端

Hugging Face 已發布 Quanto,這是一個用於 Optimum 函式庫的 PyTorch 量化後端。Quanto 提供了一種簡化且多功能的量化方法,讓開發者透過將權重與激活以低精度資料類型(例如 8 位元整數 (int8) 而非 32 位元浮點數 (float32))表示,從而減少記憶體儲存與計算成本。

主要特點與功能

Quanto 旨在簡潔且多功能,超越許多近期量化函式庫僅聚焦於大型語言模型(LLM)的限制,提供可適用於任何模型模態的線性與分組量化原語。

其核心技術能力包括:

  • 設備無關性: 量化模型可以部署在任何設備上,包括 CUDA、CPU 與 MPS(Apple Silicon)。
  • 即時模式支援: 所有功能皆可在即時模式下使用,確保與不可追蹤模型的相容性。
  • 廣泛精度支援: 支援權重的 int2、int4、int8 與 float8,以及激活的 int8 與 float8。
  • 自動化整合: 後端會自動插入量化/去量化存根、量化函式操作與量化模組。
  • 效能最佳化: 在 CUDA 設備上提供加速的矩陣乘法,支援多種組合,包括 int8‑int8、fp16‑int4、bf16‑int8 與 bf16‑int4。
  • 序列化: 與 PyTorch weight_only 以及 Hugging Face Safetensors 相容,以實現高效的模型儲存與載入。

量化工作流程

Quanto 實作了一個結構化的工作流程,將模型從浮點精度轉換為凍結的量化狀態:

  1. 量化: 將標準浮點模型轉換為動態量化模型。
  2. 校準(可選): 若激活被量化,校準模式會使用代表性樣本記錄激活範圍。
  3. 微調(可選): 支援量化感知訓練(Quantization-Aware-Training,QAT),透過少量 epoch 的訓練恢復效能損失。
  4. 凍結: 用量化權重取代浮點權重。
  5. 序列化: 將量化權重儲存至 state_dict,並將量化映射儲存為 JSON 檔案。
  6. 重新載入: 使用 requantize 輔助函式建立空模型,並重新載入序列化的權重與映射。

與 Hugging Face Transformers 的整合

Quanto 直接整合至 transformers 函式庫。使用者只需將 QuantoConfig 傳入 from_pretrained 方法,即可量化模型。

此整合的技術限制與最佳化包括:

  • 硬體需求: 雖然設備無關,但 float8 需要相容的硬體;若不支援,Quanto 會在矩陣乘法時靜默升級為 float32float16。目前 float8 在 MPS 設備上會拋出錯誤。
  • 編譯支援: Quanto 相容於 torch.compile。然而,為了更快的生成,使用者應在 QuantoConfig 中將 activations=None,以避免動態量化(如 QAT 或量化激活)帶來的問題。
  • 跨模態使用: 此整合支援多種模態,示例為能以 int8 量化 openai/whisper-large-v3 等模型。

效能基準測試

meta-llama/Meta-Llama-3.1-8B 的評估顯示,Quanto 能降低延遲與記憶體使用量。每個 token 的延遲在 NVIDIA A10 GPU 上測量。所提供的結果未使用 AWQ 或 HQQ 等後訓練最佳化演算法。

Sources