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。 示例步骤 -------- 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_BASE`` 和 ``CONFIG_MEM_APRAM_SIZE`` 决定。 编译 ---- 模型已随示例提供,但 TFLM 运行时源码仍来自子模块。首次使用时初始化子模块: .. code-block:: bash git submodule update --init modules/tflite-micro 构建 ``arcs_evb`` 固件: .. code-block:: bash ./build.sh -C -S labs/tflite_micro/hello_world -DBOARD=arcs_evb 构建 ``venusa_rd_evb`` 固件: .. code-block:: bash ./build.sh -C -S labs/tflite_micro/hello_world -DBOARD=venusa_rd_evb 烧录 ---- 烧录 ARCS CPU0 固件,将 ``<串口设备>`` 替换为实际设备: .. code-block:: bash ./tools/burn/cskburn -C arcs -s <串口设备> -b 3000000 \ --verify-all 0x0 build/tflite_micro_hello_world.bin 烧录 VenusA CPU0 固件: .. code-block:: bash ./tools/burn/cskburn -C venusa -s <串口设备> -b 3000000 \ --verify-all 0x0 build/tflite_micro_hello_world.bin 预期输出 -------- .. code-block:: text 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 -------- .. list-table:: :header-rows: 1 * - 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 > 0`` 和 ``fallback_evals = 0``。