TFLM int8 Hello World 示例
功能说明
本示例在 arcs_evb 或 venusa_rd_evb 的 CPU0 上运行 TensorFlow Lite
for Microcontrollers hello_world_int8.tflite 模型,并使用 Luna NPU 版本的
FULLY_CONNECTED 算子完成正弦函数近似推理。示例会检查推理误差以及
Luna/fallback 调用计数,只有全部推理都走 Luna 路径时才输出通过日志。
Luna 算子库会在调用栈上生成命令参数。为保证命令参数及其嵌套对象均可被
Luna 访问,本示例通过 xTaskCreateStatic() 创建专用推理任务,并将
8 KiB 任务栈固定在内部 SRAM 的 .fast.data 段。
硬件连接
无需外部连接,示例使用 LS2684 或 CSK7004J8U 内置 Luna NPU。
示例步骤
从示例的
models/hello_world_int8.tflite读取官方 int8 Hello World 模型。注册
tflite::luna::Register_FULLY_CONNECTED_INT8()算子。CPU0 创建 SRAM 静态栈推理任务,初始化 Luna 后对四组量化输入执行 TFLM 推理。
将输出反量化后与
sin()结果比较。检查 Luna 调用次数大于零且 fallback 次数为零。
模型与内存
模型文件:
models/hello_world_int8.tflite,构建时转换为 C 数组并链接进固件。Tensor arena:4 KiB 静态内存。
推理任务栈:8 KiB,固定在内部 SRAM 的
.fast.data段。Luna workspace:由目标板型的
CONFIG_MEM_APRAM_BASE和CONFIG_MEM_APRAM_SIZE决定。
编译
模型已随示例提供,但 TFLM 运行时源码仍来自子模块。首次使用时初始化子模块:
git submodule update --init modules/tflite-micro
构建 arcs_evb 固件:
./build.sh -C -S labs/tflite_micro/hello_world -DBOARD=arcs_evb
构建 venusa_rd_evb 固件:
./build.sh -C -S labs/tflite_micro/hello_world -DBOARD=venusa_rd_evb
烧录
烧录 ARCS CPU0 固件,将 <串口设备> 替换为实际设备:
./tools/burn/cskburn -C arcs -s <串口设备> -b 3000000 \
--verify-all 0x0 build/tflite_micro_hello_world.bin
烧录 VenusA CPU0 固件:
./tools/burn/cskburn -C venusa -s <串口设备> -b 3000000 \
--verify-all 0x0 build/tflite_micro_hello_world.bin
预期输出
Running on cpu-id: 0
I/tflm_hello_world ... TFLM int8 hello world start
I/tflm_hello_world ... input=0.77 output=0.6964 expected=0.6961 error=0.0003
I/tflm_hello_world ... input=1.57 output=0.9949 expected=1.0000 error=0.0051
I/tflm_hello_world ... input=2.30 output=0.7296 expected=0.7457 error=0.0161
I/tflm_hello_world ... input=3.14 output=-0.0083 expected=0.0016 error=0.0099
I/tflm_hello_world ... TFLM int8 hello world passed: luna_evals=12 fallback_evals=0
I/tflm_hello_world ... inference task SRAM stack: used=... bytes free=... bytes
核心 API
API |
说明 |
|---|---|
|
读取 FlatBuffer 模型描述 |
|
注册 Luna NPU int8 全连接算子 |
|
在静态 tensor arena 中规划张量内存 |
|
执行一次模型推理 |
|
获取 Luna 全连接算子调用次数 |
|
使用位于内部 SRAM 的静态栈创建推理任务 |
注意事项
目标板型:构建系统按芯片配置 Luna 工作区。ARCS 使用
0x20050000起始的 384 KiB APRAM,VenusA 使用0x20020000起始的 384 KiB APRAM。NPU 库:ARCS 构建从
labs/lnn/common/arcs/libraries/lunna链接 Luna 库;VenusA 构建从labs/lnn/common/venusa/libraries/libluna链接 Luna 3.0.2.2 静态库。推理任务栈:调用 Luna 的完整推理任务栈必须位于内部 SRAM;不能使用 默认动态任务栈,因为大块动态分配会优先落入 PSRAM。
ARCS Cache:ARCS 平台在 Luna 初始化前刷新并关闭 DCache,避免 CPU Cache 与 NPU 访问 APRAM 时出现数据不一致。
子模块版本:父仓记录
feat/listenai_luna分支的固定提交; 更新子模块后需要重新完成构建和实板验证。成功判据:最终日志必须同时满足
luna_evals > 0和fallback_evals = 0。