博鱼真人登录我用深度学习做个视觉AI微型处理器

 博鱼体育app官网下载Apple App Store新闻     |      2022-03-05 17:06

  讲多了算法,如何真正将算法应用到产品领域?本文将带你从0用深度学习打造一个视觉AI的微型处理器。文章含

  随着硬件尤其是显卡性能升级,以及Pytorch,TensorFlow深度学习框架日趋完善,视觉AI算法在多个领域遍地开花,其中就包括嵌入式设备。这是一种微型处理器,博鱼真人登录它的关键单元就是内部小小的计算芯片。嵌入式设备和我们日常用的电脑相比体积小,只包含必要外设。一些针对特定任务的嵌入式设备往往不会运载我们常用的比如Windows、Linux系统,而是直接将代码烧录进去运行。

  在嵌入式设备上尝试部署深度学习算法开始较早,博鱼真人登录1989年一家叫做ALVIVN的公司就将神经网络用在汽车上了。现如今,工程师们将其用在安防、机器人、自动驾驶等领域。因此,懂得如何设计、训练算法,又能将其部署到边缘硬件产品上,能帮我们实现许多产品的想法。

  但是,视觉算法部署在产品中仍有许多难点,比如:(1)模型通常需要在CPU/GPU/NPU/FPGA等各种各样不同类型的平台上部署;(2)嵌入式算力/内存/存储空间都非常有限;跑在云端服务器上,需要实时联网又不很优雅;(3)模型训练时可能会使用不同的AI框架(比如Pytorch/TensorFlow等)、不同硬件(比如GPU、NPU),相互适配产生问题[1]。

  对第一个问题,在经过调研后,还真有这样的芯片,那就是嘉楠科技的K210芯片。一个芯片几十元,对应的开发板在某宝上两百多就可以买到。根据嘉楠官方的描述,K210具有双核 64-bit RISC-V RV64IMAFDC (RV64GC) CPU / 400MHz(可超频到600MHz),双精度 FPU,8MiB 64bit 片上 SRAM(6MiB通用SRAM+2MiB的AI专用SRAM)。关于这块芯片更详细的介绍可以参考[2] 。

  市面上有许多搭载K210的开发板,笔者这里选了雅博一款功能较全的K210开发板,开始了嵌入式AI的折腾之路。

  对于第二个问题,方法就多了,不同深度学习框架,不同硬件选型都决定着不同技术路线。基本路线可以为深度学习平台训练 - 模型剪枝、量化 - 参数转换 -转换为硬件平台上能运行的模型。

  对深度学习平台选型,笔者决定选用当下最流行的Pytorch平台。最后一步往往取决于这个硬件的生态,如果没有相关生态支持,可能需要手写C语言代码加载参数运行。调研发现,K210有一个深度网络优化平台NNCASE,能加速深度模型部署。

  调研过程中发现在这块板子上部署模型大多数都是从Keras、TensorFlow开始训练并最终部署,而研究者常用的Pytorch竟然没有教程,于是今天就尝试来讲一讲。

  我们使用一个开源数据集平台:,这个网站汇总了AI开发者常见的公开数据集,调用其SDK就能直接在线训练,而且许多数据集直接在国内网络下连接直接使用,还是非常方便的。

  通过AccessKey可以上传数据、读取数据、使用数据,灵活对接模型开发和训练,与数据pipeline快速集成。

  e. AccessKey写入后就可以写代码读取数据了,读取后可以使用一行代码自行下载,或者可以开启缓存功能,在读取过后会自动将数据存储到本地。将下载后的数据放在 data 文件夹下:

  怎么把这个数据集集成到Pytorch里呢?官方文档也为此写了不少例子[4]。笔者尝试过觉得挺方便,在为不同任务训练嵌入式AI模型时,只需更换数据集的名字,就能集成,不用再打开浏览器、等待下载以及处理很久了。有了数据集之后,我们接下来用其训练一个分类任务模型。

  首先,大而深的模型是不行的,K210的RAM是6M,这意味着模型+程序都要烧到这个空间。当然我们可以放到内存卡中,但实时性要受影响。

  其次,还要考虑AI编译器对特定算子的优化,以K210 NNCASE为例[3],其支持TFLite、Caffe、ONNX共三个平台的算子。

  打开对应平台,能够到具体有哪些算子已经实现了低层优化。可以看到对ONNX算子优化还是比较多的。如果所选用的网络算子较新,抑或是模型太大,都要在本步多加思考与设计。

  如果如果最后部署不成功,往往需要回到这一步考虑网络的设计。为了尽可能减少算子的使用,本文设计一个只基于卷积+ReLU+Pool的CNN:

  开放神经网络交换(Open Neural Network Exchange,简称ONNX)是微软和Facebook提出用来表示深度学习模型的开放格式。所谓开放就是ONNX定义了一组和环境,平台均无关的标准格式,来增强各种AI模型的可交互性。

  换句话说,无论你使用何种训练框架训练模型(比如TensorFlow /Pytorch /OneFlow /Paddle),在训练完毕后你都可以将这些框架的模型统一转换为ONNX这种统一的格式进行存储。注意ONNX文件不仅仅存储了神经网络模型的权重,同时也存储了模型的结构信息以及网络中每一层的输入输出和一些的辅助信息。

  使用NNCASE将ONNX模型转为K210上能运行的KModel,由于NNCASE环境配置较为依赖环境,我们使用Docker完成环境配置,对于docker只需要安装并正确配置即可,不熟悉的可以参考我写的Docker教程[12]。

  为简化部署方式,在部署好NNCASE的Docker镜像中直接运行Python脚本。首先用Docker拉取NNCASE镜像,再进入到镜像中运行Python代码

  为什么要简化?这是因为在训练完深度学习的pytorch或者tensorflow模型后,有时候需要把模型转成 onnx,但是很多时候,很多节点比如cast节点,Identity 这些节点可能都不需要,我们需要进行简化[11],这样会方便我们后续在嵌入式平台部署。onnx-simplifier的开源地址见[9]。

  K210是支持好几种编程环境的,从最基本的cmake命令行开发环境,到I博鱼综合体育下载DE开发环境,到Python脚本式开发环境都支持,这几种开发方式没有优劣之分,有的人喜欢用命令行+vim,有的人喜欢IDE图形界面,也有的人根本不关心编译环境,觉得人生苦短只想写Python。

  一般来说越基础的开发方式自由度越大,比如C语言+官方库,能充分发挥出芯片的各种外设功能,但同时开发难度比较高,过程很繁琐;越顶层的开发方式比如写脚本,虽然十分地便捷,甚至连下载程序的过程都不需要了,但是程序功能的实现极度依赖于MicroPython的API更新,且很多高级系统功能无法使用[2]。

  为降低大家在开发中的不友好度,本文介绍第一种开发方法,以后有机会可以介绍使用C SDK直接进行开发。不管用什么系统都能进行K210的开发,我们需要完成下列内容的准备:

  (4)kflash或kflash GUI,一个烧录程序用以将编译好的.bin文件烧录到硬件中。前者命令行,后者图形界面

  笔者比较懒,不想每次指定串口号,所以直接用 /dev/cu.usbserial-* 。如果你电脑只有一个以 /dev/cu.usbserial 开头的串口,那就不用指定,直接用我这种方法:

  到这里,如果没有问题的线上部署了。怎么使用其进行编程呢?笔者建议读完[16],更多信息可以从参考Micropython的文档[14]和Github[15]。

  KModel制作好,接下来需要把KModel部署到硬件 。有两种方式,下面分别介绍,任选一种即可。

  直接将KModel放在SD卡中即可,注意TF卡需要是MBR 分区 FAT32 格式[17]。如果不是这个格式,是加载不到SD卡的。在Mac中,可以打开磁盘管理工具–选择对应磁盘–抹掉–格式–MS-DOS(FAT)直接一步格式化。

  正如使用 linux 终端一样, 使用 rshell 的 cp 命令即可简单地复制文件到开发板

  本文方法由于在Micropython上进行模型加载,在系统资源调用以及软件适配上会有许多限制。做成产品时建议用C+K210 SDK开发。由于篇幅限制,下篇将探索使用C语言对模型进行部署,欢迎关注更新!由于个人能力有限,如有疑问以及勘误欢迎和笔者进行交流:Github/QiangZiBro!