Profiling Large Language Model Trainings on the Grace Hopper Superchip using Nsight Systems
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
目录
- 作者简介
- 引言
- 用于 LLM 训练的 Grace Hopper 超级芯片
- NeMo 框架与 Nsight Systems
- 使用 Nsight Systems 对 LLM 进行性能分析
- 优化的最佳实践
- 结论
- 参考文献
作者简介
关于作者 (Giuseppe Fiameni)
- NVIDIA 高级解决方案架构师
- 通过合作支持高等教育和研究
- NVIDIA AI 技术中心 (NVAITC) EMEA 地区负责人
- 摩德纳和雷焦艾米利亚大学“可扩展人工智能”硕士课程讲师
关于作者 (Karin Sevegnani)
- NVIDIA 高级解决方案架构师
- 通过合作支持高等教育和研究
- NVAITC UK 负责人
- 爱丁堡大学和赫瑞瓦特大学爱丁堡机器人中心对话式人工智能博士
- 在自然语言处理领域拥有专业知识
引言
现代应用集成了顺序计算和并行计算
CPU 和 GPU 对于加速计算都至关重要。现代应用程序的工作流通常在串行处理和并行处理之间交替进行。CPU 擅长串行处理,而 GPU 擅长并行处理。为了进一步加速计算并使其适用于各种工作负载,需要解决 CPU 瓶颈问题。
传统加速系统的挑战
传统的加速系统通过 PCIe 总线连接 CPU 和 GPU,存在以下挑战:
* PCIe 瓶颈:限制了 CPU-GPU 之间的通信。
* 内存访问:GPU 无法直接访问 CPU 内存。
* 编程复杂性:编程模型较为复杂。
* 能效比低:CPU 每瓦性能较低。
为了解决这些问题,需要一种新的芯片架构,旨在:
* 加速 CPU-GPU 数据传输。
* 实现 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 核心
全局访问所有数据
通过 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 中的缓存行。
为高达 175B 参数的模型提供最佳性能
下图比较了 GH200 NVL2 与 H200 NVL4 在不同大语言模型上的性能表现(以每秒输出 Token 数衡量)。
* LLAMA 70B: 性能提升 1.5 倍
* GPT3 175B: 性能提升 1.4 倍
* NVLLM 340B: 性能提升 1.1 倍
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 网关进行访问。
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 进行监督微调
- 任务: 在单个 GPU 上使用 LoRA 对一个 7B 参数模型进行监督微调 (SFT)。
- 参考手册: https://docs.nvidia.com/nemo-framework/user-guide/24.07/playbooks/llama2sft.html#step-2-data-preprocessing
- 为什么使用 LoRA?
- 我们希望在性能分析期间监控什么?
- 使用
nsys命令进行分析:
- 使用
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 进行分析。
放大时间线后,我们可以观察到以下几点:
* 99.5% 内核 vs 0.5% 内存: 训练工作流是计算密集型 (compute-bound) 而非内存密集型 (memory-bound)。
* 计算密集型: 当一个进程的性能主要受限于处理器(CPU或GPU)的速度时,该进程被认为是计算密集型。
* 内存密集型: 当一个进程的性能主要受限于内存访问(读取和写入数据)的速度而非计算时,该进程被认为是内存密集型。
进一步分析 CPU 和 GPU 的活动细节:
-
左侧解读:
- 绿色条: GPU 活动
- 灰色空间: GPU 空闲
- 下方彩色块: CPU 线程
- 橙色条: CUDA 内存传输
-
右侧解读:
- GPU 利用率高,但存在空闲时段:这可能是由于 CPU 上的数据处理延迟、计算与通信重叠不足,或内核与进程之间的同步问题。
- 稀疏的橙色条:内存传输并未主导执行时间(这对于深度学习工作负载是理想情况,因为大部分数据应驻留在 GPU 上)。
查看 OS 运行时库和 CUDA API 活动,可以发现 PyTorch Autograd 引擎的行为:
- PyTorch 中的 Autograd 引擎: 这是负责自动微分的核心组件,在反向传播期间为张量计算梯度。
- 解读:
- 绿色: 活动的计算或执行。
- 棕色虚线: 线程抢占、上下文切换、等待资源。
pthread_cond_wait: 应用程序线程被阻塞,等待条件变量发出信号。这可能表示 CPU 在等待 GPU 完成任务。
优化一:设置 num_workers=4 (之前为0)
- GPU 内核的利用率更加一致,空闲间隙更少。
- 内存部分显示出规律的活动模式,表明数据到 GPU 的流水线处理得到了改善。
-
主线程:
- 更连贯的绿色活动区域。
- 在阻塞状态上花费的时间更少。
- 计算和数据移动之间的交错更好。
-
后续步骤:
- 尝试不同的
num_workers值以找到最佳设置。 - 增加批处理大小以充分饱和 GPU。
- 尝试不同的
优化二:分析卸载 (Offloading) 的影响
-
增加的 CPU 活动:
pt_autograd_0和pt_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。
优化的最佳实践
混合精度训练 (Mixed Precision Training)
- 在模型训练期间结合使用较低精度和较高精度的浮点格式。
-
提高训练速度: 较低精度的格式需要更少的计算资源。
- NVIDIA GPU 上的 Tensor Core (H100 具有第四代 T.C.) 针对混合精度进行了优化。
-
内存效率: 较低精度的格式减少了内存使用。
- 保持准确性: 使用损失缩放 (loss scaling) 技术来保留小的梯度值并避免下溢问题。
FP8 训练
- 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
参考文献
-
Grace-Hopper 超级芯片:
-
NeMo 框架 (FW):
-
Nsight Systems:
-
持续预训练:
-
使用 FP8:
-
自动混合精度:
-
NVIDIA AI 技术中心: