首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在TensorFlow/cuDNN中,NCHW比NHWC快多少?

在TensorFlow/cuDNN中,NCHW比NHWC快多少?
EN

Stack Overflow用户
提问于 2017-05-31 09:05:33
回答 4查看 14.3K关注 0票数 15

官方的TensorFlow性能指南声明:

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内核没有得到很好的优化?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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格式)实际上更快。

票数 8
EN

Stack Overflow用户

发布于 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上),您就不想使用它(似乎您也在浪费内存)。

票数 4
EN

Stack Overflow用户

发布于 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的小基准测试

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44280335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档