本文主要讨论一下为什么卷积加速更加喜欢 NHWC
的数据排布。
我目前接触过的数据排布类型(主要针对卷积)有 NCHW
(pytorch、caffe),NHWC
(Tensorflow,也是 TVM GPU 和 寒武纪 MLU Core 上更喜欢的 data Layout), CHW
(TensorRT里不考虑动态batch的话是把 N 拿出来了,只剩三维),NCHWC0 (华为昇腾 AI Core 的五维 Layout,C0 INT8时为32,FP16时为16)。为什么会有这么多数据类型排布呢,原因可能是源于不同的训练框架,比如 pytorch 和 tensorflow (大部分人的炼丹炉) 就不一样,而在推理时,更多的会考虑硬件 / 推理性能更喜欢什么样的数据类型排布。
这里主要谈谈对于 img2col+gemm
和 winograd
卷积加速算法来说,为什么 NHWC
比 NCHW
更合适 (GPU上),也是我个人的理解。
1、img2col+gemm 和 winograd 算法原理
img2col+gemm
的详细原理可以看我的这篇《【模型推理】一文看懂Img2Col卷积加速算法》,就是先把 feature map 按卷积核走过的 “踪迹” 展开、拼接 与 拉扁拉长的卷积核 进行 gemm<