然后你卡住了——三个都有人说好,教程也都能跑通,到底选哪个?
这篇不给你排名,不编跑分。只给你一张决策树:三问,每问挑一件事,落到一个框架上。命令可以直接抄,都是官方文档里的最短路径。
手机跑大模型,最容易被带偏的一句话是:"xx框架比yy快。"
问题在于,"快"这个字在手机上不成立。同一台手机,跑同一个模型,把输入改长一点,结论就可能反转。后面会解释为什么。
所以第一步不是比较,是把你的需求钉死。三个框架其实是三套不同的取舍,你只能选跟你匹配的那套:
记住这三句话就够了。这就是手机上跑大模型的全部选型逻辑——下面逐个看它们到底强在哪、代价是什么。
先举个真实的纠结,你可能也遇到过:
同事 A 用 llama.cpp 在旧手机上跑通了 7B,天天吹"手机也能跑大模型"。
同事 B 用 MNN 在旗舰机上跑 DeepSeek-R1,还发了张图——AI 直接看懂照片。
你两台手机都有,听谁?
听谁都不对,因为你俩的需求根本不是一回事。A 要的是"能出字",B 要的是"能看图和跑大模型"。这就是为什么不能听别人推荐,只能按自己的需求选。
为什么特意声明"没实测"?因为手机跑大模型的"快慢",跟具体哪台手机强绑定。同一个框架,旗舰机上能打,换到中端机可能翻车。网上那些"xx跑xx tok/s"的数字,换台手机就作废。所以这篇只给你判断依据和决策方法,不给你一个会过期的数字。
这是最"大众脸"的一个。纯 C/C++,零依赖,CPU 为主,GPU 加速是可选加分项(Metal / CUDA / Vulkan / OpenCL)。
它的强项是通用:
一句话:它是"地基"。你想最快跑通、想换档位对比、或者设备 GPU 不强,选它基本不会错。
但它不是"专精"。它文本为主,端侧多模态和移动端特化不是它的强项——真要多模态,它要你另外接视觉模型,不如 MNN 一步到位。
什么时候别选它:你要跑多模态(图像/音频),或者你设备 GPU 很强、想榨干性能上限。这两件事它都帮不上,硬用它等于自己绕远路。
阿里开源的,专为手机/嵌入式设计。CPU 优化做到 ARM 汇编级,还带动态量化。
它的强项是贴着手机:
一句话:它是"特化兵",专打移动端这仗。你要在 Android 上跑国内模型、要跑多模态、要离线,选它最省心。
代价是上手比 llama.cpp 复杂:模型要先转成 MNN 的格式,还要编译。而且生态主要在国内圈子,英文资料少。
什么时候别选它:你要跨 iOS + Android + 电脑一套代码全跑,或者你依赖 Ollama/LM Studio 那套生态、想要社区里现成的教程。MNN 在这些地方不如 llama.cpp 通用,硬上容易卡在"网上没人遇到过这个错"。
基于 TVM 编译,把模型编译到目标 GPU 的指令(Vulkan / Metal / OpenCL),还能跨到浏览器(WebGPU)。
它的强项是上限高:
一句话:它是"加速器",榨干你的 GPU。旗舰机、想要最高生成速度、或者要 Web 复用,选它。
但这里有个容易被打脸的坑,必须说清:它不是"性能天花板"。MLC 在移动 GPU 上 decode(逐字生成)快,可prefill(处理你输入的那段)明显慢于 llama.cpp。你的输入越长,这个劣势越明显。而且上手门槛最高(两段编译),中低端 GPU 上它的优势可能反而不如 llama.cpp 跑 CPU。
什么时候别选它:你的设备 GPU 不强(中低端机),或者你的场景是"长文档输入、短回答"(prefill 会拖后腿),或者你不想碰两段编译。这时候选它,等于花了最高门槛,拿到最差体验。
这里补一句 prefill / decode 到底差在哪,懂了这个你就不容易被"谁快"骗到:
大模型生成回答,分两段。prefill是"读你的输入"——你打 1000 个字,它要一口气把这 1000 个字全算一遍,算完才开始生成。decode是"一个字一个字往外蹦"——每蹦一个字,才多算一步。
这两段吃的资源不一样:prefill 吃的是"算力"(并行),decode 吃的是"带宽"(串行)。
MLC 在移动 GPU 上,是decode 快(因为 GPU 并行强);但prefill 慢,因为编译出来的 kernel 在"读长输入"这段上,不如 llama.cpp 手写的 CPU kernel 讨巧。
所以你看到"MLC 每秒 30 token"别急着信——那是 decode 的速度。你输入一长,prefill 就把时间吃回去了。这也是为什么"谁快"必须分两段看,只看一个数都是耍流氓。
看到这你应该明白了:三个框架不是"谁比谁强",是三套不同的取舍。
那为什么没人能给你一个"统一答案"?
因为手机 GPU 能力差异巨大。旗舰和中低端,GPU 差着几个量级。同一个 MLC,在旗舰上 decode 优势能兑现;到中端机上,优势变负,prefill 的劣势反而被放大。
再加上decode 快 ≠ 整体快:MLC 单看生成速度赢,但你一输入长 prompt,prefill 就把时间吃回去了。所以网上那些"谁快"的单一评测,换个设备、换个输入长度,结论就反转。
结论:选框架 = 设备能力 × 场景需求的匹配题。别拿单一"谁快"的评测结论去选,那个会过期。
先看最想要的那件事,一次只挑一个,别贪:
第 1 问 你要不要多模态(图像/音频)?要 → MNN-LLM(MNN Chat 现成,别犹豫)不要 ↓第 2 问 你要不要 Web/浏览器也复用同一套模型?要 → MLC-LLM(WebGPU 同栈)不要 ↓第 3 问 你的设备 GPU 强不强?(旗舰 vs 中低端)强 → 要最高生成速度 → MLC-LLM(decode 快,但长输入看 prefill)弱/不确定 → llama.cpp(CPU 通用,GPU 弱时最稳)
为什么这么问,一句一个理:
一句话区分第 2、3 问:第 2 问的 MLC 是"只有它能";第 3 问的 MLC 是"它最快"。前者看需求,后者看设备。
什么时候回 llama.cpp?不是"首选",是"回退":
快速上手(最短路径,都来自官方):
llama-cli -m model-Q4_K_M.gguf -cnv --jinja --temp 0 -n 1024 -c 4096 MNNConvert 转成 MNN 格式 → 编译 llm_demo(Android Studio 或 NDK)。mlc_llm convert_weight(转换+量化)→ 第二阶段 mlc_llm compile(生成设备 GPU kernel)。所以门槛高在"要一台开发机先折腾一遍",不是手机里敲条命令就完。止损线(承接上一篇):7B 的 Q4 在 6GB 以下内存跑不动,别硬塞。换 1.5B~3B,或者砍上下文。能跑且够用,比"跑满"重要。
走一遍(拿三个真实场景举例):
小明:一台中端 Android,就想在 Termux 里跑个 7B 聊天,能出字就行。
第 1 问:要多模态吗?不要。第 2 问:要 Web 复用吗?不要。第 3 问:GPU 强吗?中端机,不强。
→ llama.cpp。他不需要碰编译,装个 Termux 就能跑,最省事。
小红:旗舰机,想把 DeepSeek-R1 跑起来,还想要 AI 看懂照片。
第 1 问:要多模态吗?要。
→ MNN-LLM。别往下问了,MNN Chat 现成支持,一步到位。
老张:旗舰机,纯文本场景,想要最高生成速度,还打算把同一套模型丢到网页版。
第 1 问:不要多模态。第 2 问:要 Web 复用。
→ MLC-LLM。WebGPU 同栈,手机和浏览器一套产物。
三个人,三台设备,三种需求,落到三个框架。没有一个"对所有人最优"的答案,只有"对你这台设备这个需求"的答案。
选框架这事,先回答"我要什么",再选"用哪个",别反过来。
很多人一上来就问"哪个快",然后被一个会过期的数字带偏。正确的顺序是:先钉死需求(多模态?Web?GPU 强不强?),再落框架。
三问走完,手机上跑大模型该选哪个,答案通常就自己冒出来了——不是因为它最好,是因为它最配你。
相关阅读:
上面这套三问选型,我压成了一张《三框架选型速查卡》:三问决策树 + 每个框架的最短命令 + 五个坑。
关注后回复「框架表」,直接拿这张速查卡。