元鉴
返回中文阅读流

NVIDIA Developer Blog

NVIDIA NVbandwidth:测量 GPU 互连和内存性能的重要工具

在编写 CUDA 应用程序时,要写出优秀代码,您需要关注的重点之一是数据传输性能。这适用于...

中文内容

已翻译official company source英文原文2026-05-26

在编写 CUDA 应用程序时,要写出出色的代码,最需要关注的事项之一就是数据传输性能。这一点同样适用于单 GPU 和多 GPU 系统。你可以用来了解 GPU 系统内存特性的工具之一是 NVIDIA NVbandwidth。

在这篇博客文章中,我们将探讨 NVbandwidth 是什么、它如何工作、它的主要功能,以及如何使用它来测试和评估你自己的 NVIDIA GPU 系统。本文面向需要测量和验证 GPU 互连性能的 CUDA 开发者、系统架构师和 ML 基础设施工程师。

什么是 NVbandwidth?

NVbandwidth 是一款基于 CUDA 的工具,可使用复制引擎(CE)或内核复制方法,测量不同链路上各种内存复制模式的带宽和延迟。它会报告系统上当前测得的带宽,为了解你的 GPU 配置的性能特性提供有价值的洞察。尽管现代 GPU 拥有令人印象深刻的计算能力,但其性能经常受限于数据在不同设备之间移动的速度:

  • CPU 内存到 GPU 内存
  • GPU 内存到 CPU 内存
  • GPU 内存到 GPU 内存

了解这些性能特征有助于开发者:

  • 评估系统性能
  • 测量内存访问延迟
  • 测量单节点和多节点 GPU 部署中的带宽
  • 了解不同内存传输模式对性能的影响
  • 诊断 CUDA 应用程序中的带宽瓶颈
  • 针对特定工作负载优化内存传输模式
  • 比较系统中多个 GPU 的带宽和延迟
  • 性能监控和验证

动机

内存带宽是现代 GPU 应用(如 LLM)中的关键性能因素。随着模型规模和复杂性的增长,高效的数据移动对于在以下领域实现最佳性能变得越来越重要:

  • 模型加载和初始化:快速模型加载对于缩短启动时间至关重要
  • 推理性能:影响实时响应能力
  • 训练效率:带宽限制可能会影响不同训练阶段的性能:梯度更新、参数同步

NVbandwidth 的主要特性

全面的带宽测试

NVbandwidth 支持多种带宽测试,包括:

  1. 单向测试:主机 -> 设备(H2D)设备 -> 主机(D2H)设备 ↔ 设备(D2D)
  2. 双向测试:主机 ↔ 设备 设备 ↔ 设备
  3. 多 GPU 测试:全部到一个(A2O)一个到全部(O2A)全部到主机(A2H)主机到全部(H2A)
  4. 多节点测试(在构建时启用 MPI 支持的情况下):用于测量集群中跨节点边界带宽的测试

延迟测试

  1. 主机 ↔ 设备延迟
  2. 设备 ↔ 设备延迟

多种复制方法

该工具实现了两种主要的内存传输方法:

  1. 复制引擎(CE):使用 CUDA 内置的异步内存复制函数
  2. 流式多处理器(SM):使用自定义 CUDA 内核通过 SM 执行复制

这种双重方法有助于更全面地了解系统的带宽能力。

拓扑无关设计

NVbandwidth 旨在在单节点或多节点系统内的不同 GPU 互连拓扑中高效运行,无论使用 NVLINK、NVLink C2C 还是 PCIe。它无需用户明确了解系统拓扑即可工作,因此在实践中其使用很大程度上不依赖于拓扑。

灵活的输出选项

结果可以显示为:

  • 纯文本格式(默认)
  • JSON 格式(使用 -j 选项)

系统要求

要使用 nvbandwidth,您需要:

  • 支持 CUDA 的 NVIDIA GPU
  • CUDA toolkit(单节点版本需 11.X 或以上版本,多节点版本需 12.3 版本)
  • 与 CUDA toolkit 版本兼容的 NVIDIA 显示驱动程序
  • 兼容 C++17 的编译器(Linux 需 GCC 7.x 或以上版本)
  • CMake(版本 3.20 或以上,推荐 3.24+)
  • Boost program options 库
  • 仅多节点版本:CUDA 12.3 工具包和 550 或以上版本驱动程序,MPI 安装

如需更详细的构建说明,感兴趣的用户可以参考 README 说明。

使用 NVbandwidth

基本用法

要全面测量系统的互连带宽,只需运行:

./nvbandwidth

假设你想使用复制引擎方法测量设备到设备的带宽,缓冲区大小为 1GiB,迭代 10 次,并以 JSON 格式输出结果:

./nvbandwidth -t device_to_device_memcpy_read_ce -b 1024 -i 10 -j

示例输出

以下是运行主机到设备复制测试时输出结果的示例:

Running host_to_device_memcpy_ce.
memcpy CE CPU(row) -> GPU(column) bandwidth (GB/s)
           0         1
 0     55.63     55.64
SUM host_to_device_memcpy_ce 111.27
COEFFICIENT_OF_VARIATION host_to_device_memcpy_ce 0.00
NOTE: The reported results may not reflect the full capabilities of the platform.
Performance can vary with software drivers, hardware clocks, and system topology.

底层机制:NVbandwidth 的工作原理

架构

NVbandwidth 采用模块化设计,将测试定义、内存操作和结果报告分离为不同的子系统:

  1. CLI 接口:处理用户输入并编排测试执行
  2. 测试用例框架:为定义不同的带宽测试提供标准接口
  3. 内存复制框架:执行内存操作的核心组件 CUDA 内核:用于执行内存操作的专用 CUDA 内核
  4. 输出系统:格式化并呈现测试结果 NVbandwidth.cpp:178-246

测量详情

该工具采用以下方法来准确测量性能:

  1. 首先,它将一个自旋 kernel 入队,该 kernel 会在主机内存中的一个标志上自旋
  2. 自旋内核会在设备上自旋,直到用于测量的所有事件都已完全入队。
  3. 接着,它会将一个开始事件、一定次数的 memcpy 迭代以及最后一个停止事件入队。

最后,它释放该标志以开始测量。

这一过程确保将操作入队的开销排除在互连上的实际传输测量之外。

双向带宽测试

对于双向测试,NVbandwidth 会在数据同时沿两个方向传输时测量带宽。见下方图 1:

Figure shows CPU and GPU connected by H2D and D2H data directionsFigure shows CPU and GPU connected by H2D and D2H data directions
图 1:CPU 和 GPU 通过 H2D 和 D2H 数据方向连接

CE 复制

流 A(测量流)向设备执行写入,而相反方向的流 B 产生读取。

SM 复制

该测试启动一个内核复制,其中交替的线程 warp 以交替方向复制数据。

多节点操作

以多节点模式运行 NVbandwidth 需要额外的设置和配置。

  1. 启动 NVIDIA 节点间内存交换服务(IMEX):
sudo systemctl start nvidia-imex.service

在 /etc/nvidia-imex/nodes_config.cf g 中配置节点地址

2. 使用 MPI 运行:

mpirun --allow-run-as-root --map-by ppr:4:node --bind-to core -np 8 --report-bindings \  
  -q -mca btl_tcp_if_include enP5p9s0 --hostfile /etc/nvidia-imex/nodes_config.cfg ./nvbandwidth -p multinode

NVIDIA 多节点 NVLink(MNNVL)系统要求构成 NVLink 域的所有节点都拥有一个已完全配置且可运行的 IMEX 域。NVbandwidth 使用 MPI 来协调跨节点的测量。见下方图 2:

Figure shows an example multi-node system with 2 NVSwitches, each of which is fully-connected to all the GPUs.Figure shows an example multi-node system with 2 NVSwitches, each of which is fully-connected to all the GPUs.
图 2:使用 NVLink 连接的多节点、多 GPU 系统示例。

示例输出

以下是一个在多节点系统上测量节点之间点对点性能时输出内容的示例。

Running multinode_device_to_device_memcpy_read_ce.
memcpy CE GPU(row) -> GPU(column) bandwidth (GB/s)
           0         1         2         3         4         5         6         7
 0       N/A    397.39    397.44    397.59    397.50    397.52    397.66    397.55
 1    397.65       N/A    397.35    397.46    397.48    397.53    397.53    397.59
 2    397.65    397.35       N/A    397.57    397.39    397.55    397.53    397.50
 3    397.57    397.37    397.35       N/A    397.50    397.50    397.52    397.53
 4    397.68    397.30    397.44    397.55       N/A    397.53    397.52    397.52
 5    397.66    397.26    397.48    397.46    397.52       N/A    397.50    397.59
 6    397.68    397.39    397.48    397.59    397.52    397.44       N/A    397.61
 7    397.68    397.41    397.42    397.48    397.52    397.50    397.53       N/A

NVbandwidth 使用场景

性能优化

通过了解系统的带宽特性,您可以优化 CUDA 应用程序,以更好地利用可用带宽。例如,您可能会发现,对于您的特定硬件配置,某些传输模式比其他模式更高效。

系统评估和测试

NVbandwidth 提供了一种标准化的方法,用于测量和比较不同系统之间的带宽性能,因此对测试和系统评估很有价值。

故障排除

如果你的 CUDA 应用程序遇到性能问题,NVbandwidth 可以帮助确定带宽限制是否是影响因素之一。NVbandwidth 会报告特定系统配置下当前测得的带宽。性能结果可能会因多种因素而显著不同,例如 GPU 型号、互连代际、当前时钟频率以及系统配置的其他方面。

硬件验证:安装新的 GPU、升级驱动程序或进行系统更改后,NVbandwidth 可以验证内存带宽性能是否达到性能预期。这有助于识别可能影响应用程序性能的硬件问题、驱动程序问题或配置错误。

性能回归测试:在部署新软件版本或系统更新时,NVbandwidth 可提供用于检测性能回归的基线。通过比较变更前后的带宽测量结果,你可以快速识别更新是否对系统性能产生了负面影响。

进一步了解

NVbandwidth 是衡量和理解 NVIDIA GPU 系统带宽特性的不可或缺的工具。它通过提供全面的测试套件、灵活的配置选项以及对单节点和多节点部署的支持,为优化 CUDA 应用、评估系统性能和排查问题提供了有价值的洞察。

借助 NVbandwidth,你可以做出明智决策,以最大限度提升 CUDA 应用的性能,并确保 GPU 配置中的数据传输能力达到最佳。随着 GPU 集群在规模和复杂性上不断演进,NVbandwidth 也在持续进步,应对带宽测量与分析中的新挑战,包括测试性能可扩展性。备注

如需更深入的信息,请浏览以下更多资源。

  • 概述(NVIDIA/nvbandwidth)
  • 架构(NVIDIA/nvbandwidth)
  • 构建与运行(NVIDIA/nvbandwidth)

要开始优化您的 GPU 系统性能,请立即下载并试用 NVbandwidth!

Like

标签

原文标题

NVIDIA NVbandwidth: Your Essential Tool for Measuring GPU Interconnect and Memory Performance