选中内容(绿色)时除了会搜索文章名,还会搜索文章内容
点击结果中的文章名进入文章界面后可以按Ctrl+F在页面内搜索
  • 版权:CC BY-SA 4.0
  • 创建:2022-07-14
  • 更新:2022-07-29
爱芯 AX620A NPU 初体验


爱芯 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,编号为111112,在编译模型的时候可以指定运行的虚拟 NPU 编号

先生成模型

  1. pulsar build --input resnet18.onnx --output resnet18.joint --config config/config_resnet18.prototxt --virtual_npu 111 --output_config out.prototxt

得到 joint 模型, 直接运行, 即可得到量化误差

  1. pulsar run resnet18.onnx resnet18.joint --input images/img-416.jpg --config out.prototxt --output_gt gt
  2. -------------- ----------------- ------------------
  3. Layer: output0 2-norm RE: 10.26% cosine-sim: 0.9958
  4. -------------- ----------------- ------------------

转换工具还挺好用的,相较于其它厂商的比较易用

实机运行模型

首先看系统, SDK 目录里面有几个文件, SDK 是源码, 需要执行解压脚本解压(编译后产生 axp?),axp 是编译好的系统镜像

files

将 master 那个 axp 烧录到板子, 烧录工具只支持 windows。。。镜像也不是通用镜像格式, 比较糟糕,找同事的windows电脑烧录了下

连接板子串口(官方板子竟然是个 micro口,惊)
然后发现 minicom 无法发送数据,换个终端工具好了, 估计是 CRLF 啥的没设置好?

  1. /root # run_joint resnet18.joint --repeat 100 --warmup 10
  2. run joint version: 0.5.6
  3. virtual npu mode is 1_1
  4. tools version: 0.6.0.8
  5. f4e80a2a
  6. Using wbt 0
  7. Max Batch Size 1
  8. Support Dynamic Batch? No
  9. Quantization Type is mix
  10. Input[0]: input0
  11. Shape [1, 224, 224, 3] NHWC uint8 BGR
  12. Memory Physical
  13. Size 150528
  14. Output[0]: output0
  15. Shape [1, 1000] NCHW float32
  16. Memory Physical
  17. Size 4000
  18. Using batch size 1
  19. input[0] input0 data not provided, using random data
  20. Not set environment variable to report memory usage!
  21. CMM usage: 15785632
  22. Create handle took 481.00 ms (neu 8.02 ms, onnx 0.00 ms, axe 0.00 ms, overhead 472.98 ms)
  23. Run task took 7235 us (99 rounds for average)
  24. Run NEU took an average of 7190 us (overhead 21 us)
  25. NPU perf cnt total: 5645979
  26. NPU perf cnt of eu(0): 2791989
  27. NPU perf cnt of eu(1): 0
  28. NPU perf cnt of eu(2): 0
  29. NPU perf cnt of eu(3): 4206629
  30. 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, 而AX620NPU算力1.8Tops,看起来理论上是 CR182x 的 3.6 倍, 在这几个模型上单看时间并没有这么大的差距,原因可能是算力计算方法的不同, 或者是runtime的运行效率问题

代码编写

例程在ax-samples, 按照编译说明编译,工具链和 一个 opecv 库, 注意 opencv 我遇到了解压后文件夹命名问题, 具体根据编译报错找一个cmakelist.txt 中的依赖路径改一下就好了,后面可能就默认修复了。
不过有一个文件不是公开的, 就是 msp 包(就是上面截图的 AX620_SDK压缩包里面的一部分),需要找 FAE获取,后面应该会想办法公开获取的吧

  1. mkdir build
  2. cd build
  3. 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/ ..
  4. make install

然后在 install目录就会有二进制文件了

发送到开发板即可运行,顺便,系统没有内置 scp 方法拷贝,也没有 adb,串口也不支持 zmoden发送文件,貌似内置了个 tftp,可以尝试使用,我懒得去弄,直接在电脑开个服务python -m http.server 然后 板子用 wget 下载文件测试使用了

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

/wallpaper/wallhaven-y8xm2g.jpg