趋近智
理论很重要,但性能优化本质上是一门经验科学。对一个简单的、经过优化的机器学习模型组件进行性能分析,以展示优化实践。我们将模拟一个场景:一个在许多机器学习模型中很重要的矩阵乘法(GEMM)运算,被ML编译器编译并针对NVIDIA GPU进行了优化。我们的目的是使用NVIDIA Nsight Compute来分析其性能表现。
假设我们有一个已编译的可执行文件gemm_optimized,它执行矩阵乘法C=A×B,其中A、B和C是大型矩阵。ML编译器已应用了诸如分块、共享内存利用和指令调度等优化,以生成高效的CUDA内核。
我们的目标硬件是NVIDIA GPU(例如,Ampere或Hopper架构的GPU)。我们将主要使用NVIDIA Nsight Compute (ncu),这是一个详细的内核性能分析工具。
Nsight Compute可以通过命令行或其图形用户界面(GUI)使用。对于自动化分析或脚本编写,命令行通常更受青睐。为了捕获详细的性能数据,我们可以在ncu下执行已编译的程序。
# 确保CUDA工具包的二进制文件在您的PATH中
# 示例:对可执行文件'gemm_optimized'进行性能分析
# --set full: 收集一套全面的指标(可能耗时)
# -o profile_report: 将报告保存到名为'profile_report.ncu-rep'的文件
# ./gemm_optimized: 要进行性能分析的可执行文件
ncu --set full -o profile_report ./gemm_optimized
此命令运行gemm_optimized并收集应用程序启动的每个CUDA内核的详细性能数据,将其保存到profile_report.ncu-rep。为了更快地分析特定方面,您可以使用预定义的指标集(例如,--set roofline,--set memory)或指定单个指标。
您可以使用Nsight Compute GUI (nv-nsight-cu) 打开profile_report.ncu-rep文件,或通过命令行直接分析其内容(ncu --query-metrics ... profile_report.ncu-rep)。让我们关注通常在GUI或详细CLI报告中查看的主要部分。
报告会列出所有启动的CUDA内核。识别负责矩阵乘法的主要内核。它的名称可能具有提示性,如gemm_kernel、matmul_core,或是由编译器内部表示派生出的复杂名称。将您的分析集中在此内核上,特别是如果它占用了大部分GPU执行时间。
GPU 光速 (SOL) 吞吐量:
这个简化版屋脊图展示了两个内核。内核A(红色)运行在内存和计算上限以下,表明存在效率低下。内核B(蓝色)更接近计算上限,表明它可能是计算受限的。
占用率:
已达到的占用率,并识别限制因素:每SM的块数、每线程的寄存器数、每块的共享内存。指令统计:
指令发射槽利用率(使用了多少指令发射槽)和每时钟周期执行指令数(IPC)等指标。sqrt或超越函数),或编译器调度未能充分发挥并行性。高控制流分歧(warp中不同线程选择不同路径)会显著降低性能。内存工作负载分析:
内存吞吐量等指标显示了与峰值相比的实际带宽。查看内存操作(全局、本地、共享)的分类情况。比较了不同内存级别实际达到的带宽与理论峰值带宽。DRAM级别的高利用率表明内核可能是内存受限的。
源代码/汇编关联(可选但有效):
性能分析很少是一次性完成的过程。基于分析结果:
本次实践展示了性能分析工具如何连接高层ML模型与低层硬件执行。通过系统地分析Nsight Compute等工具提供的性能指标,您可以诊断编译器和运行时引入或未解决的瓶颈,从而指导进一步的优化工作,以实现ML工作负载的最佳性能。请记住,查阅您选择的性能分析工具和硬件的特定文档,以获取详细的指标定义和高级功能。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造