在 Ubuntu 上安装和使用 nsys

安装

nsys 来自包 cuda-nsight-systems-11-7(和自己的 CUDA 版本对应一下)。

在网上一直都没有搜到安装方式,官网也说的不明不白。尝试过两个错误的包:

  • nsight-systems:这个是 Qt 写的图形界面程序,提供的二进制可执行程序是 nsight-sys
  • nvidia-nsight:这个是 Java 写的图形界面程序,提供的二进制可执行程序是 nsight

使用

nsys profile --stat=true xxx 运行完程序后得到 report1.nsys-rep,report 后面的编号是自动增长的,而 --stat=true 表示用文本形式在命令行输出信息。如果有条件可以把 report1.nsys-rep 下载下来然后用本地的图形化程序加载分析。

但是这样导出的程序看不到 CUDA 内存占用。为了看到 CUDA 内存占用情况,考虑:

nsys profile --cuda-um-cpu-page-faults=true \
    --cuda-um-gpu-page-faults=true \
    --cudabacktrace=all \
    --cuda-memory-usage=true \
    --gpu-metrics-device=0 <program>

但还是没有成功

  1. 从结果来看程序占用了 32 MiB 显存,但是 nvidia-smi 这类工具认为程序占用了 800 MiB 显存。难道是显存分配但未读写的部分不会被计入 nsys?
  2. 受到 paranoid 等级的限制,CPU 无法采样,CUDA backtrace 和 CUDA memory usage 无法开启。

又用 echo 2 | sudo tee /proc/sys/kernel/perf_event_paranoid 改了宿主机(不是容器)的 paranoid 等级(我的容器启动参数有 --pid=host,没有 --privileged),可以采样 CPU 了。

现在 nsys-ui 的诊断信息中还有一个错误(之前是两个),看上去是权限不够,得在创建容器的时候给 --cap-add=SYS_ADMIN

Caution

不清楚 paranoid 等级具体有什么用,我测试完已经改回去了。

接下来可以考虑的方法:参考 https://stackoverflow.com/questions/38758627 把容器停止,修改参数,然后重启 docker 服务。但是重启整个 docker 服务对我来说不太现实。Commit 现有容器再创建新容器也有点麻烦,就没兴趣继续看下去了。