Daniel Horowitz, Sr Director of Engineering, NVIDIA Developer Tools | GTC March 2023
介绍与单节点代理 (Introduction & Single-Node Proxy)
深度学习训练 (Deep Learning Training)
核心策略 (Core Strategy)
更多资源
少量节点抽查
多节点综合分析
可在 Nsight Systems 或 Jupyter Lab 中加载的笔记本
全范围全等级统计
单范围全等级统计
性能分析热图
迭代分析
多报告分析用例
优化是一个迭代过程,直到达到所需的性能。
监控和性能分析有不同的目标用户、意图、细节和设计权衡。它们有重叠但不可互换。
监控器 (Monitors)
性能分析器 (Profilers)
暂停/恢复性能分析:
CLI 命令:
dcgmi profile --pausedcgmi profile --resumeAPI 函数:
dcgmProfPausedcgmProfResumeNsight Systems: 分析系统范围内的算法,包括 CPU、GPU、CUDA、网络和图形。提供全面的工作负载级性能。
Nsight Compute: 调试和分析 CUDA 内核。通过指标/计数器收集深入分析顶层 CUDA 内核。提供详细的 CUDA 内核性能。
Nsight Systems 将系统中的各种组件视为一个需要协调的“管弦乐队”。
系统可扩展到数千个 GPU,并包含复杂的互连和硬件组件。
此图展示了深度学习训练的宏观时间线视图,包括 CPU、GPU 性能指标、DRAM 和 NVLink 带宽、CUDA 硬件活动以及 CUDA API 调用等信息。
此图是时间线视图的局部放大,聚焦于范围转换,展示了更详细的 CPU 进程、线程、OS 运行时库、TensorFlow 活动以及 CUDA API 调用的时序。
什么是“热点”? (What's HOT?)
什么是“冷点”? (What's COLD?)
预算? (Budgets?)
热点可能是: (Hot spots might be:)
冷点是明确、可衡量的机会!!! (Cold spots are clear, measurable opportunities!!!)
多节点运行前的预检 (Pre-flight check for multi-node)
为什么? (Why?)
如何操作? (How?)
统一时间线 (Unified timeline)
采样 (Sampling)
追踪 (Trace)
统计 (CLI 或 GUI) (Statistics (CLI 或 GUI))
新的可扩展框架。
Nsight Systems 提供了一个详细的统一时间线视图,用于分析多核、多 GPU、多节点系统中的性能瓶颈。
该视图包含了以下关键区域:
OSRT 提供了一个详细的性能分析视图,展示了线程活动、CPU 核使用、线程状态以及操作系统的长时间阻塞回溯。
本示例展示了在使用Map/Unmap操作时可能出现的性能抖动,通过详细的跟踪视图呈现。
此视图提供了基于调用栈采样的函数统计信息,显示了各个函数的自我执行时间百分比及其所属模块。
此功能允许对Python应用程序进行调用栈采样,以识别性能瓶颈。它在时间轴上展示了Python线程的活动,并提供了详细的事件视图,包括事件的起始时间、线程ID、类别和详细描述。
NVIDIA工具扩展 (NVTX) 提供了用于CPU和GPU性能标记的API,包括OpenGL、Vulkan和Direct3D性能标记。
NVIDIA工具扩展 (NVTX):
https://github.com/NVIDIA/NVTX示例: 在CPU上使用NVTX可视化Visual Molecular Dynamics (VMD) 算法的执行。
NVTX支持C、C++和Python,允许开发者使用注解(标记、范围、嵌套范围等)来装饰应用程序源代码,从而帮助可视化执行、调试、跟踪和性能分析。
https://nvidia.github.io/NVTX/doxygen/index.html 和 https://nvidia.github.io/NVTX/doxygen-cpp/index.htmlnvtxMark("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);
CPU性能监控单元 (PMU) 采样功能支持Grace、ARM、x86-64架构,以及CPU核心、CPU/SOC uncore和内核跟踪点,提供系统范围的性能数据。
uncore_imc_0icas_count_read和uncore_imc_0icas_count_write)。以多节点深度学习训练为例,展示了GPU各项指标的采样数据。
此功能用于关联CPU上的GPU API启动事件与GPU上的实际硬件工作负载,帮助理解两者之间的时序关系。
cudaMemcpyAsync)与随后的GPU工作负载(如split_x_kernel)的关联。implicit_convolve_sgemm、_add_1_等)的更细粒度关联。GPU性能空闲检测功能旨在帮助用户发现并调查GPU性能中的“空闲”(cold spots)或“热点”(cool spots)。
发现问题:
追踪关联:
调查原因:
基于像素时间覆盖率的细节级别 (LOD) 功能允许用户通过放大视图来揭示性能谷底或空白。
此部分关注单节点性能的统计数据和分析工具。
该表格提供了NVTX开发者注解的统计数据,包括时间、调用次数、平均值、最小值、最大值和范围,以及相应的TensorRT执行上下文和操作名称。
此表格总结了CUDA内核的性能数据,包括时间、调用次数、平均值、最小值、最大值和名称,揭示了不同内核的性能特征。
此工具提供了一个专家系统视图,能够根据性能分析结果给出具体的建议。例如,对于使用页面可映射内存的CUDA异步内存拷贝,如果存在导致GPU利用率降低的阻塞操作,系统会建议使用固定(pinned)内存。
以下是可能有助于深入了解 Nsight Systems 性能分析的额外资源,以避免本次演讲篇幅过长:
GTC 演讲
DLI 实验
更多演示、视频、博客文章等...
在这一点上,可能尚未用到任何通信 API。
可以将规模扩展到 2-4 个节点,或者至少在 1 个节点上使用 IPC。
可能会注意到更多意外的阻塞。
上图展示了一个 MPI 和 UCX 操作的详细时间线追踪。右侧的描述框提供了 MPI_Bcast 事件的详细信息:
MPI_Bcast上图展示了 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 技术。它展示了多个 NIC(NIC-0, NIC-1, NIC-2, NIC-3)的字节接收和发送情况,以及发送等待时间,帮助识别网络通信瓶颈。
上图展示了 NVIDIA Quantum 交换机的采样数据。它显示了 NIC 0 (mlx5_0 - NVIDIA ConnectX-6) 以及两个 IB 交换机(0xc42a1030079a6ec 和 0xb8cef60300fbf210)的接收和发送 IB 字节数据,用于分析网络流量和性能。
在少量节点代理运行中表现良好!
现在是完整的多节点模式吗?!
上图展示了一个多节点 GPU POD 架构,其中包含 GPU PODs、分布式核心交换机、骨干交换机、叶交换机以及连接到存储的 DGX A100 系统(从 #1 到 #140)。
分析数千份报告
横向扩展处理
上图展示了 Nsys 多报告分析的整体工作流,包括报告生成、设置、分析启动、输出以及查看等主要阶段。
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尽可能避免长时间的收集。
“调度”分析
稍后进行
手动进行
存储设备并非严格必要。
食谱库 (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>
分析可以在本地、服务器或集群上启动:
Nsys 多报告分析工作流提供了一个从数据输入到分析可视化和输出的全面流程。
本页面展示了一个 Jupyter 笔记本在 Nsight Systems 或 Jupyter Lab 中加载并运行的示例。笔记本显示了一个堆叠柱状图,可视化了在 GPU 设备上不同组件(如 1st Dim、barrier、2nd Dim 和 sync)的时间(us)分布。这体现了分析报告的可交互性和可视化能力。
此页面展示了针对 Linpack CUDA 内核的全范围全等级统计数据。表格提供了详细的性能指标,包括平均值 (Avg)、近似四分位数 (Q1, Median, Q3)、总和、最小值、中位数、最大值、总计数、最小计数、中位数计数和最大计数,针对各种内核操作(例如 kernel_eval、barrier_on_stream_kernel、create_pivot_kernel 等)。
此表格展示了通过下拉菜单选择的每等级(Per-Rank)统计数据。示例中高亮显示了 mega_1_2 报告,提供了不同 CUDA API 操作(如 cudaDeviceSynchronize、cudaMemcpyAsync、cudaFree 等)的调用次数 (Num Calls)、平均值 (Avg)、最小值 (Min)、最大值 (Max) 和标准差 (StdDev) 等指标。
此页面通过图表展示了 Linpack CUDA 内核的全等级全范围统计。
- 顶部图表是一个箱线图,显示了不同内核操作(如 create_pivot_kernel、get_a_pivot_rows 等)的时间分布。
- 底部图表是一个 50% 分布图,展示了这些内核操作的 Q1、中位数 (Median) 和 Q3 的时间分布。
此箱线图展示了 QUDA NVTX GPU 投影的全等级全范围统计。图表显示了不同范围名称(如 initQuda-endQuda、loadGaugeQuda、plaqQuda、invertQuda、Dirac)的 gpu_duration 的时间分布。
本页面提供了 CUDA API 的摘要信息,包括一个详细的统计表格和一个可视化图表。
- 表格列出了 cudaDeviceSynchronize、cudaMemcpyAsync、cudaFree 等 CUDA API 的时间、总时间、调用次数、平均值、四分位数 (Q1, Med, Q3)、最大值、标准差和报告信息。
- 图表以柱状图形式展示了这些 CUDA API 的相对时间分布。
本页面展示了比较(差异)统计数据,分为“所有等级 (All Ranks)”和“检查特定等级 (Inspect Specific Rank)”两部分。
- 所有等级的表格提供了不同内核操作(如 void xmma_gemm_kernel::xmma_gemm_kernel、NCCLKernel AllGather 等)在所有等级上的时间、总时间、实例数、平均值、最小值、中位数和标准差的差异。
- 检查特定等级的表格则针对特定报告(如 hpl-develop-nhpc_22_3_378847_5)显示了其在 Time、Total Time、Instances、Avg、Min、Med、StdDev 和 Name 等方面的详细统计信息。
此页面展示了 QUDA 和 NVTX GPU-Projection 经由 CUDA 的每等级单范围统计。
- 顶部图表是一个箱线图,显示了 Dirac 范围在不同等级 (Ranks) 上的时间分布。
- 底部图表是一个 50% 分布图,展示了 Dirac 范围在不同等级上的 Q1、中位数 (Median) 和 Q3 的时间分布。
此页面展示了 SoftMax 算子在 MxNet 图像分类任务(512 个等级,64 个节点,每个节点 8 个 GPU)中的每等级单范围统计。
- 顶部图表是一个箱线图,显示了 SoftMax 操作在不同范围名称 (Range Names) 上的时间分布。
- 底部图表是一个 50% 分布图,展示了 SoftMax 操作在不同范围名称上的 Q1、中位数 (Median) 和 Q3 的时间分布。
此页面展示了 NCCL All Reduce 操作在 MxNet 图像分类任务(512 个等级,64 个节点,每个节点 8 个 GPU)中的每等级单范围统计。
- 顶部图表是一个箱线图,显示了 NCCL All Reduce 操作在不同范围名称 (Range Names) 上的时间分布。
- 底部图表是一个 50% 分布图,展示了 NCCL All Reduce 操作在不同范围名称上的 Q1、中位数 (Median) 和 Q3 的时间分布。
此箱线图作为 CUDA API 摘要的一部分,展示了 cudaMalloc 操作在不同等级(例如 mega_1_2、mega_1_0、mega_0_2 等)上的时间分布。
本幻灯片展示了CUDA内核时间覆盖的热图,用于分析GPU利用率。图表显示了不同GPU利用率(bins=30)水平下,CUDA内核在不同持续时间(Duration (s))内的活动百分比。颜色越亮表示活动百分比越高。
本幻灯片提供了三个热图,分别显示了SM活跃度(SmActive)、SM发出指令(SmIssue)和Tensor活跃度(TensorActive)在不同GPU利用率(bins=30)和持续时间(Duration (s))下的情况。这些指标有助于识别GPU上的瓶颈。
本节通过“数据中心中的接力赛”类比来解释多节点同步问题,这在许多基于迭代的应用程序(例如深度学习)中普遍存在。
本幻灯片展示了一个时间线图,说明了执行中的不一致如何导致效率损失。
图示:
问题: 在理想情况下,各个阶段应紧密衔接。然而,当某个阶段(例如,数据处理)完成较慢时,后续阶段(例如,集体通信)必须等待,从而产生一个“气泡”(bubble),导致“抖动时间开销”(Jitter time overhead)和效率损失。
本幻灯片展示了基于ncclKernel_AllReduce_TREE_LL_Sum_int64_t内核开始时间的屏障起始时间分析。
本幻灯片展示了每次迭代之间的时间差(跨Rank的Delta箱线图)。
本幻灯片是上一个图表的局部放大,展示了第80到84次迭代之间的时间差。
本幻灯片再次展示了每次迭代之间的时间差,强调了进展和一致性。
ncclKernel_AllReduce_TREE_LL_Sum_int64_t的Delta值为10.099738,显示了一个明显的尖峰。本幻灯片展示了LINPACK应用程序在每次迭代之间与中位数的差异。
ncclKernel_AllReduce_TREE_LL_Sum_int64_t随迭代次数的变化。在约80次迭代处出现了一个明显的尖峰,表明某个Rank在此处与其他Rank的中位数差异较大。本幻灯片展示了在64个节点上使用8个GPU运行512个Rank的MXNet图像分类应用程序时,每次迭代之间与中位数的差异。
ncclKernel_AllReduce_COLLNET_LL_Sum_float随迭代次数的变化。在约180次迭代处出现了一个明显的尖峰,以及在约250次迭代处出现了一个较小的尖峰。本幻灯片展示了屏障之间累积的时间,即不包括屏障等待的时间(IE Without Barrier Waits)。
delta_accum of ncclKernel_AllReduce_TREE_LL_Sum_int64_t随迭代次数增加的趋势。所有Rank的累积时间在约70次迭代后开始显著增长,并最终趋于稳定。本幻灯片展示了屏障时间累积的情况。
duration_accum of ncclKernel_AllReduce_TREE_LL_Sum_int64_t随迭代次数增加的趋势。不同Rank的累积屏障时间存在显著差异,一些Rank累积的屏障时间远多于其他Rank。本幻灯片展示了每次迭代的屏障时间。
duration of ncclKernel_AllReduce_TREE_LL_Sum_int64_t随迭代次数的变化。屏障时间在早期迭代中相对稳定,但在约100次迭代后出现了多次显著的尖峰,尤其在Rank 0上。本幻灯片展示了一个16个Rank的深度学习训练示例,其中一半的Rank速度较慢,表明存在配置不佳的节点。
图示:
结论: 这种持续时间上的明显差异表明存在性能瓶颈,可能是由于硬件配置不一致、负载不均衡或网络问题等导致。
规模化统计(Statistics @ Scale)
关联网络到排程计算(Relate networking to rank computation)
多报告可视化通过垂直排列的CLI会话(表示不同的节点或排程)和水平的时间轴来展示数据,形成时间线行。
下图展示了来自两个节点(Luna 0003 (04) 和 Luna 0004 (10))的多报告时间线。它详细展示了CPU、GPU、进程(Python)、CUDA流、线程、NCCL、NVTX和CUDA API等活动的时间分布和交互。
指南帮助发现不一致(Recipes guide you to the inconsistencies)
进一步调查(Investigate further)
每个排程迭代时间一致性(Consistent per-rank iteration time)
加载时间(Load time)
处理时间(Processing time)
补救措施(Remedies)
修复数据(Fix the data)
重新组织数据批次(Reorganize your data batches)
网卡(NIC)
交换机(Switch)
延迟或路由差异(Latency or route differences)
能否更早传输数据,稍后等待,以缓解拥堵?
WebRTC流媒体容器为远程无头服务器提供了可选的便利性。下图展示了通过WebRTC流媒体容器访问的NVIDIA开发者工具界面,其中包含详细的性能时间线视图。
多节点数据分析(Nsight Systems 2023.2 预览版)
动态合并时间线(Merging timelines dynamically)
GTC上的其他开发者工具:
联系专家(Connect with Experts):关于CUDA工具箱中的内容、CUDA Profiling、优化和调试工具以及使用NVIDIA开发者工具优化光线追踪。例如:CWESS20036, CWESS2009。
开发者工具免费提供:可在per-product网站(最新版)和通过CUDA Toolkit(最新版)获取。
支持渠道:
更多信息: