推測解碼:在不換硬體的前提下加速生成
用小模型草擬、大模型驗證,生成速度常能提升一到兩倍。
逐 token 生成的瓶頸是記憶體頻寬:每產生一個 token 都要把整個模型的權重讀一遍。推測解碼(speculative decoding)的想法是——既然讀一次權重可以驗證多個 token,那就先用便宜的方法猜幾個。
流程是:草稿模型快速產生 k 個候選 token,主模型一次性驗證這 k 個,接受正確的部分、從第一個錯的地方重來。因為驗證是平行的,所以只花一次前向傳遞的時間。
三種草稿來源
- 小模型草稿:用同系列的小模型,接受率高但需要額外載入一個模型。
- n-gram 草稿:從已生成的內容中找重複模式,零額外成本。對含大量重複的任務(程式碼、結構化輸出、引用原文)特別有效。
- 自我推測:用模型自身的淺層產生草稿,不需額外模型。
效果取決於接受率
# 加速比的粗略估算
# k: 每次草擬的 token 數;a: 平均接受率
# 加速比 ≈ (1 + k*a) / (1 + k*c) c 為草稿模型的相對成本
for k in [3, 5, 8]:
for a in [0.5, 0.7, 0.85]:
speedup = (1 + k*a) / (1 + k*0.15)
print(f'k={k} 接受率={a:.0%} → 約 {speedup:.2f}x')什麼任務接受率高
- 結構化輸出:JSON 的欄位名、括號、引號高度可預測,接受率常常超過 0.8。
- 程式碼生成:語法結構重複性高。
- 引用原文的摘要:大段複製原文時幾乎全接受。
- 創意寫作:接受率低,可能反而變慢。
n-gram 草稿的實作概念
def ngram_draft(generated, prompt, k=5, n=3):
"""在 prompt+generated 中找出與最近 n 個 token 相同的片段,
取其後續 k 個 token 當草稿。零成本,對重複內容極有效。"""
pattern = generated[-n:]
hay = prompt + generated
idx = hay.rfind(pattern, 0, len(hay) - n)
return hay[idx + n: idx + n + k] if idx >= 0 else None輸出必須完全一致
推測解碼的一個重要性質是:在正確實作下,輸出與不用推測解碼時完全相同。它只是加速,不改變結果。如果你發現輸出變了,那是實作有誤,不是預期行為。
什麼時候不該開
- 批次大小已經很大時——GPU 已經被填滿,推測解碼沒有空閒算力可用,反而變慢。
- 接受率低於 0.4 的任務。
- 記憶體吃緊時,多載一個草稿模型可能排擠 KV 快取。
先在低併發的互動式服務上試。推測解碼對「單一請求要快」最有價值,對「大量請求要吞吐」幫助有限甚至為負。
訂閱後繼續閱讀全文
本篇為訂閱者專屬內容。訂閱後可取得下列權限:
- 解鎖全部內容權限
- 閱讀不限篇數
- 全站移除廣告
月卡
NT$240
開通 30 天
一次付清,開通 30 天
季卡
NT$620
開通 90 天
一次付清,開通 90 天,每天約 NT$7
年卡
NT$2,160
開通 365 天
一次付清,開通 365 天,每天約 NT$6
一次性付款,付款成功後立即開通,到期自動結束,不會再次扣款,也不需要取消訂閱。
立即訂閱
金額均為新臺幣(TWD),即實際扣款金額,不另收手續費
支援信用卡 · Apple Pay · Google Pay · WebATM · ATM 轉帳
購買須知與退款政策