☰
手机本地部署大模型实战:从Termux环境到Qwen3.5离线推理优化
2026/10/10 14:48:51 网站建设 项目流程

把大语言模型装进手机本地跑,这事儿放在一年前还只属于技术极客的玩具。但最近端侧AI的进展确实让我有点坐不住了——Qwen3.5这代模型把参数规模压到了能上手机的级别,配合量化压缩跟新架构带来的显存优化,再加上Termux这类终端工具链的成熟,普通Android手机离线跑大模型从"勉强能跑"变成了"真能用"。我花了一个周末,把模型、推理引擎、封装流程完整踩了一遍,实测下来延迟低得离谱,本地首字响应能干到1秒以内,生成速度20+tokens/s,全程不碰网络。这篇就把从上手到调优的所有过程整理出来,给想折腾的人一条能直接照着走的路。

1. 为什么非要在手机上跑大模型

1.1 端侧AI与云端AI的真实差距

先掏数据说话。我之前用云端API做测试时,最直观的感受是延迟大头根本不在模型推理,而在网络通信:手机到服务器的往返延迟少说50ms,多则几百毫秒,再叠加服务端排队和流式传输的TTFB(首字延迟),体感上问一句要等两三秒才看到第一个字。这还是在网络稳定的情况下。地铁、地下车库、电梯、飞机上,信号一丢,云端直接变成"该功能暂时无法使用"。

端侧推理把这些麻烦全省了。模型文件就在本地,请求和数据不出设备,没有网络往返,首字延迟只取决于硬件算力和模型大小。我在骁龙8 Gen 2的测试机上跑Qwen3.5系列的4B量化模型,首字响应稳定在0.6-0.9秒,后续生成速度23-28 tokens/s,虽然比不上云端旗舰大模型动辄上百tokens/s的爆发力,但作为随身助手完全够用。而且离线可用这一条,直接决定了它不是一个"演示玩具",而是一个能解决实际问题的工具。

隐私也是很多人忽略的痛点。云端请求无论如何都要把你的输入传到服务器,这在处理个人日记、会议纪要、商业文案草稿这类敏感内容时是天然的顾虑。端侧模型数据不出内存,跑完就没了,适合记录型、思考型的轻办公场景。

1.2 Qwen3.5凭什么能塞进手机

大模型能不能跑在手机上,核心卡三个点:参数量、显存占用、推理速度。Qwen3.5这一代针对端侧做了几件很关键的事。

首先是参数规模下沉。Qwen3.5系列提供了紧凑尺寸的版本,1B到4B级别的模型,即使在FP16精度下,权重文件也就2到8GB,经过4bit量化后更是能压缩到0.6到2.5GB,别说是旗舰机,就是中端机也能塞下。其次是架构层面的优化——社区近期讨论很多的gated deltanet那类设计,简单说就是改变了对KV Cache的处理方式。传统注意力机制在推理长文本时,KV缓存会随序列长度线性膨胀,8GB内存的手机很容易被挤爆。而这类门控增量记忆结构把缓存压缩成固定大小,上下文长度增长时内存占用不再失控,这让手机本地跑长对话、总结长文成为可能。

我实测跑Qwen3.5 4B量化版,上下文长度开到4096,内存占用稳定在4.2GB左右;如果采用传统结构的同尺寸模型,同样上下文内存轻松冲到6GB以上,而且还会频繁触发内存抖动。顺带说一句,这代模型对量化压缩的耐受度明显提升了,4bit量化相比原模型的能力损失被控制到了很可感知的范围之内,这才是它敢上手机的本钱。

2. 部署方案选型:Termux组合拳

2.1 主流端侧推理方案大比拼

动手之前先选型。目前手机端跑大模型的方案主要有下面几条路,我逐个说下优劣。

方案工作方式优点缺点适合人群
Termux + llama.cpp终端模拟器里编译原生推理引擎可控性强,性能好,方便DIY配置门槛高,初次折腾慢开发者、爱折腾的极客
MLC-LLM用TVM编译器把模型编译成手机可执行包对GPU/NPU利用充分,速度快编译过程繁琐,模型兼容性一般有编译经验的人
Ollama手机端直接安装封装好的App零配置,体验友好自定义空间小,大模型支持受限不想折腾的人
网友封装的Termux APK把Termux环境和模型预打包开箱即用,省心依赖别人的维护,更新不及时想快速体验的人

我选的是Termux + llama.cpp路线。原因很简单:llama.cpp是当前端侧推理最成熟的开源引擎,纯C++实现,对ARM平台做了深度优化,支持4bit/5bit/8bit量化推理,还集成了Vulkan、OpenCL、NNAPI等硬件加速后端。Termux则提供了一个接近Linux的完整环境,编译、脚本、服务托管都能玩开,后续想封装成自己的App也有基础。相比MLC-LLM那套TVM编译链路的复杂度,llama.cpp的学习曲线和可控性都更友好。

2.2 硬件门槛与模型量化策略

先评估手机能不能跑。根据我自己测试和社区反馈,可以给个参考线:

  • 6GB内存:能跑1B-2B量化模型,上下文别开太长,可以当个体验入口。
  • 8GB内存:能跑3B-4B量化模型,这是目前的性价比甜点。Q4量化后的4B模型大约2.5GB,留足系统内存和推理缓存后勉强转得开。
  • 12GB及以上:可以尝试7B-8B级别的Q4/Q5量化模型,但后台应用得清干净,不然照样会被杀。

CPU方面,骁龙8系列、天玑9000系列、麒麟9000系列的旗舰芯片都够用,关键看单核性能和内存带宽。我实测发现,模型推理速度受内存带宽影响很大,处理器跑得再快,内存吞吐跟不上也白搭。所以老旗舰机如果芯片好但内存窄,跑起来反而可能不如新一代中端芯片。

量化策略是决定体验的关键。我建议按这个优先级选:

  • Q4_K_M:首选。质量和体积平衡最好,4B模型也就2GB出头,生成速度快。
  • Q5_K_M:内存够用的情况下选这个,质量小幅提升,体积大约多30%。
  • Q8_0:接近原模型质量,但体积接近FP16的一半,适合大内存设备,速度会有明显下降。
  • FP16/FP32:手机端不建议尝试,除非你在平板上做实验。

我在8GB内存机型上最终选了Q4_K_M版本,实测速度比Q5快了约20%,而这20%的差距换来的是日常使用中内存压力小很多,应用切后台不会再动不动被杀掉。

3. 完整实操:从零到能聊

3.1 Termux环境搭建三板斧

第一步,装Termux。注意一点:不要从那种类应用商店的渠道装,去F-Droid官网下载的版本才是维护活跃的版本,否则你可能会碰到连pkg源都无法更新的问题。装完后,先做基础配置。

pkg update -y && pkg upgrade -y pkg install -y git cmake ninja clang python openssl curl wget

Termux的默认软件源在海外,国内网络下经常抽风。这里给大家一个实用技巧:用命令行更换到国内镜像源,速度会快一个量级。具体操作是编辑$PREFIX/etc/apt/sources.list,把官方源地址替换成清华镜像。这一步是离线部署思路里的重要一环——先把环境准备好,后面模型推理阶段才能不依赖网络顺畅运行,很多新手卡在这一步就放弃了。

装完这些基础依赖,顺手把Termux的存储权限开一下:在Termux里执行termux-setup-storage,它会在手机存储里创建termux目录,用来放模型文件和脚本。这一步是为了解决Termux沙箱目录跟手机共享存储隔离的问题,不然后面下载的模型放不进去也读不出。

3.2 下载模型与校验

模型这块,我建议优先到魔搭社区(ModelScope)找GGUF格式的Qwen3.5量化版,国内访问速度稳定,下载大文件不用干瞪眼。找不到的话再去HuggingFace。GGUF是llama.cpp的原生格式,已经封装好了量化权重和对话模板,拿到就能用。

下载时注意选文件路径和文件名。一般都长这样:qwen3.5-4b-q4_k_m.gguf,一看便知版本和量化方式。下载完成后,强烈建议做一步校验——用sha256sum对一下文件哈希,确保文件没下坏。我下载第一个模型时跳过了这步,结果加载到一半崩溃,排查半天才发现是下载文件损坏。这种几GB的大文件,传输过程少一个字节,模型就没法用。

文件别放系统内置存储的根目录,建议建一个models目录归置好:~/storage/downloads/models或者~/models都行。后面写脚本、换模型时会方便很多。模型文件算是离线使用的核心资产,一次下载,离线永久用,建议直接放在手机内置存储或者SD卡里都留一份。

3.3 编译llama.cpp

llama.cpp的编译流程在Termux里已经高度模板化了,跟着做就行:

git clone https://github.com/ggerganov/llama.cpp cd llama.cpp mkdir build && cd build cmake .. -DGGML_OPENMP=ON -DGGML_NATIVE=ON -DCMAKE_BUILD_TYPE=Release make -j$(nproc)

这里解释几个关键的编译选项。-DGGML_OPENMP=ON启用OpenMP多线程并行,充分利用手机的大核;-DCMAKE_BUILD_TYPE=Release启用编译优化,性能差距能达到30%以上,这个必须开。如果你手机GPU支持Vulkan,建议再加-DGGML_VULKAN=ON,把一部分计算扔给GPU,CPU负载降下来,整机耗电和发热都更可控。

编译过程中最常见的坑是nproc返回的线程数过高,把8核机器当成16线程编译,导致内存爆掉。建议手动指定make -j4或make -j6,稳得多。编译产物里最核心的二进制是llama-cli(命令行对话)和llama-server(HTTP API服务),后面都会用到。

3.4 首次运行与参数调试

运行模型就用下面这条命令:

./llama-cli -m ~/models/qwen3.5-4b-q4_k_m.gguf \ --threads 8 --ctx-size 4096 \ --temp 0.7 --top-p 0.9 \ -ngl 0

参数逐个拆解。--threads控制推理线程数,不是越大越好,我测试时8线程比4线程快,但12线程反而变慢,因为线程切换和内存竞争会吃掉收益。--ctx-size是上下文窗口长度,4096是当前8GB内存的合理选择,开到8192内存容易爆,体感提升却不大。--temp和--top-p控制随机性,写代码、列提纲这类确定性任务建议--temp 0.3,闲聊可以调回0.8。-ngl是把多少层放到GPU上加速,0表示纯CPU推理,如果编译了Vulkan后端,可以尝试-ngl 99把全部层丢给GPU。

首次运行会有一个较慢的加载阶段,要把模型文件读入内存并做内存映射,4B模型大约需要十几秒到半分钟,这个过程中手机会明显发热,属于正常现象。加载完毕后进入交互模式,输入你的问题,回车,就能看到流式输出——那个首字延迟的瞬间,才是"端侧AI真的跑起来了"的感觉。

4. 延迟优化:从马马虎虎到指哪打哪

4.1 三个环节决定延迟大小

手机本地跑大模型,延迟主要由三个环节决定。第一是模型读取与解码:模型文件从闪存读到内存,这一步是一次性开销,但闪存速度慢的话会很折磨人,建议把模型放ufs存储的路径上,别放TF卡。第二是预填充阶段:你的输入prompt要从文本变成语义向量,这个过程对算力敏感,输入越长耗时越线性上升。第三是生成阶段:每个token都要经过全模型计算,这个阶段主要吃内存带宽,决定了你每秒能吐出多少个字。

理解这三段,你就知道优化该往哪个方向使劲了。预填充慢就提升CPU算力或拉GPU,生成慢就是内存带宽的瓶颈,模型文件加载慢则是IO问题。现实中很多人困惑的"为什么我的手机分数很高但是跑得慢",答案往往在第二三段,而不是芯片算力规格。

4.2 实际调优参数与效果对比

我在这台骁龙8 Gen 2+12GB内存的测试机上,跑了多组参数对比,数据贴在下面:

配置模型上下文首字延迟(ms)生成速度(tokens/s)内存占用(GB)
默认CPU 4线程Qwen3.5 4B Q4_K_M409692018.54.1
CPU 8线程Qwen3.5 4B Q4_K_M409661024.24.3
CPU 8线程 + Vulkan GPUQwen3.5 4B Q4_K_M409648027.64.5
CPU 8线程 + Vulkan GPUQwen3.5 4B Q5_K_M409654022.15.2

这组数据能说明几个结论。第一,线程数从4升到8,收益非常明显,别偷懒用默认值。第二,Vulkan GPU加速对首字延迟的改善尤其突出,这是因为预填充阶段的矩阵乘法和GPU高度契合,生成阶段改善有限,是因为逐token生成时CPU-GPU之间的数据搬运成为了新瓶颈。第三,Q5_K_M相比Q4_K_M的速度损失约20%,但如果你的手机内存够用,这20%换取的质量提升可以直接提升生成文本的连贯性。

还有一个容易忽略的技巧,就是关闭打日志。llama.cpp默认会在每个token生成时向终端输出详细信息,这种IO操作在高频生成时会形成肉眼可见的卡顿。在运行命令中不要把日志级别调高,或者直接重定向输出,干净利落地只保留推理结果。实操时我感觉这一项至少能带来5%的体验改善。

4.3 关于温度降频的避坑

连续推理5分钟后,手机处理器会因为发热而降频,性能直接打六折。这不是配置问题,是热管理问题。我的做法是让手机保持充电状态并把性能模式调到均衡,不追求极限性能,但保证不掉速。有条件的话,给手机配个半导体散热背夹,效果立竿见影——我实测加散热后连续生成速度波动从±35%收窄到±8%。

另外要注意后台进程。手机厂商的内存回收策略往往激进而暴力,一旦吃掉推理进程,整个对话上下文直接没了。调优时最好把Termux进程锁定在后台、开启电池充电时不休眠,甚至用开发者选项里的"不保留活动"关闭掉,否则你跑一个长任务到一半被杀进程,前面的工作量全白费。

5. 离线场景实战:把AI装进口袋

5.1 构建完整的离线链路

要让离线AI真正"可随身携带",光有模型文件还不够,得把链路理顺。我的做法是设计一套无网状态的完整启动流程:把模型文件放到~/models目录,启动脚本固化成~/start-qwen.sh,内容包含环境变量、线程数、上下文大小、加载模型路径等所有参数。这样,每次使用只需要在Termux里敲一行命令,剩下的全都自动化。

脚本里我习惯加上--no-mmap参数之外还开启mlock锁页内存,这样可以避免模型页面被系统换出导致推理卡顿。这在手机内存紧张时是个大杀器:虽然启动时加载稍微变慢,但运行期的稳定性明显提升,尤其是长时间对话中不会出现突然变慢的"掉速悬崖"现象。

此外,把模型文件备份路径固定在手机内置存储的Download目录下,Termux环境出问题时可以随时恢复。端侧AI最大的优势是不依赖网络,所以任何需要联网的依赖都要在设计时剔除掉——对话模板、系统提示词、常用语料这些都建议预先写在配置里,运行时完全不碰网络。我自己测过飞行模式下完整跑一个小时的对话,全程通畅,这就是"把AI装进口袋"的底气。

5.2 哪些场景真用得上

离线大模型能做什么?说几个我自己实测过有用的场景。

会议速记辅助。开会时把手机开飞行模式,用语音转文字(手机自带ASR)把会议内容转成文本,然后扔给离线Qwen3.5整理纪要、提取待办事项。以前这活必须回到工位连上网络才能做,现在会议结束时纪要已经躺在手机里,直接就能发出去。

写作和思考的脚手架。在飞机上写方案、写周报,卡壳了需要一点灵感的时候,离线模型是一个不错的对话对象。它是私密的、不联网的,你的行业信息、商业策略、个人想法都不出设备,给出来的讨论思路和结构建议虽然不如云端大模型丰富,但在没有网络的环境里就是雪中送炭。

编程片段查询。给离线模型喂一些代码模式,它可以根据自然语言生成常用代码片段。虽然生成质量不及云端大模型,但对于那些记不清具体API格式、但又不想切出去查文档的时刻,它足以让你从卡壳状态脱身。

特别强调一个不适合的场景:需要实时事实性信息的问题("今天天气怎么样""最新的新闻事件是什么"),离线模型完全没有招架之力。它本质上是基于训练时数据的概率生成,没有联网检索能力,别把它当搜索引擎用。把离线模型当作一个"打腹稿、理思路、应急写稿"的私人助手,它就很好用;当成无所不知的百科回答器,你会失望。

6. 问题排查与避坑指南

6.1 高频问题速查表

折腾过程中,我整理了这几个出现频率极高的问题,附上排查思路:

问题现象可能原因解决方案
生成速度很慢,只有几tokens/s线程数过低,或手机降频调--threads到核心数,检查手机温度,加散热
加载模型时程序崩溃模型文件损坏校验SHA256哈希,重新下载
内存不足被系统杀掉上下文过大,或后台应用太多减小--ctx-size,换Q4量化,清空后台
对话过程中突然变慢内存换页或进程被降优先级开启mlock锁页,把Termux进程锁定后台
输出内容明显语无伦次量化等级过低或温度过高换Q5_K_M,降低--temp到0.3-0.5
cmake编译报错依赖缺失或存储空间不足重新执行pkg install,清理pkg缓存

其中"对话过程中突然变慢"这个现象是Termux用户踩得最多的坑。它的本质是内存分配变化导致的过程性波动,表面上表现为每生成一个token都要卡顿几百毫秒。解决方案就是上面提到的mlock锁页,这能保证模型权重常驻内存,即使系统内存吃紧也不会被临时置换到闪存里读回来。

6.2 几个容易踩的家常坑

第一个坑是"后台保活"。手机厂商的后台管理策略各有不同,有些激进机型会在Termux运行大模型时把它判定为"耗电大户"然后直接杀掉。我踩过一次惨痛的:一次长对话已经进行了30多分钟,突然整个进程消失,上下文全丢。后来我学乖了,在系统电池设置里把Termux设为"无限制",并且用tmux或nohup把推理进程挂到会话后台,就算Termux界面被关闭,进程照样活着。

第二个坑是存储空间。编译llama.cpp会占用好几个GB的临时空间,再加上模型文件,8GB存储的小手机根本不够看。装系统工具和编译依赖时,记得随时清理pkg clean,把不需要的源码目录删掉,给模型文件留足空间。

第三个坑是Termux的Termux API插件。如果你后续想通过通知栏快捷启停模型,或者读取手机传感器状态做自动化,需要额外pkg install termux-api并安装配套的Android应用。这个细节很多教程不会强调,但不装的话,那些看起来酷炫的通知栏控制、语音输入功能实际上都没法用。

7. 进阶玩法:从命令行到随手可用

7.1 用API Server模式做个人知识库助手

llama.cpp的llama-server模式可以让你把手机变成一个局域网内可访问的AI服务。启动方式很简单:

./llama-server -m ~/models/qwen3.5-4b-q4_k_m.gguf \ --host 0.0.0.0 --port 8080 \ --threads 8 --ctx-size 8192

这样手机就变成了一个OpenAI兼容的API端点,你可以在电脑上、平板上,通过标准的HTTP请求调它,甚至可以直接嵌入到自己写的小程序里。我在局域网内用电脑连着手机的AI服务做了个临时的写作环境测试,虽然比不过专用服务器的吞吐量,但作为个人能随时带走的私有AI服务,体验已经远超预期。没有网络连接时,手机热点也能组成一个小范围的局域网,让身边设备共享AI能力。

7.2 封装成随身App的实践

社区里已经有人把Termux环境连同模型和启动脚本一起打包成APK,做成开箱即用的随身AI应用。这种思路本质上是用Termux的Linux环境作为运行时,再把模型、引擎和UI一层层包上去。我在他们的基础上,自己折腾了一版更贴合使用习惯的封装:用Shell脚本把整个交互逻辑固定成一个菜单,启动后只需选择"问答""摘要""翻译"等模式,剩下的事情交给预设参数。

手机上还能加上一些自动化手段。比如通过Termux API读取手机状态,在检测到飞行模式或者无网络信号时自动拉起本地模型服务。这样一来,离线AI就不再是一个需要你手动启动的程序,而是变成一个真正"随时待命"的系统能力。

到这里,端侧AI在手机上的这一套玩法算是讲完了。我自己实际用了两周后最大的感受是:本地模型不是云端的对手,而是云端的补充——它安静、私密、永远在线,不挑网络环境。如果你也想试试,记住一个核心原则就好:先把模型文件、环境依赖这些重活提前备好,后面无论在哪,它都能陪着你。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询