最新版本 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 部分的加速。
![The speedup of GEMMs in Llama2 70B and GPT3 LLM models on L40S, H100-SXM, and H200-SXM GPUs compared to A100 PCIe. On H200 for example, Llama 2 70B benefits from close to 3x speedup and GPT3 training phase from close to 5x speedup.](https://developer.nvidia.cn/zh-cn/blog/wp-content/uploads/2024/06/speedup-gemm-only-fraction-e2e-workloads-2.png)
库性能和基准测试
本节涵盖以下主题:
- 运行时性能启发式算法,或 cuBLAS 库如何平均分配最快的实现。这应该可以回答为什么用户在将 cuBLAS 与其他后端进行比较时有时会遇到性能差距。
- cuBLAS 库中的性能调整 API 可在可用时实现更快的实现。这应回答用户如何在需要单独的专用内核之前使用 cuBLAS 实现最佳性能。
运行时启发式算法
cuBLAS 库在运行时利用推荐系统(recommender system),为用户请求的任何矩阵乘法(matmuls)分配尽可能快的配置。每个配置都包括实现(kernels)和运行时启动参数。此推荐系统基于在 GPU 上运行多个可用配置的大量问题(包括多个精度、矩阵形状、layouts 和 epilogues)所产生的实际计时数据进行训练。
图 2 展示了这些数据在 Hopper GPU 上的外观,该 GPU 固定在某个典型的工作时钟,并将性能归一化到该时钟的 GPU 峰值。
![This figure shows a plot that contains two main datasets: 1) the Roofline of the underlying GPU calculated at a given frequency which is composed of a memory-bound region and a compute-bound region 2) performance of various GEMMs using multiple kernels in different kernel families available in the cuBLAS library. The y-axis is in % of the theoretical peak and the x-axis denotes arithmetic intensity in FLOP/B.](https://developer.nvidia.cn/zh-cn/blog/wp-content/uploads/2024/06/gemm-sampling-kernel-families-cublas.png)
然后,此 recommender system 的目标是在运行时针对每个大小的问题选择最快的实现。如果没有 auto-tuning,则只能在整个问题空间平均满足此条件。图 3 显示了在大型问题空间中训练准确率为 93%(geomean) 的 recommender system 的结果。在本示例中,runtime heuristics 在可视化数据集中实现了 93% 的最佳可用性能。
![This figure shows the relative performance of the best implementation picked by the runtime heuristics over the best implementation available in the cuBLAS library. It also shows that on average the runtime heuristics selects the best implementation 93% of the time. The x-axis denotes arithmetic intensity in FLOP/B.](https://developer.nvidia.cn/zh-cn/blog/wp-content/uploads/2024/06/relative-performance-cublas.png)
请注意,始终存在特定的 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。