- 作者:
- 分类:知识&开发->AI->k210
- 阅读:5319
- 点赞:23
- 版权: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, 双缓冲区34msV3 YOLOV2
模型x(输入224x224x3, 输出层7, 7, 5, 46), 正常运行一次run_yolo2(包含了后处理)50ms, flash run(flash SPI 频率使用67166666 Hz), 单缓冲区117ms, 双缓冲区97ms, 另外,双缓冲有一个layer_batch_size参数, 即每次读入到内存的大小, 前面是设置的0xC000, 改成0xC000*8后可以变成90msV4 YOLOV2
模型x(输入224x224x3, 输出层7, 7, 5, 46), 正常50ms, 加了flash run, 单缓冲区变成了112ms(flash SPI 频率使用67166666 Hz),双缓冲(没有使用batch,而是按层读取)105ms

