前言
在《LNN工具链详解:在CSK6上运行你自己的AI算法》中通过LNN工具链获得了一个算法模型,并在PC上使用test_thinker进行了推理运行,最后如何在CSK6芯片上运行输出的模型呢?
thinker-csk-project就是用来帮助大家解决这个问题的。
工具简介
thinker-csk-project
项目仓库:https://cloud.listenai.com/listenai/wasm/thinker-csk-project支持将 LNN 输出的模型快速部署到 CSK6 芯片上并使用轻量级推理框架 —— Thinker进行推理执行
• 支持在芯片上调用Thinker API
• 支持业务应用使用模型进行推理执行
• 不需要反复编译CP(DSP+NPU)固件
- ARM核主要承担的是业务相关的应用
- 算法模型以及完整的推理执行实在DSP+NPU上
开发者只需要关注算法模型的部署并获取推理执行结果,不需要进行DSP核的固件开发
框架概述
在DSP核运行WASM应用,并通过WASM应用调用Thinker相关API,从而释放NPU算力。
在WASM应用中包含模型文件,并在应用中调用Thinker执行器相关API,从而在CSK上执行推理。
快速上手指引
环境准备
- 环境依赖(Lisa zep 命令行工具)
参考聆思文档中心环境搭建章节
- Sdk获取
- wasi-sdk:wasm的编译工具链
- wasm-thinker-sdk:集成了csk6 cp固件资源与工具、thinker API的sdk
export WASM_THINKER_SDK="/path/to/wasm-thinker-sdk" export
WASI_TOOLCHAIN_PATH="/path/to/wasi-sdk-17.0"
- 从聆思云拉取示例工程代码仓
git clone https://cloud.listenai.com/listenai/wasm/thinker-csk-project
编译
- 编译wasm应用
cd app_wasm lisa zep exec python $WASM_THINKER_SDK/tools/build.py
- 编译zephyr应用(zephyr学习可参考本博客的相关文章,本次实践使用的是聆思CSK6012NanoKit)
cd app_zephyr lisa zep init-app lisa zep build -b csk6012_nano
烧录
- 烧录zephyr应用固件
cd app_zephyr lisa zep exec cskburn -s /dev/ttyUSB0 -C 6 0x0 ./build/zephyr/zephyr.bin -b 748800
- 烧录CP固件资源
lisa zep exec cskburn -s /dev/ttyUSB0 -C 6 0x100000 $WASM_THINKER_SDK/resources/cp.bin -b 748800
- 烧录WASM应用
cd app_wasm lisa zep exec cskburn -s /dev/ttyUSB0 -C 6 0x200000 ./build/app_wasm.aot -b 748800
查看串口日志
- 查看zephyr应用侧日志,连接Daplink,打开串口工具。若运行成功,显示如下:
- 查看CP/WASM日志,外接串口板到开发板RX(GPIOA15)和TX(GPIOA18),打开串口工具
开发指引
框架说明
thinker csk 示例工程师通过在DSP核上运行WASM应用。
如下图所示,ARM核上的Zephyr应用通过get、set两个方法与WASMget函数进行核间通信调用
在WASM应用中,通过zephyr应用set进来input数据,并通过thinker相关的API进行模型加载推理执行,最后把结果进行返回。
目录结构 -- WASM应用
- main.c:文件为应用主入口。
- model.h转换命令:
lisa zep exec python $WASM_THINKER_SDK/tools/bin2hex.py model.bin model.h
目录结构--zephyr应用
- .sdk:该文件夹为执行 lisa zep init-app 进行zephyr应用初始化时创建,可查看west.yml查看当前zephyr应用的依赖。
- boards:该文件夹为zephyr应用设备树overlay存放目录,csk6012_nano板型的overlay便是放置在此。
- prj.conf:该文件为zephyr应用的KConfig配置,包含了当前zephyr应用所需开启/关闭的组件配置项。
- src:该文件夹为应用源码,其中src/main.c为应用主入口。
关键实现
通过核间通信调用WASM应用的 set_input 和 get_output ,实现对模型推理的输入输出操作
WASM应用 -- API Reference
main.c中,主要include了"thinker/thinker.h" 头文件。
其中的函数声明,基本与Thinker的推理api一致。
开发者可看README中WASM应用章节的API Reference进行查阅。
总结
ARM核上的Zephyr应用通过跨核通信,让部署在DSP NPU上的WASM应用拿到业务侧的数据,并执行thinker的API进行模型的加载、数据的输入以及执行推理,最后把结果进行返回。
更多学习资源
如果需要获取本教程相关的学习资源、代码,
或者了解更多与嵌入式开发、AI芯片相关的其他课程,可以点击查看 目录导航。