MaixPy AI 硬件加速基本知识

1. 模型使用和硬件加速原理

前面我们知道了模型是一个数据机构以及很多参数, 最终以一个文件比如kmodel格式的文件的形式存在。 而这个模型要能在 MaixPy 的程序里面被使用, 首先需要程序能够理解kmodel这个文件的格式, 并且支持模型里面的算法,这样才能按照模型的描述将输入经过一些裂计算过程后得到输出。

所以,重点就是支持模型里面的算法,称算子, 理论上,我们可以用软件去实现这些算子, 就可以成功运行模型了, 而执行软件的物理器件是CPU, 神经网络模型的计算量很大,加上我们输入的是图片,图片本身的数据量就挺庞大, 就算是K210 400MHz 的主频, 也无法满足流畅的推算模型。

所以, 要么升级 CPU,但是成本太高, 要么做一个专用的硬件, 让这个硬件专门去特定的算法,因为不像 CPU 一样要做通用计算, 所以速度会非常快,在电脑上, 我们通常使用专用的图像加速卡即GPU来加速图形计算, 在K210上,这个专门的硬件叫做KPU(kendryte proccess unit),第一个但是是公司名, 其实和其它芯片的NPU做的事情是一样的。

在 MaixPy 里面,已经集成了推导模型的代码,同时使用了KPU进行计算加速,使用时无需编写很多代码,只需要调用几个函数即可快速运行模型

2. 关于 KPU

虽然 KPU 是能够加速模型运算了, 但是由于成本、时间、功耗、体积、发热、应用领域定位等各种因素,它的能力并不能像专业领域的强力NPU一样,包含了每一种算子,它只能处理一部分。

KPU 实现了卷积,批归一化,激活,池化 这4钟基础操作的硬件加速, 但是它们不能分开单独使用,是一体的加速模块。

所以, 在 KPU 上面推理模型, 以下要求(如果不需要训练和设计模型,暂时不需要仔细了解):

  1. 内存限制

K210 有 6MB 通用 RAM 和 2MB KPU 专用 RAM。模型的输入和输出特征图存储在 2MB KPU RAM 中。权重和其他参数存储在 6MB 通用 RAM 中。

  1. 哪些算子可以被 KPU 完全加速?

下面的约束需要全部满足。

  • 特征图尺寸:输入特征图小于等于 320x240(WxH) 同时输出特征图大于等于 4x4(WxH),通道数在 1 到 1024。

  • Same 对称 paddings (TensorFlow 在 stride=2 同时尺寸为偶数时使用非对称 paddings)。

  • 普通 Conv2D 和 DepthwiseConv2D,卷积核为 1x1 或 3x3,stride 为 1 或 2。

  • MaxPool(2x2 或 4x4) 和 AveragePool(2x2 或 4x4)。

  • 任意逐元素激活函数 (ReLU, ReLU6, LeakyRelu, Sigmoid…), KPU 不支持 PReLU。

  • 哪些算子可以被 KPU 部分加速?

  • 非对称 paddings 或 valid paddings 卷积, nncase 会在其前后添加必要的 Pad 和 Crop。

  • 普通 Conv2D 和 DepthwiseConv2D,卷积核为 1x1 或 3x3,但 stride 不是 1 或 2. nncase 会把它分解为 KPUConv2D 和一个 StridedSlice (可能还需要 Pad)。

  • MatMul, nncase 会把它替换为一个 Pad(到 4x4)+ KPUConv2D(1x1 卷积和) + Crop(到 1x1)。

  • TransposeConv2D, nncase 会把它替换为一个 SpaceToBatch + KPUConv2D + BatchToSpace。

说明来自这里

3. 模型转换

前面说到, 模型其实就是一组结构和参数数据,不同的软件只能识别特定格式的模型, KPU 只认.kmodel格式的模型, 一般用电脑训练的模型则不是, 比如tensorflow.h5格式或者.tflite格式, 要给KPU使用, 必须经过变成kmodel, 使用nncase这个工具来达到模型转换的目的 如果你需要转换模型, 具体使用方法看这个仓库里面的介绍

4. kmodel V3 模型 和 V4 模型

由于代码更新, 在过程中产生了两个大版本,V3V4, 其中V3模型是指用 nncase v0.1.0 RC5 转换出来的模型; V4模型指用nncase v0.2.0转换出来的模型

两者有一定的不同,所以现在两者公存, V3代码量更少,占用内存小,效率也高,但是支持的算子少; V4支持的算子更多,但是都是软件实现的,没有硬件加速,内存使用更多,所以各有所长。 MaixPy 的固件也可以选择是否支持 V4

5. MaixPy 中使用模型 kmodel

  1. 加载 SD 卡 (TF 卡)中的模型

将模型放到 SD 卡, 然后加载

   import KPU as kpum = kpu.load("/sd/test.kmodel")
  1. 加载 Flash 中的模型

将模型下载到 Flash, 然后加载

   import KPU as kpumodel_addr_in_flash = 0x300000m = kpu.load(model_addr_in_flash)

此处的 model_addr_in_flash 为模型在 Flash 中的偏移地址,模型可以通过 kflash.py 或者 kflash_gui 烧录到 Flash 对应的地址中

  1. 准备输入

一般情况下,我们会使用图像作为输入:

  • 直接使用摄像头采集的数据作为输入:

    img = sensor.snapshot()
    

    这里 img 就可以直接作为输入, 这里需要注意snapshot函数采集到图片后,会将图片数据放到两个地方 (1) RGB565内存块, 图像以 RGB565的形式存放在一块内存中,方便图像处理的函数使用,注意在内存中的排序是[像素1 RGB, 像素2 RGB...] (2) RGB888内存块, 图像以R8G8B8的形式存放在另一块内存中,注意在内存中的排序是[所有像素 R, 所有像素 G, 所有像素 B], 我们也称之为AI内存

其中,实际上作为 KPU 输入的数据是RGB888区域, 这个在前面的文档 MaixPy 图像及常用操作 章节中有仔细讲解过

  • 从文件读取,或者修改过的摄像头图像

直接从摄像头采集的图像会自动填充RGB888区域,但是我们使用图像处理函数比如image.resize()时,只会修改RGB565,没有修改RGB888,因为同时修改两处内存需要耗费大量时间,而 KPU 的输入又是RGB888内存, 所以在需要进行 KPU 运算时, 需要同步(刷新)一下RGB888内存块, 使用img.pix_to_ai()来进行同步,否则修改对 KPU没有生效。 比如:

img = sensor.snapshot()
img = img.resize(240, 240)
img.pix_to_ai()
img = image.Imag("/sd/test.jpg")
img.pix_to_ai()
  1. 前向运行模型

前向运行模型,也就是按照 输入到输出的方向走一边模型计算, 通过输入得出输出的值:


feature_map = kpu.forward(m, img)

这里得到了feature_map, 是一个特征图, 比如我们前面将的小球玩具的分类,输出特征图是两个节点, 每个节点表示了是对应物体的概率,我们将特征图转换为list对象

p_list = feature_map[:]
print(p_list)

就可以得到类似 [0.9, 0.1] 这样的结果了

6. KPU使用过程中的常见问题

6.1. KPU能够加载多大的模型?

C 语言代码运行模型: 当k210运行 c 代码时,能够加载 < 6MB左右的模型, 具体看 C 代码内容。 MaixPy 运行模型:

* 当运行 MaixPy(minimum版本)时,能够加载4MB左右的模型。 如果不使用摄像头和 LCD, 最大可以加载 5MiB 左右的模型(因为摄像头和 LCD 的缓冲区占用了很多内存,但实际应用也没多大意义了)
* 当运行 MaixPy(完整版)时,能够加载 2MiB 左右的模型
* 另外也支持实时从`Flash`加载模型, 理论上只要单层使用内存不超过 2MiB, 整体模型可以无限大,只不过要牺牲一点运算速度。 使用方法看[这里](https://github.com/sipeed/MaixPy_scripts/tree/master/machine_vision/load_big_model)。 如果对原理和实现感兴趣,可以看[这里](https://neucrack.com/p/313)

6.2. 报错"memory overflow"怎么办?

出现这个问题,根据前面讲到过的系统内存管理可知,一般有两个可能性:

  1. 报错的地方跟系统堆无关系, 可能是GC内存不够导致,可是适当增加 GC 的总内存大小
  2. 由于模型过大引起的。可以依次尝试如下解决方案:
    1. 更换maixpy mini版本固件
    2. 进行模型剪枝优化
    3. 使用 kpu.load_flash接口运行时实时加载模型,只是执行效率降低一点
    4. 如果内存不足,而且kpu.load_flash性能无法满足, 那么你可能需要使用 C SDK进行开发。

6.3. 报错"load error,only support kmodel v3/v4"怎么办?

出现这个问题可以尝试如下解决方案:

  1. 如果为加载 Flash 中的模型,请确保 flash offset 填写正确,并保证和 maixpy 固件的地址没有冲突(模型在 Flash 中的地址太靠前,然后往 Flash 烧录入固件时, 固件大小超过了模型所在的起始地址, 导致模型被破坏)
  2. 如果是采用 nncase 0.2.0进行转换的 kmodel V4,请尝试采用nncase 0.1.0进行转换,从而生成kmodel V3

6.4. 我想实现不同模型的选择加载(例如按下按钮运行目标分类,再次按下按钮则运行目标检测),应该怎么写程序?

因为内部RAM有限,所以当需要切换不同模型进行kpu.load(address)前,请先执行kpu.deinit(k210model)释放之前模型占用的内存,然后再加载新的模型。 也就是分时复用内存

文章来源于猪百岁儿,原文链接:https://bbs.sipeed.com/thread/842
搬运请注明原文地址

【新手基础教程】MaixPy AI 硬件加速基础知识相关推荐

  1. 新编大学计算机基础教程txt,新编大学计算机基础教程新大学计算机基础教程.doc...

    新编大学计算机基础教程新大学计算机基础教程 <新编大学计算机基础教程>教学设计设计人:hbx基本信息课时:75 课程类型:新编大学计算机基础教程学分:10后续课程:组网技术.操作系统课程设 ...

  2. 计算机基础教程试题及答案,计算机基础教程考试题「附答案」

    一.单选题 1.以下几种说法正确的是________. A:ADSL接入Internet有虚拟拨号和专线接入两种方式 B:拨号接入Internet的速度可以达到56Mbps C:只要接入局域网就可以接 ...

  3. sql基础教程和mysql基础教程_书评「SQL基础教程(第2版)」| 你应该知道的基础知识点梳理·上...

    写在前面关于这本书:SQL的基础教程,可以使你在SQL的学习中轻松实现从0到1的过程,循序渐进地掌握SQL的基础知识和技巧.对于零基础来说非常友好,看完能够迅速上手SQL. 关于本文:一篇对这本书的知 ...

  4. python基础教程是什么意思-python基础教程都有什么?

    分享一下传智播客的python基础教程 第一阶段 Python核心编程 可掌握的核心能力 1.掌握Python基础语法,具备基础的编程能力; 2.建立起编程思维以及面向对象程序设计思想.解决的现实问题 ...

  5. python基础教程第四版-python基础教程第4版pdf

    python基础教程第4版pdf内容摘要 第二.针对青少年人群的计算机python视频教程.青少年的特点就是有个性.复杂多变.没有耐心.如果他们浏览一个计算机的时候,打开的比较慢,或者是计算机的课程凌 ...

  6. python 科学计算基础教程电子版-Python 科学计算基础 (整理)

    Python是一种面向对象的.动态的程序设计语言,具有非常简洁而清晰的语法,既可以用于快速开发程序脚本,也可以用于开发大规模的软件,特别适合于完成各种高层任务. 随着NumPy.SciPy.matpl ...

  7. python基础教程第4版-Python基础教程(第3版) 笔记(四)

    第二章 列表和元素 2.1 序列概述 列表和元组的主要不同在于,列表是可以修改的,而元组不可以. 创建一个由数据库中所有人员组成的列表: >>> edward = ['Edward ...

  8. python基础教程运行程序_Python入门基础教程:WSGI

    原标题:Python入门基础教程:WSGI WSGI 简介 WSGI 是什么 WSGI 是 Python Web Server Gateway Interface 的缩写,是描述 Web 服务器与 P ...

  9. python基础教程第三版-Python基础教程(第三版)(七)再谈抽象

    菜鸡的学习笔记. 7.1 对象魔法 多态:可对不同类型的对象执行相同的操作,但是操作将随对象所属的类型而异: 封装:对外隐藏对象内部工作原理的细节: 继承:可基于通用类创建出专用类. 按作者的意思,多 ...

最新文章

  1. Asp.net 2.0 C#实现压缩/解压功能
  2. Linux命令学习手册-grep命令
  3. nginx 源码学习笔记(十八)—— ngx_add_inherited_sockets 继承的sockets
  4. 【java学习笔记-io流 文件读写和键盘读写】带缓存的输入/输出流和数据输入/输出流
  5. 计算机网络(一)-概述
  6. 将Mongodb注册为Windows系统服务
  7. 如何查看/统计当前AD域控制器的活动用户
  8. LNMP 1.2/1.3+升级Nginx、MySQL/MariaDB、PHP教程
  9. HTML+CSS系列教程导学
  10. 下载精确卫星星历文件 2015.3.31
  11. martyr2s提出的计算机练手小项目(未翻译)
  12. MyEclipse10破解 运行run.bat闪退 亲自试验
  13. 把撒哈拉沙漠变成一个太阳能农场,这可能吗?
  14. 字符串Hash函数对比
  15. (三)OpenCV中的图像处理之轮廓
  16. Oracle常用字符ASCII码对应表
  17. Erdaicms旅游网站程序微信和手机端分销系统正式上线发布啦
  18. ES6 lterator迭代器是个什么东西?有什么用?
  19. 膨胀珍珠岩板(EPB) 保温材料英国UKCA 认证-EN 13169
  20. 【转】酒桌上经典劝酒词

热门文章

  1. 创业必读:组建初创团队最常见、最致命的10个大坑
  2. ES6将对象中同一类相加
  3. 【五校联考1day1】我才不是萝莉控呢
  4. 虚拟现实与模拟仿真---unity
  5. JavaScript数组空位的处理
  6. 真正好用的数据恢复软件EasyRecovery15
  7. 3年前端入职健海科技(数疗领域方向),试用期总结
  8. 国产音频压缩格式JLM——JLM音频播放
  9. 树莓派安装Samba服务构建家庭NAS
  10. 【5G核心网】Packet Forwarding Model 数据包转发模型