脸书宣布开源Quantized Neural Network PACKage(QNNPACK)函数库,这是一个优化移动人工智能的高性能核心函数库,通过QNNPACK开发者可以在移动设备进行高端计算机视觉的任务,执行像是Mask R-CNN和DensePose这类算法,而且还能在小于100ms的时间内执行图象分类,即便在硬件规格较差的移动设备上,也能维持良好的性能。
作为前些时日发布深度学习框架PyTorch 1.0平台的一部分,脸书接着开源QNNPACK函数库以支持量化推理(Quantized Inference)。开发者只要通过Caffe2模型表示(Model Representation)就能立即使用QNNPACK。
由于移动设备的运算能力比数据中心的服务器低10到1,000倍,因此执行最先进的人工智能算法,势必需要经过诸多调整,才有可能在硬件的限制下挤出可用性。QNNPACK提供高性能卷积、反卷积以及在量化张量(Quantized Tensors)上完全连接运算的实例,而在QNNPACK出现之前,没有针对这类常见的如分组卷积或是扩张卷积等神经网络原语(Primitive),而这也使得ResNeXt、CondenseNet和ShuffleNet等研究型的模型,都并未获得充分的利用。
在两年前,脸书开始在手机中部署神经网络,而大多数的计算机视觉基础构架都创建在大型核心的卷积运算上,但缺点是需要高密度计算资源支持。Caffe2Go使用一个名为NNPACK的核心函数库,使用威诺格拉德转换或是快速傅立叶转换,以实现渐进快速卷积算法,而这比起原本的实例,少了数倍的乘积累加运算,减少运算的程度脸书举例,能够让3×3的卷积运算只比1×1卷积运算慢两倍,而非原始算法慢9倍。
但计算机视觉领域发展快速,并且新的神经网络基础构架使用的卷积算法类型,不再受惠于快速卷积算法,包括1×1卷积、分组卷积、跨旋转卷积、扩张卷积和深度卷积,由于这些算法本身运算密度就较低,低精度运算同时也减少了內存带宽的使用。
计算机视觉的神经网络在卷积和完全连接运算符上,大部分花费在推理时间上,而这些运算符和矩阵相乘密切相关,完全连接运算符和1×1卷积都可以直接对应到矩阵相乘,而且大核心的卷积也可以被分解成为im2col的內存布局转换和矩阵相乘的组合,所以卷积神经网络中的有效推理问题,其实就是矩阵相乘的实例问题,线上性代数函数库中称为GEMM。为此过脸书稍微修正了矩阵运算原语为PDOT(Panel Dot Product)微核心,能让运算受计算限制,以实现高性能矩阵相乘。
PyTorch和其他深度学习框架通常使用浮点数来表示训练期间神经网络的权重或是神经元,但是在模型训练结束之后,浮点数以及运算变得不那麽必要,因为许多类型的模型也适用于低精度整数计算,进行推理也不会有明显的精度损失。低精度跟单精度与半精度浮点数两种相比,內存使用量减少2到4倍,而这有助于进一步将神经网络模型保存至移动设备处理器的小型缓存中,并提高受限于內存带宽运算的性能,提高电力效率,并且在许多类型的硬件上,能提高运算的吞吐量。
QNNPACK使用与Android神经网络API兼容的线性量化解决方案。虽然QNNPACK也是利用PDOT微核心,就像其他BLAS(Basic Linear Algebra Subprograms)函数库一样,但它更专注于8比特素的量化张量,并为移动人工智能使用案例,带来完全不同的性能优化角度。大多数BLAS函数库都针对科学计算使用案例,其矩阵大至数千个双精准度浮点数元素,但是QNNPACK的输入矩阵来源使用低精度,为移动设备特化的计算机脑视觉模型,使用完全不同的维度。QNNPACK和其他GEMM实例最大的区别,就是删除了不必要的內存转换,以优化內存使用情况。
脸书公开QNNPACK端到端基准测试的性能表现,在量化最先进的MobileNet v2构架中,基于QNNPACK的Caffe2运算符,在各种手机上执行的速度比TensorFlow Lite快约2倍。与QNNPACK一起,脸书也同时开源了Caffe2量化MobileNet v2模型,能提供比目前精准度第一名的TensorFlow模型,还要精确1.3%的结果。
QNNPACK已经集成到了脸书各系列应用程序,并已经将其部署到了全球超过十亿的移动设备上了。接下来脸书还要强化QNNPACK的性能增强,包括在FP16格式下的低精度计算,以及利用NEON内积指令和16位累加,让更多轻量人工智能可以在移动设备上执行。另外,脸书也希望PyTorch API能支持QNNPACK运算符,并通过扩展套件为移动开发人员提供更丰富的工具。