最新版本 NVIDIA cuBLAS 庫版本 12.5 將繼續為深度學習(DL)和高性能計算(HPC)工作負載提供功能和性能。本文將概述自版本 12.0以來 cuBLAS 矩陣乘法(matrix multiplications)中的以下更新:
- 適用于單精度、雙精度和半精度的分組 GEMM API
- 最新的 LLM matmul 性能 NVIDIA Hopper(H100 和 H200) 和?NVIDIA Ada 架構(L40S) GPU
- 關于 cuBLAS 性能調整選項、基準測試和 API 推薦的說明
- 改進了 cuBLASLt 中的功能覆蓋范圍
分組的 GEMM API
分組的 GEMM API 可視為批量 API 的泛化,可在一次內核啟動中對不同的矩陣大小、轉置和縮放因子進行分組和并行化。
這種方法提供加速的一個示例是多專家 (MoE)模型的批量大小為 8 和 64,以及 FP16 輸入和輸出。在本示例中,分組的 GEMM API 可以使用批量 GEMM API 實現比單純循環快 1.2 倍的速度。
這一點令人印象深刻,因為當前分組的 GEMM 核函數僅利用線程束級 MMA 指令。它們已證明可以與利用線程束級 MMA (wgmma) 指令的分批 GEMM 核函數進行競爭。
cuBLAS 庫中提供了兩套新 API,用于 Grouped GEMM 支持:
- cublas<t>gemmGroupedBatched用于 FP32 (包括 TF32) 和 FP64 精度,其中單精度和雙精度的 <t> 分別為 S 或 D。
- cublasGemmGroupedBatchedEx適用于 FP16、BF16、FP32 (包括 TF32) 和 FP64 精度。
這些 API 目前支持可變形狀、轉置和縮放系數。在 GitHub 上訪問 NVIDIA/CUDALibrarySamples 查看cuBLAS 擴展程序 API和cuBLAS 3 級 API。
NVIDIA H100、H200 和 L40S GPU 上的最新 LLM Matmul 性能
NVIDIA H100、H200 和 L40S 圖形處理單元(GPU)的最新矩陣乘法(matmul)性能快照如圖 1 所示,適用于 Llama 2 70B 和 GPT3 訓練工作負載。測量這些加速時無需鎖定 GPU 頻率,并考慮了每個通用矩陣乘法(GEMM)在工作負載中的重復次數。與 Llama 2 70B 和 GPT3 訓練階段的 A100 相比,H200 上的加速分別接近 3 倍和 5 倍。 實際工作負載的最終端到端加速將取決于這些加速以及每個工作負載的非 GEMM 部分的加速。

庫性能和基準測試
本節涵蓋以下主題:
- 運行時性能啟發式算法,或 cuBLAS 庫如何平均分配最快的實現。這應該可以回答為什么用戶在將 cuBLAS 與其他后端進行比較時有時會遇到性能差距。
- cuBLAS 庫中的性能調整 API 可在可用時實現更快的實現。這應回答用戶如何在需要單獨的專用內核之前使用 cuBLAS 實現最佳性能。
運行時啟發式算法
cuBLAS 庫在運行時利用推薦系統(recommender system),為用戶請求的任何矩陣乘法(matmuls)分配盡可能快的配置。每個配置都包括實現(kernels)和運行時啟動參數。此推薦系統基于在 GPU 上運行多個可用配置的大量問題(包括多個精度、矩陣形狀、layouts 和 epilogues)所產生的實際計時數據進行訓練。
圖 2 展示了這些數據在 Hopper GPU 上的外觀,該 GPU 固定在某個典型的工作時鐘,并將性能歸一化到該時鐘的 GPU 峰值。

然后,此 recommender system 的目標是在運行時針對每個大小的問題選擇最快的實現。如果沒有 auto-tuning,則只能在整個問題空間平均滿足此條件。圖 3 顯示了在大型問題空間中訓練準確率為 93%(geomean) 的 recommender system 的結果。在本示例中,runtime heuristics 在可視化數據集中實現了 93% 的最佳可用性能。

請注意,始終存在特定的 matmul 問題,即使庫中提供了最佳實現,此推薦系統也不會返回開箱即用的最佳實現。
使用 cuBLASLt API 進行性能調整
本節介紹如何確保在不同的后端之間進行有意義的比較,以及如何使用 cuBLAS 啟發式算法 API 進一步縮小與最佳可用實現之間的差距。
到目前為止,我們的假設是用戶利用 cuBLAS matmul API(即cuBLAS matmul API),該選項會根據前面總結的默認啟發式算法來分配最佳實現選項。由于此選項并不總是能保證嚴格來說是最快的,因此 cuBLAS 庫會公開另一個 API,cublasLtMatmulAlgoGetHeuristic,這使用戶能夠輕松執行自動調整,以分發比默認運行時啟發式算法返回的實現更快的實現。
此 API 接受用戶為原始 matmul API 指定的類型。但它不會分發 matmul,而是返回多個選項,供用戶迭代、運行一次,以及選擇可能更好的實現。訪問 NVIDIA/CUDALibrarySamples 可以看到 cuBLAS 中的自動調整示例。圖 4 顯示了本示例的主要部分。
由于最新 GPU 上的性能調整選項僅在 cublasLt* API 中可用,因此任何基準測試都必須使用這組 API 并通過利用 cublasLtMatmulAlgoGetHeuristic。請注意PyTorch matmul目前未提供此功能,如果用作基準測試 cuBLAS 的代理,則無法反映可用的最佳性能。雖然也有類似選項,cublasGemmAlgo_t,可在cublasGemmEx API,此選項在 NVIDIA Ampere 架構和更新的 GPU 上是無操作的。
遷移到 cublasLtMatmul API
建議 NVIDIA Ampere 架構和更新 GPU 的高級用戶從cublasGemmEx遷移到cublasLtMatmul。除了可以訪問前面討論過的性能調整選項之外,過渡到 cublasLtMatmul APIs 還可以訪問融合后的 epilogues,并增加對 mixed-precision 矩陣乘法的支持。為促進這一過渡,請參閱cuBLASLt 庫 API 示例。
cuBLASLt 中更出色的功能和性能
自 cuBLAS 12.0 以來,cuBLAS 庫中包含以下增強功能:
- 融合后的結語支持 BF16 和 FP16 精度之間的比對,NVIDIA Ampere 架構和NVIDIA Ada 架構。
- 其他融合的結語NVIDIA Hopper和 NVIDIA Ampere。
- 在 Ada GPU 上支持 FP8,在 Ada L4、L40 和 L40S 上支持性能更新。
- 消除 cuBLASLt 的 M、N 和批量大小限制matmulAPI,與 cuBLAS 相比,它縮小了 cuBLASLt 的功能差距gemmExAPI。
- 提高了啟發式緩存處理高遷移率的工作負載。
- cuBLAS 符號在適用于 Linux 的 CUDA 工具包符號資源庫。如需了解詳情,請參閱NVIDIA CUDA 工具包符號服務器。
如需詳細了解 cuBLAS,請參閱 documentation 和?samples。
?