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

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

议程 (Agenda)

目录 (Table of Contents)


优化工作流程 (Optimization Workflow)

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

优化工作流程图
优化工作流程图

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

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

监控与性能分析工具谱系
监控与性能分析工具谱系

数据中心 GPU 监控器 (DCGM)

DCGM 监控界面与命令行输出
DCGM 监控界面与命令行输出

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

Nsight 性能分析器家族工作流程图
Nsight 性能分析器家族工作流程图

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

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

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

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

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

大型系统架构图
大型系统架构图

介绍与单节点代理 (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)

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

关键特性 (Key Features)

Nsight系统关键特性时间线视图
Nsight系统关键特性时间线视图

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

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

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

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

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

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

线程状态与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性能标记。

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

NVIDIA 工具扩展 (NVTX)

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

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和内核跟踪点,提供系统范围的性能数据。

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

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

GPU指标采样示例 - 多节点深度学习训练
GPU指标采样示例 - 多节点深度学习训练

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

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

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

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

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

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

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

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

单节点统计与分析器

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

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

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

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

统计/导出 - CUDA 内核摘要

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

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

分析器与专家系统

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

分析器与专家系统视图
分析器与专家系统视图

更多资源

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

少量节点抽查

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

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

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

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

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 字节数据,用于分析网络流量和性能。

多节点综合分析

多节点

多节点架构图
多节点架构图

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

多报告分析目标

Nsys 多报告分析工作流

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

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

报告生成

分析调度

设置

分析启动与输出

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 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上的瓶颈。

SM Active, SM Issue, TensorActive Heatmaps
SM Active, SM Issue, TensorActive Heatmaps

迭代分析

数据中心中的接力赛

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

Relay Race in the Data Center
Relay Race in the Data Center

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

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

Inconsistencies In Execution Can Lead To Efficiency Loss
Inconsistencies In Execution Can Lead To Efficiency Loss

屏障起始时间分析

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

Barrier Start Time Analysis
Barrier Start Time Analysis

每次迭代之间的时间差

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

Time Between Barriers Per Iteration (Progress)
Time Between Barriers Per Iteration (Progress)

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

Time Between Barriers Per Iteration (Detailed)
Time Between Barriers Per Iteration (Detailed)

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

Time Between Barriers Per Iteration (Progress and Consistency)
Time Between Barriers Per Iteration (Progress and Consistency)

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

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

Variance From Median Between Barriers Per Iteration (LINPACK)
Variance From Median Between Barriers Per Iteration (LINPACK)

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

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

Variance From Median Between Barriers Per Iteration (MXNet)
Variance From Median Between Barriers Per Iteration (MXNet)

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

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

Time Accumulated Between Barriers
Time Accumulated Between Barriers

屏障时间累积

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

Barrier Time Accumulated
Barrier Time Accumulated

屏障时间

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

Barrier Time
Barrier Time

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

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

16 rank DL training example
16 rank DL training example

多报告分析用例

多报告可视化

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

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

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

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

调查:数据不平衡

调查:网络不平衡和拥堵

WebRTC 流媒体容器

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

总结

感谢!

NVIDIA Logo
NVIDIA Logo