JOVANA
Explore Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

更快更省:量化與推測解碼

服務中槓桿最大的兩種加速。量化縮小你必須讀取的權重;推測解碼則讓一個小模型先猜,好讓大模型一次驗證多個詞元。

對著記憶體高牆的兩根槓桿

既然解碼是記憶體受限的,加速的兩條路就是:每個詞元搬更少記憶體,或每掃一遍記憶體產出更多詞元。量化是第一根槓桿,推測解碼是第二根。它們從相反兩端攻擊同一個瓶頸,而且可以疊加——你能同時用上兩者。

t_{\text{token}} \approx \dfrac{\text{model bytes read}}{\text{memory bandwidth}}

解码受内存带宽限制:每个 token 的耗时大致等于读取的字节数除以内存带宽——所以少读字节(量化)或每次扫描产出更多 token(投机解码)正是这两根杠杆。

量化:用更少位元儲存權重

模型的權重就是一堆數字。預設每個是 16 位元浮點數;推論量化把它們改用更少位元儲存——常見是 8 位元整數,4 位元也越來越普遍。8 位元大致把模型記憶體佔用減半,4 位元大致砍到四分之一。由於解碼速度跟著每個詞元讀取多少位元組走,砍掉位元組幾乎等比例地砍掉時間。

最常見的一種是僅權重量化:只壓縮靜態的權重,在真正要做乘法時,再即時把每個小塊解量化回完整精度。激活值(activation)維持高精度,所以準確度幾乎不動,省下的大量記憶體卻留住了。這就是為什麼一個在 fp16 下要兩張卡的模型,量化後常常一張卡就裝得下。

w \approx s\,(q - z)

仅权重量化把每个权重存成低位整数 q,乘加时再实时反量化:w ≈ s(q − z),其中 s 是每个小块的缩放因子、z 是零点。

留意你換掉的準確度

位元越少,數字越粗糙,到了某個程度品質就會滑落。8 位元通常與完整精度難以區分;4 位元需要謹慎、經過校準的方法(把每個權重捨入到讓它實際造成的誤差最小)才安全;低於 4 位元時,劣化是真實存在且因任務而異的。原則很簡單:量化之後重跑你的評測——在品質數字確認沒事之前,絕不輕信那份加速。

推測解碼:先猜在前,整批驗證

解碼之所以循序,是因為大模型每跑一遍只產出一個詞元。推測解碼打破這點,方法是加進一個又小又便宜的草稿模型(draft model)。草稿模型快速猜出接下來、比方說 4 個詞元,然後大模型在一次前向運算裡把這 4 個全部檢查完——而一次驗證好幾個詞元,對它來說花費跟產生一個幾乎一樣,因為它本來就記憶體受限、運算能力有富餘。

基础的自回归生成循环每次大模型前向只产出一个 token——这正是投机解码要打破的串行瓶颈。

自回归下一个 token 生成循环示意图,每个新 token 都被反馈作为输入。

魔法在於驗證這一步。大模型接受它同意的那段最長前綴、拒絕其餘,所以輸出可被證明與大模型獨自產生的完全相同——同樣的分布、零品質損失。這裡你不是拿準確度換速度;只要草稿猜得好,速度就是白賺的。

  1. 草稿模型便宜又快速地提議一小串詞元(例如 4 個)。
  2. 大模型在一次運算中驗證全部,找出它自己也會產生的最長前綴。
  3. 一口氣接受那段前綴;在第一個分歧處,保留大模型自己的詞元、丟棄其餘。
  4. 重複進行。在容易、可預測的文字上,每次運算能落地許多詞元;在困難的文字上,它會平順地退回到大致正常的速度。

選擇你的槓桿

量化幾乎總是值得先試:它縮小記憶體、提高每秒詞元數放大你的批次,要顧的只有一次評測。推測解碼則在互動式、單一串流的延遲上發光——一個想快點拿到答案的使用者——但對一個運算單元已經塞滿的飽和批次,它幫助有限。看場合:離線批次工作要量化加大批次;即時的程式助理則要量化加上推測解碼。