ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

手机本地部署大模型实战:从Termux环境到Qwen3.5离线推理优化

手机本地部署大模型实战:从Termux环境到Qwen3.5离线推理优化 把大语言模型装进手机本地跑这事儿放在一年前还只属于技术极客的玩具。但最近端侧AI的进展确实让我有点坐不住了——Qwen3.5这代模型把参数规模压到了能上手机的级别配合量化压缩跟新架构带来的显存优化再加上Termux这类终端工具链的成熟普通Android手机离线跑大模型从勉强能跑变成了真能用。我花了一个周末把模型、推理引擎、封装流程完整踩了一遍实测下来延迟低得离谱本地首字响应能干到1秒以内生成速度20tokens/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 wgetTermux的默认软件源在海外国内网络下经常抽风。这里给大家一个实用技巧用命令行更换到国内镜像源速度会快一个量级。具体操作是编辑$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.cppllama.cpp的编译流程在Termux里已经高度模板化了跟着做就行git clone https://github.com/ggerganov/llama.cpp cd llama.cpp mkdir build cd build cmake .. -DGGML_OPENMPON -DGGML_NATIVEON -DCMAKE_BUILD_TYPERelease make -j$(nproc)这里解释几个关键的编译选项。-DGGML_OPENMPON启用OpenMP多线程并行充分利用手机的大核-DCMAKE_BUILD_TYPERelease启用编译优化性能差距能达到30%以上这个必须开。如果你手机GPU支持Vulkan建议再加-DGGML_VULKANON把一部分计算扔给GPUCPU负载降下来整机耗电和发热都更可控。编译过程中最常见的坑是nproc返回的线程数过高把8核机器当成16线程编译导致内存爆掉。建议手动指定make -j4或make -j6稳得多。编译产物里最核心的二进制是llama-cli命令行对话和llama-serverHTTP 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 212GB内存的测试机上跑了多组参数对比数据贴在下面配置模型上下文首字延迟ms生成速度tokens/s内存占用GB默认CPU 4线程Qwen3.5 4B Q4_K_M409692018.54.1CPU 8线程Qwen3.5 4B Q4_K_M409661024.24.3CPU 8线程 Vulkan GPUQwen3.5 4B Q4_K_M409648027.64.5CPU 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.5cmake编译报错依赖缺失或存储空间不足重新执行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在手机上的这一套玩法算是讲完了。我自己实际用了两周后最大的感受是本地模型不是云端的对手而是云端的补充——它安静、私密、永远在线不挑网络环境。如果你也想试试记住一个核心原则就好先把模型文件、环境依赖这些重活提前备好后面无论在哪它都能陪着你。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进