Get the most performance from Grace Hopper

Akshay Subramaniam, Devtech Compute | GTC 2025

目录

NVIDIA Grace Hopper Superchip

images/page-0002.jpg
images/page-0002.jpg

Soul是全新的NVLink-C2C CPU↔GPU互联技术。

对于系统中的所有线程,内存的体验在行为、延迟和带宽方面都符合预期。

NVIDIA GB200 Superchip

images/page-0003.jpg
images/page-0003.jpg

这是Grace Hopper的增强版(on steroids)。

更多信息请参考 LLM Inference Performance and Optimization on NVIDIA GB200 NVL72 [S72503]

Grace Hopper Superchip 架构

images/page-0004.jpg
images/page-0004.jpg

GPU可以以CPU内存的速度访问CPU内存。

该架构图展示了NVIDIA Grace Hopper Superchip的组件和连接:

CUDA工具以充分利用Grace Hopper

images/page-0005.jpg
images/page-0005.jpg

内存分配器

仅设备内存管理 (cudaMalloc)

images/page-0006.jpg
images/page-0006.jpg

PCIe HopperGrace Hopper 架构上,cudaMalloc 的行为是相同的。通过 cudaMalloc 分配的GPU内存,CPU无法直接访问。CPU指针 ptr 无法解引用以访问GPU内存中的数据。

images/page-0007.jpg
images/page-0007.jpg

cudaMalloc 的行为继续与x86平台保持一致,CPU无法访问其分配的内存。如代码所示,数据必须通过 cudaMemcpyHostToDevice 从CPU内存显式复制到GPU内存,并在计算后通过 cudaMemcpyDeviceToHost 复制回来。

CUDA统一内存 (cudaMallocManaged)

images/page-0008.jpg
images/page-0008.jpg

PCIe HopperGrace Hopper 架构上,使用 cudaMallocManaged 分配的内存,系统通过页错误(Page fault)和迁移(migrate)机制工作。内存会在首次被访问时(on first touch)被物理分配和放置。CPU和GPU都可以访问指向该内存的指针,系统会自动处理数据迁移。

images/page-0009.jpg
images/page-0009.jpg

cudaMallocManaged 使得代码在x86和Grace Hopper之间具有可移植性,通过直接访问或移动内存页实现。如代码所示,使用 cudaMallocManaged 后,无需显式的 cudaMemcpy 调用。CPU可以直接初始化数据,然后GPU内核可以直接使用该数据指针。

系统分配内存 (malloc/mmap)

images/page-0011.jpg
images/page-0011.jpg
images/page-0012.jpg
images/page-0012.jpg

在Grace Hopper上,使用标准 malloc 分配的内存,其物理页面在首次被访问时分配。如代码所示,当GPU内核 kernel<<<1, 128>>>(data, data2) 首次访问 datadata2 时,这些内存页将被物理分配。

images/page-0013.jpg
images/page-0013.jpg

GPU内核执行完毕后,CPU可以直接访问由GPU写入的数据。如代码中的 for 循环所示,CPU可以直接从 datadata2 中读取GPU的计算结果,无需任何显式的数据拷贝。

Grace Hopper 统一内存

images/page-0010.jpg
images/page-0010.jpg

Grace Hopper的统一内存通过 地址转换服务 (Address Translation Service, ATS) 实现。系统页表 (System Page Table) 能够将CPU malloc() 分配的内存地址或GPU内存地址进行转换。
- CPU物理内存中的页面A (Page A),可以被CPU本地访问 (CPU-resident access),也可以被GPU远程访问 (Remote accesses)。
- GPU物理内存中的页面B (Page B),可以被GPU本地访问 (GPU-resident access)。
这种机制使得CPU和GPU可以无缝访问彼此的内存空间。

Grace Hopper 优化

统一内存的自动迁移 (CPU -> GPU)

images/page-0014.jpg
images/page-0014.jpg

当一个位于CPU物理内存中的页面(Page A)被GPU频繁访问时,系统会自动将该页面迁移到GPU物理内存中,以提高性能。不频繁的访问则会继续通过NVLINK C2C进行远程访问。

CUDA内存调优API

images/page-0015.jpg
images/page-0015.jpg

在Grace Hopper上,CUDA内存调优API可用于 cudaMallocManaged 和系统分配内存 (malloc)。

用于显式控制的内存调节 API

Grace Hopper 平台提供了用于显式内存控制的调节 API。开发者可以精细地管理数据在 CPU 内存和 GPU 内存之间的位置和移动,以实现性能最优化。

Page 16: Grace Hopper 内存分配与预取示意图
Page 16: Grace Hopper 内存分配与预取示意图
Page 17: Grace Hopper CPU 与 GPU 统一内存访问示意图
Page 17: Grace Hopper CPU 与 GPU 统一内存访问示意图

Grace Hopper 的缓存一致性

Grace Hopper 通过 NVLink C2C 实现了缓存一致性访问,极大地简化了 CPU 和 GPU 之间的编程模型。

Page 18: Grace Hopper 缓存一致性访问机制
Page 18: Grace Hopper 缓存一致性访问机制

跨 NVLink C2C 的原子操作

缓存一致性使得 CPU 和 GPU 能够对共享内存地址执行原子操作。

Page 19: 使用原子操作实现 CPU-GPU 同步的代码示例
Page 19: 使用原子操作实现 CPU-GPU 同步的代码示例
Page 20: CPU 初始化并启动 GPU 执行原子操作的流程
Page 20: CPU 初始化并启动 GPU 执行原子操作的流程

用于生产者/消费者模式的并发队列

缓存一致性非常适用于实现高效的生产者/消费者模式,其中 CPU 和 GPU 可以分别扮演生产者和消费者的角色,操作一个共享的并发工作队列。

Page 21: 生产者/消费者并发队列模型
Page 21: 生产者/消费者并发队列模型
Page 22: CPU 作为生产者向队列中添加工作
Page 22: CPU 作为生产者向队列中添加工作
Page 23: GPU 消费者通过原子操作从队列中预留工作
Page 23: GPU 消费者通过原子操作从队列中预留工作

Grace Hopper 优化性能

NVLink-C2C 性能

Grace Hopper 的 NVLink-C2C 互连显著提升了 CPU 和 GPU 之间的数据传输带宽。

Page 24: Grace Hopper 与 x86+H100 在 cudaMemcpy 性能上的对比
Page 24: Grace Hopper 与 x86+H100 在 cudaMemcpy 性能上的对比

为 Grace-Hopper 做好准备

Page 25: 准备使用 Grace Hopper 的要点
Page 25: 准备使用 Grace Hopper 的要点

只需重编译和运行

加速现有应用

Grace Hopper 带来的开发者效率提升

Grace Hopper 旨在加速通往加速计算的路径,显著提升开发者效率和应用性能。

Page 26: Grace Hopper 与 x86+H100 开发者效率对比曲线
Page 26: Grace Hopper 与 x86+H100 开发者效率对比曲线

在 Grace Hopper 上优化应用程序

Page 27: 章节标题页 - 在 Grace Hopper 上优化应用程序
Page 27: 章节标题页 - 在 Grace Hopper 上优化应用程序

关键优化技术

Grace Hopper 提供了两种主要的 CPU-GPU 交互和优化模式:

  1. 异步批量 cudaMemcpy: 将 CPU 内存视为 GPU 内存的扩展。通过 NVLink C2C 进行异步卸载,适用于需要批量传输大量数据的场景。
  2. 直接内存访问 (Direct Memory Access): 通过 NVLink C2C 对 CPU 内存进行显式的高带宽和缓存访问。适用于需要 GPU 对 CPU 内存进行细粒度、低延迟访问的场景。
Page 28: Grace Hopper 的两种关键优化技术
Page 28: Grace Hopper 的两种关键优化技术

监督式微调 (Supervised Fine Tuning, SFT)

本节内容感谢 Matthias Langer (DevTech Compute APAC)。

Page 29: 章节标题页 - 监督式微调 (SFT)
Page 29: 章节标题页 - 监督式微调 (SFT)

监督式微调是调整大型语言模型(LLM)以适应特定任务或领域知识的关键步骤。

Grace Hopper 的统一内存架构为处理大规模模型和数据集的微调过程提供了便利,简化了数据在 CPU 和 GPU 之间的流动。

Page 30: 监督式微调流程图
Page 30: 监督式微调流程图

混合专家模型 (Mixture of Experts - MoE)

下图展示了在 LLM 模型中,一个 Transformer 层的结构,该层采用了混合专家(MoE)架构。输入经过层归一化(Layer Norm)和注意力(Attention)模块后,再次进行层归一化,然后通过 MoE 路由(MoE Routing)机制,将计算分配给 N 个专家网络中的一个或几个。最后,将专家们的输出进行加权求和(Weighted Sum),并与原始输入进行残差连接。

Diagram of a Transformer Layer with Mixture of Experts.
Diagram of a Transformer Layer with Mixture of Experts.

技术:激活检查点 (Activation Checkpointing)

该技术旨在通过重计算激活值来更有效地利用内存。

在反向传播(Backward pass)过程中,为了节省内存,不会存储所有前向传播(Forward pass)的中间激活值,而是在需要时重新计算它们。

Diagram illustrating Activation Checkpointing.
Diagram illustrating Activation Checkpointing.

技术:异步激活卸载 (Asynchronous activation offloading)

该技术将激活值异步卸载到 CPU 内存中,以减少 GPU 内存的占用。

前向传播过程
在模型的前向传播过程中,每一层计算产生的中间张量(Intermediate Tensors)会被生成。

Diagram of the forward pass in a Transformer model.
Diagram of the forward pass in a Transformer model.

随着前向传播的进行,产生的中间张量(特别是较小的张量)被异步地从 GPU 内存卸载(Offload)到 CPU 内存中。

Diagram showing intermediate tensors being offloaded to CPU memory.
Diagram showing intermediate tensors being offloaded to CPU memory.

这个卸载过程在模型的每一层都会发生,从而持续释放 GPU 内存。

Diagram showing continued offloading of tensors across layers.
Diagram showing continued offloading of tensors across layers.

反向传播过程
在反向传播开始时,当计算需要前向传播过程中产生的中间张量时,这些张量会从 CPU 内存中被召回(Recall)到 GPU 内存。

Diagram showing intermediate tensors being recalled from CPU memory during the backward pass.
Diagram showing intermediate tensors being recalled from CPU memory during the backward pass.

随着反向传播的继续,每一层所需的中间张量都会按需从 CPU 内存中召回,直到反向传播完成。

Diagram showing continued recall of tensors during the backward pass.
Diagram showing continued recall of tensors during the backward pass.

在 Megatron-LM 中异步卸载到 CPU 内存

代码示例展示了如何使用 cpu_offload_context 来管理激活值的卸载。

self.cpu_offload_context = CPUOffloadContext(args)

with self.cpu_offload_context as ctx:
    for index in range(self.num_layers):
        layer = self.get_layer(index)
        hidden_states = layer(hidden_states, **forward_kwargs)
        hidden_states = ctx(hidden_states, self.num_layers)

相关配置参数包括:--cpu-offload-activations, --cpu-offload-async, --cpu-offload-size-threshold 67108864

下表分析了在一个约 108B 参数的 MoE MegatronLM 模型(配置为 8 个 H100 GPU 系统,2 个专家,15 层,batch size 为 8)中临时张量的分布情况。可以看出,尽管大于 1000MB 的大型张量数量不多,但它们占据了总内存的绝大部分(54.1% + 12.0%)。

Table showing temporary tensor distribution in a 108B MoE model.
Table showing temporary tensor distribution in a 108B MoE model.

性能分析与评测 (Profiling and Performance)

下图的性能分析显示:
* 在 Grace Hopper 平台上,卸载操作(D2H 和 H2D)可以被计算(Compute)有效隐藏。
* 在 x86 平台上,卸载操作主要受数据传输(data transfer)的限制,成为性能瓶颈。

在 8 个 NVLink 连接的 GPU 上对 108B MoE 模型进行监督式微调的性能对比显示,Grace Hopper 平台上的卸载(offload)方案比重计算(recompute)方案快 25%。

Performance comparison of activation offloading on Grace Hopper vs. x86 platforms.
Performance comparison of activation offloading on Grace Hopper vs. x86 platforms.

可微流体动力学 (Differentiable Fluid Dynamics)

感谢:Łukasz Wawrzyniak, Oliver Hennigh

Title slide for Differentiable Fluid Dynamics.
Title slide for Differentiable Fluid Dynamics.

XLB

来自 Autodesk Research 的加速格点玻尔兹曼框架 (Accelerated Lattice Boltzmann Framework)

特点:
* 基于格点玻尔兹曼方法(Lattice Boltzmann Method)。
* 支持多种后端:
* JAX by Google,使用数组编程。
* Warp by NVIDIA,使用核函数编程。
* Neon。

Slide introducing XLB.
Slide introducing XLB.

LBM: 数据与计算

LBM 的计算过程主要分为两个步骤:

  1. 碰撞步骤 (Collision Step): 在每个格点上,粒子分布函数根据碰撞模型进行更新,以模拟流体粒子间的相互作用。
  2. 迁移步骤 (Streaming Step): 更新后的粒子分布函数沿着离散速度方向传播到相邻的格点。
Diagrams of the Collision and Streaming steps in the Lattice Boltzmann Method.
Diagrams of the Collision and Streaming steps in the Lattice Boltzmann Method.

使用 XLB 进行核外计算 (Out of Core Computing)

利用 GH/GB 架构

下图展示了该过程:来自完整仿真域(Lattice Boltzmann Lid Driven Cavity)的瓦片被存储在主机内存(Host Memory)中,然后被传输到设备内存(Device Memory)中进行多时间步的更新。

Diagram of Out of Core Computing with XLB.
Diagram of Out of Core Computing with XLB.

核外算法 (Out-of-Core Algorithm)

使用统一内存和双缓冲技术

该技术实现了异步重叠的内存传输。

下图展示了使用双缓冲(Buffer A, Buffer B)技术,将计算(Compute)和 CPU 到 GPU 的数据传输进行重叠,从而提高效率。

Technique: Asynchronous overlapped memory transfers using double buffering.
Technique: Asynchronous overlapped memory transfers using double buffering.

使用 XLB 进行核外计算的详细流程

利用 GH/GB 架构

下图详细描述了核外计算的 7 个步骤:

  1. 分区 (Partitioning): 整个仿真域被分割成瓦片(tiles),存储在 CPU RAM 中。
  2. 数据移动: 瓦片从 CPU 内存移动到 GPU 内存。
  3. 时间步计算 #1: 在 GPU 上执行第一个时间步的计算。
  4. 时间步计算 #2: 继续在 GPU 上执行后续时间步的计算。
  5. 时间步计算 #N: 瓦片具有参数化的光环(halos),允许在 GPU 上执行多个时间步。
  6. 光环更新 (Halo Update): 光环区域在 GPU 上进行局部更新。
  7. 异步复制: 排队和多流技术允许异步内存复制,将更新后的瓦片写回 CPU RAM,同时加载新的瓦片。
Detailed workflow of Out of Core Computing with XLB.
Detailed workflow of Out of Core Computing with XLB.

异步内存传输

下图展示了在 Grace Hopper (GH) 上使用核外 (Out of Core) 内存的格子玻尔兹曼方法 (LBM) 的典型性能分析剖面图。其开销极小,约等于两次内存复制的成本。

Page 46
Page 46

从图中可以看出:
- 每个数据块更新包含多个时间步长:计算内核(蓝色和紫色条)与内存传输操作交错进行。
- CPU与GPU之间的异步内存来回传输:内存复制操作 Memcpy DtoH (Device to Host) 和 Memcpy HtoD (Host to Device) 与 CUDA 内核的执行是重叠的,这表明了异步执行的特性,有效隐藏了数据传输的延迟。

使用核外内存的开销成本

使用核外内存虽然能够处理更大规模的问题,但也会带来一定的性能开销。

Page 47
Page 47

上图展示了格子玻尔兹曼方法(BGK D3Q19)在纯 GPU 内存和使用核外内存两种配置下的最大问题规模和性能对比。

要点总结

数据库查询

本节内容感谢 Rui Lan, Eyal Soha, Nikolay Sakharnykh (DevTech Compute NALA) 的贡献。

Page 48
Page 48

x86 与 Grace Hopper 架构对比

在处理数据库查询等需要大量CPU-GPU数据交互的应用时,传统架构的瓶颈和 Grace Hopper 的优势得以体现。

Page 49
Page 49

如上图所示:
- 左侧 (x86+H100):CPU 与 Hopper GPU 通过 PCIe 总线连接。当输入表位于CPU内存,而哈希表/输出位于GPU内存时,PCIe 的带宽(~64GB/s)成为性能瓶颈。
- 右侧 (NVIDIA Grace Hopper Superchip):Grace CPU 与 Hopper GPU 通过带宽高-达 900 GB/s 的 NVLink C2C 互连。这使得 GPU 可以高速访问 CPU 的 LPDDR5X 内存(高达 512 GB/s),CPU 也可以高速访问 GPU 的 HBM3 内存(高达 4.9 TB/s),从而消除了数据传输瓶颈。

数据库查询性能

下图展示了在不同数据库查询任务中,Grace Hopper 相对于 x86 平台的性能优势。该测试采用的技术是“高带宽直接CPU访问”。

Page 50
Page 50

结论

Page 51
Page 51

关键要点 (Key Takeaways)

Page 52
Page 52

本次报告的关键要点可总结为以下三方面:

  1. 通过异步卸载实现更高的 GPU 吞吐量:Grace CPU 可以高效地将计算任务异步卸载到 Hopper GPU,最大化 GPU 的利用率。
  2. 通过统一内存为系统内存提供高带宽缓存:NVLink C2C 实现了 CPU 和 GPU 内存的统一访问,为系统内存提供了高带宽的缓存机制,支持 CPU 和 GPU 对彼此内存的高效远程访问。
  3. 优化的 AI 软件栈与开发者生产力:NVIDIA 提供了从硬件(Grace CPU + Hopper GPU)到 CUDA,再到上层训练与推理框架的完整优化软件栈,极大地提升了开发者的生产力。

CUDA 开发者会议

Page 53
Page 53

以下是推荐的 CUDA 开发者会议,涵盖了从入门到高级优化的各类主题:

更多详情请访问:nvidia.com/gtc/sessions/cuda-tuesday

Page 54
Page 54