- 作者:
- 分类:知识&开发->AI->k210
- 阅读:3777
- 点赞:21
- 版权:CC BY-SA 4.0
- 创建:2020-09-11
- 更新:2020-09-15
原文链接(持续更新):https://neucrack.com/p/313
以下方法已经在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