作者 | 小米MACE团队
责编 | 胡巍巍
近年来,依托硬件算力的提升和数据集的丰富,以深度学习为代表的人工智能领域蓬勃发展。
同时,在终端设备上部署AI应用也越来越普遍。小米作为一家以AIoT为核心战略的企业,在设备端的深度学习部署做了长期的探索。
在2018年,小米对外开源了专门为移动端设备优化的深度学习推理框架MACE(https://github.com/XiaoMi/mace/)。
功能和架构
MACE是一个在移动端运行的高性能深度学习引擎,在多框架支持、性能、系统响应、功耗、内存占用、模型保护等方面都有专门优化,同时MACE是一个异构计算平台,可以支持多个厂商的多种硬件设备。
框架广泛支持TensorFlow、Caffe等深度学习框架的模型,同时打通ONNX,也一并支持了所有可以转到ONNX的框架模型。
在大家都担心的性能上,为减少计算量和访存次数,我们对模型算子的表示层和算法本身均进行优化,例如算子融合、Winograd。
在MACE最大优势,硬件支持上,我们专门针对NEON/OpenCL/HVX,实现CPU和GPU的协调,和8位定点量化加速。尤其在系统响应方面,众所周知,移动终端设备资源相对受限,而GPU承载了UI渲染,我们安排MACE在计算时自动拆解OpenCL计算任务以保证系统UI的响应和用户体验。
MACE还在几个基本点上反复打磨,为减少内存占用,利用内存依赖分析技术,提高内部复用。同时对ARM CPU、Adreno GPU、Hexagon DSP也进行了功耗控制。
这里,值得一提的是我们的模型保护,默认将模型转换成C++代码,对模型节点和数据的字符混淆,对开发者进行最大程度的知识产权保护。
目前,我们不仅支持高通、海思、联发科、松果的主流CPU芯片,也兼容了Adreno、Mali GPU和Hexagon DSP的计算加速。
三大落地场景
视觉,毋庸置疑是AI上半场最能落地和已经被验证刚需的场景。网民的生活工作中,手机的相机作为最高频的入口,在深度学习算法的加持下,为用户提供了更出色的基础画质,在超过半数的效果中,已可媲美甚至超越数码相机的精度。
MACE非常及时地支撑了小米畅销手机的几大卖点,比如大家所熟知的场景滤镜,单摄背景虚化、人脸解锁、超分辨率等。
现在手机相册中也有不少视觉算法的应用,比如智能照片挑选、图像美化等功能。
虽然大家担心NLP在此次的AI浪潮中没有深刻地落地,但小爱同学不得不提。
这款深入人心的语音助手,利用深度学习的长短时记忆网络(LSTM)在众多NLP的场景中,尤其翻译领域中,激活了操作系统MIUI,也链接了线下的智能家居。
面对主流翻译模型对计算的速度、内存等资源的庞大需求,MACE为翻译模型中计算量占比最大的矩阵乘专门做了优化,通过优化访存顺序、量化等方式大幅提升计算速度。
而量化本身又将模型大小缩减75%,大幅缩减了运行时的内存占用,并且量化后的模型预测精度仍然符合预期。
同时,MACE本身提供内存复用的方式,通过标记内存的引用数,来复用申请的内存,基本上将运行时MACE库的内存控制在2MB左右,解决了LSTM模型算子繁多导致运行时内存占用高的问题。MACE对LSTM模型已有较好的支持,小米内部也已经有多个相关模型应用于手机上。
在网民每一次呼唤“小爱同学”背后,深度循环神经网络都在针对你的声音、语言特点和语料内容,不断训练着小爱同学的声学模型和语言模型。
为此,MACE也在推理层面做了大量配套工作。除了CNN网络外,MACE也支持了语音识别深度学习模型中常用的LSTM、TDNN等网络。
另外,MACE还针对在语音识别领域广泛使用的深度学习训练平台Kaldi框架,开发了模型转换工具,可以方便地将Kaldi模型转换成ONNX格式模型文件,使用这一工具和MACE对ONNX模型的支持,可以极大地降低部署语音识别模型的难度和缩短语音识别模型从训练到部署的时间。
此外,MACE还针对语音识别模型在嵌入式处理器上的推理计算过程中,进行了多方面的优化,如融合计算、内存优化、定点计算等,在降低运算时功耗的同时,大大提升了语音识别的速度。
工程经验
为了方面开发者对模型有直观的性能预警,MACE提供了Benchmark工具,侦测具体到每个算子所花费的时间。
另一个Validate工具也十分好用,原理是通过与其他模型训练平台的计算结果进行余弦相似度、信噪比、像素一致性等三维比对,保证了MACE引擎计算结果的正确性。
在兼容性方面,MACE支持高通、联发科等主流芯片的CPU、GPU、Hexagon DSP等计算加速,还支持在具有POSIX接口的系统上运行CPU计算加速。
同时,利用GitLab的持续集成(CI)功能,对于MACE的每一次更新,都能实现对于计算结果、兼容性、量化功能等多项任务的自动化测试。
与MACE同步地,我们开源了MobileAIBench评测工具(https://github.com/XiaoMi/mobile-ai-bench ),使开发者能够更为方便地评测在不同硬件(CPU、GPU、DSP等)和计算框架(MACE、SNPE、NCNN、Tensorflow Lite等)上同一模型(如MobileNetV1、MobileNetV2等)的运行性能和精度表现,对开发者的选择给出客观参考。
未来计划
未来,MACE将持续在易用性、高性能、兼容性上持续发力。计划如下:
1)为了支持更丰富的上层业务,我们将覆盖更多类型的模型,现阶段已经支持了图像、文本以及语音的模型,之后会增加更多相关操作,包括控制操作。
为使一些简单的模型能够在设备端训练个性化数据,我们会针对具体业务探索在端上进行训练的支持。
MACE将进一步解偶针对不同设备的代码,去除依赖、按需编译、精简库大小;也将支持混合精度,探索用更少比特位量化的方案,结合模型稀疏编码等压缩技术,减小模型大小。
2)我们将持续优化算子的性能,针对不同设备的特性,针对性地进一步优化主流芯片上的性能,也将探索如何在运用量化技术减少运行时间的同时,提高模型精度,如支持分层量化机制。
3)MACE将支持更多的设备和芯片,包括iOS,以及针对神经网络设计的专有NPU芯片。MACE将支持针对不同设备特性与模型结构,自动化的选择合适的芯片运行。
作者简介:MACE团队,小米人工智能部。成员分别毕业于清华、武大、UCL,先后就职于百度、腾讯、微软、依图。目前团队专注移动端AI业务模型的孵化和落地。
本文系作者投稿,仅代表作者观点,不代表CSDN立场。
【End】
热 文 推 荐
☞没有新芯片,没有大核弹,黄教主这次给大家带来了个PRADA
☞曝光!月薪 5 万的程序员面试题:73% 人都做错,你敢试吗?
System.out.println("点个在看吧!");
console.log("点个在看吧!");
print("点个在看吧!");
printf("点个在看吧!\n");
cout << "点个在看吧!" << endl;
Console.WriteLine("点个在看吧!");
Response.Write("点个在看吧!");
alert("点个在看吧!")
echo "点个在看吧!"
点击阅读原文,输入关键词,即可搜索您想要的 CSDN 文章。