返回首頁

GitHub Repo

Transformers 社群提出 CPU 原生 GQA 優化,局部測試解碼速度提升約兩成

10 月 12 至 13 日的 Transformers 技術討論提出,讓帶注意力遮罩的 CPU 推論直接使用原生 GQA,省去 K/V 張量複製。作者測試得到 1.21 倍解碼速度,但另一台機器僅有 1.06 倍,提案尚未合併。

Andrew Wippler from Lancaster, USA · CC BY 2.0 · Image source
zh-Hant

Transformers 社群於 10 月 12 日提出 CPU 注意力路徑優化,隔日獲專案協作者回應。提案針對 use_gqa_in_sdpa 的判斷:作者指出,目前 CPU 呼叫只在沒有注意力遮罩時啟用原生分組查詢注意力(GQA);帶填補的批次及許多生成請求,仍會經過 repeat_kv,把 K/V 複製至完整查詢頭數。技術提案

這項改動的技術價值在於減少注意力運算前的資料搬移。GQA 讓多個查詢頭共用較少的 K/V 頭;若框架先展開張量,共用結構仍會產生額外複製成本。Hugging Face 文件說明,sdpa 使用 PyTorch 的注意力實作,工程師可透過 attn_implementation 選擇後端;因此只指定 SDPA,仍不足以判斷內部是否省去這些複製。注意力後端文件

作者使用符合 SmolLM2-135M 形狀的 Llama 配置測試:9 個查詢頭、3 個 K/V 頭、bf16、批次大小 2、2048 token 左側填補前綴,以及 4 條 CPU 執行緒。在 PyTorch 2.14.1 上,解碼步驟的中位時間由 71.5 降至 59.3 毫秒,約為 1.21 倍速度;第二台機器則為 1.06 倍。作者回報 logits 與貪婪生成 token 相同,相關測試通過,但這些仍是提案者的局部驗證。測試條件與結果

提案聲稱 PyTorch 2.9 起的 CPU 核心可接受帶遮罩的原生 GQA,並限制於 K/V 不需梯度、未編譯或追蹤、K/V 頭維度相同的情況。協作者已追問排除編譯與追蹤的原因,並質疑持續累加條件的可維護性。目前議題仍開放,尚不能視為正式版本改善。工程師接下來應追蹤相容性測試與合併狀態,再以自身 CPU、序列長度及批次配置量測;上述解碼結果也不能直接推算整段生成延遲。協作者回應

來源

  1. CPU SDPA could use native GQA with a mask on torch >= 2.9
  2. Transformers Attention backends