选中内容(绿色)时除了会搜索文章名,还会搜索文章内容
点击结果中的文章名进入文章界面后可以按Ctrl+F在页面内搜索
  • 版权:CC BY-SA 4.0
  • 创建:2020-09-11
  • 更新:2020-09-15
为了在k210的有限的内存(<=6MiB)上,加载大模型(模型大于可用内存), 可以实现的方法


以下方法已经在MaixPy上实现,可以直接使用kpu.load_flash()加载即可, 具体方法见load_flash使用

实时从 flash 加载模型

从模型(kmodel)的存放可以发现(看模型结构解析), 头信息都放在前部分,后面部分都是每一层的数据, 而且由模型运算的特点(从前往后一层一层运算), 我们可以把头信息读取到内存, 层内容先不读,等需要时再读取, 这样只要保证内存有所有层中最大的一层的大小就好了

但是因为多了读取flash的过程, 总的时间就会增加, 具体跟flash的时钟频率(读取速度)有关系

双缓冲加快速度

因为运行模型需要时间, 如果每次读完flash再去运行,如此串行工作简单可靠,但是速度可能会被读取flash拉低挺多,具体取决于读取flash速度(可以尽量提高读取flash的时钟频率)

因为读取 flash 是交给 DMA 做的, 实际上 模型运算也是交给特定的硬件(KPU)去做的, 运行模型的时间可以去读取 flash 的内容到内存备下一次演算用, 这样就可以实现比单缓冲区最终表现速度更快

速度和时间

  • V3 YOLOV2 人脸检测模型(输入320x240), 正常运行24ms, flash run(flash SPI 频率使用67166666 Hz), 单缓冲区37ms, 双缓冲区34ms

  • V3 YOLOV2 模型x(输入224x224x3, 输出层7, 7, 5, 46), 正常运行一次run_yolo2(包含了后处理)50ms, flash run(flash SPI 频率使用67166666 Hz), 单缓冲区117ms, 双缓冲区97ms, 另外,双缓冲有一个layer_batch_size参数, 即每次读入到内存的大小, 前面是设置的0xC000, 改成0xC000*8 后可以变成90ms

  • V4 YOLOV2 模型x(输入224x224x3, 输出层7, 7, 5, 46), 正常50ms, 加了flash run, 单缓冲区变成了112ms(flash SPI 频率使用67166666 Hz),双缓冲(没有使用batch,而是按层读取)105ms

文章有误?有想法想讨论?查看或者发起勘误/讨论 主题
(发起评论需要先登录 github)

/wallpaper/wallhaven-g8oepq_1.jpg