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 實作了一個結構化的工作流程,將模型從浮點精度轉換為凍結的量化狀態:
- 量化: 將標準浮點模型轉換為動態量化模型。
- 校準(可選): 若激活被量化,校準模式會使用代表性樣本記錄激活範圍。
- 微調(可選): 支援量化感知訓練(Quantization-Aware-Training,QAT),透過少量 epoch 的訓練恢復效能損失。
- 凍結: 用量化權重取代浮點權重。
- 序列化: 將量化權重儲存至
state_dict,並將量化映射儲存為 JSON 檔案。 - 重新載入: 使用
requantize輔助函式建立空模型,並重新載入序列化的權重與映射。
與 Hugging Face Transformers 的整合
Quanto 直接整合至 transformers 函式庫。使用者只需將 QuantoConfig 傳入 from_pretrained 方法,即可量化模型。
此整合的技術限制與最佳化包括:
- 硬體需求: 雖然設備無關,但
float8需要相容的硬體;若不支援,Quanto 會在矩陣乘法時靜默升級為float32或float16。目前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 等後訓練最佳化演算法。