简述
最近申请到一块儿聆思的 CSK6 开发板,这块儿板子好像可以跑一些 AI 算法,索性就拿来玩玩
入门
官方的很多文档写的还是很详细的,我拿到的是 CSK6011, 这里可以看到板子详细的说明, 因为我不是做嵌入式的,此次我主要用来测试一下目标检测 yolo 算法效果跑的怎么样
环境
我这边主要使用的是核显的 win11 本子,所以我的开发环境主要选择 win。折腾多了我现在越来越懒,越来越喜欢开箱即用的环境,环境搭建的官方文档在这里,我也就选了一个最简单方案
这几个安装完基本就能直接跑
测试
作为非嵌入式的小菜鸡,验证是否会开发的自我安慰项目,电灯实验
这里就简单写一下几个命令
## 选择 hello_world
lisa zep create
cd hello_world
## 这里如果开发板不变的话,可以 lisa zep config build.board csk6011a_nano
## 可以直接执行 lisa zep build
lisa zep build -b csk6011a_nano
lisa zep flash
刷入成功后就看到 D1 等在闪了
结构
HELLO_WORLD
│ CMakeLists.txt
│ prj.conf
│ README.rst
│ sample.yaml
│
├─boards
│ csk6011a_nano.overlay
│
└─src
main.c
进阶
ok,可以简单研究一下ai算法实际运行情况了
算法
本来我想测试 yolov3 算法,但是量化啥的有点麻烦,我也没有显卡,只能使用官方的 resnet 模型
工程
环境
环境的话我选择直接使用docker,根据官方文档操作
镜像主要是两个
sudo docker pull listenai/linger:1.1.1 #纯cpu版本镜像
sudo docker pull listenai/thinker:2.1.1
运行之后执行以下就可以用了
docker container run -it listenai/linger:1.1.1 /bin/bash
root@66d80f4aaf1e:/linger#sh install.sh
docker container run -it listenai/thinker:2.1.1 /bin/bash
root@2f0688ea7963:/thinker#sh scripts/x86_linux.sh
量化
官方工具量化,我这里没有GPU不考虑精度
使用起来比较简单,核心就几句话
net.train()
train_mode = "quant"
linger.trace_layers(net, net, dummy_input, fuse_bn=True)
normalize_modules = (nn.Conv2d, nn.Linear, nn.BatchNorm2d)
replace_tuple = (nn.Conv2d, nn.BatchNorm2d, nn.Linear)
net = linger.normalize_layers(net, normalize_modules=normalize_modules, normalize_weight_value=8, normalize_bias_value=None, normalize_output_value=8)
net = linger.init(net, quant_modules=replace_tuple, mode=linger.QuantMode.QValue)
这样就可以把模型拿去再训练一下,下面就可以导出了
train_mode = "quant"
# linger.trace_layers(net, net, dummy_input, fuse_bn=True)
replace_tuple = (nn.Conv2d, nn.BatchNorm2d, nn.Linear)
net = linger.init(net, quant_modules=replace_tuple, mode=linger.QuantMode.QValue)
net.load_state_dict(torch.load("./aa_finetune.pth"))
with torch.no_grad():
out = net(dummy_input)
torch.onnx.export(net, dummy_input,"aa_quant.onnx",export_params=True,opset_version=11,operator_export_type=torch.onnx.OperatorExportTypes.ONNX_ATEN_FALLBACK)
train_mode
是干啥用的,我没看懂
转换
onnx
模型可以直接导出onnx
bin
cd demo/resnet18
tpacker -g resnet18-12-regular.onnx -d True -o model.bin
输入
顺便这里把输入也准备一下,
docker环境没给安装torch, 想执行输入脚本需要自己安装包
首先 https://github.com/LISTENAI/t... 把resnet28
换成resnet18
其次可以在docker安装torch
## 激活docker中的conda环境
source activate root
## 需要的安装一下
pip install torch torchvision
python ./tools/image_preprocess.py
如果在本地环境中使用脚本那就用docker cp进去
docker cp ./demo/resnet18/apple_after_resize.bin thinker:/thinker
测试
所有需要的东西都准备好了,那就测试一下
./bin/test_thinker demo/resnet18/apple_after_resize.bin demo/resnet18/model.bin demo/resnet18/output.bin 3 32 32 6
### 输出
init model successful!
create executor successful!
forward successful!
Predicted category index: 0
Predicted label: apple
移植
所有都好了,那就放到设备上试一下
这块儿文档也比较乱,大概是这个仓库
git clone https://cloud.listenai.com/listenai/wasm/thinker-csk-project.git
cd thinker-csk-project/app_zephyr
编译 wasm npu 应用
首先需要下载 SDK 防止出错所以跟官方一样版本, 需要在 Linux 下编译,我这里使用 docker
docker cp wasi-sdk-17.0-linux.tar.gz thinker:/opt
接下来在 docker 中操作
cd /opt
tar -zxvf wasi-sdk-17.0-linux.tar.gz
export WASI_TOOLCHAIN_PATH=/opt/wasi-sdk-17.0
git clone https://cloud.listenai.com/listenai/wasm/wasm-sdk.git --recursive
export WASM_BASE=/path/to/wasm-sdk
编译方式给的挺简单,我就是编译不成功
例如这个工程
刷入模型等固件
一直在没刷进去,后来官方有更新编译好的固件,索性直接用了,在这里
lisa zep exec cskburn -s COMx -C 6 -b 748800 0x100000 resource/cp.bin
# 这里就是上面那步编译出来的
lisa zep exec cskburn -s COMx -C 6 -b 748800 0x200000 resource/thinker_resnet18.aot
lisa zep exec cskburn -s COMx -C 6 -b 748800 0x300000 resource/resnet18_model.bin
刷入工程
lisa zep build -p -b csk6011a_nano
lisa zep flash -r csk --port COMx
打开工具就会看到
2023-09-14 16:42:59.683 *** Booting Zephyr OS build 6d326a36d5a9 ***
2023-09-14 16:42:59.685 Hello World! csk6011a_nano
2023-09-14 16:42:59.998 Loading WASM app addr: 0x18200008, size: 12637
2023-09-14 16:43:03.468 #0: Alloc video buffer: 614400
2023-09-14 16:43:03.472 #1: Alloc video buffer: 614400
2023-09-14 16:43:03.475 Press BUTTON to start a capture.
2023-09-14 16:43:03.524 Dequeueing...
2023-09-14 16:43:03.556 Processing...
2023-09-14 16:43:03.656 Resizing...
2023-09-14 16:43:05.314 Feature extraction...
2023-09-14 16:43:05.332 Input data to Thinker...
2023-09-14 16:43:05.435 Max probability: 31, index: 99
2023-09-14 16:43:05.436 Predicted label: worm
结尾
整个体验下来就是,流程基本能跑通,但是很多文档比较杂乱无章
模型必须要 QAT, 对于我这种无显卡的人来说太难了
后续有时间可以单独测一下 yolov3 的速度
最近在面试,没空搞...这篇文章也是抽时间水出来的