Python Tensorflow-配置文件自定义操作
我对一种在GPU上运行时测量自定义Tensorflow Op的详细性能的方法感兴趣 到目前为止,我已经尝试了使用时间线以及内部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计算不包括在内
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权重预计算中间值)。