Skip to content

Spike: MNN 3.6.0 + Qwen3-VL-2B 端侧视觉推理 ​

Spike ID: 001 日期: 2026-06-18(创建),2026-07-22(模拟器实测) 状态: 模拟器 CPU 垂直切片通过;Metal 失败;真机门未执行,Spike 未通过

纠正后的假设 ​

原文中的 Qwen2.5-VL-2B MNN 预转换仓库不存在,latest 也不能形成可复核基线。本轮固定:

  • MNN 3.6.0,tag commit cc20f672af9e177e2fa338c332dc097de2fc9264
  • taobao-mnn/Qwen3-VL-2B-Instruct-MNN,revision 9e49ec71ded22500a997ed0f9961e1e92b85bbc9
  • 产品目标为每 2–5s 处理一张关键帧,不宣称 1fps

本轮用户将执行范围收窄为 iOS Simulator,因此只能验证构建兼容性和软件行为,不能回答 iPhone 延迟、峰值内存、热状态或 jetsam 风险。

方法 ​

  1. 从 MNN 官方仓库 checkout 固定 tag,在 Apple Silicon 上构建 arm64 iOS Simulator 静态 framework。

  2. 下载 MNN 官方组织发布的预转换 Qwen 模型,并逐文件记录 SHA-256。

  3. 使用 Wikimedia Commons 的无隐私 CPR 训练图片 CPR_training-03.jpg,SHA-256 为 8b0a750b2c2b868f51216eaf4079639d8716905e64d134d39a47705e833d38a6。

  4. Prompt 仅允许以下 schema:

    json
    {"signal":"hand_position_correct","observation":"yes|no|unknown"}
  5. 输出经过严格 JSON、键集合、signal 白名单和枚举值校验;任何失败都转换为 unknown。

  6. CPU 后端对同一输入连续运行 10 次;Metal 后端运行 1 次以验证实际输出。原始构建和推理日志仅保存在本机临时目录,不写入仓库。

环境与锁定信息 ​

项目值
运行环境iPhone 17 Pro / iOS 26.2 Simulator,arm64
主机Apple Silicon,Apple M5 Pro
Xcode26.2
MNN3.6.0 / cc20f672af9e177e2fa338c332dc097de2fc9264
模型taobao-mnn/Qwen3-VL-2B-Instruct-MNN
模型 revision9e49ec71ded22500a997ed0f9961e1e92b85bbc9
固定输入CPR_training-03.jpg / 8b0a750b...38a6

模型文件 SHA-256 ​

文件SHA-256
config.json1ed5c6e65459fdc4b0c33319715b763005013ba8580dd3c687bd2651546ca2a4
llm_config.json5408721c81cc9a7ea8aa485a0652e5e1a47dd5ea5bbd5af2e1f16bc4f6358699
tokenizer.txt7119de4966cc6a8ae87d7f083e65b315282d06c3122fdd41ce783fdd2d3c1ca2
llm.mnn.json961dec6de26a53f63ba03e0560b52b9fc41f9a8f6c4188ee15a7a0755e883ea0
llm.mnnc2286f60cbd56a82f26bfeac92f6a96e9690889b1939346abfe9e1fae996a8f3
llm.mnn.weight1554f9ce71743b56c2d7fba4cb0c2a31c7cddf4f21e1a2ff5a2e85b9a316a29f
visual.mnnc489c1f65dc6aa5bcee42b3e291f7987df1111423c1fe570d0f3394e1207d2bb
visual.mnn.weight9feb04848cafad1117a510b43d6c2b58d6c31bef1040598156d266f9b42f581f

Framework 构建参数 ​

启用:

  • MNN_ARM82=ON
  • MNN_LOW_MEMORY=ON
  • MNN_SUPPORT_TRANSFORMER_FUSE=ON
  • MNN_BUILD_LLM=ON
  • MNN_BUILD_OPENCV=ON
  • MNN_IMGCODECS=ON
  • MNN_METAL=ON

禁用:

  • MNN_BUILD_AUDIO=OFF
  • MNN_BUILD_DIFFUSION=OFF
  • MNN_BUILD_LLM_OMNI=OFF

MNN 3.6.0 已永久移除 MNN_CPU_WEIGHT_DEQUANT_GEMM,官方 CMake 注释要求使用 MNN_LOW_MEMORY。同时,3.6.0 中 MNN_BUILD_LLM_OMNI=ON 会强制开启 audio;本轮不需要 audio,因此采用 MNN_BUILD_LLM + MNN_BUILD_OPENCV + MNN_IMGCODECS 的最小视觉构建,实际编译出 multimodal/vision 路径。

官方 iOS 示例中的 LLMInferenceEngineWrapper 只有文本接口,并不存在此前设想的 initWithModelPath、processMultimodalInput 和 cancelInference。集成实际使用 MNN 3.6.0 的 C++ MultimodalPrompt 与 Llm::response,外包一层 Objective-C++。

模拟器数据 ​

CPU:通过严格输出门 ​

同一图片连续 10 次,均返回:

json
{"signal":"hand_position_correct","observation":"yes"}
指标结果
load() wall time1405.0 ms
完整输出 p501310.0 ms
完整输出 p951813.1 ms
首 token首次 1577.0 ms;后续 1069.6–1103.9 ms
vision stage首次 916.7 ms;后续 440.2–457.1 ms
prefill551.1–580.6 ms
decode228.1–237.3 ms
严格合法 JSON10/10
sampled physical footprint首次 217,059,648 B;末次 221,843,896 B;差值 +4,784,248 B

vision stage 是 MNN context 的视觉阶段累计差值,不等同于单独的图片预处理耗时。physical footprint 是每次完成后的采样值,不是 Instruments 峰值,也不能据此证明没有内存泄漏。

Metal:未通过严格输出门 ​

为 CPU 与 Metal 使用独立 tmp_path,排除共享 mnn_cachefile.bin 污染后,Metal 的实际收据为:

指标结果
load() wall time1029.3 ms
完整调用1639.1 ms
首 token 计时1159.9 ms
sampled physical footprint1,401,623,832 B
原始输出空字符串
严格合法 JSON0/1

因此 Metal 模拟器后端失败;速度数字不能覆盖软件行为失败。首次排查还发现 CPU/Metal 共用 MNN 缓存会污染后续结果,运行时现已按 backend 隔离缓存目录。

结论与证据边界 ​

问题结论
部署成功仅证明 MNN framework 与模型能在 arm64 Simulator 的 CPU 后端加载和执行;未证明真机部署
软件行为正确CPU 固定图链路已跑通:图片 → MNN → 严格 JSON → PracticeEvent → 既有 SessionReducer / ConfidenceRouter;Metal 未通过
医疗检测准确率未验证。单张图得到 yes 不能证明手位判断正确,更不能外推 precision、recall 或临床有效性
生成式 confidence未采用。首个切片固定以 confidence=0、alert_tier=low 进入待考官确认,不触发强提醒
真机性能与稳定性未执行。冷启动、峰值内存、10 次 p50/p95、热状态、jetsam 和持续运行内存仍需真机重测

模拟器 CPU 的 p95 为 1.81 秒,但模拟器数据不能转换为 iPhone 吞吐声明,也不能据此宣称 1fps。产品仍按 2–5s 关键帧检测设计。在 Metal 输出问题解决且未来重新授权真机测试前,不扩展实时相机或 Live UI。

后续 20+3 张多图与 visibility prompt 预验证见 spike-002。该结果没有推翻本页的 Simulator CPU 部署和严格解析收据,但暴露出明显肯定偏置,进一步阻断了 hand_position_correct 的产品启用与医疗准确率声明。

选择更新(2026-07-22):本页保留 2B 的历史构建与固定图收据,不改写为 4B 数据。候选筛选后,当前固定图片切片已按 TD-024 切换到 Qwen3-VL-4B;正式 profile、CPU 10 次与 Metal 失败收据见 spike-002。

Jason Xun judges & accepts · AI assists