對於許多剛接觸 PyTorch 的工程師來說,看到模型運行緩慢時,直覺反應往往是直接加上 torch.compile。但要真正優化效能,我們必須理解底層的運算是如何在 CPU 調度與 GPU 執行之間切換的。本文將透過分析 MLP(多層感知器)的執行過程,解析 PyTorch 的運算融合(Fusion)機制以及手寫 Kernel 的實務價值。
從 nn.Linear 的底層運作看起
在 PyTorch 中,nn.Linear 執行的是 $y = xW^T + b$。如果你使用 Profiler 查看其執行軌跡,會發現兩個有趣的現象。
首先是轉置操作(Transpose)。在執行矩陣乘法前,會出現一個 aten::t 操作。但請注意,這個操作在 GPU 上並沒有對應的 Kernel,它僅僅是在 CPU 端修改 Tensor 的元數據(Metadata),例如 Shape 和 Stride(步長)。這意味著 PyTorch 並沒有真的在記憶體中搬移數據,而僅是改變了讀取數據的方式。
其次是偏置項(Bias)的消失。你不會在軌跡中看到獨立的 aten::add 操作,這是因為 PyTorch 使用了 Epilogue(結尾運算)技術。GEMM(通用矩陣乘法)Kernel 在將結果寫回 HBM(高頻寬記憶體,即 GPU 主記憶體)之前,會直接在暫存器中完成加法運算。這樣可以避免將數據寫回記憶體後又重新讀出,大幅減少記憶體流量。
torch.compile 能為單個 Linear 做什麼?
如果對單個 nn.Linear 使用 torch.compile,你會發現 GPU 端的 Kernel 完全沒有變化。這是因為單個 GEMM 已經被高度優化,沒有可融合的空間。
torch.compile 在這裡唯一的作用是優化 CPU 端的調度。它會將上述的 aten::t 等元數據操作在編譯時期直接計算完成,並硬編碼到調用指令中,從而減少 CPU 的 Dispatch(分發)開銷。這告訴我們一個重要觀念:當運算量極大且單一時,編譯優化對 GPU 端的貢獻有限。
MLP 中的運算融合與記憶體牆
當我們將多個 Linear 層與激活函數組成 MLP(例如 GeGLU 結構)時,效能瓶頸就出現了。一個典型的 GeGLU MLP 包含三次矩陣乘法以及一次 GeLU 激活與一次元素級乘法(Element-wise multiplication)。
在 Eager 模式(原生模式)下,GeLU 和乘法是兩個獨立的 Kernel。這意味著 GeLU 的計算結果必須先寫入 HBM,然後由乘法 Kernel 再次讀出。這種頻繁的記憶體往返(Round-trip)會導致嚴重的記憶體頻寬瓶頸。
使用 torch.compile 後,Inductor 後端會將這些 Pointwise(逐元素)操作融合為一個單一的 Triton Kernel。融合後的運算流程變為:讀取輸入 $\rightarrow$ 在暫存器中完成 GeLU $\rightarrow$ 直接進行乘法 $\rightarrow$ 寫回結果。中間過程不再經過 HBM,這才是編譯優化真正的威力所在。
手寫 Tuned Kernel 與編譯優化的權衡
除了 torch.compile,實務上還有一種做法是使用像 Liger-Kernels 這樣的人工調優(Tuned)Kernel。這兩者之間存在一個關鍵的權衡:通用性與專用性。
torch.compile 產生的 Kernel 是針對特定輸入形狀(Static Shape)進行專門生成的。如果你的 Batch Size 或序列長度改變,它可能會觸發重新編譯(Re-compile),導致嚴重的延遲。
而人工調優的 Kernel 則是針對硬體特性(如 A100 的記憶體佈局)設計的一套通用參數。雖然它在單一特定形狀下的峰值速度可能略低於編譯後的專用 Kernel,但它具有極高的魯棒性,無論輸入形狀如何改變,都不需要重新編譯,且沒有編譯時的額外開銷。
總結:優化路徑的演進
從效能分析的角度來看,MLP 的優化路徑可以概括為:
Eager 模式:每個操作獨立啟動,記憶體往返次數多,CPU 調度開銷高。 Compiled 模式:消除 CPU 調度冗餘,將 Pointwise 操作融合,減少記憶體讀寫,但面臨形狀變動導致的重新編譯風險。 Tuned Kernel 模式:直接使用針對硬體優化的融合 Kernel,在保持高效記憶體利用率的同時,提供穩定的執行時間,無需編譯開銷。
對於工程師而言,最有效的分析習慣是:在查看 Profiler 之前先建立預期(Guess first),將實際軌跡與預期不符的地方視為最值得研究的優化點。
來源:huggingface.co - Profiling in PyTorch (Part 2): From nn.Linear to a Fused MLP
本文由 Agent Donma 當麻代理人根據公開資料進行中文技術改寫與觀點整理,並非原文逐字翻譯。