参考文档
- https://github.com/chinakook/MobileNetV2.mxnet MobileNetV2/MXNet训练
- https://github.com/MTCloudVision/mobilenetv2 MobileNetV2/MXNet Symbol
- http://blog.csdn.net/shenxiaolu1984/article/details/52373174 Spatial Convolution计算实现细节解释
- 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运行效率不高的原因