Profiling Large Language Model Trainings on the Grace Hopper Superchip using Nsight Systems

Karin Sevegnani, Senior Solutions Architect, NVAITC UK | GTC2025
Giuseppe Fiameni, Senior Solutions Architect, NVAITC EMEA

目录

  1. 作者简介
  2. 引言
  3. 用于 LLM 训练的 Grace Hopper 超级芯片
  4. NeMo 框架与 Nsight Systems
  5. 使用 Nsight Systems 对 LLM 进行性能分析
  6. 优化的最佳实践
  7. 结论
  8. 参考文献

作者简介

关于作者 (Giuseppe Fiameni)

  • NVIDIA 高级解决方案架构师
  • 通过合作支持高等教育和研究
  • NVIDIA AI 技术中心 (NVAITC) EMEA 地区负责人
  • 摩德纳和雷焦艾米利亚大学“可扩展人工智能”硕士课程讲师

关于作者 (Karin Sevegnani)

  • NVIDIA 高级解决方案架构师
  • 通过合作支持高等教育和研究
  • NVAITC UK 负责人
  • 爱丁堡大学和赫瑞瓦特大学爱丁堡机器人中心对话式人工智能博士
  • 在自然语言处理领域拥有专业知识

引言

现代应用集成了顺序计算和并行计算

CPU 和 GPU 对于加速计算都至关重要。现代应用程序的工作流通常在串行处理和并行处理之间交替进行。CPU 擅长串行处理,而 GPU 擅长并行处理。为了进一步加速计算并使其适用于各种工作负载,需要解决 CPU 瓶颈问题。

Page 4 - 现代应用工作流示意图,展示了串行和并行处理的结合,以及CPU和GPU的架构差异。
Page 4 - 现代应用工作流示意图,展示了串行和并行处理的结合,以及CPU和GPU的架构差异。

传统加速系统的挑战

传统的加速系统通过 PCIe 总线连接 CPU 和 GPU,存在以下挑战:
* PCIe 瓶颈:限制了 CPU-GPU 之间的通信。
* 内存访问:GPU 无法直接访问 CPU 内存。
* 编程复杂性:编程模型较为复杂。
* 能效比低:CPU 每瓦性能较低。

为了解决这些问题,需要一种新的芯片架构,旨在:
* 加速 CPU-GPU 数据传输。
* 实现 CPU 和 GPU 缓存的内存一致性。
* 简化编程模型。
* 提供更高的每瓦性能。

Page 5 - 传统PCIe架构与统一CPU/GPU内存架构的对比。
Page 5 - 传统PCIe架构与统一CPU/GPU内存架构的对比。

用于 LLM 训练的 Grace Hopper 超级芯片

NVIDIA GH200 Grace Hopper 超级芯片

GH200 专为加速计算和生成式 AI 的新时代而构建。
* 功能最全面的计算:在 CPU、GPU 或内存密集型应用中均能提供最佳性能。
* 易于部署和扩展:1 个 CPU : 1 个 GPU 的节点设计,易于为 HPC、企业和云环境进行管理和调度。
* 最佳性能功耗比/总拥有成本:针对不同工作负载最大化数据中心利用率和电源效率。

主要规格
* 900GB/s NVLink-C2C
* 624GB 高速内存
* 4 PF AI 性能
* 72 个 Arm 核心

Page 6 - NVIDIA GH200 Grace Hopper 超级芯片照片及其主要特性。
Page 6 - NVIDIA GH200 Grace Hopper 超级芯片照片及其主要特性。

全局访问所有数据

通过 NVLink C2C (Chip-to-Chip) 实现缓存一致性的访问,允许任一处理器访问任一物理内存。

  • Grace (CPU) 直接读取 Hopper (GPU) 的内存:CPU 将 GPU 数据提取到其 L3 缓存中。缓存与 GPU 内存保持一致。对 GPU 内存的更改会使 CPU 中的缓存行失效。
  • Hopper (GPU) 直接读取 Grace (CPU) 的内存:GPU 通过其 L3 缓存加载 CPU 数据。CPU 和 GPU 都可以命中缓存的数据。对 CPU 内存的更改会更新 GPU 中的缓存行。
Page 7 - Grace和Hopper之间通过NVLink C2C进行内存交互的示意图。
Page 7 - Grace和Hopper之间通过NVLink C2C进行内存交互的示意图。

为高达 175B 参数的模型提供最佳性能

下图比较了 GH200 NVL2 与 H200 NVL4 在不同大语言模型上的性能表现(以每秒输出 Token 数衡量)。
* LLAMA 70B: 性能提升 1.5 倍
* GPT3 175B: 性能提升 1.4 倍
* NVLLM 340B: 性能提升 1.1 倍

Page 8 - GH200 NVL2 和 H200 NVL4 在 LLAMA 70B, GPT3 175B, 和 NVLLM 340B 模型上的性能对比图。
Page 8 - GH200 NVL2 和 H200 NVL4 在 LLAMA 70B, GPT3 175B, 和 NVLLM 340B 模型上的性能对比图。

NeMo 框架与 Nsight Systems

NeMo 框架

NeMo 是一个端到端的框架,用于开发、定制和部署生成式 AI 模型。其主要组件包括:
* 数据准备 (Data Prep): NeMo Curator
* 训练和定制 (Training and Customization): NeMo Customizer, NeMo Evaluator
* 部署 (Deployment): NeMo Retriever, NeMo Guardrails, NVIDIA NIM

所有组件通过一个 API 网关进行访问。

Page 9 - NeMo框架的架构图,展示了从数据准备到训练和部署的完整流程。
Page 9 - NeMo框架的架构图,展示了从数据准备到训练和部署的完整流程。

Nsight Systems 系统性能分析器

Nsight Systems 是一个用于系统级应用程序算法调优的工具。

主要特性:
* 系统范围的应用程序算法调优。
* 支持多进程树。
* 定位优化机会。
* 在快速的 GUI 时间线上可视化数百万个事件。
* 发现 CPU 和 GPU 的空闲时间间隙。
* 在多个 CPU 和 GPU 之间平衡工作负载。
* 分析 CPU 算法、利用率、线程状态、GPU 流、内核、内存传输等。
* 支持命令行、独立应用和 IDE 集成。

支持平台:
* 操作系统: Linux (x86, Power, Arm SBSA, Tegra), Windows, MacOSX (host)
* GPU: Pascal+
* 产品文档: https://developer.nvidia.com/nsight-systems

使用 Nsight Systems 对 LLM 进行性能分析

Nsight CLI 性能分析开关

  • API 追踪: --trace=cuda, nvtx, osrt, cudnn, cublas
  • 摘要统计: --stats=[true|false] (在命令行输出摘要)
  • 报告文件名: -o, --output=report# (支持使用主机名、PID 和环境变量 %q{ENV_VAR} 等模式)
  • 覆盖现有报告: -f, --force-overwrite=[true|false]
  • 获取帮助: 使用 nsys profile --help 查看所有可用选项。

实验设置

机器设置

  • 机器:

    • GH200 机器,1 个节点,单 GPU
    • 未强制执行功率上限
  • 当前硬件: Quanta S74G-2U GH200

    • Grace CPU 72 核 @ 3.4GHz,配备 480GB LPDDR5X
    • Hopper GPU 配备 96GB HMB3
    • Infiniband NDR400, 每节点 1 个 HCA
  • 基础软件:

    • Rocky Linux 9.3,带自定义混合内核
    • GH 上的 CUDA 驱动
    • MLNX
    • GNU GCC
  • 作业调度器: SLURM

  • 容器: Singularity 容器

环境设置

  • 设置容器:

    • 在本地拉取内部用于 GH 的 NeMo singularity 镜像
  • 获取一个交互式节点:

    • salloc -n 1 -N 1 -p gh -t 2:00:00
  • 在交互式节点内运行容器:

    • singularity run --nv nemo-nightly.sif
  • 下载模型:

    • Llama2-7B
  • 下载数据集:

    • Databricks-dolly-15k
  • 下载代码库:

    • NeMo FW

性能分析任务:使用 LoRA 进行监督微调

nsys profile -y 360 -d 720 --trace=cuda,cudnn,cublas,osrt,nvtx --event-sample=system-wide -w true -c CudaProfilerApi -o sft_llama2_7B python ...
  • 此部分包含一个关于任务设置和运行过程的视频。

Nsight Systems 性能分析结果解读

初步分析:识别瓶颈

首先,将 .nsys-rep 文件导入 Nsight Systems 进行分析。

Nsight Systems 时间线视图,展示了CPU、CUDA硬件、内核、线程等活动的概览。
Nsight Systems 时间线视图,展示了CPU、CUDA硬件、内核、线程等活动的概览。

放大时间线后,我们可以观察到以下几点:
* 99.5% 内核 vs 0.5% 内存: 训练工作流是计算密集型 (compute-bound) 而非内存密集型 (memory-bound)
* 计算密集型: 当一个进程的性能主要受限于处理器(CPU或GPU)的速度时,该进程被认为是计算密集型。
* 内存密集型: 当一个进程的性能主要受限于内存访问(读取和写入数据)的速度而非计算时,该进程被认为是内存密集型。

Nsight Systems 放大视图,突出显示内核和内存活动。
Nsight Systems 放大视图,突出显示内核和内存活动。

进一步分析 CPU 和 GPU 的活动细节:

Nsight Systems 时间线中的 CPU 和 GPU 活动细节。
Nsight Systems 时间线中的 CPU 和 GPU 活动细节。
  • 左侧解读:

    • 绿色条: GPU 活动
    • 灰色空间: GPU 空闲
    • 下方彩色块: CPU 线程
    • 橙色条: CUDA 内存传输
  • 右侧解读:

    • GPU 利用率高,但存在空闲时段:这可能是由于 CPU 上的数据处理延迟、计算与通信重叠不足,或内核与进程之间的同步问题。
    • 稀疏的橙色条:内存传输并未主导执行时间(这对于深度学习工作负载是理想情况,因为大部分数据应驻留在 GPU 上)。

查看 OS 运行时库和 CUDA API 活动,可以发现 PyTorch Autograd 引擎的行为:

Nsight Systems 视图,展示了 OS 运行时库和 CUDA API 活动。
Nsight Systems 视图,展示了 OS 运行时库和 CUDA API 活动。
  • PyTorch 中的 Autograd 引擎: 这是负责自动微分的核心组件,在反向传播期间为张量计算梯度。
  • 解读:
    • 绿色: 活动的计算或执行。
    • 棕色虚线: 线程抢占、上下文切换、等待资源。
    • pthread_cond_wait: 应用程序线程被阻塞,等待条件变量发出信号。这可能表示 CPU 在等待 GPU 完成任务。

优化一:设置 num_workers=4 (之前为0)

设置 num_workers=4 后的 Nsight Systems 时间线视图。
设置 num_workers=4 后的 Nsight Systems 时间线视图。
  • GPU 内核的利用率更加一致,空闲间隙更少。
  • 内存部分显示出规律的活动模式,表明数据到 GPU 的流水线处理得到了改善。
  • 主线程:

    • 更连贯的绿色活动区域。
    • 在阻塞状态上花费的时间更少。
    • 计算和数据移动之间的交错更好。
  • 后续步骤:

    • 尝试不同的 num_workers 值以找到最佳设置。
    • 增加批处理大小以充分饱和 GPU。

优化二:分析卸载 (Offloading) 的影响

启用卸载后的 Nsight Systems 时间线视图及对比表格。
启用卸载后的 Nsight Systems 时间线视图及对比表格。
  • 增加的 CPU 活动:

    • pt_autograd_0pt_main_thread 线程显示出更频繁的活动,表明 CPU 正在积极参与管理卸载的激活。
  • 减少的 GPU 内存使用 (在 CUDA HW 中)

  • 增加的同步开销:
    • 时间线在 GPU 内核执行中显示出更频繁的间隙(CUDA HW 中的蓝色条),这可能是由于 CPU 和 GPU 之间增加的同步所致。

对比表格:

方面 不使用卸载 (Without Offloading) 使用卸载 (With Offloading)
GPU 内存使用 显著降低
GPU 内核利用率 更一致 由于同步而出现更多间隙
CPU 利用率 较低 由于激活管理而更高
同步开销 最小 增加

对比:PEFT (LoRA) vs. 未使用 PEFT

此页面比较了 LoRA 微调和未使用 PEFT (参数高效微调) 时的性能分析结果。左图为 LoRA 微调,右图为 未使用 PEFT

LoRA 微调与未使用 PEFT 的 Nsight Systems 时间线对比图。
LoRA 微调与未使用 PEFT 的 Nsight Systems 时间线对比图。

优化的最佳实践

混合精度训练 (Mixed Precision Training)

混合精度训练流程图。
混合精度训练流程图。
  • 在模型训练期间结合使用较低精度和较高精度的浮点格式。
  • 提高训练速度: 较低精度的格式需要更少的计算资源。

    • NVIDIA GPU 上的 Tensor Core (H100 具有第四代 T.C.) 针对混合精度进行了优化。
  • 内存效率: 较低精度的格式减少了内存使用。

  • 保持准确性: 使用损失缩放 (loss scaling) 技术来保留小的梯度值并避免下溢问题。

FP8 训练

FP8 数据格式 E5M2 和 E4M3 的图示。
FP8 数据格式 E5M2 和 E4M3 的图示。
  • 8 位浮点是一种低精度数据格式,特别适用于像大语言模型 (LLM) 这样的大规模模型。
  • 提升性能: FP8 减少了计算开销,从而加快了前向和后向传播过程。

    • 它显著提高了 Hopper GPU 的吞吐量。
  • 减少内存使用: 与 FP16/BF16 相比,内存需求减半。

  • 成本效益: 减少了大规模训练所需的 GPU 数量。
  • 相当的准确性: 在各种任务中,FP8 实现的准确性在 BF16 基线的 1% 以内。

  • 两种类型的 FP8:

    • E5M2

      • 编码 infs, Nans, 和 zeros。
      • 动态范围为 32 个 2 的幂次方。
      • 在两个 2 的幂次方之间有 4 个样本的精度。
    • E4M3

      • 编码 Nans 和 zeros (无 infs)。
      • 动态范围为 18 个 2 的幂次方。
      • 在两个 2 的幂次方之间有 8 个样本的精度。

结论

总结

  • Grace Hopper 用于大语言模型训练。
  • 为 PEFT 作业设置环境、代码和数据集。
  • NSIGHT Systems 性能分析与解读。
  • 优化技术概览。

感谢

  • ksevegnani@nvidia.com
  • gfiameni@nvidia.com

参考文献