Deep Dive into Math Libraries

Arthy Sundaram, Product Manager
Harun Bayraktar, Director of Engineering
GTC Spring 2024

引言

数学库是实现满足您需求的加速的基础。核心优势包括:

Page 2, 介绍数学库的四个核心优势
Page 2, 介绍数学库的四个核心优势

议程 (Agenda)

本次演讲将涵盖以下主题:

快速傅里叶变换库 (Fast Fourier Transform Libraries)

cuFFT API 扩展

cuFFT 提供了多种 API 扩展,以满足不同场景的需求,这些 API 均可从 CPU 代码中调用。

API 扩展 描述 可用性
cuFFT Host APIs 用于单 GPU 的 GPU 加速 FFT CUDA Toolkit/HPC SDK
cuFFTxt Host APIs 多 GPU 单节点 FFT CUDA Toolkit/HPC SDK
cuFFTMp Host APIs 多 GPU 多节点 FFT HPC SDK
cuFFTDx Device APIs 用于在 CUDA 核函数内部执行的 FFT (In-kernel FFTs) 独立下载 (Standalone download)

cuFFT: 即时编译与链接时优化 (Just-In-Time, Link-Time Optimization)

传统方法为每种可能的配置和 GPU 架构提供预编译的专用核函数,但这会导致“组合爆炸”问题,扩展性差。

JIT LTO (即时编译与链接时优化) 通过将核函数作为预编译的“片段”提供,解决了这一问题。这些片段在运行时(Runtime)与用户代码(例如回调、卷积等)结合,动态生成针对目标方案的专用核函数。这为用户代码集成提供了更多可能性,并使库功能更加丰富。

Page 6, cuFFT JIT LTO 机制示意图
Page 6, cuFFT JIT LTO 机制示意图

cuFFT - JIT LTO 性能与路线图

JIT LTO 实现了核函数的运行时最终确定和内联回调,并增加了对 Windows 的支持。

Page 7, cuFFT JIT LTO 性能提升与发展路线图
Page 7, cuFFT JIT LTO 性能提升与发展路线图

cuFFTDx

cuFFTDx 是一个 C++ 头文件库,提供设备端 API,用于将 FFT 融合(fusing)到用户核函数中。

Page 8, cuFFTDx 架构与性能对比图
Page 8, cuFFTDx 架构与性能对比图

稠密和稀疏线性代数库 (Dense and Sparse Linear Algebra Libraries)

cuBLAS

cuBLAS 是用于执行基本线性代数运算(BLAS)的 GPU 加速库。

cuBLAS API 扩展

cuBLAS 提供了多种可从 CPU 代码调用的 API 扩展。

API 扩展 描述 可用性
cuBLAS Host APIs 标准的 GPU BLAS API,带有额外的 GEMM 扩展。 CUDA Toolkit/HPC SDK
cuBLASLt Host APIs 用于 GEMM 的高级 API,具备可编程性、AI 训练的启发式核函数选择以及多种混合精度和尾声(epilogues)支持。 CUDA Toolkit/HPC SDK
cuBLASXt Host APIs 用于单节点多 GPU 的 cuBLAS 调用。 CUDA Toolkit/HPC SDK

新的 API 扩展: cuBLASDx 和 cuBLASMp

这些新的 API 扩展现已开放下载。

API 扩展 描述 可用性
cuBLASMp Host APIs (Preview) 用于多 GPU 多节点(MGMN)的标准 BLAS API,可从 CPU 代码调用。 独立下载和 HPC SDK
cuBLASDx Device side APIs (Preview) 简洁易用的在核函数内部使用的 GEMM(in-kernel GEMMs)。 独立下载

cuBLASDx: 用于核函数内 GEMM 的设备端 API

cuBLASDx 旨在简化在 CUDA 核函数内部执行通用矩阵乘法(GEMM)的操作。

Page 13, cuBLASDx 架构与性能对比图
Page 13, cuBLASDx 架构与性能对比图

cuBLASMp: 分布式稠密线性代数

cuBLASMp 提供多节点主机 API 以实现规模化计算。

Page 14, cuBLASMp 在 DGX-H100 集群上的弱扩展性测试
Page 14, cuBLASMp 在 DGX-H100 集群上的弱扩展性测试

cuBLAS API 扩展家族概览

下图总结了 cuBLAS API 扩展的完整家族,涵盖了从单 GPU 到多节点集群,以及从主机端到设备端的各种应用场景。

Page 15, cuBLAS API 扩展家族概览表
Page 15, cuBLAS API 扩展家族概览表

cuBLAS - Grouped GEMM

从 CUDA 12.4 开始引入 Grouped GEMM (实验性功能)。这是一个单一、简化、高性能的 API,用于对不同大小和 leading dimensions 的矩阵进行批处理。

应用场景包括:
- 专家混合(Mixture of Experts): 激活较小模型的子集。
- 异构图神经网络(Heterogeneous GNN): 学习层次关系。

这些应用场景会产生大量来自不同专家或不同子图的相异 GEMM(通用矩阵乘法)操作,Grouped GEMM 可以将它们分组处理以提升效率。

Image illustrating the concept of Grouped GEMM for Mixture of Experts and Heterogeneous GNN models.
Image illustrating the concept of Grouped GEMM for Mixture of Experts and Heterogeneous GNN models.

cuBLAS - Grouped GEMM vs 迭代式批处理 GEMM

Grouped GEMM 提供单一、简化、高性能的 API,用于对不同大小和 leading dimensions 的矩阵进行批处理。

优势:
- 单次内核提交: 无启动延迟,提升 GPU 利用率。
- 支持的数据类型: 支持 FP32、TF32 和 FP64。
- 即将支持: FP16 和 BF16。

性能对比:
下图展示了在 H100 SXM 上,专家混合(MoE)生成阶段 GEMM 的性能。结果显示,与迭代式批处理 GEMM 相比,cuBLAS Grouped GEMM 实现了显著的几何平均加速。
- 批大小为 64 时,加速比为 1.2 倍。
- 批大小为 8 时,加速比为 1.18 倍。

Comparison of Grouped Batched GEMMs (concurrent kernels) vs Iterative calls to Batched GEMMs (sequential kernels) and performance benchmark graph.
Comparison of Grouped Batched GEMMs (concurrent kernels) vs Iterative calls to Batched GEMMs (sequential kernels) and performance benchmark graph.

cuBLASLt

功能覆盖与性能提升

cuBLASLt 提供了用于 GEMM 的高级 API,支持多种混合精度、epilogues、内核选择和性能优化,是 CUDA Toolkit/HPC SDK 的一部分。

近期更新:
- 增加了对更大矩阵维度(m, n)和批大小的支持。
- 改进了针对最新大语言模型(LLM)的 matmul 性能。

性能基准测试:
- MLPerf v3.0 GPT3 LLM 训练 (仅 Matmul 加速比):
- 在 bf16 精度下,H100-SXM 和 H200-SXM 相较于 A100 实现了 3.1 倍的加速。
- 在 bf16+fp8 混合精度下,H100-SXM 和 H200-SXM 分别实现了 4.6 倍和 4.8 倍的加速。

Performance charts showing matmul speedups for MLPerf v3.0 GPT3 and Llama2 70B training on different GPUs.
Performance charts showing matmul speedups for MLPerf v3.0 GPT3 and Llama2 70B training on different GPUs.

cuTENSOR: GPU 加速的张量线性代数库

2.0 版本的新 API、功能和性能

性能提升:
- cuTENSOR 2.0.0 (无 JIT) vs 1.7.0 加速比: 在 A100-80GB-PCIe 和 H100-80GB-PCIe 上,新版本在 bf16、fp16、fp32、fp64 和 complex(fp32) 数据类型上均有性能提升,最高加速比接近 3 倍。
- cuTENSOR 2.0 - JIT 带来的增量加速 (H100): 在 H100 上,启用 JIT 相比未启用 JIT,可带来额外的性能增益,最高可达 1.4 倍以上。

Key features of cuTENSOR 2.0 and performance comparison charts.
Key features of cuTENSOR 2.0 and performance comparison charts.

cuSPARSE

稀疏性实践:结构化与非结构化

cuSPARSE 库提供了处理不同类型稀疏性的 API:

Diagram illustrating unstructured sparsity and the process of fine-grained 2:4 structured sparsity.
Diagram illustrating unstructured sparsity and the process of fine-grained 2:4 structured sparsity.

cuSPARSE: 新的稀疏格式 - 分块压缩稀疏行格式 (BCSR)

性能对比:
下图展示了 BSR SDDMM 与 CSR SDDMM 的性能对比 (单位: GFLOPS)。结果表明,随着块大小 (blocksize) 的增加,BSR SDDMM 的性能显著优于 CSR SDDMM。例如,当块大小为 32 时,BSR SDDMM 的性能达到 1,354.88 GFLOPS,而 CSR SDDMM 仅为 501.2 GFLOPS。

Performance graph comparing BSR SDDMM versus CSR SDDMM across different block sizes.
Performance graph comparing BSR SDDMM versus CSR SDDMM across different block sizes.

cuSPARSELt 0.6.0

该版本增加了对 Hopper Tensor Cores 的支持,用于矩阵的 2:4 结构化稀疏计算。

性能:
下图展示了在 H100 上,使用 cuSPARSELt 的 2:4 稀疏 GEMM 相对于使用 cuBLASLt 的密集 GEMM 的加速比。在不同矩阵尺寸和数据类型(bf16, int8, fp8)下,均可获得约 1.5 倍的加速。

Performance chart showing speedup of 2:4 sparsity using cusparselt vs dense GEMM on H100.
Performance chart showing speedup of 2:4 sparsity using cusparselt vs dense GEMM on H100.

高级求解器 (Advanced Solvers)

cuDSS: 适用于 NVIDIA GPU 的直接稀疏求解器

cuDSS 0.2.0 版本现已在 https://developer.nvidia.com/cudss 上提供。

求解流程:
1. 分析/重排序 (ANALYSIS/REORDERING):
- 矩阵类型: 实数/复数、对称/非对称、厄米矩阵。
- 重排序算法: AMD, COLAMD, RTF, Metis ND。

  1. 因子分解 (FACTORIZATION):

    • 分解方法: LU, Cholesky, Bunch-Kaufman。
    • 主元选择 (Pivoting): 无、全局、局部、列、行、阈值。
  2. 求解 (SOLVING):

    • 支持多个右端项 (RHS)、转置求解。
    • 可选的迭代求精以提高精度。

平台支持:

Flowchart of the cuDSS direct sparse solver process.
Flowchart of the cuDSS direct sparse solver process.

图像和数据压缩库 (Image and Data Compression Libraries)

nvImageCodec: GPU 加速的图像处理

nvImageCodec 支持矩阵:
下表详细列出了不同格式在解码和编码时所支持的后端库。

nvImageCodec Support Matrix table showing supported formats and backends for decoding and encoding.
nvImageCodec Support Matrix table showing supported formats and backends for decoding and encoding.

nvCOMP: GPU 加速的数据压缩

H100 性能:
下图展示了不同算法在 H100 上的压缩率、压缩吞吐量和解压吞吐量。

Performance charts for nvCOMP on H100, showing Compression Ratios, Compression Throughputs, and Decompression Throughputs for various algorithms.
Performance charts for nvCOMP on H100, showing Compression Ratios, Compression Throughputs, and Decompression Throughputs for various algorithms.

CPU 库 (CPU Libraries)

NVPL-24.03 Beta:支持 NVIDIA Grace 上 HPC 应用的 CPU 数学库

NVPL (NVIDIA Performance Libraries) 是一套用于 NVIDIA Grace CPU 架构的高性能计算(HPC)数学库。

Page 31: NVPL-24.03 Beta 版本发布详情、性能图表和 Grace Superchip 架构。
Page 31: NVPL-24.03 Beta 版本发布详情、性能图表和 Grace Superchip 架构。

上图右侧的性能图表显示:

下图展示了 NVIDIA Grace Superchip 的架构,其包含 144 核 Arm Neoverse V2 核心,通过 NVLink-C2C 连接,提供 900 GB/s 的双向带宽和 1TB/s 的 LPDDR5X ECC 内存带宽。

Python API 介绍 (Introducing Python APIs)

本节内容由 Harun Bayraktar, Leo Fang, Satya Varadhan, Leopold Cambier 呈现。

Page 32: nvmath-python 介绍标题页。
Page 32: nvmath-python 介绍标题页。

Python 数学库功能的生态系统

Page 33: Python 在数学库功能方面的生态系统现状。
Page 33: Python 在数学库功能方面的生态系统现状。

探路者:cuQuantum Python

cuQuantum Python 是为张量网络收缩提供 Pythonic 用户体验(UX)的成功案例。它展示了高级 API 如何显著简化代码并提高开发效率。

Page 34: 从 C++ 到低级 Python 绑定再到 Pythonic API 的代码行数对比。
Page 34: 从 C++ 到低级 Python 绑定再到 Pythonic API 的代码行数对比。

nvmath-python 架构

nvmath-python 旨在以便捷的 Pythonic 方式高性能地访问 CUDA 数学库功能。

核心特性:
- 最小化延迟:从 Python 快速访问新的 CUDA 库功能。
- 互操作性:与核心 Python 数值计算包(NumPy, SciPy, CuPy, PyTorch 等)兼容。
- Pythonic 库接口:为 CUDA 加速库提供 Pythonic API,这些 API 构建在低级 1:1 C API 的 Python 绑定之上。
- 平台无关性:可在 GPU、CPU (x86 & Arm) 和 Grace-Hopper 上运行。

设计优势:
- 为终端用户、包开发者和内核作者提供统一的高生产力与高性能设计。
- 能够访问所有扩展和峰值性能功能,如降低和混合精度、设备 API、以及功能定制(例如 cuFFT 内联回调)。

Page 35: nvmath-python 的架构图,展示了其如何连接 Python 应用与底层硬件加速库。
Page 35: nvmath-python 的架构图,展示了其如何连接 Python 应用与底层硬件加速库。

nvmath-python 演示

示例 1:专用矩阵乘法(matmul)API 的基本和高级用法
- 操作: d = ReLU(a x b + bias)
- 这是一个融合操作的例子,详情请参见 S62162_nvmath-python_fused_matmul_demo.pdf

Page 36: nvmath-python 演示示例1的标题页。
Page 36: nvmath-python 演示示例1的标题页。

示例 2:三种方式实现卷积
- 操作: y = iFFT(FFT(xin) . f)
- 实现方式包括:主机 API、回调函数、融合内核。
- 详情请参见 S62162_nvmath-python_convolutions_demo.pdf

Page 37: nvmath-python 演示示例2的标题页。
Page 37: nvmath-python 演示示例2的标题页。

nvmath-python 演示总结

nvmath-python 提供了一个高生产力的环境,同时赋予了优化性能的灵活性。

Page 39: nvmath-python 两个演示的性能对比图。
Page 39: nvmath-python 两个演示的性能对比图。

发布时间线

nvmath-python 的发布将通过 pipconda 提供,源代码将在 GitHub 上开源。

Page 40: nvmath-python 的暂定发布时间线。
Page 40: nvmath-python 的暂定发布时间线。

结束语 (Closing Remarks)

NVIDIA 数学库总结

NVIDIA 数学库在以下四个关键领域持续发展:

  1. 无缝加速 (Seamless Acceleration):利用 Tensor Cores 等硬件特性。

    • 在 cuBLASLt 和 cuSPARSELt 中支持 FP8
    • 涵盖 cuBLAS, cuSPARSE, cuDSS, cuTENSOR, cuFFT, nvImageCodec, nvCOMP
    • nvmath-python
  2. 可组合性 (Composability):通过设备扩展库实现。

    • cuFFTDx
    • cuBLASDx
    • Python 设备扩展
  3. NVPL on Arm:高性能 CPU 库。

    • NVPL 24.03 发布,新增 Tensor 库。
  4. 多 GPU 与多节点 (Multi-GPU & Multi-Node):扩展至超级计算机。

    • cuBLASMp 加入 cuSOLVERMpcuFFTMp MGMN 库系列。
Page 42: NVIDIA 数学库的四大发展方向总结。
Page 42: NVIDIA 数学库的四大发展方向总结。

参考文献

Page 43: 相关会议和报告的参考文献列表。
Page 43: 相关会议和报告的参考文献列表。