方栗子 发自 凹非寺
量子位 出品 | 公众号 QbitAI
Facebook发布了一个开源框架,叫QNNPACK,是手机端神经网络计算的加速包。
官方表示,它可以成倍提升神经网络的推理效率,几乎比TensorFlow Lite快一倍。
这个框架,能够为很多运算加速,比如DW卷积 (Depthwise Convolution) ,许多先进的架构里面都用得到。
目前,QNNPACK已经是PyTorch 1.0的一部分,在Caffe2里就能直接使用。
其实,Facebook手机应用里面,已经部署了这个QNNPACK。也就是说,数以亿计的手机都在用了。
从哪个角度加速?
QNNPACK,这个名字眼熟么?
两年前,Facebook就推出过一个加速包,叫做NNPACK,Caffe2Go用的就是它。
基于Winograd变换和傅里叶变换,有效减少卷积计算里的乘加运算 (Multiply-Add) 。这样一来,3x3卷积可以只比1x1慢一倍,而不会慢8倍。
不过,世界变化很快。现在的计算机视觉 (CV) 神经网络里,用到的很多卷积类型,已经沾不到NNPACK的光:
比如,1x1卷积,分组卷积 (Grouped Convolution) ,Strided Convolution,扩张卷积 (Dilated Convolution) ,DW卷积 (DepthWise Convolution) ,适用于精度/存储带宽受到限制的 (移动端等) 场景。
而CV神经网络,大部分推理时间,都花在卷积和全连接运算上。
这样的运算,和矩阵乘法密切相关:
大内核的卷积,可以分解成im2col和一个矩阵乘法。
所以,有高效的矩阵乘法,才能有高效的卷积网络。
于是,QNNPACK出世了。
怎样加速矩阵乘法?
矩阵乘法,A x B = C。C里面的每一个元素,都可以看成A中某行和B中某列的点乘。
但直接在点乘基础上计算的话,一点也不快,会受到存储带宽的限制。
如果,能同时计算A中多行和B中多列的点乘,即MRxNR,就能给运算速度带来猛烈的提升。
不需要太多,这样细小的改变就够了。
节省内存和缓存
模型训练,可能更需要高精度。但在训练完成后,推理部分对精度的需求可能就没有那么高了。
低精度的计算,有时对推理的准确性不会产生明显的影响。
而这样的运算,不需要太大存储,并节省能源,有助于把AI部署在移动端。
QNNPACK用的线性量化 (Linear Quantization) 方案,与安卓的神经网络API兼容。
它假设量化值q[i]是用8比特的无符号整数 (Unsigned Integers) 来表示的,以及q[i]与真实值r[i]相关,关系如下:
与其他库不同,QNNPACK把矩阵A、B都放进一级缓存 (L1 Cache) ,目标是把所有对运算过程并不非常必要的内存转换 (Memory Transformations) 都删掉。
QNNPACK可以在一次微内核调用 (Microkernel Call) 里,处理A和B。
不需要在微内核之外,累积32位的中间结果,QNNPACK把32位的中间值融合进微内核,然后写出8位值,节省了存储带宽和缓存。
赢了TensorFlow Lite
开发团队用谷歌的视觉框架MobileNetV2里面的图像分类模型来测试。
拿TensorFlow Lite做对手,和QNNPACK比了一场。
结果是,QNNPACK比TensorFlow Lite几乎快一倍,不论是在高端智能机,还是普通智能机身上。
所以,各位也去试一下?
GitHub项目页:
https://github.com/pytorch/QNNPACK
博客原文:
https://code.fb.com/ml-applications/qnnpack/
— 完 —
加入社群
量子位AI社群开始招募啦,欢迎对AI感兴趣的同学,在量子位公众号(QbitAI)对话界面回复关键字“交流群”,获取入群方式;
此外,量子位专业细分群(自动驾驶、CV、NLP、机器学习等)正在招募,面向正在从事相关领域的工程师及研究人员。
进专业群请在量子位公众号(QbitAI)对话界面回复关键字“专业群”,获取入群方式。(专业群审核较严,敬请谅解)
活动策划招聘
量子位正在招聘活动策划,将负责不同领域维度的线上线下相关活动策划、执行。欢迎聪明靠谱的小伙伴加入,并希望你能有一些活动策划或运营的相关经验。相关细节,请在量子位公众号(QbitAI)对话界面,回复“招聘”两个字。
量子位 QbitAI · 头条号签约作者
վ'ᴗ' ի 追踪AI技术和产品新动态