返回首頁

GitHub Repo

PyTorch 社群提出融合修補,量化 LLM 單筆解碼可能因大型中間緩衝區變慢

10 月 10 日的 PyTorch 社群回報指出,Inductor 在特定算子組合下會將矩陣乘法的完整乘積寫入記憶體,增加量化 LLM 單筆解碼成本。案例涵蓋正式版與開發版,修補已有局部測試及量測,但仍是未合併的草稿。

Pytorch Deepdream (https://github.com/gordicaleksa/pytorch-deepdream) by gordicaleksa (https://github.com/gordicaleksa/pytorch-deepdream/commits?author=gordicaleksa) · MIT · Image source
zh-Hant

PyTorch 社群於 10 月 10 日公開一項 Inductor 效能問題:使用 max-autotune 相關設定時,單列矩陣乘法可能因前置算子的融合判斷,產生原本可省略的大型 FP32 中間緩衝區。回報者在 RTX 5090 上,於 2.14.1 與 2.16 開發版均觀察到特定組合變慢,並附上最小重現與生成程式碼。問題回報

回報分析指出,當矩陣乘法的 M 固定為 1,該路徑會將運算拆成廣播乘法與加總。若兩側輸入各自的運算數未超過門檻,合併後卻超過 GPU 預設的 30,編譯器可能將完整 (1, K, N) 乘積實體化,再交給歸約核心讀取。以 K=9216、N=2560 為例,這會額外寫入、讀回各約 94 MB 資料;算子稍增或稍減,反而可能避開這個窗口。重現與分析

官方文件說明,max-autotune 會使用 Triton 或模板矩陣乘法,並在 GPU 預設啟用 CUDA Graphs;max-autotune-no-cudagraphs 則關閉圖形重播。這讓工程團隊能分開比較核心生成與重播效果。從本次案例推論,評估量化解碼時,應連同活化函式、反量化及矩陣乘法一起量測,單獨測試乘法可能漏掉融合造成的記憶體流量。官方文件

草稿 PR #200540 提議先實體化較小的廣播輸入,避免完整乘積落地。作者提供的 RTX 4090 測試中,一項帶 SwiGLU 前置運算的 int4 權重量化案例由 179.5 微秒降至 27.1 微秒,並加入緩衝區配置與數值對照測試。這是局部核心量測,尚不能換算成完整模型的 token 吞吐提升。修補提案

截至查核時,提案仍為草稿、未有審查,部分 CI 等待核准。工程師可先檢查生成程式碼是否配置上述乘積緩衝區,再比較編譯模式、延遲與數值結果;後續應追蹤上游審查及正式版本是否納入修補。提案狀態

來源

  1. Inductor M=1 矩陣乘法中間緩衝區效能回報 #200539
  2. 優先實體化小型廣播輸入的草稿修補 #200540
  3. torch.compile — PyTorch 2.14 documentation