一年的打磨,MNN正式版发布!( 三 )


一年的打磨,MNN正式版发布!

文章插图
精度上几乎没有下降,但是性能足足提升了一倍 。搭配上 MNN 转换工具的--fp16输出选项,模型大小还能减小一半 。一箭双雕 。
Dot
一年的打磨,MNN正式版发布!

文章插图

一年的打磨,MNN正式版发布!

文章插图
亦记作 ( SIMD Dot ),是 ARMv8.2 架构的可选扩展 。可用时,可以使用 SDOT/UDOT 指令实现 int8/uint8 的点积计算 。SDOT/UDOT 指令如上图所示,一次可以处理两个 4x4 int8/uint8 数据乘,并累加到 4x1 的 int32/ 的寄存器上 。这样强大的硬件加速指令,还是双发射的 。
一年的打磨,MNN正式版发布!

文章插图
实战表现效果也非常明显,在原先 int8 无法发挥效用的设备上,ARMv8.2 也成功实现了耗时减半 。
工具链
2019年的绿盟开发者大会上,我们发布了 MNN 的前端和版的转换、量化、可视化工具 。而今,又增加了对 MNN (表达式)、模型训练的封装,累计新增超过 150 个接口 。具体可以参考说明文档【11】 。
依然是前文的 构图,使用改写的版本如下:
class Net(nn.Module):"""construct a lenet 5 model"""def __init__(self):super(Net, self).__init__()self.conv1 = nn.conv(1, 20, [5, 5])self.conv2 = nn.conv(20, 50, [5, 5])self.fc1 = nn.linear(800, 500)self.fc2 = nn.linear(500, 10)def forward(self, x):x = F.relu(self.conv1(x))x = F.max_pool(x, [2, 2], [2, 2])x = F.relu(self.conv2(x))x = F.max_pool(x, [2, 2], [2, 2])x = F.convert(x, F.NCHW)x = F.reshape(x, [0, -1])x = F.relu(self.fc1(x))x = self.fc2(x)x = F.softmax(x, 1)return x
对熟悉的开发者来说,是不是要亲切上许多呢?
注:目前API 处于 BETA 阶段 。我们会根据社区和内部的反馈持续改进API,包含进行的改动 。
后续计划
2020年,我们计划每个季度发布一个稳定版本 。
未来的计划,主要集中在性能、训练、NPU 支持和模型压缩 。
性能
性能是 MNN 的立身之本,相信很多朋友选择 MNN,也主要出于它飙车般的性能 。有兴趣的朋友,可以去看看MNN 发表在今年 MLSys 的论文解读【12】 。
训练
MNN 最新拥有的训练能力已经通过 (表达式)接口支持常用模型的训练、量化、蒸馏,我们会进一步完善训练能力,添加更多算子和求导的支持,以支持更多的模型 。
NPU 支持
NPU 具有超高的性能、超低的能耗,将是未来手机的标配 。NPU 的支持,也是许多 MNN 用户经常在钉钉群里提出的需求 。MNN 在未来的1年,会逐步支持更多的 NPU,请大家拭目以待!
模型压缩
MNN 目前已经拥有 Post-和 -aware的能力 。我们会持续投入模型压缩(如蒸馏,稀疏,剪枝,低比特等),给业界提供更多优秀的、即插即用模型压缩算法 。
1、
2、
3、
4、
5、
6、
7、
8、
9、
10、
11、
12、