一文詳盡大型語言模型的四種量化技術

大型語言模型(比如 ChatGPT 背後的技術)確實非常 "龐大"——這不僅指它們的能力,更直接體現在它們的體積上。一箇中等規模的模型就可能佔用幾十 GB 的內存,相當於幾百部高清電影的大小。對於普通開發者、個人研究者或初創公司來說,這樣的資源需求無疑是一道難以跨越的門檻。

爲什麼我們需要量化技術?

想象一下,你要搬運一座小山般的貨物。直接搬運整座山顯然不現實,但如果我們能把這些貨物精打細算地分裝到更小的箱子裏,運輸就會變得可行。量化技術做的就是類似的工作——它通過降低數值精度來縮減模型體積,同時儘可能保留模型的核心能力。

這種技術帶來的好處顯而易見:

量化技術全景圖

不同的使用場景需要不同的量化策略,就像不同的旅行需要不同的行李箱:

  1. 訓練後量化(PTQ) - "即用型壓縮"
  1. 量化感知訓練(QAT) - "量身定製的精簡"
  1. 4 位量化微調 - "極限壓縮"
  1. 混合精度 - "智能分配"

量化是如何工作的?

本質上,量化就是將模型中的高精度數字(通常是 32 位浮點數)轉換爲低精度表示(如 8 位或 4 位整數)。這就像把精細的手繪地圖簡化爲簡明的示意圖——雖然丟失了一些細節,但關鍵信息都得以保留。

一個形象的比喻是:量化就像把高清照片轉換爲更小的文件格式。我們通過各種巧妙的算法,確保在縮小文件大小的同時,照片中的關鍵內容仍然清晰可辨。

隨着技術的進步,量化已經能讓大模型在體積縮小 4 倍甚至更多的情況下,性能損失控制在可接受範圍內。這使得在普通筆記本電腦甚至手機上運行強大的語言模型成爲可能,大大降低了 AI 技術的使用門檻。。

先談成本:量化如何幫你省錢

在部署大型語言模型(LLM)時,持續的使用費用(主要是推理成本)往往是用戶最關心的實際問題。讓我們以 130 億參數的 LLaMA 2 模型爲例,看看量化能帶來多大的經濟效益:

存儲空間對比

這個數字意味着什麼?量化後的模型大小隻有原來的 1/4!就像把一輛大卡車換成了一輛小轎車,不僅停車位更好找,油耗也大幅降低。

運營成本節省

在實際運營中,這種體積的縮減會直接反映在成本上:

具體來說,如果 FP16 版本的 LLaMA 2-13B 每天運營成本是 1,000 美元,那麼 4 位量化版本的成本可以降到 250-400 美元 / 天,相當於節省了 60-75% 的費用!這種級別的成本削減,對於創業公司或個人開發者來說,可能就是項目可行與否的關鍵因素。

技術基礎:從比特說起

在深入量化技術之前,我們需要了解一些基礎知識:

計算機的最小單位:比特(bit)

舉個生活中的例子:ASCII 編碼中的大寫字母 "A",在計算機中就是用 01000001 這 8 個比特(1 個字節)存儲的。

存儲單位進階

我們常見的存儲單位都是基於字節的:

浮點數的精度

大型語言模型處理的主要是浮點數,常見的精度有:

想象一下,FP32 就像一個能顯示 6 位小數的高級計算器,而 FP16 則像只能顯示 3 位小數的普通計算器。雖然精度降低了,但在很多情況下已經足夠使用,而且計算速度更快、佔用空間更小。

理解這些基礎概念後,我們就能更好地把握量化技術的核心思想:如何在保證模型性能的前提下,用更少的比特數來表示這些數字。就像用簡筆畫代替精細素描,既要抓住主要特徵,又要保持可識別性。

圖(2):FP32 和 FP16

我們深入研究一下 “指數” 和“尾數”是什麼。你知道所有數字都是先用科學計數法表示,然後再轉換爲二進制嗎?圖(3)是科學計數法,其中 m 稱爲尾數e指數。

圖(3):科學計數法

採用科學計數法,圖(2)分爲三部分。對於 FP32:

我們展示一下π (pi ≈ 3.141592653589793) 以 FP64FP32FP16 形式存儲時的樣子。

import struct
import math
import numpy as np

# 獲取圓周率的值
pi = math.pi

# 將浮點數打包成二進制
packed64 = struct.pack('>d', pi) # 'd' = double-precision float (fp64)
packed32 = struct.pack('>f', pi) # single-precision float (fp32)

# 轉換爲 0 和 1 的二進制字符串
binary64 = ''.join(f'{byte:08b}' for byte in packed64)
binary32 = ''.join(f'{byte:08b}' for byte in packed32)
binary16 = np.binary_repr(np.float16(pi).view(np.int16)width=16)

print(f"Value of π: {pi}")
pi_fp64 = np.float64(np.pi)
pi_fp32 = np.float32(np.pi)
pi_fp16 = np.float16(np.pi)
print(f"FP64: {pi_fp64:.20f}")
print(f"FP32: {pi_fp32:.20f}")
print(f"FP16: {pi_fp16:.20f}")
print(f"Binary (fp64) representation: {binary64}")
print(f"Binary (fp32) representation: {binary32}")
print(f"Binary (fp16) representation: {binary16}")

我們可以得到以下結果。這麼多的 bits,你是不是被驚豔到了呢?

Value of π: 3.141592653589793
FP64: 3.14159265358979311600
FP32: 3.14159274101257324219
FP16: 3.14062500000000000000
Binary (fp64) representation: 0100000000001001001000011111101101010100010001000010110100011000
Binary (fp32) representation: 01000000010010010000111111011011
Binary (fp16) representation: 0100001001001000

輸出告訴我們:

LLM 的大小會一點一點地增長。例如,具有 130 億個參數的 LLaMA 2 在完全 FP16 精度下佔用約 26 GB。因此,關鍵思想是:如果您可以減少所需的位數,則可以減少 LLM 的大小。

然後我們考慮整數(INT)表示。圖(4)顯示 FP32 需要 32 位來表示值 30.2。而 INT8 將 30.2 四捨五入爲 30,可以用 8 位表示。INT4 將 30.2 的上限設爲 7,因爲 INT4 只能表示 - 8 到 7。但 INT4 僅需 4 位。如果我們可以將參數從 FP16 轉換爲 INT8 或 INT4,我們可以大大減少 LLM 的大小。

圖(4):FP 和 INT 表示

所有量化技術都是從 FP32 或 FP16 轉換爲 INT8 或 INT4 的變體。

從廣泛使用的量化——PTQ 開始。

技術 1:訓練後量化 (PTQ):大模型的 "瘦身術"

訓練後量化 (Post-Training Quantization, PTQ) 是目前應用最廣泛的量化技術,就像給已經訓練好的模型做 "瘦身手術"。它的最大優勢是簡單高效——不需要重新訓練模型,幾分鐘內就能完成量化,即使是擁有數千億參數的巨型模型也能輕鬆應對。

PTQ 工作原理詳解

我們用一個具體的例子,一步步拆解 PTQ 的量化過程:

假設一個 LLM 在 FP 表示中的權重矩陣 W 如圖(5)所示:

圖(5):FP 表示中的假設權重矩陣

第一步:按列量化

PTQ 會對每一列獨立進行量化處理。我們以第一列 [1.5, -1.2, 2.0] 爲例:

  1. 確定範圍:找出最小值 (-1.2) 和最大值(2.0)

  2. 計算縮放因子

  1. 量化轉換

最終得到量化後的第一列:[7, -6, 7]

圖(6):訓練後量化過程

我們將第 2 列從 FP 量化爲 INT4。

我們將第 3 列從 FP 量化爲 INT4。

量化後的 LLM 僅存儲量化的整數和比例,如圖(7)所示。

圖(7):存儲在量化的 LLM 中

現在討論如何使用(推理)這個量化的 LLM。在推理過程中,模型需要全精度形式的權重才能進行正確的矩陣乘法和激活。因此,在將量化權重加載到內存後,需要將它們反量化回浮點表示以進行計算。

運行時去量化

圖(8):去量化過程

如果將恢復後的矩陣與原始矩陣進行比較(如圖 (9) 所示),您會發現恢復後的矩陣很接近,但並不完全一致。錯誤來自舍入截斷(超過 4 位限制時)。

圖(9):量化誤差

誤差分析與優化

PTQ 的主要誤差來源:

  1. 舍入誤差:浮點到整數的轉換

  2. 截斷誤差:超出表示範圍的值被截斷

爲了減小誤差,研究者開發了更先進的 PTQ 技術,其中最著名的是 GPTQ

PTQ 的優勢與侷限

優勢

⚠️ 侷限

PTQ 就像給模型做 "快速減肥",雖然可能會損失一點 "體力"(精度),但換來了更靈活的身手(部署便利性)。對於大多數應用場景來說,這種權衡是非常值得的。

技術 2:量化感知訓練 (QAT):讓模型學會 "適應精簡"

當我們需要將模型壓縮到極低精度(如 INT4)時,普通的訓練後量化 (PTQ) 可能會導致性能大幅下降。這時就需要 ** 量化感知訓練(Quantization-Aware Training, QAT)**——這種方法就像在模特正式登臺前,先讓 ta 穿着精簡版服裝進行排練,從而更好地適應最終舞臺效果。

QAT 核心原理

QAT 的精妙之處在於它在訓練過程中就引入了 "模擬量化" 環節:

  1. 前向傳播時,權重和激活會被臨時量化爲低精度(如 INT4)

  2. 立即反量化回高精度(FP32/FP16)繼續計算

  3. 反向傳播時,使用高精度梯度更新權重

這種 "假量化" 操作讓模型在整個訓練過程中都能感知到量化帶來的影響,從而自主調整權重分佈,最小化最終的量化誤差。

圖:QAT 中的假量化操作(量化→反量化)

PyTorch 實現示例

以下是使用 PyTorch 實現 QAT 的典型代碼流程:

import torch
import torch.quantization

# 1. 定義原始模型
model = torch.nn.Sequential(
    torch.nn.Linear(10, 20),
    torch.nn.ReLU(),
    torch.nn.Linear(20, 10),
    torch.nn.ReLU(),
    torch.nn.Linear(10, 5)
)

# 2. 準備QAT配置
model.qconfig = torch.quantization.get_default_qat_qconfig('fbgemm')

# 3. 插入假量化節點
qat_model = torch.quantization.prepare_qat(model.train())

# 4. 正常訓練流程
optimizer = torch.optim.Adam(qat_model.parameters())
for epoch in range(10):
    for data, target in train_loader:
        optimizer.zero_grad()
        output = qat_model(data)
        loss = torch.nn.MSELoss()(output, target)
        loss.backward()
        optimizer.step()

# 5. 轉換爲最終量化模型
quantized_model = torch.quantization.convert(qat_model.eval())

QAT 技術優勢

更高精度:相比 PTQ,QAT 在低比特量化時能保持更好性能 ✔ 異常值魯棒:模型自動學習適應量化範圍的權重分佈 ✔ 移動端友好:特別適合手機、IoT 等資源受限設備

QAT 的適用場景

  1. 對精度要求苛刻的應用(如醫療診斷)

  2. 需要極低比特量化(如 INT4/INT2)的情況

  3. 模型架構複雜,PTQ 導致顯著性能下降時

前沿進展

最新研究如 LLM-QAT(Chen et al., 2024) 將 QAT 成功應用於大語言模型,通過:

研究顯示,在 LLaMA-7B 上應用 QAT 後,INT4 量化模型的準確度可比 PTQ 提升 15-20%

QAT 就像給模型上的 "量化預備課",雖然訓練時間稍長,但能讓模型在最終部署時表現更加出色。當 PTQ 無法滿足精度要求時,QAT 是最佳的升級選擇。

技術 3:4 位量化微調:極限壓縮與智能恢復的藝術

當模型需要部署在極度資源受限的環境時,4 位量化(INT4)就像給模型做 "極限瘦身手術"——將每個參數壓縮到僅用 4 位表示(僅有 16 種可能的取值)。這種激進壓縮雖然節省了 75% 的內存,但也面臨嚴峻的精度挑戰。這時候,量化後微調就成爲了關鍵的 "康復訓練" 過程。

4 位量化的雙重挑戰

  1. 表示範圍極端受限:-8 到 7 的整數範圍難以精確表達神經網絡豐富的權重分佈

  2. 累積誤差顯著:連續的矩陣運算會使量化誤差不斷放大

圖:4 位量化與微調的協同工作流程

QLoRA:4 位量化的救星

當前最先進的解決方案是 QLoRA(Quantized Low-Rank Adaptation),它巧妙結合了:

  1. 4 位基礎量化:使用bitsandbytes庫實現高效壓縮

  2. 低秩適配器:僅微調少量關鍵參數來恢復性能

  3. 雙重量化:對量化參數本身再進行壓縮

from transformers import AutoModelForCausalLM
from peft import LoraConfig, get_peft_model
import torch
import bitsandbytes as bnb

# 加載預訓練模型並應用4位量化
model = AutoModelForCausalLM.from_pretrained(
    "big-model",
    load_in_4bit=True,
    quantization_config=bnb.Config(
        load_in_4bit=True,
        bnb_4bit_compute_dtype=torch.float16,  # 使用FP16加速計算
        bnb_4bit_use_double_quant=True         # 啓用雙重量化
    )
)

# 配置LoRA微調策略
lora_config = LoraConfig(
    r=8,                      # 低秩矩陣的秩
    lora_alpha=32,            # 縮放因子
    target_modules=["q_proj", "v_proj"],  # 僅微調注意力層的部分參數
    lora_dropout=0.1          # 防止過擬合
)

# 應用QLoRA微調
model = get_peft_model(model, lora_config)

關鍵技術解析

  1. ** 雙重量化 (Double Quantization)**:
  1. ** 分塊量化 (Block-wise Quantization)**:
  1. Paged 優化器

實際效益對比

MEhHpf

研究顯示 (Li et al., 2023),在 LLaMA-13B 上應用 QLoRA 後,4 位量化的性能損失可從 28% 降至不足 5%

適用場景建議

推薦場景

⚠️ 注意事項

這種 "先壓縮後修復" 的策略,就像先將油畫拍成數碼照片,再通過專業修圖恢復細節。雖然無法 100% 還原原作,但在大多數應用場景下已經足夠出色,同時獲得了前所未有的部署便利性。

**技術 4:混合精度量化:AI 模型的 "智能節能模式"

混合精度量化就像給模型裝上 "智能調節器",讓不同部件自動選擇合適的精度檔位——關鍵部分保持高清畫質,次要部分則切換爲節能模式。這種動態調整策略在保持模型性能的同時,實現了最優的資源利用。

混合精度的核心思想

  1. 分層精度分配
  1. 動態調整機制

圖:神經網絡各層採用不同量化精度(FP16/INT8/INT4)

技術實現三部曲

1. 敏感度分析(確定各層重要性)

from torch.quantization import get_sensitivity_map

# 在驗證集上測試各層對量化的敏感度
sensitivity_map = get_sensitivity_map(
    model, 
    val_loader, 
    num_batches=10
)

2. 精度分配策略

# 自定義量化配置(示例)
qconfig_dict = {
    "object_type": [
        (nn.Linear, {"dtype": torch.int8}),  # 默認配置
        (AttentionLayer, {"dtype": torch.float16}),  # 注意力層保持高精度
        (nn.LayerNorm, {"dtype": torch.float32})  # 歸一化層最高精度
    ],
    "module_name": [
        ("output", {"dtype": torch.float16})  # 輸出層特殊處理
    ]
}

3. 混合精度轉換

from torch.ao.quantization import quantize_fx

# 應用混合精度量化
quantized_model = quantize_fx.prepare_fx(
    model, 
    qconfig_dict, 
    example_inputs
)

硬件協同優化

現代加速器對混合精度有專門優化:

實際應用效果對比

zj9vse

研究顯示 (Jacob et al., 2018),在 ResNet-50 上應用混合精度,既能保持 99% 的原始準確率,又能獲得 1.8 倍加速

部署建議

推薦場景

⚠️ 注意事項

混合精度量化就像交響樂團的音量調節——小提琴保持清晰高音,大鼓發出低沉共鳴,各司其職又和諧統一。這種智能的資源分配方式,正在成爲工業界部署 AI 模型的新標準。

寫在最後:量化的藝術與科學

在大模型時代,量化技術已經成爲 AI 工程師的必備技能,就像攝影師必須掌握光線調節一樣重要。通過這篇文章,我們共同探索了四種核心量化方法,每種方法都像不同的 "鏡頭濾鏡",爲模型部署提供獨特的優勢視角:

量化技術全景圖

HdjQwc

實用選擇指南

  1. 緊急上線? → PTQ 是你的 "急救包"

  2. 追求完美? → QAT 是精度控的 "定製西裝"

  3. 內存告急? → 4 位量化 + LoRA 像 "壓縮餅乾"

  4. 硬件多樣? → 混合精度扮演 "智能管家"

正如 NVIDIA 首席科學家 Bill Dally 所言:"未來三年,模型壓縮技術將比硬件進步帶來更大的效率提升。"

量化技術仍在飛速演進,三個前沿方向值得關注:

記住,沒有放之四海皆準的量化方案。就像選擇合適的交通工具——短途用自行車,跨洋用飛機,關鍵是根據你的目的地(應用場景)、行李規模(模型大小)和時間預算(開發週期)做出明智選擇。願這些量化技術成爲你 AI 工程工具箱中的得力助手!

參考

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/KQxhrYtDTudRZkxgu5yN5g