- 作者:
- 分类:知识&开发->AI->edge_AI
- 阅读:1612
- 点赞:12
- 版权:CC BY-SA 4.0
- 创建:2022-07-14
- 更新:2022-07-29
原文链接(持续更新):https://neucrack.com/p/440
爱芯 Ax620A 简介
四核 A7 1GHz, 3.6TOPS@INT8,14.4TOPS@INT4(W4A4),28.8TOPS@INT2 (W2A4), 提供模型转换工具。
需要注意的是, 这里 3.6TOPS@INT8 指的是芯片总算力, 实际芯片包含了 NPU 和 ISP 部分, 在 AX620A 上两个平分算力,即 1.8TOPS@INT8, 理论上可以关闭 ISP 来将所有算力分配给 NPU 使用,实际算力会小于2倍的单NPU算力, AI-ISP 的算法集成在 BSP,所以一般情况下我们的应用不能使用 AI-ISP 的算力
生成 Resnet18 尝试模型量化和仿真运行
官方配套有文档 newwizard
,注意获取最新的版本,以及配套的转换工具(名叫super pulsar
)
生成模型格式为 joint,可以同时运行 AI-ISP 和 PTQ(post training quantization)模型(离线量化模型), NPU 资源平分为2同时运行, 虚拟出两个虚拟NPU,编号为111
和112
,在编译模型的时候可以指定运行的虚拟 NPU 编号
先生成模型
pulsar build --input resnet18.onnx --output resnet18.joint --config config/config_resnet18.prototxt --virtual_npu 111 --output_config out.prototxt
得到 joint 模型, 直接运行, 即可得到量化误差
pulsar run resnet18.onnx resnet18.joint --input images/img-416.jpg --config out.prototxt --output_gt gt
-------------- ----------------- ------------------
Layer: output0 2-norm RE: 10.26% cosine-sim: 0.9958
-------------- ----------------- ------------------
转换工具还挺好用的,相较于其它厂商的比较易用
实机运行模型
首先看系统, SDK 目录里面有几个文件, SDK 是源码, 需要执行解压脚本解压(编译后产生 axp?),axp 是编译好的系统镜像
将 master 那个 axp 烧录到板子, 烧录工具只支持 windows。。。镜像也不是通用镜像格式, 比较糟糕,找同事的windows电脑烧录了下
连接板子串口(官方板子竟然是个 micro口,惊)
然后发现 minicom 无法发送数据,换个终端工具好了, 估计是 CRLF 啥的没设置好?
/root # run_joint resnet18.joint --repeat 100 --warmup 10
run joint version: 0.5.6
virtual npu mode is 1_1
tools version: 0.6.0.8
f4e80a2a
Using wbt 0
Max Batch Size 1
Support Dynamic Batch? No
Quantization Type is mix
Input[0]: input0
Shape [1, 224, 224, 3] NHWC uint8 BGR
Memory Physical
Size 150528
Output[0]: output0
Shape [1, 1000] NCHW float32
Memory Physical
Size 4000
Using batch size 1
input[0] input0 data not provided, using random data
Not set environment variable to report memory usage!
CMM usage: 15785632
Create handle took 481.00 ms (neu 8.02 ms, onnx 0.00 ms, axe 0.00 ms, overhead 472.98 ms)
Run task took 7235 us (99 rounds for average)
Run NEU took an average of 7190 us (overhead 21 us)
NPU perf cnt total: 5645979
NPU perf cnt of eu(0): 2791989
NPU perf cnt of eu(1): 0
NPU perf cnt of eu(2): 0
NPU perf cnt of eu(3): 4206629
NPU perf cnt of eu(4): 0
可见 resnet18 infer(不包含模型加载和预处理) 用了 7.2ms
, 作为比较, CR182x 宣称 0.5Tops
算力, resnet18
需要12ms
; resnet50 用了 26.8ms
, CR182x 用时34.5ms
; mobilenetV2 用时4ms
, CR182x 用时5.8ms
, 而AX620
NPU算力1.8Tops
,看起来理论上是 CR182x 的 3.6 倍, 在这几个模型上单看时间并没有这么大的差距,原因可能是算力计算方法的不同, 或者是runtime的运行效率问题
代码编写
例程在ax-samples, 按照编译说明编译,工具链和 一个 opecv 库, 注意 opencv 我遇到了解压后文件夹命名问题, 具体根据编译报错找一个cmakelist.txt 中的依赖路径改一下就好了,后面可能就默认修复了。
不过有一个文件不是公开的, 就是 msp 包(就是上面截图的 AX620_SDK压缩包里面的一部分),需要找 FAE获取,后面应该会想办法公开获取的吧
mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/arm-linux-gnueabihf.toolchain.cmake -DBSP_MSP_DIR=/home/neucrack/data/ax620/AX620_R1.22.1001_Sipeed/02.SDK/msp/out/ ..
make install
然后在 install
目录就会有二进制文件了
发送到开发板即可运行,顺便,系统没有内置 scp 方法拷贝,也没有 adb,串口也不支持 zmoden发送文件,貌似内置了个 tftp,可以尝试使用,我懒得去弄,直接在电脑开个服务python -m http.server
然后 板子用 wget
下载文件测试使用了