昨天談 evals,結論是「你要能量測模型好不好」;今天要補上另一半:模型評測過了、能力達標,還得跑得起、跑得省。一個在 A100 叢集上拿到漂亮分數的模型,若要塞進單張消費級顯示卡、或壓進手機的 NPU,中間隔著一整套「模型壓縮」工程。壓縮的三大主線是量化、蒸餾、剪枝,而它們共同的驗收關卡,正是昨天講的那套評測——壓完之後掉了多少能力,只有 eval 說了算。

📖 學

為什麼非壓不可:記憶體、延遲、成本

大模型的第一道牆是記憶體。一個參數用 FP16 存要 2 bytes,700 億參數的模型光權重就要約 140GB,還沒算 KV cache 與啟用值。這代表沒壓縮就得動用多張 80GB 顯示卡,不但貴,跨卡通訊還拖慢延遲。第二道牆是延遲與吞吐:自迴歸生成是記憶體頻寬受限(memory-bound),每產生一個 token 都要把整份權重從顯示記憶體搬進運算單元,權重越小、搬得越快。第三道牆是成本:雲端 GPU 按時計費,能用一張卡跑就別用兩張。壓縮的本質,就是拿「一點點可接受的品質損失」去換「數倍的記憶體、延遲、成本改善」。

量化:把數字的位元數砍掉

量化是把權重(有時連同啟用值)從高精度浮點降到低位元表示,最常見是 FP16 → INT8 → INT4。做法分兩大路線。**後訓練量化(PTQ)**在模型訓練完後直接轉換,只需要少量校準資料(calibration data)估計數值分佈,快、便宜,是上線的主流。兩個代表演算法:GPTQ 逐層逐列地量化權重,用二階資訊最小化每層的重建誤差,推論時再於融合核心裡即時還原;AWQ(Activation-aware Weight Quantization)則觀察哪些權重對啟用值影響最大,保護這批「重要權重」不被過度壓壞,通常量化更快、推論表現也穩。**量化感知訓練(QAT)**則在訓練/微調階段就把量化誤差模擬進去,讓模型學會適應低精度,品質上限更高,但要付出訓練成本。

四位元格式近年出現新玩法。傳統 INT4 是整數均勻切割,對 LLM 常見的長尾分佈不友善;MXFP4 改用「微縮放(microscaling)」:每 32 個值共用一個 8-bit 指數縮放因子,每個值用 E2M1 浮點(1 符號、2 指數、1 尾數)編碼,對長尾更有韌性,且 Blackwell 等新硬體可原生執行。要注意的是,四位元不等於「小到免費」——即便用 MXFP4,近期像 Kimi K3 這種上兆參數等級的模型,權重仍要約 1.4TB 才裝得下,壓縮只是把「不可能」變成「勉強可行」,不是變魔術。

蒸餾:讓小模型模仿大模型

知識蒸餾(Knowledge Distillation)換一個思路:不壓縮同一個模型,而是訓練一個小的 student 去模仿大的 teacher。經典做法是讓 student 學 teacher 的 soft label——不是只學「正確答案是貓」,而是學 teacher 輸出的整個機率分佈(貓 0.7、狗 0.2、狐狸 0.1),這些「軟」資訊藏著類別間的相似結構,比硬標籤資訊量大得多,student 因此能用更少參數逼近 teacher 的行為。實務上還有 hard-label 蒸餾(直接拿 teacher 生成的序列當訓練資料),適合閉源 teacher 只能看輸出文字的情況。這也是 DeepSeek 蒸餾爭議的脈絡:當 teacher 是他人的閉源模型、你只透過 API 拿它的輸出來訓練自己的 student,就會踩到「這算不算未授權蒸餾」的授權與倫理灰區。技術上蒸餾威力很大,但用誰的輸出、有沒有權利用,是另一層問題。

剪枝:直接拿掉不重要的連結

剪枝(Pruning)把貢獻小的權重直接歸零或移除。非結構化剪枝逐一移除個別權重,壓縮率高、精度保留好,但產生的是隨機稀疏矩陣,一般硬體很難把稀疏轉成真實加速。結構化剪枝整批移除——整個注意力頭、整層、整個 channel——結構規整、能直接減少運算量與記憶體、在通用硬體上真正跑更快,代價是較粗糙、掉分風險高。折衷方案如 NVIDIA 支援的 2:4 半結構化稀疏(每 4 個權重保留 2 個),兼顧硬體加速與精度。剪枝完通常要再微調(fine-tune)幫模型恢復被剪掉的能力。

三者取捨:沒有免費午餐

量化最泛用、上線最快,通常是第一選擇;INT8 幾乎無損,INT4 開始需要小心驗證。蒸餾能得到「原生就小」的模型、推論最省,但要重新訓練、且受 teacher 授權限制。剪枝理論漂亮,但要真正加速依賴硬體對稀疏的支援。三者可疊加(先蒸餾、再量化、再剪枝),但誤差會累積。這就回到昨天的主軸:每壓一步,都必須用 eval 重跑——用同一套基準測前後對照,量出到底掉了幾分、掉在哪類任務(常見是長脈絡、數學、程式碼最先崩)。壓縮不是壓完就算,是「壓一點、量一次」的迭代。

🧠 記

  • 壓縮要解決三道牆:記憶體(權重塞不下)、延遲(memory-bound 搬權重慢)、成本(GPU 按時計費)。
  • 量化=砍位元;PTQ 便宜快(GPTQ 最小化重建誤差、AWQ 保護重要權重),QAT 品質上限高但要訓練。
  • MXFP4 用每 32 值共享指數的微縮放 + E2M1,比 INT4 更耐長尾;但四位元不等於免費,兆級模型仍要約 1.4TB。
  • 蒸餾讓小 student 學大 teacher 的 soft label(機率分佈);DeepSeek 爭議在於用誰的輸出、有無授權。
  • 剪枝分非結構化(壓縮率高、難加速)與結構化(規整、能真加速、掉分風險高),2:4 稀疏是折衷。
  • 三者可疊加但誤差累積;每壓一步都要用昨天的 eval 前後對照,量出掉了幾分、掉在哪類任務。

✍️ 實踐

做一次「量化前後對照」小實驗。 挑一個開源模型(如 7B 級),用 Hugging Face Transformers 分別載入 FP16 與 INT4(GPTQ 或 AWQ 皆可)兩版,實測三個數字:顯示記憶體占用、單筆推論延遲、以及在你自己 3 到 5 題代表性任務上的輸出品質。把數字並排列成一張表,你會很直觀地感受到「省了幾倍記憶體、掉了多少品質」的權衡曲線,遠比讀文件有感。

替壓縮建一條 eval 護欄。 沿用昨天的評測思路,固定一組小而穩的評測集(涵蓋你最在意的能力,尤其長脈絡、數學、程式碼這些易崩項),把它接成一個腳本:每次換量化格式或剪枝比例,就自動重跑一次、輸出分數對照。設一條紅線(例如「關鍵任務掉分不得超過 2%」),超過就回退。這樣壓縮就從「憑感覺」變成「有數據守門」的工程流程。

🔗 延伸學習

💬 問 AI

想把壓縮策略套到自己手上的模型時,先讓 AI 幫你排出「動作順序 + 驗收指標」,再動手:

我要把「[模型名稱與參數量,例如 Llama 3 8B]」部署到「[目標硬體,例如單張 24GB 顯示卡 / 手機 NPU]」,
目標是「[延遲 / 記憶體 / 成本要求]」,可接受的品質損失上限是「[例如關鍵任務掉分不超過 2%]」。

請幫我:
1. 判斷量化、蒸餾、剪枝三者(或組合)哪個最適合我的情境,並說明理由與取捨;
2. 若選量化,建議格式(INT8 / INT4 / MXFP4)與演算法(GPTQ / AWQ / QAT),以及需要多少校準資料;
3. 列出一套壓縮後的驗收清單:該跑哪些 eval、哪類任務最可能掉分、紅線怎麼設;
4. 指出這條路線上最容易踩雷的地方。