It's Easier than You Think – Debugging and Optimizing CUDA with Intelligent Developer Tools
It's Easier than You Think – Debugging and Optimizing CUDA with Intelligent Developer Tools
Mahender Hari
目录
议程
本次演讲的议程安排如下:
- 高级工具生态系统概览
-
针对每个工具:
- 简要描述和功能概览
- 最新版本中的新功能以及它们解决的问题
-
当前和未来的重点领域
- 附加资源/问答环节
NVIDIA开发者工具是一套强大的库、SDK和开发者工具,横跨桌面和移动平台,使开发者能够构建、调试、分析和部署利用加速计算硬件的软件。
更多信息请访问:https://developer.nvidia.com/tools-overview
开发者工具生态系统
NVIDIA的开发者工具生态系统涵盖了从开发到调试再到性能分析的整个流程:
-
IDE 集成:
- Nsight Visual Studio Code Edition
- Nsight Eclipse Edition
- JupyterLab
-
调试器 (Debuggers):
- CUDA-GDB, Nsight Visual Studio Edition
- Nsight Visual Studio Code Edition
-
正确性检查器 (Correctness Checker):
- Compute Sanitizer
-
性能分析器 (Profiler):
- Nsight Systems, Nsight Compute, CUPTI, NVIDIA Tools eXtension (NVTX)
IDE 和调试器
IDE 和计算调试器
在熟悉的环境中开发和调试 CUDA。
-
Nsight Visual Studio Edition
- 为 Visual Studio 提供 IDE 集成。
- 在 Visual Studio 中构建和调试 CPU+GPU 代码。
-
Nsight Visual Studio Code Edition
- 为 VS Code 提供 IDE 集成。
- 从 Windows 或 Linux 远程定位 Linux/L4T/QNX 目标。
- 在 Visual Studio Code 中构建和调试 CPU+GPU 代码。
-
Nsight Eclipse Edition
- 为 Eclipse 提供 IDE 集成。
- 在 Eclipse 中构建和调试 CPU+GPU 代码。
-
JupyterLab 扩展
- 集成 Nsight Systems 和 Nsight Compute。
- 分析单个单元格。
- 在 Nsight 工具的图形界面中查看报告,所有操作均在 JupyterLab 内完成。
-
CUDA GDB
- CPU + GPU 内核调试器。
- 支持步进、断点、内联函数、变量检查等。
- 基于 GDB 构建,并使用许多相同的 CLI 命令。
- 支持本地/远程连接。
Compute Sanitizer
帮助识别 CUDA 应用程序中的风险。
Compute Sanitizer 包含多个工具,用于检测不同类型的错误:
- Racecheck: 共享内存数据风险检测工具。
- Initcheck: 未初始化设备全局内存访问检测工具。
- Synccheck: 线程同步风险检测工具。
- Memcheck: 内存访问错误和泄漏检测工具。
文档: https://docs.nvidia.com/compute-sanitizer/
Github 示例: https://github.com/NVIDIA/compute-sanitizer-samples/
下图展示了 compute-sanitizer 运行 memcheck_demo 时的输出,它检测到了一个无效的全局内存写入操作,并提供了详细的错误信息,包括线程、块、地址和主机调用栈。
IDE 和调试器:新功能
IDE 和计算调试器新特性
在熟悉的环境中开发和调试 CUDA。
Compute Debugger
- 支持 FP4/FP6/FP8 格式。
- 提供跨发行版的构建,并带回 TUI shell。
- 支持在 Mobile Linux 和 WSL 上进行后期附加(late attach)。
- 通用后端(所有平台)和性能改进。
Compute Sanitizer
- 支持 Blackwell TCMM A 内存检查。
- Initcheck 现在也覆盖共享内存。
- 支持 Python 调用栈。
- 改进了堆栈可读性。
NVTX Tools Extension API
NVIDIA Tools eXtension (NVTX)
NVTX 允许开发者标注应用程序源代码,以便在使用调试、跟踪和性能分析工具时实现执行过程的可视化。
- 仅头文件库: 只需包含
<nvtx3/nvToolsExt.h>。 - 标记 (Marker):
nvtxMark("This is a marker"); - Push-Pop 范围:
nvtxRangePush("This is a push/pop range");
// Do something interesting in the range.
nvtxRangePop(); // Pop 必须在与 Push 相同的线程上 - Start-End 范围:
nvtxRangeId_t rangeId = nvtxRangeStart("This is a start/end range");
// Sometime else in the code, not necessarily same thread as start call
nvtxRangeEnd(rangeId);
下图展示了 NVTX 标记在性能分析器时间轴上的可视化效果。
API 参考链接: https://nvidia.github.io/NVTX/doxygen/index.html 和 https://nvidia.github.io/NVTX/doxygen-cpp/index.html
Python 和 NVTX
可以通过 pip install nvtx (https://pypi.org/project/nvtx/) 在 Python 中使用 NVTX。
- 使用 NVTX 标注 Python 代码:
import time
import nvtx
@nvtx.annotate(color="blue")
def my_function():
for i in range(5):
with nvtx.annotate("my_loop", color="red"):
time.sleep(1)
- 使用 Nsight Systems 进行分析和可视化:
下图展示了上述 Python 代码在 Nsight Systems 中的分析结果,可以清晰地看到my_function和my_loop的执行时间和范围。
NVIDIA SDK 和 NVTX:一个完整的生态系统
NVTX 是一个完整的生态系统的一部分,与众多 NVIDIA SDK 和库集成,包括:
- 深度学习框架 (DL Frameworks): PyTorch (with Layers), JAX + XLA, TensorFlow
- DeepStream SDK: Accel. GStreamer Plugins, GXF
- Holoscan SDK: GXF
- 数学库 (Math Libraries): cuSPARSE, cuSOLVER, cuBLAS
- 深度学习库 (Deep Learning Libraries): TensorRT, cuDLA
- 通信库 (Comm. Libraries): NVSHMEM, NCCL
- 其他库: cuFile, cuML, cuDF
- NVTX 库: C Headers, C++ wrapper, Python wrapper, 以及新支持的 Fortran wrapper 和 RUST wrapper。
NVTX 扩展负载 (Extended Payloads) & NVTX 计数器 (Counters)
利用 NVTX 和 Nsight Systems 实现更多功能。
- 将任意数据传递给 NVTX 事件,并允许用户定义此数据的布局,无需额外的数据转换。
- NVTX 标记、push/pop 范围和 start/end 范围均支持扩展负载。
- NVTX 计数器:
- 即时和延迟计数器采样。
- 通过扩展负载模式定义计数器组的数据布局。
- 用户自定义范围。
下图展示了 Nsight Systems 视图,其中包含了 NVTX 计数器(如吞吐量)和带有扩展负载的事件。当鼠标悬停在一个事件上时,可以看到其附加的元数据,如序列号、读/写大小和自定义消息。
Nsight Systems
Nsight Systems - 系统性能分析器
主要特性:
-
系统级应用程序算法调优:
- 支持多进程树。
-
定位优化机会:
- 在非常快速的 GUI 时间线上可视化数百万个事件。
- 识别未使用的 CPU 和 GPU 时间间隙。
-
平衡多个 CPU 和 GPU 之间的工作负载:
- 分析 CPU 算法、利用率和线程状态。
- 分析 GPU 流、内核、内存传输等。
-
集成方式: 命令行、独立应用、IDE 集成。
- 支持环境: 容器、编排器、作业调度器。
- 操作系统: Linux (x86-64, ARM, Tegra), Windows, macOS X (主机)。
- GPU: Turing+ 架构。
文档/产品链接: https://developer.nvidia.com/nsight-systems
Nsight Systems 用户界面概览
Nsight Systems 的时间轴视图提供了对应用程序执行情况的全面可视化。
Page 16
- 进程和线程 (Processes and threads): 显示应用程序中的活动进程和线程。
- 线程状态 (Thread state): 可视化线程的执行状态(例如,运行中、休眠中)。
- cuDNN 和 cuBLAS 跟踪 (cuDNN and cuBLAS trace): 显示 NVIDIA 库(如 cuDNN 和 cuBLAS)的调用和执行情况。
- 内核和内存传输活动 (Kernel and memory transfer activities): 跟踪 GPU 内核的执行以及 CPU 和 GPU 之间的数据传输。
- 多 GPU (Multi-GPU): 支持并显示多个 GPU 上的活动,便于分析多 GPU 系统。
关注区域的缩放与过滤
用户可以对时间轴进行缩放和过滤,以详细观察感兴趣的特定区域,从而进行更深入的性能分析。
Page 17
Nsight Systems 新特性
Page 18
Grace CPU 性能分析
Nsight Systems 现已支持对 Grace CPU 的硬件计数器和指标进行性能分析。
Page 19
-
CPU 核心和 Uncore 事件:
- 为每个 CPU 核心进行采样。
- 可视化并行效应。
- 查看缓存命中/未命中、指令退休等信息。
-
L3 一致性结构 (Coherency Fabric):
- 芯片到芯片的流量。
- CPU 到 GPU 的流量。
- GPU 到 CPU 的流量。
-
支持可变采样频率。
- 时间轴与所有其他数据关联:
- GPU 与 CPU 的空闲时间及指标。
- 数据移动。
- 缩放和过滤功能。
Grace TopDown 分析
Nsight Systems 提供了 Grace CPU 的 TopDown 分析方法论,以指导性能优化。
Page 20
- TopDown 分析指导: 该方法论指导用户判断性能瓶颈是位于前端(Front end bound)还是后端(Back end bound)。
- NVTX 范围统计摘要: 提供每个 NVTX 代码范围的摘要统计信息。
- 详细分解: 提供更详细的性能指标分类,例如分支预测效率(Branch Effectiveness)和指令 TLB 效率(Instruction TLB Effectiveness),并给出相应的计算公式和报告。
Python 性能分析更新
Nsight Systems 增强了对 Python 应用程序的性能分析能力。
Page 21
-
Python 调用栈样本和 CUDA API 回溯:
- 帮助识别代码的当前位置和调用路径。
- 提供自上而下和自下而上的树状视图,便于分析。
-
全局解释器锁 (GIL) 跟踪:
- GIL 是 Python 中常见的性能瓶颈。
-
查看流行框架和库中的注解代码范围:
- 支持 PyTorch(带有 Layers trace)、RAPIDS、DASK、Spark、CV-CUDA 等。
- 无需修改源代码即可自定义跟踪 Python 函数。
Nsight Analysis 改进
该工具用于处理和分析复杂的、大型的报告或报告集合。
Page 22
-
可视化随时间变化的使用情况以识别:
- 趋势、阶段和行为模式。
- 负载不均衡。
- 空闲的 GPU 计算周期。
- 低效的调度。
- 计算与通信的重叠情况。
-
可定制的预定义“配方”(Recipes):
- 理解计算热点与通信的关系。
- 理解所有 GPU 内核和内存操作的相对成本。
- 在多节点、多 GPU 应用中测量所有 GPU 的利用率。
- 识别 InfiniBand 拥塞。
- 测量 InfiniBand、Ethernet 和 NVLink 的吞吐量。
- 计算利用率以及计算与通信的重叠部分。
- 理解本地和网络存储的 I/O 操作。
- 识别机器学习训练中性能不佳的节点。
Nsight 插件
用户可以将自己的数据集成到 Nsight Systems 中。
Page 23
- 利用现有的报告/数据收集流程。
- 使用 NVTX 向 Nsight Systems 提供数据。
- 将插件放置在 Nsight Systems 的插件目录中,并编写一个插件清单文件。
- 使用命令行接口(CLI)
"--enable plugin:home,flag1,arg1,arg2=val1,org3=val2,...,valN",标志和参数会在启动时传递给你的进程。
Nsight Compute
Page 24
Nsight Compute:内核性能分析器
Nsight Compute 是一个用于 CUDA 内核分析和调试的强大工具。
Page 25
主要特性:
- 交互式/非交互式内核分析和 CUDA API 调试。
- 内置的引导式分析系统:
- 提供性能优化建议和预估的加速效果。
-
完全可定制的数据收集和显示:
- 提供 Python 接口以访问分析数据。
-
多种使用方式: 命令行、独立应用、IDE 集成、远程目标分析。
- 操作系统支持: Linux (x86_64, ARM SBSA, L4T), Windows, QNX, MacOS (仅主机端)。
- GPU 支持: Volta 及更高版本。
- 文档/产品链接: https://developer.nvidia.com/nsight-compute
Nsight Compute GUI 界面
Nsight Compute 的图形用户界面提供了详细的性能指标和引导式分析。
Page 26
- 目标指标区域 (Targeted metric sections): 提供对 GPU 级别计算和内存性能的概览,帮助识别主要瓶颈。
- 内置的引导式分析和优化专业知识 (Built-in expertise for Guided Analysis and optimization): 提供基于规则的分析,解释性能问题并给出优化建议。
- 可定制的数据收集和展示 (Customizable data collection and presentation): 允许用户根据需要收集和展示详细的性能数据,如 SM(流式多处理器)和流水线的利用率。
内存分析图表
Nsight Compute 提供直观的内存层次结构图,以分析数据流和利用率。
Page 27
- 内存分析图 (Memory analysis chart): 可视化数据在不同内存层级(如全局内存、L1/L2 缓存、共享内存)之间的流动。
- 传输大小或吞吐量 (Transferred size or throughput): 显示不同内存路径上的数据传输量或带宽。
- 颜色编码识别高利用率 (Color coding for identifying high utilization): 使用颜色深浅表示利用率高低,帮助快速定位瓶颈。
- 未使用的单元 (Unused units): 标识出未被使用的硬件单元,揭示潜在的优化空间。
源代码、PTX 和 SASS 分析
Nsight Compute 能够将性能指标与源代码、PTX(并行线程执行)代码和 SASS(汇编代码)进行关联。
Page 28
- 源代码/PTX/SASS 分析与关联 (Source/PTX/SASS analysis and correlation): 将高级源代码与底层硬件指令相关联。
- 每行或每条指令的源度量 (Source metrics per line or instruction): 显示每行代码或每条指令的性能指标,如执行采样数。
- 来自编译器和规则系统的源码注释 (Source annotations from compiler and rules system): 提供编译器生成的注释和基于规则的性能洞察。
- 指标热力图快速识别热点 (Metric heatmap to quickly identify hotspots): 使用热力图可视化性能瓶颈所在的代码行。
Nsight Compute 新特性
Page 29
Blackwell Tensor Memory 支持
Nsight Compute 增加了对 Blackwell 架构中新型 Tensor Memory 的分析支持。
Page 30
- 跟踪通过 Tensor Memory 的读写操作。
- 识别瓶颈或利用率不足的情况。
- 为 TMEM 操作提供硬件指标。
- 图示说明了已执行的 Tensor Core 操作、Tensor Memory 操作以及数据在 Tensor Operations、Tensor Memory 和片上内存之间流动时的请求数。例如,图中显示了 256.00 条 Tensor Core 操作指令和 256.00 条 Tensor Memory 操作指令。
Python 支持
- 源代码解析与语法高亮: 工具能够解析源代码并进行语法高亮,方便代码阅读和分析。
- 原生与Python代码的调用栈: 提供统一的调用栈视图,同时展示原生代码(C/C++/CUDA)和Python代码的调用关系。
附加功能
-
内核堆栈大小报告:
- 增进对内存使用和限制的理解。
-
改进的范围性能分析:
- 范围内的内核的开始/结束时间戳现在可在时间轴上查看。
- 指导性分析规则现在可以检测范围内的性能问题。
-
支持多进程服务 (MPS)*:
-
通用搜索*:
- 在报告和文档中快速定位感兴趣的主题。
* 即将推出
CUPTI: CUDA Profiling Tools Interface
CUPTI 更新
-
在Blackwell GPU上使用硬件事件(HES)进行低开销内核追踪
-
周期性指标采样:
- 在设备级别进行低开销的GPU性能指标采样。
- 每个样本包含指标值和时间戳。
- 支持Turing+架构。
-
一套新的主机和目标性能分析API:
- 一致且统一的API集,涵盖命名、类型、错误码、错误处理宏等。
- 相比当前的Perfworks API,新的API简化了API的使用。
- 解锁了对NVLINK、C2C和PCIe指标的访问。
-
Python API:
- CUPTI C Activity和Callback API的子集。
- 支持Python版本3.9、3.10、3.11或3.12。
-
用于改进可调试性的符号文件
回顾重点领域
开发工具中的人工智能 (AI in DevTools)
引入 Nsight Copilot
- 工具中的AI助手支持: 帮助开发者完成任务。
- 由NVIDIA Inference Microservices (NIMs) 驱动。
- 使用ComputeEval进行基准测试和质量检查,以确保准确性。
Nsight Copilot in Visual Studio Code
- 帮助用户编写和理解CUDA代码及概念。
- 提供自动补全和代码生成功能。
Nsight Copilot in Nsight Compute
- 帮助用户解答关于Nsight Compute使用、性能分析结果数据和性能优化的问题。
- 提供基于已收集数据的概念性CUDA知识的交互式聊天。
引入 Nsight Cloud
目标
- 提高Nsight工具的易用性:
- 减少对自定义调试构建/容器的需求。
- 简化从"n"个(1000s)节点收集的数据的分析和呈现。
- 改善云用户(公有/CSP、私有、本地)、数据中心、研究实验室的横向扩展能力:
- 支持多节点通信。
- 支持作业调度器/任务编排器。
组件
- Nsight Operator: 配置、启用和管理性能分析。
- Injector: 添加到任务或容器中的上下文性能分析代理,有助于避免修改/创建开发/调试实例的需要。现已在 http://ngc.nvidia.com 上为 Nsight Systems 提供。
- Nsight Streamer: 查看/可视化来自Nsight工具的报告。
- 轻量级,减少移动大量数据的需求。
- 安全,敏感的性能分析和系统数据保留在本地。
- 现已在 http://ngc.nvidia.com 上为 Nsight Systems, Nsight Deep Learning Designer, Nsight Compute 和 Nsight Graphics 提供。
启用 Python 支持
-
开发者工具教程: 提供涵盖Nsight Systems、Nsight Compute、Compute Sanitizer的示例。
- 加速计算中心 > 加速Python用户指南 > 第10章:开发者工具
-
Python性能分析:
- 在Compute Sanitizer、Nsight Systems(包括采样)和Nsight Compute中查看调用栈。
- CUDA API回溯:原生和Python调用栈。
- 在Nsight Systems中查看组合调用栈:自顶向下、自底向上、扁平视图。
- 在Nsight Systems中进行工作负载和函数追踪。
- 使用Python NVTX模块注解
.py文件。 - 用户自定义注解注入配置文件。
- 支持PyTorch(包括层)、RAPIDS、DASK。
-
JupyterLab扩展: 适用于Nsight Systems和Nsight Compute。
- 对单个单元格进行性能分析。
- 在JupyterLab内通过Nsight工具GUI查看报告。
附加资源
开发者工具视频系列
提供了一个YouTube播放列表,旨在帮助用户开始使用NVIDIA开发者工具进行CUDA开发。该系列视频将帮助用户提高使用工具的熟练度,并将示例应用到自己的开发环境中。内容涵盖分析性能报告、调试技巧以及优化CUDA代码的最佳实践,主要关注Nsight Compute和Nsight Systems。
视频列表包括:
- CUDA开发者工具 | Nsight工具生态系统简介
- CUDA开发者工具 | Nsight Systems简介
- CUDA开发者工具 | Nsight Compute简介
- CUDA开发者工具 | 使用NVIDIA Nsight Systems进行性能分析
- CUDA开发者工具 | 使用NVIDIA Nsight Compute进行SOL分析
- CUDA开发者工具 | 使用NVIDIA Nsight Compute进行内存分析
GTC上的开发者工具相关活动
会议 (Sessions)
- S72527: 比你想象的更容易——使用智能开发者工具调试和优化CUDA
- S72537: 优化多语言科学模拟:一个Grace超级芯片案例研究
- S72867: 面向加速计算的AI开发者工具——稀缺数据并不可怕
- S73224: 使用Nsight Graphics进行混合CUDA/Graphics应用程序的性能分析
- S72435: 探索面向加速计算应用开发的AI辅助开发者工具
实验 (Labs)
- DLI71670: 发现瓶颈——使用Nsight Systems优化AI管道
- DLI71640: AI及其他领域的内核优化——释放Nsight Compute的力量
- DLI72423: 精通Nsight:光线追踪应用的GPU性能分析
- DLI74509: Nsight分析系统:构建自定义Python分析脚本,以单节点和多节点应用揭示性能和瓶颈
与专家交流 (Connect with the Experts)
- CWE72393: 你的开发者工具箱里有什么?CUDA和图形性能分析、优化和调试工具
- CWE72433: CUDA开发者最佳实践
- CWE72456: 性能分析和优化
- CWE73338: 如何在NVIDIA Grace CPU上运行和优化你的工作负载
现场演示 (Live demos)
- 请访问NVIDIA展位的AI辅助开发者工具展台。
开发者工具是免费的,可在线获取,并包含在CUDA工具包中。
支持可通过以下方式获得:
https://forums.developer.nvidia.com/c/developer-tools
更多信息请访问:
https://developer.nvidia.com/tools-overview