學習 / 實作

KV 量化入門:省下多少位元組,又引入什麼誤差?

llm / 理解 · 機制拆解

比較整張量與逐行int8量化,顯式計入scale,觀察離群值對注意力輸出的影響。

進階 · 9 分鐘 · 更新於 2026-10-07 · 步驟 14 / 18

這篇之後,已經有了哪些結果?

保留本文發表時的結論與下一步構想;以下是已發布的後續內容,不代表所有侷限皆已解決。

繼續探索

繼續探索

  1. 機制拆解

    KV 量化軸:Key 與 Value 為什么不能一概而論?

    162組保存整數碼的離線對照,比較全張量、逐Token與K逐通道/V逐Token,保留混合策略並非總更優的結果。

    10 分鐘已發布

瀏覽統計暫不可用

本文目錄 6
跳至正文 ↓

固定版本程式碼 · 原始證據 · 實驗檔案

把KV從float32變成int8,直覺上能縮小四倍。但這句話遺漏了量化參數,也沒有回答更關鍵的問題:量化誤差經過Softmax後,會怎樣影響輸出?

本篇保存合成K/V陣列,比較整張量一個scale與每行一個scale。沒有訓練模型、自然語言問答或GPU量化算子。壓縮的是存儲表示;計算時會還原成float64,所以不宣稱降低計算峰值內存或提升吞吐。

先把一個數怎樣變化講清楚

使用對稱int8范圍[-127,127],scale為該組最大絕對值除127:

scale = max(abs(x)) / 127
q = round(x / scale)
x_hat = q * scale

全零組把scale設為1,避免除零。scale以float32保存,量化值以int8保存。四舍五入誤差大致由半個量化步長控制,還要考慮scale自身浮點精度;本例單測檢查固定正常陣列,不聲稱任意輸入都可忽略scale誤差。

整張量只存一個scale,開銷小;逐行可以讓不同Token使用自己的范圍,但要多存scale。它也不能解決同一行內一個很大元素壓縮其他小元素分辨率的問題。

為什麼離群值重要

本輪在K和V的第一個元素上施加40倍擾動,再用同樣輸入比較。這個人為設置不等于真實LLM的分布,只用于觀察動態范圍擴大。

K量化誤差 → QK分數變化 → Softmax權重變化
V量化誤差 ───────────────────→ 加權和變化

兩處誤差可以共同影響輸出。僅檢查KV逐元素誤差,不足以替代注意力輸出對照;更不能替代真實模型任務質量評測。

位元組賬單

維度32、K和V各N行;下表含兩份scale,不含對象頭或分配器開銷。

N float32 KV 整張量int8 + scale 逐行int8 + scale
64 16,384 B 4,104 B 4,608 B
256 65,536 B 16,392 B 18,432 B
1024 262,144 B 65,544 B 73,728 B

逐行在N=256時比float32少存約71.9%的陣列位元組,而不是嚴格75%。基準是同形狀float32表示;數值參考和實際實驗計算用float64,分母不能混用。

輸出誤差并非一個固定折扣

3種子×3長度×正常/離群×兩策略,共36組。以種子7、長度256的最大絕對輸出差為例:

輸入 整張量 逐行
正常 0.00437 0.00247
40倍單元素擾動 0.04396 0.04295

逐行在這個樣本有幫助,但離群情況下差距很小。完整矩陣最大絕對輸出誤差達到4.136,不能只展示上表溫和樣本就說“幾乎無損”。原始數據保存每組誤差與輸出陣列;這些絕對誤差的意義還依賴輸出尺度。

KIVI研究討論了Key與Value分布差異,并采用不同分組方式。本篇兩者都使用同一簡單策略,沒有實現KIVI的2bit方案,也不能借用其真實模型結論。

可以自己做的兩個檢查

首先把全部KV設為零,輸出應有限且為零;再把一個元素放大,觀察哪一個scale發生變化。整張量會影響全體精度,逐行只改變該行,但該行內部的小元素仍可能受損。

若想判斷可否用于生產,下一步需要真實模型的校準分布、任務誤差、反量化代價、峰值顯存和端到端性能。這些是後續候選,不能從36組隨機陣列自動推導。優先讀懂本輪保存的負結果,而不是追求一個好看的壓縮倍數。

從干凈目錄復現

使用 Python 3.12。入口一次運行這組三個主題的對照,各篇只解讀自己的子集,不把同一份記錄重復當作新增回合。

git clone https://github.com/VirtualSelect/hohoo-ai-lab.git hohoo-ai-lab-study
cd hohoo-ai-lab-study
git checkout 02a2660e22c969e70e3a6f095003614a7dfa448e
python -m pip install numpy==2.2.6
python experiments/10-attention-costs/run.py --out outputs/my-run
python experiments/10-attention-costs/audit.py outputs/my-run

輸出目錄必須不存在。本機驗證環境為 Windows,Linux/macOS尚未復測。不需要模型密鑰或付費服務。manifest中的程式碼凍結提交早于上方含證據的歸檔提交,源碼哈希對應實際執行檔案。

寫給未來的自己合上文章前,留下一點自己的理解。

你的私人學習便箋,只存在目前瀏覽器,不會上傳或公開。清理瀏覽器資料會遺失,請匯出留存。三種語言共用這篇文章的便箋。

下一篇已發布內容:KV 量化軸:Key 與 Value 為什么不能一概而論? →

目前學習位置

理解 / LLM

  1. ○ 注意力分塊:不保存完整分數矩陣,如何保持結果?
  2. ○ KV 量化入門:省下多少位元組,又引入什麼誤差?
  3. ○ KV 量化軸:Key 與 Value 為什么不能一概而論?

繼續探索

繼續探索

  1. 實驗 / 035

    KV 量化入門:省下多少位元組,又引入什麼誤差?

    比較整張量與逐行int8量化,顯式計入scale,觀察離群值對注意力輸出的影響。

    已完成
  2. 專案 / 002

    Java LLM 實作集

    Java 會話、請求重試與持久化邊界,以及注意力、快取成本和量化誤差的可復現實驗。

    開發中
  3. 機制拆解

    注意力分塊:不保存完整分數矩陣,如何保持結果?

    從錯誤的分塊平均出發,推導在線Softmax累加,并用9組陣列和558次計時區分省內存與加速。

    9 分鐘已發布

接下來,走哪條路?

依據文章關聯與同主題已發布內容整理,不使用隨機推薦。

← 全部文章