在自然語言處理領域,大型語言模型(LLM)在自然語言處理領域的應用越來越廣泛。然而,隨著模型規模的增大,計算和存儲資源的需求也急劇增加。為了降低計算和存儲開銷,同時保持模型的性能,LLM大模型的量化技術應運而生
1. 量化的技術原理
LLM大模型的量化技術主要是通過對模型參數進行壓縮和量化,從而降低模型的存儲和計算復雜度。具體來說如下:
- 參數壓縮
通過將模型中的浮點數參數轉換為低精度的整數參數,量化技術可以實現參數的壓縮。這不僅可以減少模型所需的存儲空間,還可以降低模型加載的時間。 - 計算加速
由于低精度整數運算的速度遠快于浮點數運算,量化技術還可以通過降低計算復雜度來實現計算加速。這可以在保證模型性能的同時,提高模型的推理速度。
量化技術的三個主要目的:節省顯存
、加速計算
、降低通訊量
。它們往往不會同時在場,不同的應用場景下應當對癥下藥
1.1. 神經網絡中的數據類型
- FP32:在深度學習中,單精度浮點數格式FP32是一種廣泛使用的數據格式,其可以表示很大的實數范圍,足夠深度學習訓練和推理中使用。這種格式使用4個bytes(32bits)表示。
- Tensor Float 32: Tensor Float 32是Tensor Core支持新的數值類型,從NVIDIA A100中開始支持。A100的普通FP32的峰值計算速度為19.5TOPs,而TF32的峰值計算速度為156TOPs,提升了非常多
在深度學習中,其實我們對浮點數的表示范圍比較看重,而有效數字不是那么重要。在這個前提下,TF直接就把FP32中23個分數值截短為10bits,而指數位仍為8bits,總長度為19(=1+8+10)bits。至于為什么是10bits 就夠了,那是因為FP16就只有10bits用來表示分數值。而在實際測試中,FP16的精度水平已經足夠應對深度學習負載,只是表示的范圍不夠廣而已 - FP16: FP16是一種半精度浮點格式,深度學習有使用FP16而不是FP32的趨勢,因為較低精度的計算對于神經網絡來說似乎并不重要。額外的精度沒有任何作用,同時速度較慢,需要更多內存并降低通信速度。
- BFLOAT16: 由Google開發的16位浮點格式稱為“Brain Floating Point Format”,簡稱“bfloat16”。這個名字來源于“Google Brain”,這是谷歌的一個人工智能研究小組。
FP16設計時并未考慮深度學習應用,其動態范圍太窄。BFLOAT16解決了這個問題,提供與FP32相同的動態范圍。其可以認為是直接將FP32的前16位截取獲得的,現在似乎也有取代FP16的趨勢。
1.2. 量化是如何縮小模型的?
目前發現不使用4字節FP32精度轉而使用2字節BF16/FP16半精度可以獲得幾乎相同的推理結果,同時模型大小會減半。這促使開發者想進一步削減內存,如果再從2字節半精度轉成僅1字節的8bits數據類型,甚至4bits類型呢?實際上,對于大模型最常見的就是8bits量化(FP8/INT8)和4bits量化(FP4/NF4/INT4)。
量化通過減少每個模型權重所需的位數,顯著降低了模型的大小。模型一個典型的場景是將權重從FP16(16位浮點)減少到INT4(4位整數)。同時,在內存中傳輸時,也顯著降低了帶寬占用。這允許模型在更便宜的硬件上或以更高的速度運行。通過降低權重的精度,LLM的整體質量也會受到一些影響。
研究表明,這種影響因所使用的技術而異,較大的模型受到精度變化的影響較小
。更大的型號(超過70B)即使轉換為4bits也能保持其性能。一些技術,如NF4,表明對其性能沒有影響。因此,對于這些較大的型號,4bits似乎是性能和大小/速度之間的最佳折衷,而對于較小的型號,8bits量化可能更好。
- 較大的模型(如超過70B)使用4bit量化其性能沒有影響
- 較小的模型使用8bit量化可能更好
下面以Qwen-7B-Chat為例展示INT8和INT4量化的效果【模型效果的評估模型介紹參見附錄】
2. LLM量化的使用場景
LLM量化技術在以下場景中非常有用:
- 移動設備和邊緣計算:大型語言模型通常需要大量的存儲和計算資源。通過量化,可以將模型壓縮到適合移動設備和邊緣設備的大小,以便實現更高效的推理。
- 云端部署:在云端部署大型語言模型時,存儲和計算成本也是一個重要考慮因素。量化可以幫助降低云端服務器的資源需求。
3. 為什么需要量化
- 存儲空間優化:大型語言模型的參數數量龐大,存儲這些參數需要大量的顯存。通過量化可以顯著減小模型的存儲空間。
- 計算速度優化:低精度的整數運算比浮點數運算更快。量化可以加速模型的推理過程。
4. 如何量化?
4.1. 量化的分類
根據量化后的目標區間
可以分為四類:
- 二值量化(1, -1)、
- 三值量化(-1, 0, 1)、
- 定點數量化(INT4, INT8),最常見的量化方式
- 2 的指數量化。
根據量化節點的分布
可以分為均勻量化和非均勻量化
非均勻量化可以根據待量化參數的概率分布計算量化節點。如果某一個區域參數取值較為密集,就多分配一些量化節點,其余部分少一些。這樣量化精度較高,但計算復雜度也高。
現在 LLM 主要采用的是均勻量化,它又可以分為對稱量化、非對稱量化。前者是后者的一種特殊情況
量化,就是要選擇合適的量化系數,平衡截斷誤差和舍入誤差
。
非對稱量化
對稱量化
4.2 量化算法
根據量化的時機,有量化感知訓練和訓練后量化兩條路徑。
訓練后量化 PTQ:
將已經訓練好的模型的權重轉換為較低的精度,而無需任何再訓練。盡管PTQ簡單易實現,但由于權重值的精度損失,它可能會略微降低模型的性能。
- 目前針對 LLM 的量化研究都集中在 Post-training quantization (PTQ)。像是 LLM.int8(), SmoothQuant, GPT-Q 都屬于這一范疇
對于權重而言,我們可以在推理前事先計算好量化系數,完成量化。但是對于激活(即各層的輸入),它們事先是未知的,取決于具體的推理輸入,會更加棘手。根據對激活的量化,分為動態與靜態量化。- 動態量化:顧名思義,這是 on-the-fly 的方式:推理過程中,實時計算激活的量化系數,對激活進行量化。
- 靜態量化:與動態量化相反,靜態量化在推理前就計算好激活的量化系數,在推理過程中應用即可。
量化感知訓練
與PTQ不同,QAT在訓練階段集成了權重轉換過程。這通常不會明顯降低模型性能,但對計算的要求更高。QLoRA就是一種高度使用QAT的技術。
Quantization Aware Training (QAT) 量化感知訓練:首先正常預訓練模型,然后在模型中插入“偽量化節點”,繼續微調。所謂“偽量化節點”,就是對權重和激活先量化,再反量化。這樣引入了量化誤差,讓模型在訓練過程中“感知”到量化操作,在優化 training loss 的同時兼顧 quantization error.
- 通過 QAT,可以減小量化誤差,嘗試用更低的位寬去量化模型。
- QAT 雖好,但插入“偽量化節點”后微調大大增加了計算成本,尤其是面對超大規模的 LLM。
4.3 量化粒度
量化,必然有相應的量化系數 。量化粒度指的是計算 時范圍大小——用到了多少個待量化參數。這個范圍越小,說明有更少的待量化參數共享同一個 ,量化誤差自然也越小。
- per-tensor: (one scale factor) per-tensor,這是最簡單的一種方式,也是范圍最大的粒度——整個激活矩陣對應一個量化系數 ;對于權重矩陣也是如此。
- per-token & per-channel
- Group-wise
注意:權重和激活可以選擇不同的量化粒度。譬如權重用 per-tensor,激活用 per-token。并且對于激活還有動態量化與靜態量化之分。
5. 量化的影響
- 精度損失:量化技術會引入一定的精度損失,這可能導致模型性能的下降。因此,如何在保證性能的同時實現高效的量化是亟待解決的問題。
- 計算速度提升:低精度的整數運算速度更快,可以加速模型的推理過程。
- 可移植性:由于不同的硬件平臺對量化技術的支持程度不同,因此模型的移植性可能會受到影響。在實際應用中,需要考慮不同硬件平臺的兼容性和優化。
附錄
MMLU
MMLU(Massive Multitask Language Understanding)【大規模多任務語言理解能力】是一個新的基準,用于衡量在零樣本(zero-shot)和少樣本(few-shot)情形下,大模型在預訓練期間獲得的世界知識。
這使得該基準測試更具挑戰性,也更類似于我們評估人類的方式。
- 該基準涵蓋 STEM、人文(humanities)、社會科學(social sciences)等領域的 57 個學科(subject)。
- 學科范圍從數學和歷史等傳統領域到法律和倫理等更為專業的領域。
它的難度從初級到高級,既考驗世界知識,又考驗解決問題的能力。 學科的粒度和廣度使該基準成為識別模型盲點的理想選擇。
C-Eval
C-Eval 是一個全面的中文基礎模型評估套件。它包含了13948個多項選擇題,涵蓋了52個不同的學科和四個難度級別,如下所示。您可以在 探索 中查看我們的數據集示例,或查看我們的論文了解更多細節。
GSM8K
GSM8K 數據集是由 OpenAI 發布的小學數學題數據集,項目地址
GSM8K 由 8.5K 高質量的小學數學問題組成,這些問題都是由人類寫手創造的。我們將這些問題分為 7.5K 訓練問題和 1K 測試問題。這些問題需要 2 到 8 個步驟來解決,解決方法主要是使用基本的算術運算(+ - / *)進行一連串的基本計算,以得出最終答案。一個聰明的中學生應該能夠解決每個問題
HumanEval
HumanEval: Hand-Written Evaluation Set,是《Evaluating Large Language Models Trained on Code》中提到的一個代碼評測基準。
HumanEval的評估邏輯
每一個測試問題重復實驗n次,然后通過單元測試,計算平均通過率。我們可以在源碼地址中看到起執行邏輯