使用自推測解碼加速文本生成

自推測解碼透過 LayerSkip 方法實現,使單一大型語言模型(LLM)能夠利用自身的早期層草擬 token、深層層驗證 token 來加速文本生成。此方法減少了與傳統推測解碼相關的記憶體佔用和計算延遲,傳統推測解碼需要兩個獨立的模型。

自推測解碼 與 傳統推測解碼

傳統推測解碼依賴小型草擬模型生成一序列 token,並使用較大的驗證模型進行驗證。相對地,自推測解碼對兩個角色使用同一個模型。透過在中間層退出模型以產生草擬 token,系統消除了對次要模型權重的需求,從而節省記憶體並減少大規模推論的整體硬體足跡。

技術實作:提前退出與未嵌入

為了啟用自推測解碼,模型必須具備「提前退出」的能力,即生成過程在預先指定的中間層停止。

未嵌入 Logits

由於語言模型(LM)頭部通常僅在最終層進行訓練,模型需要特定訓練來「未嵌入」來自中間層的 logits。此過程將中間層的輸出投射到 LM 頭部以預測下一個 token。

訓練修改

在預訓練或微調期間,會使用兩項主要修改來使提前退出變得可行:

  • Layer Dropout:模型被訓練以跳過某些層,且在更深層的 dropout 率會增加。這減少了對後續層的依賴並提升泛化能力。
  • Early Exit Loss:對每個退出(中間層)應用標準化損失,迫使 LM 頭部學習如何未嵌入來自模型各深度的輸出。

推論過程:草擬與驗證

推論分為兩個不同的階段:

  1. 自草擬:透過在中間層退出模型來生成 token。推測 token 的數量及具體的退出層是平衡速度與準確度的超參數。
  2. 自驗證:完整模型驗證草擬 token。為了優化此過程,系統會重複使用在草擬階段快取的早期層結果,僅計算剩餘層以進行驗證。

硬體與效能優化

自推測解碼利用 KVQ 快取(KV 快取與退出查詢快取的組合)來減少冗餘計算。相較於兩模型系統,這提供了三項主要優勢:

  • 共享權重:前 $E$ 層在草擬與驗證中被重複使用。
  • 共享 KV 快取:前 $E$ 層的 key-value 對被重複使用。
  • 共享計算:退出查詢快取儲存退出層 $E-1$ 的查詢向量,使驗證過程能夠跳過計算層 $0$ 到 $E-1$。

基準測試與效能權衡

在 A100 GPU 上進行的基準測試顯示,對於多數模型規模——包括 Llama 3.2 1B、Llama 3 8B、Llama 2 13B 和 Llama 2 7B——早期退出自推測解碼的速度快於傳統的兩模型推測解碼。

「最佳點」適用於早期退出

退出層與效能之間存在非線性關係。退出過早會導致準確度低且草擬 token 的接受率低;退出過晚則會增加草擬階段的計算開銷。對於多數模型,存在一個「最佳點」,在此預測準確度與生成開銷之間的權衡被優化以達到每秒最大 token 數。

模型特定結果

  • Llama 2 70B:雖然相比自回歸解碼顯著加速,但與其他模型相比的加速幅度較小,這可能是因為其持續預訓練使用的 token 較少(328M token),而 Llama 2 7B 變體使用了 52B token。
  • 基線模型:未使用 LayerSkip 配方進行訓練的模型無法看到加速,因為其早期層未被訓練來預測輸出,導致 token 接受率極低。

與 Transformers 整合

自推測解碼已整合到 Hugging Face transformers 庫中。只要模型檢查點已使用 LayerSkip 配方進行訓練,即可透過在 generate() 函式中加入 assistant_early_exit 參數來啟用。

Sources