参考文档

  1. https://github.com/chinakook/MobileNetV2.mxnet MobileNetV2/MXNet训练
  2. https://github.com/MTCloudVision/mobilenetv2 MobileNetV2/MXNet Symbol
  3. http://blog.csdn.net/shenxiaolu1984/article/details/52373174 Spatial Convolution计算实现细节解释
  4. http://docs.tvmlang.org/tutorials/get_started.html#schedule-the-computation TVM split使用示例程序

随机模型数据

Mxnet预训练模型

  • [x] 验证nnvm的分类模型的识别有效性,通过验证imagenet的预训练模型

性能优化

# schedule description of spatial
SpatialPack = namedtuple('SpatialPack', ['vh', 'vw', 'vc', 'ba', 'bc', 'unroll'])

上面是Spatial Convolution运算相关的调度器描述,接下来先介绍调度器描述里面的字段具体含义,以方便进行调度器参数调整:

  • vh:卷积输出数据->特征图高度坐标轴(NCHW数据布局)->tile调度器->子块高度
  • vw:卷积输出数据->特征图高度坐标轴(NCHW数据布局)->tile调度器->子块宽度
  • vc:卷积输出数据->特征图输出通道坐标轴(NCHW数据布局)->split调度器->内层循环尺寸
  • ba:图像输入数据->图像高度坐标轴(CHW数据布局)->split调度器->内层循环尺寸
  • bc:权重输入数据->权重输入通道坐标轴(CIHW数据布局)->split调度器->内层循环尺寸
  • unroll:卷积输出数据->特征图子块(由vw决定)宽度坐标轴->unroll调度器->是否开启
_Schedule = namedtuple('Schedule', ['vh', 'vw', 'vc', 'bc', 'unroll'])

上面是Depthwise Convolution运算相关的调度器描述,接下来先介绍调度器描述里面的字段具体含义,以方便进行调度器参数调整:

  • vh:卷积输出数据->特征图高度坐标轴(NCHW数据布局)->tile调度器->子块高度
  • vw:卷积输出数据->特征图高度坐标轴(NCHW数据布局)->tile调度器->子块宽度
  • vc:卷积输出数据->特征图输出通道坐标轴(NCHW数据布局)->split调度器->内层循环尺寸
  • bc:权重输入(卷积输出)数据->权重输入(特征图输出)通道坐标轴(COHW数据布局)->split调度器->内层循环尺寸
  • unroll:卷积输出数据->特征图子块(由vw决定)宽度坐标轴->unroll调度器->是否开启

参考文档4中有一个关于使用split调度器的简单向量加法程序,节选如下:

# 描述计算
n = tvm.var("n")
A = tvm.placeholder((n,), name='A')
B = tvm.placeholder((n,), name='B')
C = tvm.compute(A.shape, lambda i: A[i] + B[i], name="C")
# 创建调度器
s = tvm.create_schedule(C.op)
# 设置调度器相关基元
bx, tx = s[C].split(C.op.axis[0], factor=64)
# GPU线程绑定
if target == "cuda":
    s[C].bind(bx, tvm.thread_axis("blockIdx.x"))
    s[C].bind(tx, tvm.thread_axis("threadIdx.x"))

上面的简单调度器的等价CPU C++代码是:

for (int bx = 0; bx < ceil(n / 64); ++bx) {
  for (int tx = 0; tx < 64; ++tx) {
    int i = bx * 64 + tx;
    if (i < n) {
      C[i] = A[i] + B[i];
    }
  }
}

这里仔细讲解一下调度器各个子参数的调整规律和注意点:

验证残差结构对ARM部署时的运行速度影响

结论:首先去掉Mobilenet_V2网络中残差结构重新生成TVM代码后运行速度无影响,表明残差结构不会对运行速度产生影响

运行速度包含单核和多核

进行Mobilenet_V2的单元结构的验证测试

Mobilenet_V2的单元结构为Inverted residual block

进行Mobilenet_V2的卷积尺寸的验证测试

结论:Mobilenet_V2中的扩展(x6)和缩减(/6)卷积特征图通道的尺寸类型是比较特殊的,其运行效率低于现有框架使用的卷积。

这也是在Caffe和其他深度学习框架中Mobilenet_V2运行效率不高的原因

results matching ""

    No results matching ""