TFLM int8 Hello World 示例

功能说明

本示例在 arcs_evbvenusa_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。

示例步骤

  1. 从示例的 models/hello_world_int8.tflite 读取官方 int8 Hello World 模型。

  2. 注册 tflite::luna::Register_FULLY_CONNECTED_INT8() 算子。

  3. CPU0 创建 SRAM 静态栈推理任务,初始化 Luna 后对四组量化输入执行 TFLM 推理。

  4. 将输出反量化后与 sin() 结果比较。

  5. 检查 Luna 调用次数大于零且 fallback 次数为零。

模型与内存

  • 模型文件:models/hello_world_int8.tflite,构建时转换为 C 数组并链接进固件。

  • Tensor arena:4 KiB 静态内存。

  • 推理任务栈:8 KiB,固定在内部 SRAM 的 .fast.data 段。

  • Luna workspace:由目标板型的 CONFIG_MEM_APRAM_BASECONFIG_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

说明

tflite::GetModel()

读取 FlatBuffer 模型描述

tflite::luna::Register_FULLY_CONNECTED_INT8()

注册 Luna NPU int8 全连接算子

tflite::MicroInterpreter::AllocateTensors()

在静态 tensor arena 中规划张量内存

tflite::MicroInterpreter::Invoke()

执行一次模型推理

tflite::luna::FullyConnectedInt8LunaEvalCount()

获取 Luna 全连接算子调用次数

xTaskCreateStatic()

使用位于内部 SRAM 的静态栈创建推理任务

注意事项

  1. 目标板型:构建系统按芯片配置 Luna 工作区。ARCS 使用 0x20050000 起始的 384 KiB APRAM,VenusA 使用 0x20020000 起始的 384 KiB APRAM。

  2. NPU 库:ARCS 构建从 labs/lnn/common/arcs/libraries/lunna 链接 Luna 库;VenusA 构建从 labs/lnn/common/venusa/libraries/libluna 链接 Luna 3.0.2.2 静态库。

  3. 推理任务栈:调用 Luna 的完整推理任务栈必须位于内部 SRAM;不能使用 默认动态任务栈,因为大块动态分配会优先落入 PSRAM。

  4. ARCS Cache:ARCS 平台在 Luna 初始化前刷新并关闭 DCache,避免 CPU Cache 与 NPU 访问 APRAM 时出现数据不一致。

  5. 子模块版本:父仓记录 feat/listenai_luna 分支的固定提交; 更新子模块后需要重新完成构建和实板验证。

  6. 成功判据:最终日志必须同时满足 luna_evals > 0fallback_evals = 0