我对一种在GPU上运行时测量自定义Tensorflow操作的详细性能的方法感兴趣。在
到目前为止,我已经尝试了使用时间线的this post方法,以及内部Tensorflow Profiler(tf.profiler.Profiler
)。两种方法的结果非常相似,如果我想研究一个网络,这是很好的,但对于分析单个操作,输出太粗糙,不包括操作内计算(至少我找不到方法)。我的下一个尝试是使用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%)
所以在我看来,我的定制操作在GPU上花费了同样多的时间,但在CPU上却要长一个数量级。对于一个GPU操作,这是不可接受的,我想知道我的操作在CPU上花了多少时间。另外让我吃惊的是,我的操作系统似乎只分配了原来Conv操作系统的三分之一的GPU内存。在
有没有一种方法可以获得我的自定义操作(包括CPU和GPU使用情况)的详细资料,向我解释我做错了什么,并帮助我改正错误?在
目前没有回答
相关问题 更多 >
编程相关推荐