Python Tensorflow-配置文件自定义操作

Python Tensorflow-配置文件自定义操作,python,tensorflow,profiling,nvprof,Python,Tensorflow,Profiling,Nvprof,我对一种在GPU上运行时测量自定义Tensorflow Op的详细性能的方法感兴趣 到目前为止,我已经尝试了使用时间线以及内部Tensorflow探查器(tf.Profiler.Profiler)的方法。两者都提供了非常相似的结果,如果我想调查一个网络,这很好,但对于分析单个Op来说,输出太粗糙,并且不包括Op内的计算(至少我找不到这样做的方法)。我的下一次尝试是使用CUDA探查器nvpprof(或nvp),它的方向更加正确,并显示对CUDA内核和内存分配的单个调用。但现在,CPU计算不包括在内

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

到目前为止,我已经尝试了使用时间线以及内部Tensorflow探查器(
tf.Profiler.Profiler
)的方法。两者都提供了非常相似的结果,如果我想调查一个网络,这很好,但对于分析单个Op来说,输出太粗糙,并且不包括Op内的计算(至少我找不到这样做的方法)。我的下一次尝试是使用CUDA探查器
nvpprof
(或
nvp
),它的方向更加正确,并显示对CUDA内核和内存分配的单个调用。但现在,CPU计算不包括在内。我尝试在上运行
nvprof--cpu评测,但现在评测器从未完成(请参阅)

我的场景如下:我编写了一个自定义运算,它非常类似于2D中的卷积运算,并且不会花费太多时间来计算。在网络中,我的自定义Op的性能大约是
tf.nn.conv2d
的3倍。使用
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操作,这是不可接受的,我想知道我的操作在CPU上花费了多少时间。另外让我吃惊的是,我的操作似乎只分配了原Conv操作所分配的GPU内存的三分之一


有没有一种方法可以获得我的定制操作的详细配置文件(包括CPU和GPU使用情况),可以向我解释我做错了什么,并帮助我修复错误

我也希望看到更详细的分析视图。你最后调查了什么?我的假设是Conv2D正在使用Winograd实现,这需要更大的内存消耗(使用conv权重预计算中间值)。