对,这组截图基本把问题说明白了:
同一台 Redmi K90、同一个 PocketPal、同样能输入图片,Gemma 4 E2B 可以正常识图,而 Qwen3.5-9B 一到图片编码阶段就崩。
所以现在可以排除很多东西了:
不是手机完全不支持视觉模型;
不是 PocketPal 整个多模态功能坏了;
不是“16GB 一定跑不了图片”;
也不是你选 CPU 仍然偷偷用了 GPU 导致的。
Gemma 4 E2B 在你手机上已经实际跑通视觉,而且速度约 21 tok/s,只是首图视觉编码 TTFT 较高,这说明基础图像读取、mmproj、MTMD、CPU 后端本身都能工作。
真正的问题集中到 Qwen3.5-9B 的视觉路径。
更准确地说,现在最像:
Qwen3.5-9B + mmproj 在 PocketPal 当前 bundled llama.cpp/rnllama 中,视觉计算 buffer reserve 失败,然后 allocator 没正确处理失败,最终在 ggml_gallocr_alloc_graph 里直接崩溃。
这和 llama.cpp 现在公开的一个 Bug 几乎完全一致。它的调用栈就是:
ggml_gallocr_alloc_graph → ggml_backend_sched_alloc_graph → clip_image_batch_encode → mtmd_encode
跟你的栈一模一样。那个 issue 解释得很清楚:前面的 ggml_backend_sched_reserve() 如果失败,代码没有正确检查返回值,后面继续使用空 buffer,于是最终 SIGSEGV。(GitHub)
但为什么 Gemma 能跑,Qwen 不行?
因为两者视觉部分的内存需求并不一样。
你截图里 PocketPal 对 Gemma 4 E2B 给出的估算,2K context 总内存大约 4.5GB。
而 Qwen3.5-9B,仅 GGUF 本体就大很多。例如官方 Unsloth GGUF:
Q4_K_M:约 5.68GB
UD-Q4_K_XL:约 5.97GB
Q5_K_M:约 6.58GB
再加 mmproj F16:约 918MB
也就是说还没计算视觉临时 buffer、KV cache、runtime 和图像 tensor,Qwen 已经大约 6.6~7GB 这一档了。(Hugging Face)
所以完全可能发生:
Gemma:
模型 + mmproj + vision compute buffer < 可安全分配范围
→ 正常。
Qwen3.5-9B:
模型 + 918MB mmproj + vision compute buffer
→ 某一次 reserve() 失败
→ PocketPal/llama.cpp 没优雅地报“OOM”
→ 直接在 gallocr_alloc_graph 崩。
这里有一个很重要的区别:
系统显示“9.5GB 可用”不能证明这次 reserve 一定成功。
Android 那个“可用”数字包含大量可回收页/cache,而且 ggml backend 需要的是特定 buffer 分配。它不等于“App 此刻还能稳定 malloc 9.5GB”。
所以现在我不会再说:
“肯定不是内存。”
而应该说:
不像普通的系统 RAM 耗尽,更像 Qwen3.5 视觉计算 buffer 达到某个临界点,然后触发了 llama.cpp allocator 的 Bug。
这两件事可以同时成立。
还有一个证据非常强
PocketPal 官方已经有用户报告:
Snapdragon + 16GB + Android 16 + Qwen3.5-9B
在近期 PocketPal 更新之后出现硬崩,并且:
换量化也崩;
CPU 也崩;
清后台也崩;
小模型正常;
加载视觉 mmproj 后,发送图片立即崩。
几乎就是你现在的情况。(GitHub)
所以现在我给你的判断已经可以提高到:
70%:PocketPal/llama.cpp 当前 Qwen3.5 多模态 allocator/regression 问题
25%:Qwen3.5-9B 视觉 buffer 在16GB环境刚好触发这个 Bug
5%:手机/高通本身
而且现在没必要换24GB手机来验证。因为即使24GB可能让这个 reserve 成功,从而“绕开”Bug,也不能证明原来的16GB手机硬件不行。
最干净的验证方法反而是:
同一台 K90,直接用最新版原生 llama.cpp 的 llama-mtmd-cli 跑同一套 Qwen3.5-9B + mmproj。
如果原生最新版能识图,而 PocketPal崩:
100%基本锁定 PocketPal bundled llama.rn/llama.cpp 版本问题。
而如果最新版 llama-mtmd-cli 也在同一位置崩,那么就是上游 llama.cpp/Qwen3.5 vision allocator 问题。
你这次 Gemma 4 E2B 成功识图其实是非常关键的对照实验,已经证明你的 K90 16GB 本身是能跑本地视觉模型的。
by ChatGPT