我对一种在GPU上运行时测量自定义Tensorflow Op的详细性能的方法感兴趣。
到目前为止,我已经尝试使用时间轴以及内部Tensorflow Profiler(tf.profiler.Profiler
)来使用this post的方法。两者都提供非常相似的结果,如果我想研究网络,这很好,但是对于分析单个Op而言,输出太粗糙了,并且不包含运算内部的计算(至少我找不到这种方法) 。我的下一个尝试是使用CUDA探查器nvprof
(或与此有关的nvvp
),它的方向更正确,并显示对CUDA内核和内存分配的单个调用。但是现在,不包括CPU计算。我尝试运行nvprof --cpu-profiling on
,但现在分析器无法完成(请参见here)
我的情况如下:我编写了一个自定义Op,它与2D中的卷积非常相似,不需要花费太多时间进行计算。在网络中,我的自定义操作的性能比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%)
所以在我看来,我的自定义Ops在GPU上花费的时间差不多,但是在CPU上花费的时间却要多一个数量级。对于GPU Op,这是不可接受的,我想找到我的Ops在CPU上花费的时间。令我惊讶的是,我的操作人员似乎只分配了原始Conv Ops所需要的GPU内存的三分之一。
是否可以获取自定义Op的详细配置文件(包括CPU和GPU使用情况),该配置文件可以向我解释我做错了什么并帮助我纠正错误?