本文最后更新于2024年4月24日,已超过 60 天没有更新,如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

为什么使用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是对图像渲染之类操作的细化。

Transitioning to Nsight Systems from NVIDIA Visual Profiler / nvprof ...

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系统有两种安装方式:

  1. CUDA ToolKit
  2. Nsight Systems - Get Started | NVIDIA Developer

一般情况下不需要考虑第二种安装方式,除非你有独立使用的需求或者想要装最新版,如果你本地的nvcc能跑起来,cuda toolkit就应该已经装好了,使用cuda toolkit安装会默认把host和target端都装上。

Clip_2024-04-23_01-42-26

windows端

Clip_2024-04-23_15-54-42

linux端

第二种方式可以安装到最新版本,如 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打开,

    1. 在file->New Project中创建一个新项目

    2. 选择一个要连接的target设备,本地连接选择第二个,其他连接选择Configure targets,这里以本地连接为例。

      Clip_2024-04-24_14-55-39

    3. 在下面的界面中勾选需要的模块,模块功能和CLI中对应功能的是对应名字的是一致的,必填的只有 Target application模块,其中的 Command line with arguments 等同于CLI中的 [application] [application arguments],需要填入待执行文件的绝对路径,Working directory为待执行文件所在的目录。填写完毕后点击右侧的start开始生成

      Clip_2024-04-24_15-00-40

3.2可视化

可视化只需要用GUI工具打开对应的报告就行了,没什么特殊操作,对于CLI生成的.nsys-rep文件可以在NVIDIA Nsight Systems 中 File -> open 选中需要打开的文件。由于Nsight System收集了很多信息,学会看懂这些信息也是一个挑战。

[TODO 3.3 NVTX&性能分析]

4.参考

安装指南 — nsight-systems 2024.2 文档 --- Installation Guide — nsight-systems 2024.2 documentation (nvidia.com)

用户指南 — nsight-systems 2024.2 文档 --- User Guide — nsight-systems 2024.2 documentation (nvidia.com)


有帮助的话请打个赏吧!