3

我对在 GPU 上运行时测量自定义 Tensorflow Op 的详细性能的方法感兴趣。

到目前为止,我已经使用时间轴以及内部的 Tensorflow Profiler ( )尝试了这篇文章的方法。tf.profiler.Profiler两者都提供了非常相似的结果,如果我想调查网络,这很好,但是对于分析单个操作,输出太粗糙并且不包括操作内计算(至少我找不到方法) . 我的下一个尝试是使用 CUDA 分析器nvprof(或nvvp就此而言),它的方向更正确,并显示对 CUDA 内核和内存分配的单个调用。但是现在,不包括 CPU 计算。我试过运行nvprof --cpu-profiling on,但现在探查器永远不会完成(见这里

我的场景如下:我编写了一个自定义 Op,它与 2D 中的卷积非常相似,并且不应该花费更多时间来计算。在网络中,我的自定义 Op 的性能比tf.nn.conv2d. 使用tf.profiler.Profiler我得到以下信息:

Profile:
node name                    | requested bytes             | total execution time          | accelerator execution time    | cpu execution time
CustomConv2DBackpropInput     72.09MB (100.00%, 7.04%),     194.36ms (100.00%, 38.05%),     49.82ms (100.00%, 17.61%),      144.54ms (100.00%, 63.44%)
CustomConv2D                  65.54MB (92.96%, 6.40%),      95.41ms (61.95%, 18.68%),       45.16ms (82.39%, 15.96%),       50.25ms (36.56%, 22.06%)
CustomConv2DBackpropFilter    134.48MB (86.55%, 13.14%),    72.39ms (43.27%, 14.17%),       41.22ms (66.44%, 14.56%),       31.17ms (14.50%, 13.68%)
Conv2DBackpropFilter          294.68MB (73.41%, 28.79%),    63.39ms (29.10%, 12.41%),       62.80ms (51.87%, 22.19%),       594us (0.82%, 0.26%)
Conv2DBackpropInput           230.97MB (44.62%, 22.57%),    48.77ms (16.69%, 9.55%),        48.16ms (29.68%, 17.02%),       610us (0.56%, 0.27%)
Conv2D                        225.74MB (22.06%, 22.06%),    36.50ms (7.15%, 7.15%),         35.84ms (12.66%, 12.66%),       664us (0.29%, 0.29%)

所以在我看来,我的自定义操作在 GPU 上花费的时间差不多,但在 CPU 上的时间要长一个数量级以上。对于 GPU Ops,这是不可接受的,我想找到我的 Ops 在 CPU 上花费的时间。另外让我吃惊的是,我的 Ops 似乎只分配了原始 Conv Ops 分配的 GPU 内存的三分之一。

有没有办法获得我的自定义操作(包括 CPU 和 GPU 使用)的详细配置文件,可以向我解释我做错了什么并帮助我纠正错误?

4

0 回答 0