Optimizing at Scale: Investigating Hidden Bottlenecks in Multi-Node Workloads

Daniel Horowitz, Sr Director of Engineering, NVIDIA Developer Tools | GTC March 2023

议程 (Agenda)

  • 监控与性能分析工具谱系
  • Nsight Systems 多节点支持
    • 单节点代理 (Single-node proxy)
    • 少量节点抽查 (Few-node spot-check)
    • 多节点综合分析 (Multi-node comprehensive)
    • 多节点数据分析框架 (v2032.2 预览版)
    • 手动调查 (回溯到节点内部)
    • 高级主题

目录 (Table of Contents)

  • 优化工作流程 (Optimization Workflow)
  • 监控 → 性能分析 (Monitoring → Profiling)
  • 数据中心 GPU 监控器 (DCGM)
  • Nsight 性能分析器家族:性能分析工作流程 (Nsight Profiler Family: Performance Analysis Workflow)
  • 协调任务的“管弦乐队” (Tuning an Orchestra of Tasks)
  • 扩展到数千个 GPU (Scaled to 1000s of GPUs)
  • 介绍与单节点代理 (Introduction & Single-Node Proxy)

    • 深度学习训练 (Deep Learning Training)

      • 放大视图 - 图形模式 (Zoomed Out - Graph Mode)
      • 缩小视图 - 范围转换 (Zoomed In - Range Transition)
    • 核心策略 (Core Strategy)

    • 为什么选择单节点代理? (Why Single-Node Proxy?)
    • 关键特性 (Key Features)
    • Nsight Systems 时间线详细解析 (Nsight Systems Timeline Detail)
      • 线程状态与操作系统运行时跟踪 (OSRT)
      • 示例:Map/Unmap 抖动
      • 线程调用栈采样 - 函数表统计
      • Python 调用栈采样
      • 面向CPU与GPU的开发者注解API
      • NVIDIA 工具扩展 (NVTX)
      • CPU PMU 采样
      • GPU 指标采样 (计算与图形)
      • GPU API 启动与硬件工作负载关联
      • GPU 性能空闲检测 (GPU Bubble Detective)
      • 基于像素时间覆盖率的细节级别 (LOD)
      • 单节点统计与分析器
      • 统计/导出 - NVTX 开发者代码注解
      • 统计/导出 - CUDA 内核摘要
      • 分析器与专家系统
  • 更多资源

  • 少量节点抽查

    • MPI & UCX 追踪与异步完成范围
    • NVSHMEM & NCCL
    • NVIDIA NIC 指标采样 (Infiniband & RoCE)
    • NVIDIA Quantum 交换机采样
  • 多节点综合分析

    • 多节点
    • 多报告分析目标
    • Nsys 多报告分析工作流
      • 报告生成
      • 分析调度
      • 设置
      • 分析启动与输出
      • 整体工作流 (输入、处理、输出与视图)
  • 可在 Nsight Systems 或 Jupyter Lab 中加载的笔记本

  • 全范围全等级统计

    • All-Ranges All-Ranks Statistics (EX: Linpack CUDA Kernels)
    • Per-Rank Tables via Drop-Down
    • All-Ranks All-Ranges Boxplots & 50% Distribution Graph (EX: Linpack CUDA Kernels)
    • All-Ranks All Ranges Boxplots (EX: QUDA NVTX GPU Projection)
    • CUDA API Summary
    • Compare(Diff) Statistics
  • 单范围全等级统计

    • Per-Rank Single-Range Boxplots & 50% Distribution Graph (EX: QUDA & NVTX GPU-Projection via CUDA)
    • Per-Rank Single-Range Boxplots & 50% Distribution Grap (EX: SoftMax - Image Classification with MxNet 512 ranks on 64 nodes with 8 GPU)
    • Per-Rank Single-Range Boxplots & 50% Distribution Grap (EX: NCCL All Reduce - Image Classification with MxNet 512 ranks on 64 nodes with 8 GPU)
    • CUDA API Summary cudaMalloc Per-Rank
  • 性能分析热图

    • CUDA内核时间覆盖热图
    • SM Active、SM Issue、TensorActive 热图
  • 迭代分析

    • 数据中心中的接力赛
    • 执行不一致会导致效率损失
    • 屏障起始时间分析
    • 每次迭代之间的时间差
    • 每次迭代之间与中位数的差异(LINPACK示例)
    • 每次迭代之间与中位数的差异(MXNet图像分类示例)
    • 屏障之间累积的时间(不含屏障等待)
    • 屏障时间累积
    • 屏障时间
    • 16个Rank的深度学习训练示例:配置不佳的节点导致半数Rank变慢
  • 多报告分析用例

  • 多报告可视化
  • 调查:错误、干扰、不平衡、不一致
  • 调查:数据不平衡
  • 调查:网络不平衡和拥堵
  • WebRTC 流媒体容器
  • 总结
  • 感谢!

优化工作流程 (Optimization Workflow)

优化是一个迭代过程,直到达到所需的性能。

优化工作流程图
优化工作流程图
  • 观察 (Observe)
  • 分析 (Analyze)
  • 优化 (Optimize)

监控 → 性能分析 (Monitoring → Profiling)

监控和性能分析有不同的目标用户、意图、细节和设计权衡。它们有重叠但不可互换。

  • 监控器 (Monitors)

    • 目标: 粗略观察质量、利用率、进度,帮助评估作业。
    • 用户: 管理员和使用 top、netstat、taskman 等工具的用户。
    • 用途: 将问题追溯到作业。
    • 特点: 低速率(分钟或秒)。对观察检查和响应敏感,开销低。对根本原因的细节较少。
    • 正常运行时间: 通常 100%。
    • 示例: Data Center GPU Monitor (DCGM)。
  • 性能分析器 (Profilers)

    • 目标: 辅助应用程序优化。
    • 用户: 工程师,旨在将问题关联到代码区域。
    • 特点: 种类繁多,侧重于可观察性,开销各异。可能会序列化或重放工作。
    • 正常运行时间: 通常不是 100%。
    • 示例: Nsight Systems, Nsight Compute, Nsight Graphics。
监控与性能分析工具谱系
监控与性能分析工具谱系

数据中心 GPU 监控器 (DCGM)

  • 特点: 不显眼。非常适合评估集群健康状况、作业健康状况和作业评级。
  • 优化: 针对低频率统计数据(10Hz 或更低)进行优化。
  • 映射: 可映射到作业和进程,但不像性能分析器那样处理代码和算法。
  • 暂停/恢复性能分析:

    • 在 NVIDIA Hopper 架构之前需要。
    • CLI 命令:

      • dcgmi profile --pause
      • dcgmi profile --resume
    • API 函数:

      • dcgmProfPause
      • dcgmProfResume
DCGM 监控界面与命令行输出
DCGM 监控界面与命令行输出

Nsight 性能分析器家族:性能分析工作流程 (Nsight Profiler Family: Performance Analysis Workflow)

Nsight 性能分析器家族工作流程图
Nsight 性能分析器家族工作流程图
  • 起点: 综合工作负载性能。
  • Nsight Systems: 分析系统范围内的算法,包括 CPU、GPU、CUDA、网络和图形。提供全面的工作负载级性能。

    • 重新检查整体性能。
    • 可进一步深入到 Nsight Compute 或 Nsight Graphics。
  • Nsight Compute: 调试和分析 CUDA 内核。通过指标/计数器收集深入分析顶层 CUDA 内核。提供详细的 CUDA 内核性能。

  • Nsight Graphics: 调试和分析图形着色器和帧。深入分析图形帧。提供详细的帧/渲染性能。

协调任务的“管弦乐队” (Tuning an Orchestra of Tasks)

Nsight Systems 将系统中的各种组件视为一个需要协调的“管弦乐队”。

各种硬件组件与指挥家图
各种硬件组件与指挥家图

扩展到数千个 GPU (Scaled to 1000s of GPUs)

系统可扩展到数千个 GPU,并包含复杂的互连和硬件组件。

大型系统架构图
大型系统架构图
  • NVIDIA Quantum-2 Infiniband NDR400 提供 100 GB/s 的带宽。
  • 每个节点包含 BLUEFIELD-3 DPUGRACE CPU 和多个 HOPPER GPU(例如,4 个或 8 个),并支持硬件一致性。

介绍与单节点代理 (Introduction & Single-Node Proxy)

深度学习训练 (Deep Learning Training)

放大视图 - 图形模式 (Zoomed Out - Graph Mode)

深度学习训练的Nsight系统时间线视图 (放大)
深度学习训练的Nsight系统时间线视图 (放大)

此图展示了深度学习训练的宏观时间线视图,包括 CPU、GPU 性能指标、DRAM 和 NVLink 带宽、CUDA 硬件活动以及 CUDA API 调用等信息。

缩小视图 - 范围转换 (Zoomed In - Range Transition)

深度学习训练的Nsight系统时间线视图 (缩小)
深度学习训练的Nsight系统时间线视图 (缩小)

此图是时间线视图的局部放大,聚焦于范围转换,展示了更详细的 CPU 进程、线程、OS 运行时库、TensorFlow 活动以及 CUDA API 调用的时序。

核心策略 (Core Strategy)

  • 什么是“热点”? (What's HOT?)

    • 收缩我编写的代码会更容易吗?
    • 这是大多数人关注的地方,但并非总是最佳的投资回报率。
  • 什么是“冷点”? (What's COLD?)

    • 利用未使用的资源会更容易吗?
    • 免费的优化机会?是的,请!
  • 预算? (Budgets?)

  • 热点可能是: (Hot spots might be:)

    • 可并行化?
    • 在不损害准确性、内存等的情况下可收缩?
  • 冷点是明确、可衡量的机会!!! (Cold spots are clear, measurable opportunities!!!)

    • 如何移除或填补它们?
    • 我在哪里存在不正确/不必要/意外的依赖和同步?(例如:线程、进程或跨节点之间的 MPI_Barrier!)。

为什么选择单节点代理? (Why Single-Node Proxy?)

  • 多节点运行前的预检 (Pre-flight check for multi-node)

    • 它能正常工作,对吗?
    • 在扩展到多节点之前,确保其“表现良好”(相对而言)。
  • 为什么? (Why?)

    • 在你的多节点运行中也会出现这些问题。
    • 调度问题不会比多节点更多或更少。
    • 在情况不复杂时,更容易/更快地进行优化。
  • 如何操作? (How?)

    • 使用单个 rank。
    • 该 rank 的参数应与目标“完整运行”相似(例如:batch size 为 256 张图片)。

关键特性 (Key Features)

  • 统一时间线 (Unified timeline)

    • 多 GPU、CPU、DPU、NIC 和交换机。
    • 操作系统和软件。
  • 采样 (Sampling)

    • 硬件和软件。
  • 追踪 (Trace)

    • API (CUDA, cuBLAS, cuDNN, cuDF, cuML, TensorRT, DALI, OptiX, Vulkan, GL, ...)。
    • 硬件工作负载。
    • 通过 NVTX 在代码中进行开发者代码注解。
  • 统计 (CLI 或 GUI) (Statistics (CLI 或 GUI))

    • CUDA 内核。
    • NVTX 范围。
  • 新的可扩展框架。

  • 让我们看几个示例图片...
Nsight系统关键特性时间线视图
Nsight系统关键特性时间线视图

Nsight Systems 时间线详细解析 (Nsight Systems Timeline Detail)

Nsight Systems 提供了一个详细的统一时间线视图,用于分析多核、多 GPU、多节点系统中的性能瓶颈。

Nsight系统时间线视图详细标注
Nsight系统时间线视图详细标注

该视图包含了以下关键区域:

  • CPU 内核 (CPU cores): 显示 CPU 175, CPU 55, CPU 122, CPU 253, CPU 115 的活动。
  • GPU 指标样本 (GPU metrics samples): 包括 GPU 0000:01:00.0 - A100-SXM4 的 GPC 时钟频率、SM 活动、SM 指令、SM Issue、TensorCore 活动、SM Warp Occupancy 等。
  • GPU 带宽 (GPU bandwidths): 显示 DRAM 带宽、NVLink 带宽、PCIe 带宽。
  • GPU CUDA 内核和内存活动 (GPU CUDA kernel & memory activities): 展示 CUDA HW (0000:01:00.0 - A100-SXM4) 的活动。
  • CPU 进程和线程状态 (CPU processes & thread states): 包括 Python 进程、线程状态(如 99.5% Stream 13, 99.6% Kernels, 9.2% Memory, NVTX tensorflow-core, 11 rlpymn hidden, Threads (112), python 等)。
  • CUDA API 追踪 (CUDA API trace): 显示各种 CUDA API 调用。
  • CPU 调用栈样本 (CPU call-stack samples): 在采样点显示 CPU 的函数调用栈。

线程状态与操作系统运行时跟踪 (OSRT)

OSRT 提供了一个详细的性能分析视图,展示了线程活动、CPU 核使用、线程状态以及操作系统的长时间阻塞回溯。

  • 可视化元素:
    • 线程ID与名称 (Thread ID & name)
    • 操作系统运行时API (OS runtime APIs)
    • 线程活动 (Thread activity)
    • 线程CPU核心 (Thread CPU core)
    • 线程状态 (Thread state)
    • 操作系统运行时长时间阻塞回溯 (OS runtime long blocking backtrace)
线程状态与OSRT跟踪视图
线程状态与OSRT跟踪视图

示例:Map/Unmap 抖动

本示例展示了在使用Map/Unmap操作时可能出现的性能抖动,通过详细的跟踪视图呈现。

Map/Unmap 抖动示例跟踪视图
Map/Unmap 抖动示例跟踪视图

线程调用栈采样 - 函数表统计

此视图提供了基于调用栈采样的函数统计信息,显示了各个函数的自我执行时间百分比及其所属模块。

函数表统计
函数表统计

Python 调用栈采样

此功能允许对Python应用程序进行调用栈采样,以识别性能瓶颈。它在时间轴上展示了Python线程的活动,并提供了详细的事件视图,包括事件的起始时间、线程ID、类别和详细描述。

Python 调用栈采样跟踪视图及事件
Python 调用栈采样跟踪视图及事件

面向CPU与GPU的开发者注解API

NVIDIA工具扩展 (NVTX) 提供了用于CPU和GPU性能标记的API,包括OpenGL、Vulkan和Direct3D性能标记。

  • NVIDIA工具扩展 (NVTX):

    • GitHub链接: https://github.com/NVIDIA/NVTX
  • 示例: 在CPU上使用NVTX可视化Visual Molecular Dynamics (VMD) 算法的执行。

使用NVTX可视化VMD算法
使用NVTX可视化VMD算法

NVIDIA 工具扩展 (NVTX)

NVTX支持C、C++和Python,允许开发者使用注解(标记、范围、嵌套范围等)来装饰应用程序源代码,从而帮助可视化执行、调试、跟踪和性能分析。

  • API引用: https://nvidia.github.io/NVTX/doxygen/index.htmlhttps://nvidia.github.io/NVTX/doxygen-cpp/index.html
  • 基本用法示例:
    • 标记 (Marker):
nvtxMark("This is a marker");
* **推入-弹出范围 (Push-Pop range)**:
nvtxRangePush("This is a push/pop range");
// Do something interesting in the range
nvtxRangePop();
* **开始-结束范围 (Start-End range)**:
// Somewhere in the code:
nvtxRangeHandle_t handle = nvtxRangeStart("This is a start/end range");
// Somewhere else in the code, not necessarily same thread as Start call:
nvtxRangeEnd(handle);
  • 高级概念: 支持颜色、域、类别等。
NVTX代码示例及跟踪视图
NVTX代码示例及跟踪视图

CPU PMU 采样

CPU性能监控单元 (PMU) 采样功能支持Grace、ARM、x86-64架构,以及CPU核心、CPU/SOC uncore和内核跟踪点,提供系统范围的性能数据。

  • 采样范围: Grace, ARM, x86-64;CPU核心;CPU/SOC uncore;内核跟踪点;系统范围。
  • 系统架构: 显示了Grace CPU与Hopper GPU之间的互联,包括高速I/O、NVLink-C2C和NVLink网络。
    CPU PMU采样架构图
  • 跟踪视图: 示例展示了CPU周期和指令的采样数据,以及Uncore的计数器(如uncore_imc_0icas_count_readuncore_imc_0icas_count_write)。

GPU 指标采样 (计算与图形)

以多节点深度学习训练为例,展示了GPU各项指标的采样数据。

  • 采样的GPU指标:
    • SM活跃度 (SM Active)
    • SM问题 (SM Issue)
    • Tensor活跃度 (Tensor Active)
    • DRAM带宽 (DRAM Bandwidth)
    • NVLink Tx带宽 (NVLink Tx Bandwidth)
    • PCIe带宽 (PCIe Bandwidth)
GPU指标采样示例 - 多节点深度学习训练
GPU指标采样示例 - 多节点深度学习训练

GPU API 启动与硬件工作负载关联

此功能用于关联CPU上的GPU API启动事件与GPU上的实际硬件工作负载,帮助理解两者之间的时序关系。

  • 可视化: 上半部分展示了CPU启动事件(如cudaMemcpyAsync)与随后的GPU工作负载(如split_x_kernel)的关联。
  • 详细关联: 下半部分展示了多个CPU启动事件与GPU上复杂工作负载(如implicit_convolve_sgemm_add_1_等)的更细粒度关联。
GPU API 启动与硬件工作负载关联
GPU API 启动与硬件工作负载关联

GPU 性能空闲检测 (GPU Bubble Detective)

GPU性能空闲检测功能旨在帮助用户发现并调查GPU性能中的“空闲”(cold spots)或“热点”(cool spots)。

  • 发现问题:

    • 利用细节级别 (LOD) 指示器识别活动。
  • 追踪关联:

    • 跟踪事件之间的关联以回溯到CPU。
    • 选择周围的GPU CUDA操作。
  • 调查原因:

    • 调查在空闲期间以及之前发生了什么。
    • 利用线程调用栈 (Thread call-stacks)。
    • API和库跟踪 (API & library traces)。
    • 操作系统运行时回溯 (OS Runtime backtraces)。
    • 用户编码注解 (例如:NVTX)。

基于像素时间覆盖率的细节级别 (LOD)

基于像素时间覆盖率的细节级别 (LOD) 功能允许用户通过放大视图来揭示性能谷底或空白。

  • 原理: 放大时,原来聚合的低活动区域会展开,显示出其中隐藏的性能间隙。
基于像素时间覆盖率的细节级别
基于像素时间覆盖率的细节级别

单节点统计与分析器

此部分关注单节点性能的统计数据和分析工具。

统计/导出 - NVTX 开发者代码注解

该表格提供了NVTX开发者注解的统计数据,包括时间、调用次数、平均值、最小值、最大值和范围,以及相应的TensorRT执行上下文和操作名称。

NVTX开发者代码注解统计表格
NVTX开发者代码注解统计表格

统计/导出 - CUDA 内核摘要

此表格总结了CUDA内核的性能数据,包括时间、调用次数、平均值、最小值、最大值和名称,揭示了不同内核的性能特征。

CUDA内核摘要统计表格
CUDA内核摘要统计表格

分析器与专家系统

此工具提供了一个专家系统视图,能够根据性能分析结果给出具体的建议。例如,对于使用页面可映射内存的CUDA异步内存拷贝,如果存在导致GPU利用率降低的阻塞操作,系统会建议使用固定(pinned)内存。

  • 示例: 对于CUDA Async Memcpy with Pageable Memory,建议使用固定的(PINNED)内存,并提供了命令行指令。
分析器与专家系统视图
分析器与专家系统视图

更多资源

以下是可能有助于深入了解 Nsight Systems 性能分析的额外资源,以避免本次演讲篇幅过长:

少量节点抽查

在这一点上,可能尚未用到任何通信 API。
可以将规模扩展到 2-4 个节点,或者至少在 1 个节点上使用 IPC。
可能会注意到更多意外的阻塞。

MPI & UCX 追踪与异步完成范围

MPI & UCX 追踪时间线
MPI & UCX 追踪时间线

上图展示了一个 MPI 和 UCX 操作的详细时间线追踪。右侧的描述框提供了 MPI_Bcast 事件的详细信息:

  • 描述: MPI_Bcast
  • 开始: 0.164935
  • 结束: 0.1650455 (+109,210 µs)
  • 线程: 1342434
  • 发送字节: 0
  • 接收字节: 4
  • 根: 0
  • MPI_COMM_WORLD

NVSHMEM & NCCL

NVSHMEM & NCCL 追踪时间线
NVSHMEM & NCCL 追踪时间线

上图展示了 NVSHMEM 和 NCCL 操作的时间线追踪。其中一个突出显示的事件是 nccKernel_AllReduce_RING_LL_Sum_int32_t,其详细信息如下:
- 名称: nccKernel_AllReduce_RING_LL_Sum_int32_t
- 开始: 1.52161s
- 结束: 1.52161s (+41,504 µs)
- Grid: <<1, 1, 1>>
- Block: <<64, 1, 1>>
- 启动类型: 正常 (Regular)
- 共享内存: 41,472 字节 (Bytes)
- 动态共享内存: 0 字节 (Bytes)
- 注册器线程: 96
- 局部内存/线程: 0 字节 (Bytes)
- 局部内存总量: 251,638,240 字节 (Bytes)
- 共享内存执行: 98.304 字节 (Bytes)
- 共享内存大小: 4 B
- 启动于线程: 19621
- 延迟: -10,563 µs
- 相关 ID: 4189
- 流: 流 20

NVIDIA NIC 指标采样 (Infiniband & RoCE)

NVIDIA NIC 指标采样时间线
NVIDIA NIC 指标采样时间线

上图显示了 NVIDIA NIC(网络接口卡)的指标采样时间线,涵盖 Infiniband 和 RoCE 技术。它展示了多个 NIC(NIC-0, NIC-1, NIC-2, NIC-3)的字节接收和发送情况,以及发送等待时间,帮助识别网络通信瓶颈。

NVIDIA Quantum 交换机采样

NVIDIA Quantum 交换机采样
NVIDIA Quantum 交换机采样

上图展示了 NVIDIA Quantum 交换机的采样数据。它显示了 NIC 0 (mlx5_0 - NVIDIA ConnectX-6) 以及两个 IB 交换机(0xc42a1030079a6ec 和 0xb8cef60300fbf210)的接收和发送 IB 字节数据,用于分析网络流量和性能。

多节点综合分析

多节点

  • 在 1 个节点代理运行中表现良好!
  • 在少量节点代理运行中表现良好!

    • 网络 API 和硬件指标采样
  • 现在是完整的多节点模式吗?!

    • 多报告数据分析
    • Jupyter Lab 集成
    • 多报告可视化
多节点架构图
多节点架构图

上图展示了一个多节点 GPU POD 架构,其中包含 GPU PODs、分布式核心交换机、骨干交换机、叶交换机以及连接到存储的 DGX A100 系统(从 #1 到 #140)。

多报告分析目标

  • 减少“上手”时间
  • 分析数千份报告

    • 无需手动测量和搜索
    • 避免“猜测哪个文件”
  • 横向扩展处理

  • 集群范围的结论
  • 食谱库 -> 可定制
  • 结果展示 (Jupyter、图表等)
  • 分享

Nsys 多报告分析工作流

Nsys 多报告分析工作流
Nsys 多报告分析工作流

上图展示了 Nsys 多报告分析的整体工作流,包括报告生成、设置、分析启动、输出以及查看等主要阶段。

报告生成

  • SLURM 示例:
    srun|sbatch <args> nsys profile <nsys_args> app <app_args>
    --output=name_%q{SLURM_NODEID}_%q{SLURM_PROCID}.nsys-rep
  • 确保报告名称是唯一的。
  • 避免从所有 rank 收集系统范围的数据。

    • 如果 [$SLURM_LOCALID == 0]
      • --nic-metrics=true
      • --gpu-metrics-device=all
  • 尽可能避免长时间的收集。

    • 很少需要超过几次迭代,但 1-5 分钟是可以接受的。
    • 更长的报告 = 更多 RAM 和加载时间
    • 好处 -> 检测不一致性 (即卡顿)

分析调度

  • 生成报告 与今天相同。
  • “调度”分析

    • 立即进行
    • 稍后进行

      • 低优先级
      • 更少节点
      • 其他地方
    • 手动进行

  • 存储设备并非严格必要。

设置

  • 食谱库 (Recipe Library): 包含检测器和食谱脚本 (Recipe Script),用于统计分析。

    • 检测器
    • 食谱脚本
    • 统计信息
    • 选择食谱或创建自定义食谱。
  • 食谱参数 (Recipe Params): 接收参数值。

    • 填入参数。
  • Nsys 报告: Nsys 报告可以存储在存储设备 (Storage Appliance) 中。

    • 选择报告目录。

分析启动与输出

jocelyn@login-node1:/home/jocelyn/simulation/
$./nsys recipe <recipe_name> <args>
$./python3 -m recipe <recipe_name> <args>

分析可以在本地、服务器或集群上启动:

  1. 选择食谱或创建自定义食谱。
  2. 填入参数。
  3. 选择报告目录。
  4. Nsys 报告作为输入。
  5. Nsys 食谱运行时 (Nsys Recipe Runtime): 使用 Dask 和 Legate 等工具,在多个工作节点 (Worker Node A) 上并行运行食谱脚本片段 (Recipe Script Fragment) 来分析 Nsys 报告。
  6. Nsys 食谱输出 (Nsys Recipe Output): 生成 Nsys-analysis 报告和元数据,可以是数据库、Jupyter Notebook 或 HTML/Markdown 格式。

整体工作流 (输入、处理、输出与视图)

Nsys 多报告分析工作流提供了一个从数据输入到分析可视化和输出的全面流程。

  • 输入: 分析数据来自目录、Nsys-UI 辅助文件以及视图转换前的原始分析数据。
  • 处理: Nsys 配方输出包括 Nsys-analysis、重现和元数据、数据库、Jupyter 笔记本以及 HTML/Markdown 格式的报告。 Jupyter 笔记本用于视图转换,可以生成表格、图表、图形、交互式工具提示,并且易于调整和共享。
  • 输出: Nsys 配方输出。
  • 视图: 分析可视化可以通过 Nsys GUI 或 JupyterLab 进行,支持在 Nsight Systems 内部或外部查看,并可能带来用户体验优势。
Nsys Multi-Report Analysis Workflow (Page 46)
Nsys Multi-Report Analysis Workflow (Page 46)

可在 Nsight Systems 或 Jupyter Lab 中加载的笔记本

本页面展示了一个 Jupyter 笔记本在 Nsight Systems 或 Jupyter Lab 中加载并运行的示例。笔记本显示了一个堆叠柱状图,可视化了在 GPU 设备上不同组件(如 1st Dim、barrier、2nd Dim 和 sync)的时间(us)分布。这体现了分析报告的可交互性和可视化能力。

Notebook loadable in Nsight Systems or Jupyter Lab (Page 47)
Notebook loadable in Nsight Systems or Jupyter Lab (Page 47)

全范围全等级统计

All-Ranges All-Ranks Statistics (EX: Linpack CUDA Kernels)

此页面展示了针对 Linpack CUDA 内核的全范围全等级统计数据。表格提供了详细的性能指标,包括平均值 (Avg)、近似四分位数 (Q1, Median, Q3)、总和、最小值、中位数、最大值、总计数、最小计数、中位数计数和最大计数,针对各种内核操作(例如 kernel_evalbarrier_on_stream_kernelcreate_pivot_kernel 等)。

All-Ranges All-Ranks Statistics EX: Linpack CUDA Kernels (Page 49)
All-Ranges All-Ranks Statistics EX: Linpack CUDA Kernels (Page 49)

Per-Rank Tables via Drop-Down

此表格展示了通过下拉菜单选择的每等级(Per-Rank)统计数据。示例中高亮显示了 mega_1_2 报告,提供了不同 CUDA API 操作(如 cudaDeviceSynchronizecudaMemcpyAsynccudaFree 等)的调用次数 (Num Calls)、平均值 (Avg)、最小值 (Min)、最大值 (Max) 和标准差 (StdDev) 等指标。

Per-Rank Tables via Drop-Down (Page 50)
Per-Rank Tables via Drop-Down (Page 50)

All-Ranks All-Ranges Boxplots & 50% Distribution Graph (EX: Linpack CUDA Kernels)

此页面通过图表展示了 Linpack CUDA 内核的全等级全范围统计。
- 顶部图表是一个箱线图,显示了不同内核操作(如 create_pivot_kernelget_a_pivot_rows 等)的时间分布。
- 底部图表是一个 50% 分布图,展示了这些内核操作的 Q1、中位数 (Median) 和 Q3 的时间分布。

All-Ranks All-Ranges Boxplots & 50% Distribution Graph EX: Linpack CUDA Kernels (Page 51)
All-Ranks All-Ranges Boxplots & 50% Distribution Graph EX: Linpack CUDA Kernels (Page 51)

All-Ranks All Ranges Boxplots (EX: QUDA NVTX GPU Projection)

此箱线图展示了 QUDA NVTX GPU 投影的全等级全范围统计。图表显示了不同范围名称(如 initQuda-endQudaloadGaugeQudaplaqQudainvertQudaDirac)的 gpu_duration 的时间分布。

All-Ranks All Ranges Boxplots EX: QUDA NVTX GPU Projection (Page 52)
All-Ranks All Ranges Boxplots EX: QUDA NVTX GPU Projection (Page 52)

CUDA API Summary

本页面提供了 CUDA API 的摘要信息,包括一个详细的统计表格和一个可视化图表。
- 表格列出了 cudaDeviceSynchronizecudaMemcpyAsynccudaFree 等 CUDA API 的时间、总时间、调用次数、平均值、四分位数 (Q1, Med, Q3)、最大值、标准差和报告信息。
- 图表以柱状图形式展示了这些 CUDA API 的相对时间分布。

CUDA API Summary (Page 53)
CUDA API Summary (Page 53)

Compare(Diff) Statistics

本页面展示了比较(差异)统计数据,分为“所有等级 (All Ranks)”和“检查特定等级 (Inspect Specific Rank)”两部分。
- 所有等级的表格提供了不同内核操作(如 void xmma_gemm_kernel::xmma_gemm_kernelNCCLKernel AllGather 等)在所有等级上的时间、总时间、实例数、平均值、最小值、中位数和标准差的差异。
- 检查特定等级的表格则针对特定报告(如 hpl-develop-nhpc_22_3_378847_5)显示了其在 Time、Total Time、Instances、Avg、Min、Med、StdDev 和 Name 等方面的详细统计信息。

Compare(Diff) Statistics (Page 54)
Compare(Diff) Statistics (Page 54)

单范围全等级统计

Per-Rank Single-Range Boxplots & 50% Distribution Graph (EX: QUDA & NVTX GPU-Projection via CUDA)

此页面展示了 QUDA 和 NVTX GPU-Projection 经由 CUDA 的每等级单范围统计。
- 顶部图表是一个箱线图,显示了 Dirac 范围在不同等级 (Ranks) 上的时间分布。
- 底部图表是一个 50% 分布图,展示了 Dirac 范围在不同等级上的 Q1、中位数 (Median) 和 Q3 的时间分布。

Per-Rank Single-Range Boxplots & 50% Distribution Graph EX: QUDA & NVTX GPU-Projection via CUDA (Page 56)
Per-Rank Single-Range Boxplots & 50% Distribution Graph EX: QUDA & NVTX GPU-Projection via CUDA (Page 56)

Per-Rank Single-Range Boxplots & 50% Distribution Grap (EX: SoftMax - Image Classification with MxNet 512 ranks on 64 nodes with 8 GPU)

此页面展示了 SoftMax 算子在 MxNet 图像分类任务(512 个等级,64 个节点,每个节点 8 个 GPU)中的每等级单范围统计。
- 顶部图表是一个箱线图,显示了 SoftMax 操作在不同范围名称 (Range Names) 上的时间分布。
- 底部图表是一个 50% 分布图,展示了 SoftMax 操作在不同范围名称上的 Q1、中位数 (Median) 和 Q3 的时间分布。

Per-Rank Single-Range Boxplots & 50% Distribution Grap EX: SoftMax - Image Classification with MxNet 512 ranks on 64 nodes with 8 GPU (Page 57)
Per-Rank Single-Range Boxplots & 50% Distribution Grap EX: SoftMax - Image Classification with MxNet 512 ranks on 64 nodes with 8 GPU (Page 57)

Per-Rank Single-Range Boxplots & 50% Distribution Grap (EX: NCCL All Reduce - Image Classification with MxNet 512 ranks on 64 nodes with 8 GPU)

此页面展示了 NCCL All Reduce 操作在 MxNet 图像分类任务(512 个等级,64 个节点,每个节点 8 个 GPU)中的每等级单范围统计。
- 顶部图表是一个箱线图,显示了 NCCL All Reduce 操作在不同范围名称 (Range Names) 上的时间分布。
- 底部图表是一个 50% 分布图,展示了 NCCL All Reduce 操作在不同范围名称上的 Q1、中位数 (Median) 和 Q3 的时间分布。

Per-Rank Single-Range Boxplots & 50% Distribution Grap EX: NCCL All Reduce - Image Classification with MxNet 512 ranks on 64 nodes with 8 GPU (Page 58)
Per-Rank Single-Range Boxplots & 50% Distribution Grap EX: NCCL All Reduce - Image Classification with MxNet 512 ranks on 64 nodes with 8 GPU (Page 58)

CUDA API Summary cudaMalloc Per-Rank

此箱线图作为 CUDA API 摘要的一部分,展示了 cudaMalloc 操作在不同等级(例如 mega_1_2mega_1_0mega_0_2 等)上的时间分布。

CUDA API Summary cudaMalloc Per-Rank (Page 59)
CUDA API Summary cudaMalloc Per-Rank (Page 59)

性能分析热图

CUDA内核时间覆盖热图

本幻灯片展示了CUDA内核时间覆盖的热图,用于分析GPU利用率。图表显示了不同GPU利用率(bins=30)水平下,CUDA内核在不同持续时间(Duration (s))内的活动百分比。颜色越亮表示活动百分比越高。

CUDA Kernel Time-Coverage Heatmap
CUDA Kernel Time-Coverage Heatmap

SM Active、SM Issue、TensorActive 热图

本幻灯片提供了三个热图,分别显示了SM活跃度(SmActive)、SM发出指令(SmIssue)和Tensor活跃度(TensorActive)在不同GPU利用率(bins=30)和持续时间(Duration (s))下的情况。这些指标有助于识别GPU上的瓶颈。

  • SmActive(SM活跃度): 指示流多处理器(Streaming Multiprocessor, SM)处于活动状态的百分比。
  • SmIssue(SM指令发出): 指示SM发出指令的百分比。
  • TensorActive(Tensor活跃度): 指示Tensor核心处于活动状态的百分比,这对于深度学习工作负载尤其重要。
SM Active, SM Issue, TensorActive Heatmaps
SM Active, SM Issue, TensorActive Heatmaps

迭代分析

数据中心中的接力赛

本节通过“数据中心中的接力赛”类比来解释多节点同步问题,这在许多基于迭代的应用程序(例如深度学习)中普遍存在。

  • 许多基于迭代的应用程序(例如深度学习)会遇到类似的问题。
  • 迭代周期被类比为“赛段”(Epoch -> race; Iteration -> race segment)。
  • “团队”有成百上千个赛段跑步者(即成千上万个参与的进程/rank)。
  • 效率由最慢的跑步者决定(即所有人在代码屏障处等待)。
Relay Race in the Data Center
Relay Race in the Data Center

执行不一致会导致效率损失

本幻灯片展示了一个时间线图,说明了执行中的不一致如何导致效率损失。

  • 图示:

    • 蓝色方块:数据准备
    • 绿色方块:数据处理
    • 红色方块:集体通信
    • 黑色方块:迭代结束
  • 问题: 在理想情况下,各个阶段应紧密衔接。然而,当某个阶段(例如,数据处理)完成较慢时,后续阶段(例如,集体通信)必须等待,从而产生一个“气泡”(bubble),导致“抖动时间开销”(Jitter time overhead)和效率损失。

  • 注意: 使用模型并行、分布式批归一化、分布式优化器或异步预处理侧流等方法时,时间线可能会有所不同。
Inconsistencies In Execution Can Lead To Efficiency Loss
Inconsistencies In Execution Can Lead To Efficiency Loss

屏障起始时间分析

本幻灯片展示了基于ncclKernel_AllReduce_TREE_LL_Sum_int64_t内核开始时间的屏障起始时间分析。

  • Progress (迭代进展): 上方图表展示了各个Rank随迭代次数增加的进展情况。可以看到Rank 0的进展与其他Rank在早期阶段有明显差异,然后在达到约100次迭代后趋于一致。
  • Consistency (迭代一致性): 下方图表展示了所有Rank在不同迭代下的时间一致性。不同颜色的线条代表不同的Rank。
Barrier Start Time Analysis
Barrier Start Time Analysis

每次迭代之间的时间差

本幻灯片展示了每次迭代之间的时间差(跨Rank的Delta箱线图)。

  • 图表显示了随着迭代次数的增加,屏障之间的时间(Time)如何变化。
  • 大约在第70次迭代附近出现了一个显著的峰值,表明在该迭代中屏障间的时间显著增加,且波动性较大。此后,时间逐渐下降并趋于稳定。
Time Between Barriers Per Iteration (Progress)
Time Between Barriers Per Iteration (Progress)

本幻灯片是上一个图表的局部放大,展示了第80到84次迭代之间的时间差。

  • 第80次迭代: 屏障之间的时间波动最大,箱体范围宽广,从约50到110,中位数约为75。
  • 第81-84次迭代: 时间波动性明显减小,中位数时间也较为稳定,大约在75-80之间,且箱体范围窄。
Time Between Barriers Per Iteration (Detailed)
Time Between Barriers Per Iteration (Detailed)

本幻灯片再次展示了每次迭代之间的时间差,强调了进展和一致性。

  • Progress (迭代进展): 上方图表显示了Rank 2在第83次迭代时,ncclKernel_AllReduce_TREE_LL_Sum_int64_t的Delta值为10.099738,显示了一个明显的尖峰。
  • Consistency (迭代一致性): 下方图表显示了第80次迭代时,Rank 20的Delta值为11.09958,在一个相对平稳的基线上显示出较大的波动。
Time Between Barriers Per Iteration (Progress and Consistency)
Time Between Barriers Per Iteration (Progress and Consistency)

每次迭代之间与中位数的差异(LINPACK示例)

本幻灯片展示了LINPACK应用程序在每次迭代之间与中位数的差异。

  • Progress (迭代进展): 上方图表显示了Delta of ncclKernel_AllReduce_TREE_LL_Sum_int64_t随迭代次数的变化。在约80次迭代处出现了一个明显的尖峰,表明某个Rank在此处与其他Rank的中位数差异较大。
  • Consistency (迭代一致性): 下方图表展示了不同Rank在迭代过程中与中位数的差异。可以观察到一些Rank(例如Rank 0和Rank 4)在特定迭代中显示出较大的偏差。
Variance From Median Between Barriers Per Iteration (LINPACK)
Variance From Median Between Barriers Per Iteration (LINPACK)

每次迭代之间与中位数的差异(MXNet图像分类示例)

本幻灯片展示了在64个节点上使用8个GPU运行512个Rank的MXNet图像分类应用程序时,每次迭代之间与中位数的差异。

  • Progress (迭代进展): 上方图表显示了Delta of ncclKernel_AllReduce_COLLNET_LL_Sum_float随迭代次数的变化。在约180次迭代处出现了一个明显的尖峰,以及在约250次迭代处出现了一个较小的尖峰。
  • Consistency (迭代一致性): 下方图表展示了不同Rank在迭代过程中与中位数的差异。相比LINPACK示例,这个图表显示了更频繁的、但通常幅度较小的偏差,尤其是在迭代后期。
Variance From Median Between Barriers Per Iteration (MXNet)
Variance From Median Between Barriers Per Iteration (MXNet)

屏障之间累积的时间(不含屏障等待)

本幻灯片展示了屏障之间累积的时间,即不包括屏障等待的时间(IE Without Barrier Waits)。

  • Progress (迭代进展): 上方图表显示了delta_accum of ncclKernel_AllReduce_TREE_LL_Sum_int64_t随迭代次数增加的趋势。所有Rank的累积时间在约70次迭代后开始显著增长,并最终趋于稳定。
  • Consistency (迭代一致性): 下方图表显示了所有Rank在迭代过程中的累积时间一致性。可以看到各个Rank的累积时间趋势高度一致。
Time Accumulated Between Barriers
Time Accumulated Between Barriers

屏障时间累积

本幻灯片展示了屏障时间累积的情况。

  • Progress (迭代进展): 上方图表显示了duration_accum of ncclKernel_AllReduce_TREE_LL_Sum_int64_t随迭代次数增加的趋势。不同Rank的累积屏障时间存在显著差异,一些Rank累积的屏障时间远多于其他Rank。
  • Consistency (迭代一致性): 下方图表显示了所有Rank在迭代过程中的屏障时间累积一致性。可以看到累积屏障时间在整个迭代过程中波动较大,且不同Rank之间的模式有所不同。
Barrier Time Accumulated
Barrier Time Accumulated

屏障时间

本幻灯片展示了每次迭代的屏障时间。

  • Progress (迭代进展): 上方图表显示了duration of ncclKernel_AllReduce_TREE_LL_Sum_int64_t随迭代次数的变化。屏障时间在早期迭代中相对稳定,但在约100次迭代后出现了多次显著的尖峰,尤其在Rank 0上。
  • Consistency (迭代一致性): 下方图表显示了所有Rank在迭代过程中的屏障时间一致性。图表揭示了各个Rank在不同迭代中屏障时间的剧烈波动和不一致性,尤其在后期迭代中。
Barrier Time
Barrier Time

16个Rank的深度学习训练示例:配置不佳的节点导致半数Rank变慢

本幻灯片展示了一个16个Rank的深度学习训练示例,其中一半的Rank速度较慢,表明存在配置不佳的节点。

  • 图示:

    • 上方曲线(Rank0-Rank7):这些Rank的迭代持续时间(Duration (ms))在85-90毫秒之间,相对较快。
    • 下方曲线(Rank8-Rank15):这些Rank的迭代持续时间在75-80毫秒之间,明显慢于上方组。
  • 结论: 这种持续时间上的明显差异表明存在性能瓶颈,可能是由于硬件配置不一致、负载不均衡或网络问题等导致。

16 rank DL training example
16 rank DL training example

多报告分析用例

  • 多节点(Multi-Node)
  • 多趟(Multi-Pass):降低每趟开销或处理不兼容设置。
  • 多运行(Multi-Run):回归检测和实验。
  • 规模化统计(Statistics @ Scale)

    • 集群级别利用率!
    • 比较各排程(ranks)的进度、迭代和阶段。
    • 发现有问题迭代/时间范围/排程。
  • 关联网络到排程计算(Relate networking to rank computation)

  • 直接查看感兴趣的时间线报告(Go straight to the timeline reports of interest)
    • 比较最差、最好和中位报告。

多报告可视化

多报告可视化通过垂直排列的CLI会话(表示不同的节点或排程)和水平的时间轴来展示数据,形成时间线行。
多报告可视化

来自两个节点的多报告时间线

下图展示了来自两个节点(Luna 0003 (04) 和 Luna 0004 (10))的多报告时间线。它详细展示了CPU、GPU、进程(Python)、CUDA流、线程、NCCL、NVTX和CUDA API等活动的时间分布和交互。
来自两个节点的多报告时间线

调查:错误、干扰、不平衡、不一致

  • 指南帮助发现不一致(Recipes guide you to the inconsistencies)

    • 时间或迭代
    • 排程(Rank)、节点等
  • 进一步调查(Investigate further)

    • 比较最小值、中位数和最大值
    • 统计数据
    • 并排时间线
    • 合并时间线

调查:数据不平衡

  • 每个排程迭代时间一致性(Consistent per-rank iteration time)

    • 加载时间(Load time)

      • 此批次加载时间是否超过正常值?
      • 如果是并行加载,是否有任何排程需要等待?
    • 处理时间(Processing time)

      • 此批次使用DNN处理时间是否超过正常值?
      • 如果任何人达到屏障的时间较长,所有人都被卡住!
  • 补救措施(Remedies)

    • 修复数据(Fix the data)

      • 在主要PNG数据集中混入少量JPEG,或在WAV中混入MP3?
      • 分辨率、采样率、精度错误等
    • 重新组织数据批次(Reorganize your data batches)

      • 在一个迭代中,每个批次(发送到每个排程)的处理时间大致相等。

调查:网络不平衡和拥堵

  • 网卡(NIC)

    • 单个排程上的流量过大、节点共享网卡或带宽不足。
    • NUMA感知绑定。
  • 交换机(Switch)

    • 某个区域/团队流量过大或带宽不足。
  • 延迟或路由差异(Latency or route differences)

    • 所有节点是否位于数据中心(CSP的区域、建筑、通道)中同一位置?
    • 是否“智能地”考虑了拓扑结构来分配任务到节点?
    • 硬件是否正常运行?
  • 能否更早传输数据,稍后等待,以缓解拥堵?

  • 能否使用网络内计算,例如NVIDIA SHARP?

WebRTC 流媒体容器

WebRTC流媒体容器为远程无头服务器提供了可选的便利性。下图展示了通过WebRTC流媒体容器访问的NVIDIA开发者工具界面,其中包含详细的性能时间线视图。
WebRTC 流媒体容器

总结

  • 多节点数据分析(Nsight Systems 2023.2 预览版)

    • 配方(Recipes)和Jupyter笔记本报告
    • 所有范围所有排程(All-ranges all-ranks)
    • 每范围所有排程(Per-range all-ranks)
    • 迭代步调(Iteration pacing)
    • 利用率热图(Utilization heatmaps)
  • 动态合并时间线(Merging timelines dynamically)

  • WebRTC 流媒体容器(WebRTC streaming container)
  • 新数据提供者(New data providers)
    • NVIDIA Quantum Switch 采样
    • NVIDIA NVSwitch 采样
    • CPU PMU 指标采样
    • Python 调用栈采样

感谢!

  • 下载最新的Nsight Systems:https://developer.nvidia.com/nsight-systems
  • GTC上的其他开发者工具:

    • 会议(Sessions):包括关于CUDA开发者工具、多节点工作负载优化、性能CUDA内核、CUDA概述和Nsight开发者工具的会议。例如:SS1205, SS1421, SS1882, SS1772, SS1230, SE52434。
    • 实验室(Labs):包括关于使用Nsight Profiling Tools优化模式、调试和分析CUDA应用程序正确性以及使用NVIDIA Nsight Graphics和NVIDIA Nsight Systems进行光线追踪开发的实验室。例如:DLITS1143, DLITS1202, DLITS1580。
  • 联系专家(Connect with Experts):关于CUDA工具箱中的内容、CUDA Profiling、优化和调试工具以及使用NVIDIA开发者工具优化光线追踪。例如:CWESS20036, CWESS2009。

  • 开发者工具免费提供:可在per-product网站(最新版)和通过CUDA Toolkit(最新版)获取。

  • 支持渠道

  • 更多信息

NVIDIA Logo
NVIDIA Logo