方红豆 丽翔 凹非寺
物理位 公司出品 | 社会公众号 QbitAIFacebook正式发布了两个开放源码构架,叫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技术和产品新动态