当前位置: 首页 > 知识库问答 >
问题:

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

濮升
2023-03-14

官方TensorFlow性能指南规定:

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

共有3个答案

顾嘉良
2023-03-14

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

我最多期望有两个百分点的NCHW更快的训练时间,随着时间的推移,我预计XLA JIT编译成熟时,性能差异将消失。

使用Keras,您可以使用K轻松地尝试这两种格式。因此,请同时尝试这两种格式,看看它对您的特定型号有何影响。

这里是一个带有VGG模型的小基准https://gist.github.com/carlthome/51d62cbf5fc23098418eef93b11a5d78

董宜然
2023-03-14

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

https://github.com/tensorflow/tensorflow/issues/8286

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

吕高寒
2023-03-14

原因是大多数简单卷积的实现(这里不谈winograd或fft),最终会做某种简单的矩阵乘法,这意味着在它们的内部循环中,它们从两个张量中乘以一些值并求和结果。

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

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

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

 类似资料:
  • 许多用户认为这是切换到 Pytorch 的原因,但我还没有找到牺牲最重要的实际质量、速度来换取急切执行的理由/解释。 下面是代码基准测试性能,TF1与TF2-TF1的运行速度从47%到276%不等。 我的问题是:在图形或硬件级别,是什么导致了如此显着的减速? 寻找详细的答案-我已经熟悉广泛的概念。相关Git 规格:CUDA 10.0.130、cuDNN 7.4.2、Python 3.7.4、Win

  • 问题内容: 人们普遍认为Redis的速度非常快,而mongoDB的速度也很快。但是,我很难找到比较两者结果的实际数字。给定相似的配置,功能和操作(并可能显示因素如何随着不同的配置和操作而变化)等,Redis的速度快10倍吗?快2倍吗?快5倍吗? 我只说性能。我知道mongoDB是另一种工具,具有更丰富的功能集。这不是“ MongoDB 比Redis 更好 ”的争论。我问的是,Redis在什么方面优

  • 我目前正在将一个模型从TensorFlow转换为TensorFlow Lite。通过首先创建一个检查点和一个保存的失重图(.pbtxt),然后使用freeze\u graph()函数将模型冻结为具有图权重的.pb,最后在冻结的模型文件上运行tflite\u convert命令,我将模型从常规TF1.x会话转换为.tflite文件。在此过程中没有量化-保留了浮动。在那之后,我把模型放进Android

  • 我目前正在研究单图像超分辨率,我设法冻结了一个现有的检查点文件,并将其转换为tensorflow lite。然而,当使用.tflite文件执行推断时,对一个图像进行上采样所需的时间至少是使用.ckpt文件恢复模型时的4倍。 使用. ckpt文件的推理使用session.run()完成,而使用. tflite文件的推理使用interpreter.invoke()完成。这两个操作都是在典型PC上运行的

  • 我知道React创建一个虚拟DOM并比较差异,然后只是更新真实DOM的实际元素,但是如果手动更改它,如何更有效呢?通过还是使用jQuery函数?

  • 问题内容: 我可以在网上(在Stack Overflow上以及其他方面)找到大量有关使用Python或在Python中进行连接是一种非常低效且不好的做法的信息。 我似乎找不到为什么效率如此低下。在这里没有提到“在某些情况下已针对20%的改进进行了优化”(仍然不清楚这些情况是什么),我找不到任何其他信息。 在比其他Python串联方法更好的技术水平上发生了什么? 问题答案: 假设您有这段代码可以从三