在當今人工智慧(AI)和大型語言模型(LLM)的快速發展中,模型的規模和計算需求不斷增長,這些模型的參數量動輒數十億,佔用數十GB的儲存空間,並需要高階GPU或TPU進行推論。然而,對於邊緣裝置、消費級硬體或成本敏感的應用來說,這些龐大的模型並不實際。這時,量化(Quantization)作為一種模型壓縮技術應運而生,幫助開發者縮減模型大小、降低記憶體需求並加速推論速度,同時盡可能保留模型效能。

Quantization (量化)
Quantization(量化)是一種模型壓縮技術,其主要目的是降低模型中數值(主要是權重)的精度,從而減少模型的體積、記憶體佔用(RAM/VRAM)和計算量,並可能加速模型的推論速度。
運作方式:
大型語言模型在訓練時,其參數(權重)通常使用高精度的浮點數來表示,最常見的是 FP32 (32位元單精度浮點數)。量化技術會將這些高精度的數值,透過特定的映射演算法,轉換為較低精度的數值格式,例如:
- BF16 (16位元浮點數)
- FP16 (16位元半精度浮點數)
- int8 (8位元整數)
- int4 (4位元整數)
- 甚至更低的精度 (如 int3, int2)
目的與優點:
- 減少模型大小: 低精度數值佔用的儲存空間更少。例如,int8 模型大小約為 FP32 的 1/4,int4 約為 1/8。這使得模型更容易儲存和分發。
- 降低記憶體需求: 在推論時,模型需要載入到記憶體(CPU 的 RAM 或 GPU 的 VRAM)中。較小的模型佔用更少的記憶體,使得在記憶體有限的裝置(如手機、邊緣裝置、消費級 GPU)上運行大型模型成為可能。
- 加速推論:減少記憶體頻寬瓶頸: 載入模型權重和讀寫活化值時,傳輸的數據量減少,降低了記憶體頻寬的壓力。
- 更快的計算: 某些硬體(如特定的 CPU 指令集、GPU 的 Tensor Cores)對低精度(尤其是整數)運算有特別優化,執行速度比高精度浮點運算更快。
- 降低功耗: 計算和數據搬移量的減少通常伴隨著功耗的降低。
挑戰與權衡:
主要的挑戰是 精度損失。降低數值的表示精度必然會損失一部分資訊,這可能導致模型效能(例如,生成文本的品質、回答問題的準確性)下降。因此,量化技術的關鍵在於找到最小化精度損失的映射方法。常見的技術包括:
- 校準 (Calibration): 使用一小部分代表性數據來確定最佳的量化參數,如縮放因子 (Scale Factor) 和零點 (Zero-Point)。
- 量化感知訓練 (Quantization-Aware Training, QAT): 在模型訓練過程中就模擬量化的影響,讓模型學習適應低精度表示。
- 後訓練量化 (Post-Training Quantization, PTQ): 在模型訓練完成後進行量化,通常速度較快,但可能精度損失較大。有許多改進的 PTQ 方法(如 GPTQ, AWQ)試圖在不重新訓練的情況下達到更好的精度。
數據格式FP32、FP16、BF16、int8、int4
這些都是在電腦科學和深度學習中用來表示數值的數據格式,主要區別在於它們使用的位元數 (bits) 以及它們如何編碼數值(浮點數 vs 整數)。位元數越少,佔用的儲存空間和記憶體就越少,計算通常也越快,但表示數值的精度就越低。
FP32 (Single-Precision Floating-Point / 單精度浮點數):
- 意思: 使用 32 個位元來表示一個浮點數。
- 結構: 遵循 IEEE 754 標準,通常包含:
- 1 位符號位 (Sign bit)。
- 8 位指數位 (Exponent bits): 決定數值的範圍大小。
- 23 位尾數位 (Mantissa/Fraction bits): 決定數值的精度。
- 差別:
- 高精度和寬動態範圍: 能表示非常大和非常小的數值,且精度相對較高。
- 基準: 是絕大多數科學計算和深度學習模型訓練時的標準格式。
- 技術差異: 作為標準,硬體(CPU/GPU)對其支援最廣泛且成熟。但每個數值需要 4 個位元組 (Bytes) 儲存,計算相對較慢。
FP16 (Half-Precision Floating-Point / 半精度浮點數):
- 意思: 使用 16 個位元來表示一個浮點數。
- 結構: 遵循 IEEE 754 標準,通常包含:
- 1 位符號位。
- 5 位指數位。
- 10 位尾數位。
- 差別:
- 大小減半: 模型大小和記憶體占用是 FP32 的一半。
- 計算加速: 在支援 FP16 的硬體(如 NVIDIA GPU 的 Tensor Cores)上計算速度可以顯著提升。
- 動態範圍顯著縮小: 由於只有 5 位指數位,能表示的數值範圍遠小於 FP32。這使得在訓練過程中容易出現梯度下溢 (Underflow) 或溢位 (Overflow) 的問題,常需要使用混合精度訓練 (Mixed Precision Training) 和損失縮放 (Loss Scaling) 等技術來克服。
- 精度降低: 尾數位減少,精度低於 FP32。
- 技術差異: 是一種直接縮減位元數的浮點數格式。主要挑戰在於其有限的動態範圍。
BF16 (BFloat16 - Brain Floating Point / 腦浮點數):
- 意思: 使用 16 個位元表示的浮點數,是 Google 為其 TPU 設計的一種格式。
- 結構:
- 1 位符號位。
- 8 位指數位。
- 7 位尾數位。
- 差別:
- 大小減半: 與 FP16 相同,模型大小和記憶體占用是 FP32 的一半。
- 保持動態範圍: 關鍵區別在於它保留了與 FP32 相同的 8 位指數位,因此具有與 FP32 相同的動態範圍,不易發生溢位/下溢。
- 精度更低: 為了保持動態範圍,其尾數位比 FP16 更少 (7 vs 10),因此數值精度比 FP16 和 FP32 都低。
- 技術差異: 是一種權衡下的浮點數格式,犧牲了部分精度來維持寬廣的動態範圍,這對深度學習中的梯度和活化值範圍變化大的情況特別有利。越來越多的現代 GPU (NVIDIA Ampere 架構及之後, AMD CDNA 架構等) 也開始支援 BF16。
int8 (8-bit Integer / 8位元整數):
- 意思: 使用 8 個位元來表示一個整數。
- 結構: 8 位元,可以表示 2^8 = 256 個不同的整數值。通常是有符號的 (-128 到 127) 或無符號的 (0 到 255)。
- 差別:
- 極大壓縮: 模型大小和記憶體占用是 FP32 的 1/4。
- 潛在高速計算: 許多 CPU 和 GPU 對 int8 整數運算有特別優化(如 NVIDIA Tensor Cores 的 INT8 模式),速度可能非常快。
- 類型轉換: 從浮點數變為整數,這是根本性的變化。
- 動態範圍和精度嚴重受限: 只能表示有限的整數。
- 技術差異:
- 需要量化 (Quantization): 必須將原始 FP32 的數值範圍映射 (map) 到 int8 的有限範圍內。這通常需要:
- 縮放因子 (Scale Factor): 一個浮點數,用於縮放 int8 值以近似原始 FP32 值。
- 零點 (Zero-Point): 一個 int8 值,對應原始 FP32 值中的 0。
- 精度損失較大: 這個映射過程必然會損失信息。需要校準 (Calibration)(使用少量代表性數據確定最佳 Scale 和 Zero-Point)或量化感知訓練 (QAT) 來最小化精度下降。
int4 (4-bit Integer / 4位元整數):
- 意思: 使用 4 個位元來表示一個整數。
- 結構: 4 位元,只能表示 2^4 = 16 個不同的整數值 (例如 -8 到 7 或 0 到 15)。
- 差別:
- 極致壓縮: 模型大小和記憶體占用是 FP32 的 1/8。
- 潛在更高加速: 理論上比 int8 更快,記憶體頻寬需求更低。
- 表示能力極其有限: 精度損失非常顯著。
- 技術差異:
- 量化挑戰極高: 將 FP32 映射到僅 16 個值的挑戰巨大。簡單的線性量化(如 int8 常用的)通常效果很差。
- 需要複雜量化技術: 常見技術包括:
- 分組量化 (Group-wise Quantization): 將權重分成小組,每組有自己的 Scale 和 Zero-Point (例如 GPTQ, AWQ, GGUF 中的 Q4_K_M 等方法)。
- 非對稱/非線性量化: 更精確地設置零點和映射關係。使用更複雜的數據結構: 例如 GGUF 中的 _K_ 量化方法,會額外儲存一些高精度的縮放因子或最小值/最大值信息來輔助反量化。
- 硬體支援: 直接支援 int4 不如 int8 普遍,但可透過軟體或特定硬體加速器實現。
Quantization 跟 GGUF 的關聯性
本質不同:
GGUF 是一種用於儲存量化模型的檔案格式。 Quantization (量化) 是一種技術或過程,用於降低模型的數值精度。GGUF 則是這種技術的成果 (即量化後的模型) 的一種載體或容器格式。
範疇不同:
Quantization 是一個廣泛的概念,可以用在各種模型 (不限於 LLM) 和各種部署場景中。實現量化的方法有很多種 (如上所述的 PTQ, QAT, GPTQ, AWQ 等)。GGUF 是一個特定的檔案格式,主要圍繞 llama.cpp 生態系統使用,雖然設計上具有擴展性,但目前最常與 llama.cpp 支持的量化方法(主要是基於 int8, int4 的各種變體)緊密相關。
簡單類比:
GGUF 就像是一個設計精良的標準化快遞箱,箱子上有標籤說明裡面裝的是什麼(模型架構)、用了哪種填充技術(Quantization)、物品的特性(元數據),以及如何安全地取出和使用物品(載入和運行)。這個箱子(GGUF 檔案)使得快遞員(llama.cpp)能夠方便地處理和遞送這個包裹(量化後的模型)。
Quantization將高精度數值(如FP32)轉換為低精度格式(如FP16、BF16、int8、int4),實現模型壓縮和推論加速。不同數據格式在動態範圍、精度和硬體支援上各有優劣,需根據應用場景選擇。GGUF作為量化模型的標準化檔案格式,與Quantization相輔相成,確保模型在llama.cpp等推論框架中的高效運行。
我是TN科技筆記,如果喜歡這篇文章,歡迎留言、點選愛心、轉發給我支持鼓勵~
也歡迎每個月請我喝杯咖啡,鼓勵我撰寫更多科技文章,一起跟著科技浪潮前進!!
>>>請我喝一杯咖啡