TFLM MobileNet V2 Luna 推理示例

功能说明

本示例在 arcs_evbvenusa_rd_evb 的 CPU0 上运行 MobileNet V2 W8A8 模型,通过 TensorFlow Lite for Microcontrollers 调用 Luna NPU 版本的 CONV_2DDEPTHWISE_CONV_2DFULLY_CONNECTED 算子。示例记录 整网推理周期、输出校验和、Top-1 索引以及各 Luna kernel 的调用次数和分阶段 周期,用于验证 TFLM 与 Luna 的整网适配链路并定位性能热点。

示例将模型输入全部填充为 128,目的是提供稳定、可重复的推理冒烟测试, 不执行图片预处理。因此日志中的 Top-1 索引不代表真实图片的分类结果。

硬件连接

无需外部连接,示例使用 LS2684 或 CSK7004J8U 内置 Luna NPU。

模型与内存

  • 模型文件:models/mobilenet_v2.tflite,大小约 3.84 MiB。

  • 输入:UINT8 张量,示例将所有输入元素填充为 128

  • 输出:1000 个 UINT8 分类分数。

  • Tensor arena:位于 PSRAM;ARCS 性能配置为 6 MiB,其他平台默认 4 MiB。

  • Conv2D 预打包权重:ARCS 预留最多 4 MiB tensor arena 空间,以消除推理期间的 权重转换和打包;其他平台默认预算为 1 MiB。

  • 推理任务栈:1024 个 StackType_t,在当前 RV32 ABI 下为 4 KiB,固定在 内部 SRAM 的 .fast.data 段。

  • Luna workspace:由目标板型的 APRAM 配置提供。

构建时,CMake 将 mobilenet_v2.tflite 转换为 C 数组并链接进固件。需要使用 其他兼容模型时,可通过 TFLM_MOBILENET_MODEL 覆盖默认路径。

示例步骤

  1. 初始化 Luna 时钟和运行时;ARCS 保持硬件一致性 DCache 开启,以加速 PSRAM 张量访问。

  2. 读取随示例提供的 MobileNet V2 W8A8 模型并检查 TFLite schema 版本。

  3. 注册模型需要的 10 个算子,其中卷积、深度卷积和全连接使用 Luna kernel。

  4. 在 PSRAM tensor arena 中分配模型张量和预打包卷积权重。

  5. 使用常量输入执行一次推理,计算输出校验和与 Top-1 索引。

  6. 输出 tensor arena 使用量、推理周期、Luna kernel 分阶段统计、调用计数和 推理任务剩余栈空间。

性能与内存配置

prj_arcs.conf 默认启用 -O3,并使用下列两个 Kconfig 选项:

选项

ARCS 默认值

说明

CONFIG_TFLM_MOBILENET_V2_TENSOR_ARENA_SIZE

6291456(6 MiB)

PSRAM tensor arena 容量

CONFIG_TFLM_MOBILENET_V2_CONV_PREPARED_FILTER_BUDGET

4194304(4 MiB)

Conv2D 持久化预打包权重预算

增大预打包预算会降低推理耗时,但必须同时保证 tensor arena 能容纳激活张量。 替换模型后应检查 tensor arena: used=... capacity=...;若出现 Failed to resize buffer,应增大 arena 或减小预打包预算。

编译

模型已随示例提供,但 TFLM 运行时源码仍来自子模块。首次使用时初始化子模块:

git submodule update --init modules/tflite-micro

构建 arcs_evb 固件:

./build.sh -C -S labs/tflite_micro/mobilenet_v2 -DBOARD=arcs_evb

构建 venusa_rd_evb 固件:

./build.sh -C -S labs/tflite_micro/mobilenet_v2 -DBOARD=venusa_rd_evb

烧录

烧录 ARCS CPU0 固件,将 <串口设备> 替换为实际设备:

./tools/burn/cskburn -C arcs -s <串口设备> -b 3000000 \
    --verify-all 0x0 build/tflite_micro_mobilenet_v2.bin

烧录 VenusA CPU0 固件:

./tools/burn/cskburn -C venusa -s <串口设备> -b 3000000 \
    --verify-all 0x0 build/tflite_micro_mobilenet_v2.bin

预期输出

推理周期和剩余栈空间会随平台及构建配置变化。使用随示例提供的模型时,日志格式如下:

I/tflm_mobilenet_v2 ... mobilenet_v2 passed: output=1000 checksum=62994 top1=892 invoke=... cycles conv_luna=35 depthwise_luna=17 fc_luna=1
I/tflm_mobilenet_v2 ... profile conv inner: ...
I/tflm_mobilenet_v2 ... mobilenet_v2 result=0 stack_free=...

mobilenet_v2 passed 表示模型解析、张量分配和 Invoke() 均成功。确认 Luna 加速链路时,还应检查 conv_lunadepthwise_lunafc_luna 均大于零。

核心 API

API

说明

tflite::GetModel()

读取 FlatBuffer 模型描述

tflite::MicroMutableOpResolver

仅注册 MobileNet V2 所需算子

tflite::luna::Register_CONV_2D_INT8()

注册 Luna NPU int8 卷积算子

tflite::luna::Register_DEPTHWISE_CONV_2D_INT8()

注册 Luna NPU int8 深度卷积算子

tflite::luna::Register_FULLY_CONNECTED_INT8()

注册 Luna NPU int8 全连接算子

tflite::MicroInterpreter::AllocateTensors()

在 PSRAM tensor arena 中规划张量内存

tflite::MicroInterpreter::Invoke()

执行一次整网推理

xTaskCreateStatic()

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

核心文件

文件

说明

models/mobilenet_v2.tflite

MobileNet V2 W8A8 模型

src/main.cc

算子注册、张量分配、推理及结果检查

src/luna_platform.c

Luna 时钟、Cache 和运行时初始化

src/model_data.cc.in

将模型字节生成固件内 C 数组的模板

prj_arcs.conf / prj_venusa.conf

ARCS 与 VenusA 的 CPU0 平台配置

注意事项

  1. 分类语义:示例使用常量输入,只验证推理链路;Top-1 索引不能作为图片 分类结果。接入真实图片时需要按模型要求完成尺寸、通道顺序和量化预处理。

  2. Flash 容量:模型会直接链接进固件,当前配置为固件预留 8 MiB Flash 空间。

  3. 模型兼容性:替换模型时必须保持输入类型、输出类型和算子集合兼容;否则需 同步修改 src/main.cc 的张量检查与算子注册。

  4. 推理任务栈:调用 Luna 的完整推理任务栈必须位于内部 SRAM,避免命令参数 落入 Luna 无法访问的内存。

  5. ARCS Cache:当前 ARCS 板级配置启用硬件一致性 DCache;Luna 命令数据位于 APRAM,模型张量位于 PSRAM。若移植到非一致性 Cache 平台,必须补充显式的 clean/invalidate 操作,不能直接沿用本配置。

  6. 成功判据:除 result=0 外,还应确认三类 Luna kernel 调用计数均大于零。