CPU 上限选 llama.cpp,GPU 上限选 MLC-LLM,NPU 能效上限选 MediaPipe / AI Edge SDK(Qualcomm AI Engine Direct),PyTorch 生态选 ExecuTorch,"能跑就行"选 PocketPal / Ollama 移动端。 没有"全能王",瓶颈决定了上限------想跑得更稳更快,关键是选对硬件路径(CPU / GPU / NPU)再选框架。
一、框架全景速查表
| 框架 | 计算后端 | 模型格式 | 模型灵活度 | 量化支持 | 典型性能(0.6~3B 旗舰机) | 接入成本 |
|---|---|---|---|---|---|---|
| llama.cpp | CPU(NEON/dotprod/i8mm/KleidiAI)+ Vulkan/Metal/OpenCL | GGUF | ★★★ 100+ 架构 | Q4/Q5/Q8 K-quants、IQ 系列 | CPU: 30~80 t/s(0.6B) | ★☆☆ 直接下载二进制 |
| MLC-LLM | Adreno/Mali GPU(Vulkan/OpenCL/Metal) | MLC 专属(需编译转换) | ★★ 需要预编译 list | 编译期量化(q4f16 等) | GPU 路径比 llama.cpp CPU 快 2.5~3×(骁龙 8 Gen 3) | ★★☆ 需编译模型 |
| MediaPipe LLM Inference API | CPU + GPU delegate + NPU(AICore) | .task / .bin | ★★ 受限(Gemma、Phi、Falcon、StableLM、Gemma 3N) | Google 预量化 | Gemma 2B在骁龙上流畅 | ★☆☆ 一行代码接入 |
| AI Edge SDK / LiteRT + GenAI | CPU / GPU / NPU(Hexagon HTP) | .litertlm / .tflite | ★★ 受限(Google 官方 list) | Google 预量化 | NPU 路径能效最高、TTFT < 100ms | ★★☆ 需配置 delegate |
| ExecuTorch | CPU(XNNPACK)+ Vulkan + QNN delegate | .pte(导出式) | ★★ 需自行导出 | PT2E、GPTQ、8da4w | PyTorch 原生体验 | ★★★ 导出流程复杂 |
| NexaSDK | CPU/GPU/NPU 全栈 | 专属格式 | ★★ | 多种 | 骁龙全家桶,一站式 | ★★☆ |
| PocketPal / Ollama Mobile | 底层 llama.cpp | GGUF | 继承 llama.cpp | 同 llama.cpp | ≈ llama.cpp | ★☆☆ GUI 即开即用 |
| Termux + llama.cpp | CPU(同 llama.cpp) | GGUF | 继承 llama.cpp | 同 llama.cpp | ≈ llama.cpp | ★★☆ 需会 Linux CLI |
二、五大主流动手方案详解
1. llama.cpp(你现在在用的)
定位:CPU 上限方案,唯一开箱即用的通用引擎。
Android 官方 Release 提供 arm64-v8a 静态二进制,下载后 chmod +x 即可运行 llama-server,无任何依赖。模型从 HuggingFace 下载 GGUF 文件,100+ 架构通吃(Qwen、Llama、Gemma、Phi、Mistral、MoE 等)。
CPU 路径是它最深的护城河:内置 KleidiAI 微内核 ,运行时自动按 dotprod/i8mm/SVE2 调度,且支持 GGML_KLEIDIAI_SME=1 在 v9.6 芯片上启用 SME2。Vulkan 后端能调 Adreno GPU,但社区实测 CPU 仍是最稳路径。
性能调优要点(你已踩过):
taskset绑定大核(如taskset F0绑 cpu4-7),llama.cpp 自己的-Cr/-Crb在 Android 上常因线程掩码失败- 线程数 = 大核数(旗舰机通常 4)
- KV cache 用 f16(ARM 上 q8_0 要现场反量化,反而更慢)
- decode 已接近内存带宽 roofline(0.6B Q8_0 在 SD888 上约 33 t/s = 21 GB/s 有效带宽,超过理论值的 85%)
适用:所有想深度定制、想用任何模型、想跑在自己编译版本上的用户。
2. MLC-LLM(GPU 上限)
定位:TVM 编译型引擎,调 Adreno/Mali GPU 而不是 CPU。
思路完全不同:编译期 把模型图编译成针对目标 GPU 的优化 kernel(Vulkan/OpenCL/Metal),生成专属模型包(.mlcarchive + mlc-chat-config),然后通过 Android App(mlcchat)或自研 App 加载。
- 支持 Vulkan(Adreno/Mali 通吃)和 OpenCL,Web 端还能跑 WebGPU
- 在骁龙 8 Gen 3 上实测比 llama.cpp CPU 快 2.5~3×(PocketPal vs MLC Chat 对比)
- 学术评测也把它列为 GPU 部署的代表方案
代价 :模型支持列表受编译管线限制,不能像 GGUF 那样"下载就能跑";自定义模型要走mlc_llm convert_weight+mlc_llm gen_config+ 编译流程;模型文件也比 GGUF 略大。
适用:在意速度上限、不介意预编译流程、想调 Adreno GPU 的用户。
3. MediaPipe LLM Inference API(最简接入)
定位:Google 官方一站式 API,几行 Java/Kotlin 代码接入本地 LLM。
LLM Inference Stack 封装了分词、采样、KV cache 管理,开发者只关心"喂 prompt、拿 token"。支持平台覆盖 Android/iOS/Web,模型列表目前包含 Gemma、Gemma 3N、Phi 2、Falcon 1B、StableLM 3B 等。
- 接入成本最低:Gradle 引依赖 →
LlmInference实例化 →generateResponse() - 底层可调 CPU、GPU delegate、以及通过 Android AICore 调 NPU(Gemini Nano 系统级服务,Android 14+ 旗舰设备)
- 模型需转成
.task或.bin格式,官方提供转换脚本,也支持把 safetensors 的 Gemma 3N 微调版转过来
代价 :模型范围受限,不能随便加载 Qwen/Llama 等任意 GGUF;底层不暴露 llama.cpp 那样的精细调优参数。
适用:App 开发者,想给 Android 应用加"本地 AI 助手"功能,不需要折腾底层。
4. AI Edge SDK / LiteRT(NPU 能效上限)
定位:Google LiteRT(原 TensorFlow Lite)的 GenAI 扩展,直接打通 Qualcomm Hexagon NPU。
2025 年底 Google 宣布 LiteRT 通过 Qualcomm AI Engine Direct(QNN) delegate 把 90+ 算子下沉到 Hexagon HTP,覆盖大多数视觉、音频、LLM 模型。这是目前唯一能在 Android 上原生调 NPU 跑 LLM 的公开路径。
- 骁龙 Hexagon NPU 在旗舰 SoC 上提供 45~75 TOPS 算力,能效比 CPU/GPU 高一个数量级
- 首个 token 延迟(TTFT)可压到 100ms 量级
- 也可以直接走 Qualcomm SNPE SDK 加载 ONNX/自定义格式模型
代价 :模型需按 NPU 重新量化并编译;支持的 SoC 列表有限(主要是骁龙 8 Gen 2/3/Elite);Google 官方 LLM 模型清单相对窄。
适用:电池敏感场景(长时语音助手、常驻 AI 功能),且目标用户机型相对集中。
5. ExecuTorch(PyTorch 原生路径)
定位:PyTorch 官方端侧运行时,AOT 编译产物为 .pte 文件。
流程是 Python 侧用 torch.export 导出 → ExecuTorch 编译器链接 backend delegate(XNNPACK、Vulkan、QNN)→ Android App 通过 JNI 加载 .pte 推理。
- 对 PyTorch 训练资产最友好,
torch.export一次到位 - 支持 XNNPACK(CPU)、Vulkan(GPU)、QNN(NPU)三种 delegate
- LLM 推理支持(Llama 3、Phi 等)官方提供导出脚本
代价 :导出流程复杂(动态 shape、KV cache 的 export 处理是难点);社区 LLM 生态远不如 llama.cpp 丰富。
适用:团队已经深度使用 PyTorch 训练管线,想复用训练侧工程师。
三、其他可选方案
- PocketPal AI:基于 llama.cpp 的 Android GUI 客户端,零配置直接下 GGUF 用,是"会点手机但不想命令行"的用户首选
- Ollama / LM Studio:桌面端为主,移动端体验有限,不推荐作为 Android 主力
- NexaSDK(Qualcomm 官方推荐):一套 SDK 同时覆盖 CPU/GPU/NPU,模型格式统一,适合做骁龙生态绑定
- Termux + llama.cpp:在 Termux 里编译运行 llama.cpp,体验和原生二进制一致,适合喜欢 Linux 命令行的极客
四、模型获取与格式速查
| 框架 | 模型格式 | 从哪儿拿 |
|---|---|---|
| llama.cpp / PocketPal / Termux | GGUF | HuggingFace(unsloth/Qwen3-0.6B-GGUF 等仓库) |
| MLC-LLM | .mlcarchive 包 |
MLC 官方预编译包 或 mlc_llm package 自编译 |
| MediaPipe LLM API | .task / .bin |
Google Model Garden / MediaPipe Models |
| AI Edge SDK | .litertlm / .tflite |
Google AI Edge Models |
| ExecuTorch | .pte |
examples/models/llama 导出脚本 |
五、性能参考(0.6~3B 模型,旗舰 SoC)
以骁龙 8 Gen 3 / Elite 跑 Qwen3-0.6B~1.7B 为例(实际数字因机型、温控、量化级别浮动):
- llama.cpp CPU(taskset 大核):30~80 t/s
- MLC-LLM Vulkan:llama.cpp CPU 的 2.5~3×
- NPU 路径 :TTFT < 100ms,decode 能效比最高,但吞吐未必最高
预算给得多 → 选 MLC-LLM GPU;预算紧但求稳 → llama.cpp CPU;电池敏感 → NPU 路径(MediaPipe/AI Edge)。
六、按场景选型速查
- Android 原生 App 内嵌本地 AI 助手,最快落地 → MediaPipe LLM Inference API(Gemma 3N)
- App 内嵌、想用 Qwen/Llama 等任意开源模型 → llama.cpp JNI 封装(或现成的 PocketPal)
- 追求最高速度,愿意花时间编译 → MLC-LLM(Vulkan/OpenCL)
- 旗舰骁龙 + 电池敏感(常驻助手、语音唤醒) → AI Edge SDK / NexaSDK(NPU)
- 已有 PyTorch 训练管线要下放端侧 → ExecuTorch
- 极客玩家、Termux 命令行 → Termux + llama.cpp(你正在用的方式)
- 只想"下载个 App 就能用" → PocketPal AI
一句话总结:llama.cpp 是"什么都能跑但只到 CPU 上限",MLC-LLM 是"能调 GPU 的上限",MediaPipe/AI Edge 是"NPU 能效上限但模型受限",ExecuTorch 是"PyTorch 党的端侧通道",PocketPal 是"零门槛消费级入口"。 选型前先问自己两个问题:目标机型 SoC 是什么?能接受多复杂的模型转换流程?答案就能锁定唯一选项。