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

在TensorFlow/cuDNN中,NCHW比NHWC快多少?,tensorflow,gpu,Tensorflow,Gpu,国家: CNN使用的大多数TensorFlow操作都支持NHWC和NCHW数据格式。在GPU上,NCHW更快。但在CPU上,NHWC有时更快 对于卷积,在TensorFlow/cuDNN中,NCHW比NHWC快多少?这方面是否有任何参考或基准 还有,为什么速度更快?据我所知(请参阅),GPU上NHWC的TensorFlow在内部总是转置到NCHW,然后为NCHW调用cuDNN conv内核,然后将其转置回。但为什么会这样呢?cuDNN conv内核也适用于NHWC。也许在某个时候,他们进行了比较

国家:

CNN使用的大多数TensorFlow操作都支持NHWC和NCHW数据格式。在GPU上,NCHW更快。但在CPU上,NHWC有时更快

对于卷积,在TensorFlow/cuDNN中,NCHW比NHWC快多少?这方面是否有任何参考或基准


还有,为什么速度更快?据我所知(请参阅),GPU上NHWC的TensorFlow在内部总是转置到NCHW,然后为NCHW调用cuDNN conv内核,然后将其转置回。但为什么会这样呢?cuDNN conv内核也适用于NHWC。也许在某个时候,他们进行了比较,而NHWC的cuDNN conv内核非常慢。但这是最新的吗?差别有多大?NHWC如此缓慢的技术原因是什么?或者这种情况下的cuDNN内核没有得到很好的优化?

从TF1.1开始,您甚至不能直接调用NHWC。TF执行与NCHW之间的转换。因此,无论在cuDNN中实施NHWC的效率如何,从TF用户的角度来看,NCHW的速度更快:


性能比当然取决于问题,但我的感觉是它很大,如果可以避免的话,你不想使用NHWC(在GPU上)(看起来你也在浪费内存)

我认为手动优化布局没有多大意义,特别是因为
data\u format=“channels\u first”
看起来比在整个TensorFlow中坚持默认值要详细得多,因为内部应该处理好它

我预计最多会有两个百分点的NCW更快的训练时间,随着时间的推移,我预计XLA-JIT编译成熟时,性能差异将消失。 使用Keras,您可以使用
K轻松地尝试这两种格式。因此,请同时尝试这两种格式,看看它对您的特定型号有何影响


这是一个带有VGG模型的小型基准测试,原因是大多数简单卷积的实现(这里不说winograd或fft)最终都会执行某种简单的矩阵乘法,这意味着在它们的内部循环中,它们会将张量中的一些值相乘,并将结果相加

在CPU实现中,使用SSE或AVX优化,沿着C维度执行此操作会更快,因为您只需将值4乘以4或8乘以8,然后在添加所有C维度后,在最后执行缩减(将4或8个累积相加)

然而,在GPU上,跨线程执行缩减是一项成本更高的操作(至少在开普勒引入包裹级别原子操作之前是如此),因此历史上它已经过优化,以便包裹中的每个线程读取连续(内存中)HW值,并使用循环在C部分上进行累积

请注意,尽管最新的nvidia卡(RTX)现在有张量乘法核心,可以在一次操作中处理小数据块,包括减少C的一小部分,因此在这些卡上使用NHWC(或混合NCHCW格式)实际上更快。

CPU端:

让我们假设他们的输入和过滤器都被转换为GEMM:对于NCHW,im2col之后的输入形状是
W[输出通道,输入通道*过滤器高度*过滤器宽度]
X[输入通道*过滤器高度*过滤器宽度,输出高度*输出宽度]
,对于NHWC,im2col之后的输入形状是
X[out_height*out_width,filter_height*filter_width*in_Channel]
W[filter_height*filter_width*in_Channel,out_Channel]
,前一个会做得很好,后一个会做得很好,因为你可以看到差异只出现在
out\u通道
第一位或
out\u高度*out\u宽度
第一位,你几乎可以看出任何性能差异,因为GEMM是高度优化的,将使用一些封装和平铺技术我们可以做小的矩阵乘法

NCHW最大的任务来自im2col,因为对于NHWC,您可以存储内部moset in_通道数据,而NCHW需要从一行跳到另一行,从一个通道跳到另一个通道以获得完整的数据补丁(这也是XNNPACK为提高性能所做的)

GPU端:


我还不太清楚。

为什么这是离题?我回答了你的问题吗?@MaxB:嗯,还没有完全回答。我把我的问题扩展了一点,以便更清楚地说明我想知道的内容。“一点”?!你使用我提供的链接添加了六个新的Qs…我并没有投你反对票--只是撤销了我之前的+1。我们现在有一份关于这一点的出版物,我们比较了NHWC和NCHW,NCHW几乎快了2.5倍。所以这绝对不是百分之几。