量化方法:大型語言模型推論加速 100 倍

量化方法:大型語言模型推論加速 100 倍

本文主要根據最新的主流 GPU 硬體與量化演算法研究論文,探討量化推論加速的可行方向。在當前量化方案的背景下,讓我們深入探討這個主題。

量化簡介

模型量化是一種模型壓縮技術,旨在透過調整權重和激活值的位元寬度來縮小模型大小。這種縮小有助於降低計算負載、GPU 記憶體 I/O 和佔用,最終減少延遲並提升吞吐量。下圖說明了量化如何加速深度學習:

  • 步驟 1:權重和激活值儲存從記憶體載入到 MatMul 計算單元。權重和激活值的位元寬度會顯著影響資料傳輸延遲。
  • 步驟 2:MatMul 計算單元執行矩陣乘法,位元寬度和格式也會影響延遲。
  • 步驟 3:累加器通常具有較高位元寬度以進行高精度求和。求和後,累加器中的值可能會重新量化(輸出位元寬度決定傳輸並儲存回記憶體以供下一個處理步驟使用的位元數)。

深度學習加速器示意圖

根據不同的量化方案,主要有兩種方法:量化感知訓練(QAT)和訓練後量化(PTQ)。

  • QAT(量化感知訓練),又稱線上量化,需要在訓練期間進行額外的計算。它將量化與反向傳播結合,調整模型權重,確保量化後的模型維持準確度。
  • PTQ(訓練後量化),又稱離線量化,使用最少或無需額外資料來量化預訓練模型。這個過程包含校準,可能涉及縮放模型權重。PTQ 方法有兩種:
    • 後動態量化(PDQ) 不依賴校準資料集,而是直接使用量化公式轉換每一層。QLoRA(量化感知低秩適應)即採用此方法。
    • 後校準量化(PCQ) 需要代表性資料集,根據模型中每一層的輸入輸出調整量化權重。GPTQ(生成式預訓練 Transformer 量化)即採用此方法。

硬體支援

NVIDIA 系列

NVIDIA 系列顯卡因 CUDA 生態系統,在支援不同精度和資料型別方面一直保持領先地位。

AMD 系列

AMD 的 MI300 系列顯卡在某些測試中展現出超越 H100 的效能指標,是值得考慮的下一選擇。它們也支援 FP8 型別。

除了 NVIDIA 和 AMD 系列顯卡,國產顯卡也對 FP16 和 INT8 等資料型別提供了良好的支援(目前對 FP8 等資料格式的支援相對不足),此處不再一一列舉。

LLM 量化的挑戰

先從一個簡單的比較開始。我們分別對 ResNet18 和 OPT-13B 模型進行了基本的 INT 量化。結果發現 ResNet18 的效能幾乎不受影響,而 OPT-13B 則遭受了顯著損失。

同樣是遵循高斯分佈的神經網路,為何會有如此差異?這主要歸因於 LLM 中的離群值或異常值。

單個 transformer 區塊,由自注意力模組和線性模組組成。紅色連線是帶有離群值的 transformer 中的問題連線。如上方 transformer 結構中的紅色標記所示,transformer 中量化的問題發生在網路中一個非常特定的部分。在一些全連接模組中,尤其是在網路的最後幾層,層歸一化後的總和存在顯著的離群值。直接移除這些離群值會顯著降低網路的準確度,因為它們有特定用途。這些離群值迫使下一層的注意力機制聚焦於文本中一些無意義的標記,例如句子分隔符、句號或逗號,導致這些特定標記不會被顯著更新。根據論文 LLM.int8() 的發現,激活值中存在離群值,其絕對值明顯較大。而且這些離群值分佈在少數特徵中,稱為 湧現特徵。已知離群值對模型效能有重大影響,直接丟棄它們並非可行解決方案。離群值的存在使得 fp16 的範圍非常大。因此,當用 int8 表示時,每個數字需要表示一個寬範圍的 fp16,從而產生自然誤差。傳統 CNN 也透過提出校準方法解決了這個問題。具體來說,對 fp16 值進行統計分析,然後使用 KL 散度等演算法捨棄較大的值,從而縮小 int8 需要表示的 fp16 範圍,提高準確度。具體捨棄多少量是透過不斷迭代 KL 演算法以找到最佳範圍來決定的。

幸運的是,這些離群值非常特定。它們只出現在某些注意力區塊中,在這些區塊中又只出現在某一層,而在這些層中又只出現在幾個輸出通道中。這些離群值甚至對每個資料點都出現在相同的通道中([1,3])。基於上述結論,LLM.int8()[1] 提出了一種混合精度演算法。

LLM.int8() 示意圖

根據上圖,X 代表每一層的激活值,行數等於序列長度,列數等於隱藏大小。圖中的黃色條代表離群值,生動說明了它們的分佈模式(第二個結論)。向量級量化的意義在於,對於非離群值的列,使用 int8 對稱量化。由於是針對列進行操作,在矩陣乘法中,對應的權重 W 需要從對應的行中提取出來進行 int8 運算。對於黃色的離群值列,則使用 fp16 進行行列運算。最後,將兩部分的結果相加,等同於直接進行矩陣乘法。透過 LLM.int8() 的混合量化方法,其準確度幾乎與 fp32 相同,此處不貼實驗結果資料。

FP8 與 INT8

為何特別提到 FP8 和 INT8?這主要是因為最新的 GPU 架構,例如 Hopper 架構和 Tensor Core,支援 FP8 精度計算。因此,值得探討 FP8 量化。

Tensor Core (Hopper) (a) 將 1 個位元分配給範圍或精度 (b) 支援多種累加器和輸出型別。

Int8 與 fp8 的不同之處在於它缺少中間的指數部分,僅包含尾數。這種資料表示結構如下圖所示,更適合表達均勻分佈。

根據 [4],如果分佈表現出非常突出的離群值,則 FP8-E4/FP8-E5 格式會更準確。然而,如果分佈表現良好且更接近高斯形狀,則預期 INT8 或 FP8-E2/FP8-E3 表現更好。

此處我們針對幾種分佈繪製了「位元精度」:反轉並歸一化的 RMSE

如上圖所示,對於均勻分佈,INT8 表現最佳。對於常態分佈,FP8-E2 最優,INT8 緊隨其後。神經網路中的許多分佈都是高斯分佈,這表明分佈結果是一個高度相關的效能指標。只有在出現離群值時,具有更多指數位元的格式才開始提供更好的結果。最優量化器基於 Lloyd-Max 量化器,可以針對這些分佈獲得。對於像 ResNet18、MobileNetV2 等網路,其層大多呈高斯形狀,使用 FP8-E2 和 INT 等格式效能最佳,而 FP8-E4 和 FP8-E5 等格式效能明顯較差。我們還發現,像 ViT 和 BERT 這樣的 transformer 模型在 FP8-E4 上表現最佳,這正是因為 transformer 中的某些層存在非常大的離群值。具體來說,有些層在層歸一化之前的激活值中有很多離群值。由於這些離群值會顯著影響效能,導致裁剪時出現零誤差,因此 FP8-E4 格式表現最佳,而 FP8-E2/INT8 格式表現明顯較差。

那麼,在 LLM 領域,FP8 是否比 INT8 有絕對優勢?結論可能恰恰相反,主要原因如下:

  • 根據電路設計中定點和浮點累加的原理,FP8 MAC 單元的效率比 INT8 單元低 50% 到 180%。如果工作負載是計算密集型,這會減慢專用晶片的處理速度。
  • 對於大多數網路,FP8 的表現不如 INT8,即使是像 transformer 這樣具有大量離群值的結構,也可以透過混合精度或量化感知訓練方法來解決。

總體而言,在純量化背景下,FP8-E4 和 FP8-E5 等浮點格式無法在深度學習推論的效能和準確度上取代 INT8。那麼,FP8 格式的優勢和定位在哪裡?首先,總結一下 FP8 格式的優點:

  • FP8 Tensor Core 比 16 位元 Tensor Core 更快。
  • 減少記憶體移動。
  • 如果模型已經用 FP8 訓練過,部署更方便。
  • FP8 具有更寬的動態範圍。
  • 從 FP8 轉換為 FP16/FP32/BF16 的電路可以設計得更簡單直接,無需從 INT8/UINT8 轉換為 FP 所需的乘法和加法開銷。

基於這些優點,很明顯 FP8 實際上更適合訓練。參考 [5],無需修改學習率和權重衰減等任何超參數,無論是預訓練任務還是下游任務,使用 FP8 訓練的模型與使用 BF16 高精度訓練的模型表現相似。值得注意的是,在訓練 GPT-175B 模型時,與 TE 方法相比,在 H100 GPU 平台上新提出的 FP8 混合精度框架可將訓練時間減少 17%,記憶體使用量減少 21%。

下游任務的零樣本效能。模型分別使用標準 BF16 混合精度方案或提議的 FP8 低精度方案進行訓練

使用 FP8 格式量化模型進行推論,可以避免 QAT 或 PTQ 過程(以避免精度降低),同時還能受益於從 FP8 到 FP16 及其他格式的更高轉換效率,從而顯著提升推論效能。

量化最佳成本效益

類似於 exllamav2 專案,支援基於 GPTQ 演算法的 2、3、4、5、6 和 8 位元量化,但對於 LLM,什麼長度和格式的量化成本效益最佳?參考 [6],針對各種 LLM 架構進行了大量實驗,以確定不同位元分配對模型效能的影響:

125M 到 176B 參數 OPT 模型在四個資料集上的平均零樣本效能的位元級別縮放定律。當量化精度從 16 位元降低到 4 位元時,固定模型位元數的零樣本效能穩定提升。在 3 位元時,這種關係發生逆轉,使 4 位元精度成為最佳選擇。

  • 對於給定的零樣本效能,4 位元精度幾乎為所有模型系列和大小提供了最佳縮放(4 位元精度不會導致模型效能顯著下降)。唯一的例外是 BLOOM-176B,其中 3 位元表現稍好,但差異不顯著。
  • 4 位元精度目前是逐位元最有效的精度,同時也表明 3 位元精度的效能仍有提升空間。因此,低於 4 位元的低位元精度研究是一個值得的方向。
  • 位元級別量化的研究揭示,資料型別和區塊大小是影響位元級別量化效果的關鍵因素。

基於以上,我們可以得出結論:4 位元精度量化是目前最具成本效益的方案。然而,在 4 位元資料中,哪種資料型別能獲得更好的量化結果?參考 [7],LLM-FP4 方法提出了針對大型語言模型(LLM)的 FP4 量化,採用訓練後方式將權重和激活值量化為 4 位元浮點值。現有的 PTQ 解決方案主要基於整數,在低於 8 位元的位元寬度下表現不佳。與整數量化相比,浮點(FP)量化更靈活,能更好地處理長尾或鐘形分佈,並已成為許多硬體平台的預設選擇。專案參考:https://github.com/nbasyl/LLM-FP4

FP 量化的一個特點是其效能很大程度上取決於指數位元和裁剪範圍的選擇。LLM-FP4 透過搜尋最佳量化參數,構建了一個穩健的 FP-PTQ 基線。此外,激活分佈中存在更高的跨通道方差和更低的通道內方差,這增加了激活量化的難度。為了解決這個問題,LLM-FP4 提出了逐通道激活量化,並證明這些額外的縮放因子可以被重新參數化為權重的指數偏差,從而產生可忽略的成本。LLM-FP4 首次將 LLaMA-13B 中的權重和激活值量化為僅 4 位元,在常識零樣本推理任務上取得了 63.1 的平均分數,僅比全樣本低 5.8,並顯著優於先前的最先進模型 12.7 個百分點。具體資料見下圖:

LLaMA 模型在常識推理任務上的零樣本效能。我們將 E/W/A 分別表示詞嵌入、模型權重和激活值的位元寬度

從上圖可以得出以下主要結論:

  • 當激活值未量化,且詞嵌入和權重量化為 4 位元時,LLM-FP4(FP 型別)比 GPTQ 等演算法(INT 型別)略有優勢。
  • 當激活值量化為 8 位元,且詞嵌入和權重量化為 4 或 8 位元時,LLM-FP4(FP 型別)與其他演算法(INT 型別)表現相似,效能無顯著差異。
  • 當激活值量化為 4 位元時,LLM-FP4(FP 型別)與其他演算法(INT 型別)相比有明顯提升。

總之,如果激活值沒有量化到 4 位元,目前 FP4 相較於 INT4 並無顯著優勢。

一些值得注意的量化專案

GPTQ-for-LLaMa

  • 使用 GPTQ 量化的模型具有顯著的速度優勢。簡單來說,GPTQ 逐個量化區塊內的每個參數,每量化一個參數後,會對區塊內的其他參數進行調整,以補償量化造成的精度損失。
  • GPTQ 量化需要校準資料集來對模型進行訓練後量化,以獲得量化權重。GPTQ 的概念源自 Yann LeCun 在 1990 年提出的 OBD 演算法,後續經過 OBS、OBC (OBQ) 等方法的持續改進,而 GPTQ 是 OBQ 方法的加速版本。
  • GPTQ-for-LLaMa 倉庫提供了一個專門針對 LLaMa 的 GPTQ 量化解決方案。建議用於在 GPU 上部署 LLaMa 模型。
  • 專案連結:GPTQ-for-LLaMa

ExLlama

  • ExLlama 有兩個版本:ExLlama 和 ExLlamaV2,是一個用於在現代消費級 GPU 上執行本地 LLM 的推理庫。
  • ExLlamaV2 支援類似 V1 的 4 位元 GPTQ 模型,但也引入了新的“EXL2”格式。EXL2 基於與 GPTQ 相同的最佳化方法,支援 2、3、4、5、6 和 8 位元量化,允許在模型內混合量化級別,以實現每個權重 2 到 8 位元之間的任何平均位元率。
  • ExLlamaV2 可以對每個線性層應用多個量化級別,產生類似稀疏量化的效果,其中更重要的權重(列)使用更多位元量化。允許 ExLlama 與序列模型高效協作的相同重映射技術,使得這種混合格式幾乎不影響效能。
  • 一般來說,ExLlama 的推理速度比其他量化方法稍快。
  • 專案連結:ExLlama

GGML

  • GGML 是一個專注於機器學習的 C 語言函式庫,由 Georgi Gerganov 建立,因此縮寫為“GG”。該函式庫不僅提供張量等機器學習基本元素,還提供了一個用於分發 LLM 的獨特二進位格式。
  • GGML 使用 C 語言編寫,支援整數量化(4 位元、5 位元、8 位元)和 16 位元浮點數。
  • GGML 與 llama.cpp 函式庫無縫協作,確保從業者能夠有效利用 LLM 的強大功能。llama.cpp 函式庫的主要目標是讓 MacBook 上能夠使用 INT4 量化的 LLaMA 模型。
  • 專案連結:GGML

Transformer Engine

Transformer Engine(TE)是一個旨在 NVIDIA GPU 上加速 Transformer 模型的函式庫,包括在 Hopper GPU 上使用 8 位元浮點(FP8)精度,從而在訓練和推論中提供更好的效能和更低的記憶體使用率。TE 為流行的 Transformer 架構提供了一組高度最佳化的建構區塊,以及一個自動混合精度類別 API,可與特定框架的程式碼無縫整合。此外,TE 還包含一個與框架無關的 C++ API,用於 Transformer 中的 FP8 支援,可與其他深度學習函式庫整合。主要功能包括:

  • 易於使用的模組,用於建構支援 FP8 的 Transformer 層。
  • Transformer 模型的最佳化,包括核心融合。
  • 在 NVIDIA Hopper 和 NVIDIA Ada GPU 上支援 FP8。
  • 在 NVIDIA Ampere GPU 架構及更高版本上最佳化所有精度(FP16、BF16)。

專案連結:Transformer Engine

對於注意力測試,您可以匯入 te.LayerNormLinear 並測量注意力計算的平均時間。

Stage Model Structure Data Format RTX 4090 RTX 3090
Basic Attention PyTorch Native Attention FP16 92ms 183ms
Basic Attention + TE Linear and LayerNorm tx replacement FP16 96ms Not supported
Basic Attention + TE’s LayerNorm Optimization TE.LayerNormLinear FP16 96ms Not supported
TE Full TE Full Attention Algorithm FP16 74ms Not supported
TE Full + FP8 FP Forward Propagation Replacement FP8 42ms Not supported

測試結論:在使用 Transformer Engine 的情況下,相對於基本注意力演算法,使用 fp16 時效能提升約 20%。此外,使用 fp8 時效能顯著提升 54.5%,表明投入時間改善推論效能是值得的。

Bitsandbytes

Bitsandbytes 是自訂 CUDA 函數的輕量級包裝器,專門最佳化用於 8 位元運算、矩陣乘法(LLM.int8())和量化函數,主要支援 LLM.int8() 量化演算法。bitsandbytes 函式庫支援分位數、線性和動態量化等量化方法。它是最簡單的方法之一,不需要量化校準資料或校準過程。可以輕鬆與任何包含 torch.nn.Linear 模組的模型一起使用。目前的分析表明,NF4(NormalFloat 資料型別)和 FP4 是同樣有效的 4 位元量化技術,表現出相似的屬性,如推理速度、記憶體消耗和生成內容的品質。NormalFloat 資料型別是量化技術的增強形式,代表了資訊理論中權重在常態分佈下的最佳表示。它主要由 QLoRA 方法用於以 4 位元精度微調模型。以下是 QLoRA 的一些資料:

125M 到 13B 的 OPT、BLOOM、LLaMA 和 Pythia 模型在不同資料型別下 Pile Common Crawl 的平均困惑度。

AIMET

AIMET 是 Qualcomm 提供的函式庫,用於神經網路模型的高階模型量化和壓縮技術。它旨在提高推理速度,同時減少計算和記憶體需求,並將對準確度的影響降至最低。例如,在 Qualcomm Hexagon DSP 上執行的模型,其速度可比 Qualcomm Kyro CPU 快 5 到 15 倍。AIMET 體現了在非 NVIDIA 硬體上的量化實作。通常,它代表了硬體供應商提供的基本量化能力,而目前尚無單一專案能為不同硬體平台提供通用的量化能力。

結論

4 位元量化是目前最具成本效益的量化方案。然而,最佳化取決於詞嵌入、權重和激活值的量化層級。在大多數場景中,除了激活值量化到 4 位元的情況外,整數(Int)量化提供更好的成本效益,包括非量化場景。因此,低位元量化,特別是在訓練後量化(PTQ)中關注激活值,是一個有前景的量化加速方向。

INT8 是目前最常用的量化方案。與 INT8 相比,FP8 在量化場景中無法完全取代它,但適用於模型訓練,為無需量化即可解決推論效能問題提供了方案。結合硬體 Tensor Core 的 FP8 相關技術,以最大化推理速度,是一個值得探索的新方向。

基於 GPTQ 演算法的專案在大型語言模型(LLM)領域佔據主導地位。然而,新的資料型別(如 FP4 和 NF4)、更低位元精度以及動態量化,為創新和研究提供了機會。

除了 NVIDIA GPU,新的 GPU 和 CPU(如 AMD、國產 GPU 和 Qualcomm)帶來了新的機會。將量化演算法快速適配到不同硬體平台並最大化硬體效能,是一個值得探索的新方向。

參考文獻

[1] LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale
[2] Outliers Dimensions that Disrupt Transformers Are Driven by Frequency
[3] Smoothquant: Accurate and efficient post-training quantization for large language models
[4] FP8 versus INT8 for efficient deep learning inference
[5] FP8-LM: Training FP8 Large Language Models
[6] The case for 4-bit precision: k-bit Inference Scaling Laws
[7] LLM-FP4: 4-Bit Floating-Point Quantized Transformers
[8] GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers
[9] Understanding the Impact of Post-Training Quantization on Large Language Models
[10] QLoRA: Efficient Finetuning of Quantized LLMs

novita.ai 提供 Stable Diffusion API,以及數百個快速且最便宜的 AI 影像生成 API,涵蓋 10,000 個模型。🎯 最快 2 秒生成,按量付費,每張標準圖像最低 $0.0015,您可以新增自己的模型並省去 GPU 維護。免費分享開源擴充套件。

推薦閱讀

  1. Stable Diffusion API: A Comprehensive Guide
  2. ChatGLM3: Open Source Chat LLMs