服务器上的CNN训练框架很多,如tensorflow、pytorch、keras、caffe等等。该类框架在PC及服务器中的显卡、高性能CPU中都有不错的性能表现,但是如果需要将模型移植到一些低算力的嵌入式设备中,则需要考虑其他的方式进行部署。
首发:https://zhuanlan.zhihu.com/p/71648953
作者:张新栋
在服务器上,我们借助tensorflow等框架,主要目的是为了做模型的训练。为此,tensorflow此类离线训练框架针对服务器级别的硬件设备(主要是GPU),进行了大量的性能优化。但在嵌入式端的性能上面,该类主流框架并没有做过多的考虑(tensorflow嵌入式端的开发目前仍处于活跃状态)。考虑到以上的痛点,近几年开源社区涌现出了许多优秀的嵌入式端CNN inference框架。正如其名称一样,该类框架主要考虑对网络的inference阶段进行性能优化(仅有极少数场景可能会考虑back propagation),排名不分先后有,MNN(阿里巴巴)、NCNN(腾讯)、Mace(小米)、Tengine、ArmNN(Arm公司)等。上述框架针对嵌入式设备都进行了大量的Neon、OpenCL等SIMD优化,适配了多类硬件设备,如Arm IP、GPU、DSP、NPU等。
笔者也是最近开始关注此类框架,包括从设计上、具体Op的优化算法、前端适配、计算图优化等。具体Op的优化算法、计算图优化是非常大的工作量,不在本次教程的讨论范围中,我们会在后续的专栏中逐个进行介绍。在本专栏的《自己动手写CNN Inference框架》系列中,我们主要介绍如何从零开始去写一个属于自己的CNN inference框架(胡乱起个名,Naive CNN Inference Library),借此机会跟大家一起学习神经网络中一些知识点,包括但不限于:
- 如何解析前端的模型参数(如tensorflow训练好的模型参数)
- 对应Op的具体inference 操作
- 对应Op的具体C代码实现
- 构建graph并进行inference
我们用如下的流程图来表示
NCIL的简单流程
我们的想法也非常简单,通过建立一个统一的参数文件格式来约束前端模型解析和后端模型推理。为了简化我们的开发工作,我们在前端模型解析采用python脚本进行开发,按照约定的模型文件格式进行模型的写入;第二步在进行NCIL库的模型文件加载、图的构建、推理。
后续该系列的文章中,我们将以MNIST数字识别的任务为目标,逐步完善MNIST CNN中所需的Op,最后用开发好的NCIL进行完整的网络推理。
最后,欢迎大家留言讨论、关注专栏,谢谢大家!
推荐阅读
专注嵌入式端的AI算法实现,欢迎关注作者微信公众号和知乎嵌入式AI算法实现专栏。
更多嵌入式AI相关的技术文章请关注极术嵌入式AI专栏