1. 使用nvprof输出kernel timeline数据
Kernel Timeline 输出的是以gpu kernel 为单位的一段时间的运行时间线,我们可以通过它观察GPU在什么时候有闲置或者利用不够充分的行为,更准确地定位优化问题。nvprof是nvidia提供的用于生成gpu timeline的工具,其为cuda toolkit的自带工具。使用方法如下:
nvprof -o out.nvvp -f --csv --profile-from-start off python3 mnist.py
-o
用于输出 .nvvp
文件,-f
用于强制覆盖, --csv
可是在console输出除 timeline 以外数据的时候以逗号分隔数据,方便拷贝至csv文件。我们需要重点讲一下--profile-from-start
。
往往我们只需要监测中间模型运行的部分,忽略掉预处理的部分,让生成的timeline短一些。所以需要让nvprof不要从程序一开始就运行,而是在代码中手动设置开启。设置开启的方法是先在代码中插入如下函数:
import ctypes
_cudart = ctypes.CDLL('libcudart.so')
def cu_prof_start():
ret = _cudart.cudaProfilerStart()
if ret != 0:
raise Exception('cudaProfilerStart() returned %d' % ret)
def cu_prof_stop():
ret = _cudart.cudaProfilerStop()
if ret != 0:
raise Exception('cudaProfilerStop() returned %d' % ret)
然后在对应位置插入:
for epoch in range(EPOCHS):
...
flag = False
cu_prof_start()
for images, labels in train_ds:
if flag:
cu_prof_stop()
flag = True
train_step(images, labels)
...
这样我们就可以只监测一个迭代步了。
nvprof的其余flag信息可见
CUDA Toolkit Documentationdocs.nvidia.com
https://docs.nvidia.com/cuda/profiler-users-guide/index.html#nvprof-overview
2 使用nvvp或nsight eclipse edition查看nvprof输出
因为我们的模型常常是运行在远端的服务器上,我们需要把输出的监测数据拷贝至本地查看。对于nvprof生成的`.nvvp`文件来说,需要在本地使用nvvp或nsight eclipse进行查看。这两者也都是cuda toolkit中自带的。需要强调的是,即使本地电脑没有N卡也是可以安装cuda toolkit的(最新版本macOS除外,详情见文末注意事项)。
2.1 安装
以下安装指在用来查看数据的电脑上装。运行代码的机器只需要配置好cuda就可以了。
- 安装cuda
请从官网下载安装包,对于没有n卡的机子只需要安装toolkit就可以了。目前cuda 10.1测试通过,10.2的nvvp在打开时会卡死。同样的错误请见
安装后运行nvcc --version
测试是否成功。
- 安装jdk
对于jdk的版本,nsight文档中说只支持到151,但是本地安装现在最新的241版本测试成功。
安装后运行java -version
测试是否成功。并运行nsight
或nvvp
测试是否可以正常打开nsight或nvcc。注意,这里的nsight指nsight eclipse plugin edition(不需要安装eclipse)。
2.2 打开并查看文件
命令行输入nvvp
以打开,File->Import后选择CUDA->nvprof,下一步后按照具体情况选择是single session还是multiple session,下一步在timeline data file处点击browse,选择已经传到本地的.nvvp
文件即可。使用nsight类似。下图为使用nvvp的一个样例:
3 注意事项
因为在macOS 10.15之后无法安装cuda toolkit,以上工具会无法正常使用(无法用mac电脑查看数据)。