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 commitcc20f672af9e177e2fa338c332dc097de2fc9264 taobao-mnn/Qwen3-VL-2B-Instruct-MNN,revision9e49ec71ded22500a997ed0f9961e1e92b85bbc9- 产品目标为每
2–5s处理一张关键帧,不宣称1fps
本轮用户将执行范围收窄为 iOS Simulator,因此只能验证构建兼容性和软件行为,不能回答 iPhone 延迟、峰值内存、热状态或 jetsam 风险。
方法
从 MNN 官方仓库 checkout 固定 tag,在 Apple Silicon 上构建 arm64 iOS Simulator 静态 framework。
下载 MNN 官方组织发布的预转换 Qwen 模型,并逐文件记录 SHA-256。
使用 Wikimedia Commons 的无隐私 CPR 训练图片
CPR_training-03.jpg,SHA-256 为8b0a750b2c2b868f51216eaf4079639d8716905e64d134d39a47705e833d38a6。Prompt 仅允许以下 schema:
json{"signal":"hand_position_correct","observation":"yes|no|unknown"}输出经过严格 JSON、键集合、signal 白名单和枚举值校验;任何失败都转换为
unknown。CPU 后端对同一输入连续运行 10 次;Metal 后端运行 1 次以验证实际输出。原始构建和推理日志仅保存在本机临时目录,不写入仓库。
环境与锁定信息
| 项目 | 值 |
|---|---|
| 运行环境 | iPhone 17 Pro / iOS 26.2 Simulator,arm64 |
| 主机 | Apple Silicon,Apple M5 Pro |
| Xcode | 26.2 |
| MNN | 3.6.0 / cc20f672af9e177e2fa338c332dc097de2fc9264 |
| 模型 | taobao-mnn/Qwen3-VL-2B-Instruct-MNN |
| 模型 revision | 9e49ec71ded22500a997ed0f9961e1e92b85bbc9 |
| 固定输入 | CPR_training-03.jpg / 8b0a750b...38a6 |
模型文件 SHA-256
| 文件 | SHA-256 |
|---|---|
config.json | 1ed5c6e65459fdc4b0c33319715b763005013ba8580dd3c687bd2651546ca2a4 |
llm_config.json | 5408721c81cc9a7ea8aa485a0652e5e1a47dd5ea5bbd5af2e1f16bc4f6358699 |
tokenizer.txt | 7119de4966cc6a8ae87d7f083e65b315282d06c3122fdd41ce783fdd2d3c1ca2 |
llm.mnn.json | 961dec6de26a53f63ba03e0560b52b9fc41f9a8f6c4188ee15a7a0755e883ea0 |
llm.mnn | c2286f60cbd56a82f26bfeac92f6a96e9690889b1939346abfe9e1fae996a8f3 |
llm.mnn.weight | 1554f9ce71743b56c2d7fba4cb0c2a31c7cddf4f21e1a2ff5a2e85b9a316a29f |
visual.mnn | c489c1f65dc6aa5bcee42b3e291f7987df1111423c1fe570d0f3394e1207d2bb |
visual.mnn.weight | 9feb04848cafad1117a510b43d6c2b58d6c31bef1040598156d266f9b42f581f |
Framework 构建参数
启用:
MNN_ARM82=ONMNN_LOW_MEMORY=ONMNN_SUPPORT_TRANSFORMER_FUSE=ONMNN_BUILD_LLM=ONMNN_BUILD_OPENCV=ONMNN_IMGCODECS=ONMNN_METAL=ON
禁用:
MNN_BUILD_AUDIO=OFFMNN_BUILD_DIFFUSION=OFFMNN_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 次,均返回:
{"signal":"hand_position_correct","observation":"yes"}| 指标 | 结果 |
|---|---|
load() wall time | 1405.0 ms |
| 完整输出 p50 | 1310.0 ms |
| 完整输出 p95 | 1813.1 ms |
| 首 token | 首次 1577.0 ms;后续 1069.6–1103.9 ms |
| vision stage | 首次 916.7 ms;后续 440.2–457.1 ms |
| prefill | 551.1–580.6 ms |
| decode | 228.1–237.3 ms |
| 严格合法 JSON | 10/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 time | 1029.3 ms |
| 完整调用 | 1639.1 ms |
| 首 token 计时 | 1159.9 ms |
| sampled physical footprint | 1,401,623,832 B |
| 原始输出 | 空字符串 |
| 严格合法 JSON | 0/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。