为什么使用Nsight System?
CUDA编程主要研究的是HPC(高性能计算),要写出一个高效的程序需要反复优化,以及对硬件和编程细节的详细了解,怎么评估效率,时间是一个很直观的测量方式,但是对于CPU-GPU的异构架构,我们通过CPU的计时器给GPU计时存在很多干扰因素,如核函数launch的时间,和主机同步的时间,这样测量存在较大的误差,除了核函数的计时还有很多显存操作如HtoD,DtoH,Stream的协同等编程细节也需要被计时,对于这些需求Nvidia官方推出了NvProf,Nvvp,Nsight等工具,Nsight是前两个工具的改良版。
Nsight System是什么?
Nsight System是Nvidia Nsight系列工具中的一个,除他以外还有Nsight Compute,Nsight Graphics,三者的区别在于侧重的领域,Nsight的System是一个全系统范围的监控工具,可以在粗粒度上监控CPU和GPU的调用关系,如什么时候开始把数据从CPU移动到GPU,持续多久,什么时候开始发射kernel,kernel与kernel之间或kernel与内存读写之间有没有做overlap(一种并行或并发)等,Nsight Compute是对System中粗粒度的kernel执行过程的细化,Nsight Graphics是对图像渲染之类操作的细化。
1.环境要求
Nsight System支持很多硬件和系统平台,这里只讨论windows(x86_64)和linux(x86_64),需要注意的是目前Nsight System只能支持64位的操作系统。Nsight System软件包括两个部分,执行要监控的程序以收集数据的target端,和用来可视化的host端。target端对于环境的要求比较严格,它负责全系统范围内包括CPU和GPU的各种事件和API的监控,host端比较宽松,只做一些可视化,也会提供一些使用GUI连接到target端0代码生成出报告的功能。
1.1 target端
-
cuda版本 > 10.0
下面提供几种可以查看cuda版本的方式:
nvcc -V
指令- deviceQuery脚本
windows下一般会配置CUDA_PATH环境变量,可以使用指令"%CUDA_PATH%/extras/demo_suite/deviceQuery"
,其中CUDA_PATH的值一般为C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\<版本号>
linux下一般会配置CUDA_HOME环境变量,可以使用指令${CUDA_HOME}/extras/demo_suite/deviceQuery
,其中CUDA_HOME的值一般为/usr/local/cuda
⚠Note :
官方文档中给的
/usr/local/cuda/samples/1_Utilities/deviceQuery
路径已不适用于12.0+的cuda -
linux(x86_64)下要求:
- linux中需要设置perf_event_paranoid <=2
cat /proc/sys/kernel/perf_event_paranoid #查看 sudo sh -c 'echo 2 >/proc/sys/kernel/perf_event_paranoid' #设置为2(临时) sudo sh -c 'echo kernel.perf_event_paranoid=2 > /etc/sysctl.d/local.conf' #设置为2(永久)
-
系统内核版本
CentOS >= 3.10.0-693
RedHat Enterprise Linux > 7.4
Ubuntu >= 4.3
使用uname -a
指令查看系统kernel信息 -
glibc版本 > = 2.17
使用ldd --version
指令查看 -
Nsight System需要有
/var/lock
目录的写入权限
-
windows(x86_64)下要求:
- Windows 10
- NVIDIA驱动版本 >= 411.63
1.2 host端
- Windows 10、Windows Server 2019。仅支持 64 位版本
- Linux Ubuntu 14.04 及更高版本是验证过可以支持的,在其他发行版上运行也应该是可能的。仅支持 64 位版本
2.安装
对于 x86_64 处理器架构的windows和linux系统有两种安装方式:
一般情况下不需要考虑第二种安装方式,除非你有独立使用的需求或者想要装最新版,如果你本地的nvcc能跑起来,cuda toolkit就应该已经装好了,使用cuda toolkit安装会默认把host和target端都装上。
第二种方式可以安装到最新版本,如 2024.2.1.106-242134037904v0的版本,linux端推荐使用runfile安装。
⚠Note :
1.使用cuda toolkit安装方式在windows安装后,是无法直接使用
nsys
指令和nsys-ui
指令的,需要手动把target-windows-x64
目录和host-windows-x64
目录加入到环境变量path中。其中nsys
指令为Nsight System的缩写是target端的cli,nsys-ui
为host端的GUI。2.目前,Nsight System的target端不支持WSL2,包括目前最新的2024.2.1.106-242134037904v0版本(我测试过)(参考)。
3.使用
Nsight System的使用大致可以分为生成report和可视化。这里只会给出操作的逻辑,参数和细节还得看官方文档。
ⓘ Info:
除了上面描述的两个功能,该工具提供了很多其他操作,如对报告的后处理根据专家系统生成报告等。文档中对应的这部分👈
3.1生成report
生成report有两种方法,使用target端的CLI工具生成和使用host端连上target设备通过GUI操作生成。
ⓘ Info:
部分操作需要管理员权限,可以使用
nsys status -e
查看当前执行环境的信息。
-
target端CLI工具生成
使用CLI工具也有两种方式,profile和交互式。
- profile
nsys profile [options] [application] [application-arguments]
常见的options有
option description -y | --delay 数据采集延迟开始的时间(秒),默认值0 -d | --duration 数据采集持续的时间(秒),如果用户指定了--kill=none持续时间就会失效。 -e | --env-var 指定环境变量eg: -e TEST_ONLY=0 -f | --force-overwrite 用于指定输出是否覆盖同名文件,可选项 true、false, 默认值false -o | --output 设置输出report的名称,可使用特殊标识,%h(系统的hostname),%p(进程的pid) -s | --sample cpu数据的采样范围,可选参数 process-tree、system-wide、none,默认值process-tree -w | --show-output 是否把stdout和stderr信息显示到控制台,默认值true -t | --trace 选择要跟踪的api,默认值cuda, opengl, nvtx, osrt ⚠Note :
option的缩写和完整写法的使用方式不同
nsys profile -y 10 [app] [app args]
等价于nsys profile --delay=10 [app] [app args]
常见的场景如下
nsys profile -t cuda,nvtx,cudnn,cublas,osrt -f true --delay=60 -o my_dnn ./my_dnn.exe
指定需要跟踪cuda,nvtx,cudnn,cublas,osrt的信息,输出文件名为my_dnn,延迟60秒开始收集数据,输出覆盖同名文件
application 可以是nvcc编译出的二进制也可以是python
nsys profile -t cuda,nvtx,cudnn,cublas,osrt -f true --delay=60 -o my_dnn python ./my_dnn_script.py
ⓘ Info:
使用 nsys profile --help 查看更多参数或者跳转到文档对应部分👈,有缩写的指令比较常用,可以优先看
- 交互式
交互式可以手动控制数据收集过程的开始和结束
nsys start --stop-on-exit=false nsys launch --trace=cuda,nvtx --sample=none
[application-arguments] nsys stop 在没有launch app的时候使用start先开启交互进程此时不会收集数据,将会在launch app的时候开始收集,在stop执行后停止,如果一直不敲stop,最长会收集5分钟后自动停止(为了防止数据承包你的硬盘)。
nsys launch --trace=cuda,nvtx --sample=none
[application-arguments] nsys start nsys stop nsys start nsys stop 先执行launch可以在多个start,stop中使用。
eg:
E:\Laboratory\cudaLearn>nsys launch -t cuda,nvtx ./matmul_baseline.exe E:\Laboratory\cudaLearn>nsys start E:\Laboratory\cudaLearn>nsys stop Generating 'C:\Users\zhou.jianqi\AppData\Local\Temp\nsys-report-b657.qdstrm' [1/1] [========================100%] report1.nsys-repGenerated: E:\Laboratory\cudaLearn\report1.nsys-rep E:\Laboratory\cudaLearn>nsys start E:\Laboratory\cudaLearn>nsys stop Generating 'C:\Users\zhou.jianqi\AppData\Local\Temp\nsys-report-5408.qdstrm' [1/1] [========================100%] report2.nsys-rep Generated: E:\Laboratory\cudaLearn\report2.nsys-rep
ⓘ Info:
-
host端GUI生成
找到NVIDIA Nsight System软件打开,命令行中可以使用指令
nsys-ui
打开,-
在file->New Project中创建一个新项目
-
选择一个要连接的target设备,本地连接选择第二个,其他连接选择Configure targets,这里以本地连接为例。
-
在下面的界面中勾选需要的模块,模块功能和CLI中对应功能的是对应名字的是一致的,必填的只有 Target application模块,其中的 Command line with arguments 等同于CLI中的 [application] [application arguments],需要填入待执行文件的绝对路径,Working directory为待执行文件所在的目录。填写完毕后点击右侧的start开始生成
-
3.2可视化
可视化只需要用GUI工具打开对应的报告就行了,没什么特殊操作,对于CLI生成的.nsys-rep
文件可以在NVIDIA Nsight Systems 中 File -> open 选中需要打开的文件。由于Nsight System收集了很多信息,学会看懂这些信息也是一个挑战。
[TODO 3.3 NVTX&性能分析]
4.参考
用户指南 — nsight-systems 2024.2 文档 --- User Guide — nsight-systems 2024.2 documentation (nvidia.com)
Comments | NOTHING