NVIDIA 基於 Tile 的 GPU 編程編碼指南:從 cuTile 和 Triton 內核到 Flash Attention
本教程通過 TileGym 探索 NVIDIA 的基於 tile 的 GPU 編程,構建一個可在不同硬件上運行的 Colab 工作流程。我們探測 CUDA 環境,嘗試真實的 cuTile 後端,並在標準 Colab GPU 缺乏 cuTile 堆棧時回退到 Triton。我們學習核心 tile 思想:對整個數據塊進行操作,而不是單個線程,然後加載、計算和存儲它們。我們實現了向量加法、融合 GELU、行級 softmax、分塊矩陣乘法和 flash attention,並將每個結果與 PyTorch 進行比較。
本教程深入探討基於 tile 的 GPU 編程,利用 TileGym 構建一個實用的 Colab 工作流程,該流程能在不同的硬件條件下運行。我們首先探測可用的 CUDA 環境,檢查 NVIDIA cuTile 是否可直接運行,當標準 Colab GPU 缺乏所需的 cuTile 堆棧時,回退到 Triton。通過這樣的設置,我們學習 tile 編程的核心思想:不再編寫單線程代碼,而是對整個數據塊進行操作,將它們加載到內核中,高效計算,然後存儲結果。我們使用這一模型實現了向量加法、融合 GELU、行級 softmax、分塊矩陣乘法以及 flash attention,並將每個結果與 PyTorch 進行正確性比較和基準測試。
首先進行 CUDA 環境探測,檢查 GPU 計算能力和 CUDA 版本,以確定是否支持 cuTile。如果硬件和軟件條件滿足,則嘗試導入 cuTile 後端;否則使用 Triton 作為回退。教程強調,即使沒有 cuTile,Triton 內核也能在 Colab 的 T4 GPU 上運行,但 cuTile 需要 CUDA 13.1+ 和 Ampere/Ada/Blackwell GPU。
接下來,我們實現向量加法內核,採用純 tile 操作(load → compute → store),展示最簡的 tile 編程模式。然後實現融合 GELU 內核,將兩個操作融合到一個內核中以減少內存流量。行級 softmax 內核展示瞭如何通過 tile 規約和在線 softmax 算法高效處理每行的歸一化。分塊矩陣乘法內核演示了使用 CUDA 張量核心(如果可用)並沿 K 維度累積的 tile 乘法過程。最後,flash attention 內核實現了在線 softmax 注意力計算,避免實例化完整的注意力矩陣,從而節省內存並提高效率。
每個內核都提供了完整的代碼示例和與 PyTorch 的對比測試,包括正確性檢查和性能基準測試。教程最後總結了所學的關鍵概念:tile 編程模型(整塊加載/計算/存儲)、內核融合、tile 規約、基於張量核心的 K 循環矩陣乘法,以及在線 softmax flash attention 內核。
結論指出,這些概念不僅適用於當前的 Triton 實現,也直接映射到未來支持 cuTile 的硬件上,為 GPU 編程提供了可擴展的路徑。教程還提供了完整代碼和筆記本鏈接,鼓勵讀者進一步探索。