CNN使用的大多数TensorFlow操作都支持NHWC和NCHW数据格式。在GPU上,NCHW更快。但在CPU上,NHWC有时更快。
在TensorFlow/cuDNN中,NCHW比NHWC快多少?对此是否有参考或基准?
还有,为什么它更快?据我了解(请参阅这里),GPU上的NHWC的TensorFlow将始终在内部转到NCHW,然后调用NCHW的cuDNN conv内核,然后将其转回。但它为什么要这么做?cuDNN conv内核也适用于NHWC。也许在某个时候,他们做了比较,cuDNN内核的NHWC非常慢。但这是最新的吗?差别有多大?NHWC速度这么慢的技术原因是什么?还是这种情况下的cuDNN内核没有得到很好的优化?
发布于 2020-06-06 19:58:41
原因是大多数简单卷积的实现(这里没有讨论winograd或fft ),最终都是做某种简单的矩阵乘法,这意味着在它们的内环中,它们从两个张量中相乘一些值,并对结果进行求和。
在CPU实现中,使用SSE或AVX优化,沿着C维度这样做速度更快,因为您只需乘以--将值4乘4或8乘以8,然后在添加所有C维度后,在最后进行还原(4或8累加之和)。
然而,在GPU上,跨线程进行缩减是一种更昂贵的操作(至少在开普勒引入包级原子操作之前是这样的),因此从历史上看,它是经过优化的,这样在一个包中的每个线程都会连续(在内存中)读取HW值,并通过一个循环在C的各个部分上进行积累。
请注意,最新的nvidia卡(RTX)现在有张量乘法核,可以在一次操作中处理小块,包括减少一小部分C,因此在这些卡上使用NHWC (或混合NCHWC格式)实际上更快。
发布于 2017-05-31 17:35:41
从TF1.1开始,甚至不能直接调用NHWC。TF进行NCHW与NCHW的转换。因此,无论在cuDNN中实现NHWC的效率如何,从TF用户的角度来看,NCHW更快:
https://github.com/tensorflow/tensorflow/issues/8286
当然,性能比率将取决于问题,但我的感觉是,它很大,如果您能够避免使用NHWC (在GPU上),您就不想使用它(似乎您也在浪费内存)。
发布于 2018-06-25 11:27:51
我不认为手动优化布局有多大意义,特别是因为data_format="channels_first"
看起来比在整个TensorFlow中坚持默认布局要冗长得多,而且内部应该处理它。
我预计NCHW最多能缩短几个百分点的训练时间,而且随着XLA编译的成熟,随着时间的推移,这种性能差异会消失。
使用Keras,您可以很容易地使用K.set_image_data_format
来尝试这两种方法,因此尝试两者,看看它对您的特定模型有什么不同。
下面是一个带有VGG模型https://gist.github.com/carlthome/51d62cbf5fc23098418eef93b11a5d78的小基准测试
https://stackoverflow.com/questions/44280335
复制相似问题