📚 Termux 无 Root 学习开发系列
阶段一:环境搭建与终端基础 ✅ 已完成
01-05 安装 → 包管理 → 文件管理 → Vim/tmux
阶段二:编程开发环境 ✅ 已完成
06-09 Python → C/C++ → Node.js → Git
阶段三:网络与远程操作 ✅ 已完成
10-12 SSH → 网络工具 → 网络代理
阶段四:Termux:API 与自动化 ✅ 已完成
13-14 硬件调用 → 定时任务
阶段五:proot-distro 完整 Linux ✅ 已完成
15-17 proot-distro → Jupyter → 桌面环境/VNC
阶段六:AI 与 AIGC 实战
✓ 18 调用 LLM API 对话与自动化
19 llama.cpp 本地模型推理(当前篇)
20 RAG 知识库与本地文档问答(待制作)
阶段七至九共 8 篇,后续持续更新

19 llama.cpp 本地模型推理

难度:高级 · 阶段六:AI 与 AIGC 实战 · 约 18 分钟阅读
读完本篇你将能:

上一篇我们用 API 调用云端大模型,体验虽好但有两个前提:要有网络、要花钱。llama.cpp 走另一条路——把模型塞进手机里,纯本地推理,断网也能用,token 消耗为零。代价是模型要小、速度要慢一些,但对于日常问答、代码辅助、知识库检索完全够用。

本篇从 llama.cpp 是什么讲起,手把手带你在 Termux 里编译、下载模型、跑通第一次对话,再到性能调优和本地 API 服务。全程离线,所有数据不出手机。

📖 本篇目录
01 llama.cpp 与 GGUF 简介
02 编译安装:Termux 原生方式
03 编译安装:proot Ubuntu 方式
04 模型选择与下载
05 运行推理与参数调优
06 本地 API 服务模式

01 llama.cpp 与 GGUF 简介

llama.cpp 是一个纯 C/C++ 实现的大语言模型推理引擎,由 Georgi Gerganov 发起,现在已迁移到 ggml-org 组织下开发。它的核心价值就是"轻"——不需要 GPU、不需要 Python 依赖、几百兆的二进制文件就能跑大模型。手机、树莓派、老电脑这些边缘设备,全靠它才能跑得起 LLM。

什么是 GGUF

GGUF(GGML Universal Format)是 llama.cpp 原生支持的模型文件格式。它的核心是量化——把原本 16 位或 32 位浮点数的模型权重,压缩成 4 位、5 位、8 位整数,体积减少 70% 以上,推理速度翻倍,而质量损失非常有限。

量化等级 体积(3B 模型) 质量 推荐场景
Q2_K ~1.2 GB 损失较大 内存极度紧张
Q3_K_M ~1.6 GB 可接受 低配手机
Q4_K_M ⭐ ~2.0 GB 接近 FP16 推荐,质量速度平衡
Q5_K_M ~2.4 GB 很好 内存充足时选择
Q8_0 ~3.4 GB 几乎无损 旗舰机且追求质量
💡 小贴士:K 系列量化是什么
K 系列(Q4_K_M、Q5_K_M 等)是 llama.cpp 特有的量化方案,"K"代表 k-quants。相比旧的 Q4_0 简单量化,K 系列用更精细的分组策略,在相同体积下质量更好。后缀 _M 代表 medium 平衡型,_S 代表 small 小体积,_L 代表 large 高质量。日常选 Q4_K_M 准没错。

02 编译安装:Termux 原生方式

Termux 原生编译的好处是不需要 proot 环境,直接在 Termux 主系统里跑,性能损耗最小。缺点是要手动装依赖,且不支持某些需要完整 glibc 的优化项。对大多数用户,原生方式已经足够。

Bash · Termux 原生编译
1
2
3
4
5
6
7
8
9
10
11
12
# 1. 安装编译依赖
pkg install clang cmake git make -y
# 2. 克隆仓库(已迁移到 ggml-org)
git clone https://github.com/ggml-org/llama.cpp.git
cd llama.cpp
# 3. 使用稳定版本(可选,推荐)
git checkout b10502  # 2026年8月最新构建
# 4. 编译(开启 OpenBLAS 加速)
cmake -B build -DGGML_OPENBLAS=ON
cmake --build build -j$(nproc)
# 5. 验证编译产物
ls build/bin/
llama-cli  llama-server  llama-bench  ...

编译过程大约 5-15 分钟,取决于手机性能。如果 OpenBLAS 在 Termux 中安装失败,去掉 -DGGML_OPENBLAS=ON 用纯 CPU 编译也能跑,只是慢一些。

⚠️ 常见错误
git clone 速度慢或超时
✅ 用代理加速:export https_proxy=http://127.0.0.1:7890 后再 clone
编译时 OOM(内存不足被杀死)
✅ 减少并行数:cmake --build build -j 2,只用 2 线程编译

03 编译安装:proot Ubuntu 方式

如果你已经装好了 proot-distro(第 15 篇内容),在 Ubuntu 里编译更省心——软件源更全,OpenBLAS 等依赖直接 apt 安装即可,遇到问题搜索资料也更多。缺点是 proot 有少量性能损耗,大约比原生慢 10%-15%。

Bash · proot Ubuntu 编译
1
2
3
4
5
6
7
8
9
10
11
12
13
# 进入 Ubuntu 环境
proot-distro login ubuntu
# 1. 安装依赖
apt update &&& apt install -y \
    build-essential cmake git \
    libopenblas-dev libgomp1
# 2. 克隆并编译
git clone https://github.com/ggml-org/llama.cpp.git
cd llama.cpp
cmake -B build -DGGML_OPENBLAS=ON
cmake --build build -j$(nproc)
# 3. 把编译产物软链接到 ~/bin 方便调用
mkdir -p ~/bin && ln -s ~/llama.cpp/build/bin/llama-cli ~/bin/
💡 小贴士:选原生还是 proot
新手推荐proot Ubuntu 方式,依赖全、资料多,出问题好查。追求极致性能或不想装 Ubuntu 的用户用 Termux 原生方式。两者编译出的 llama.cpp 功能完全一致,只是性能有细微差别。本篇后续的运行命令两种方式通用。

验证编译结果

编译完成后,用 llama-bench 快速测试一下当前设备的推理性能,心里有个数。

Bash
./build/bin/llama-bench -m 模型路径.gguf -p 128 -n 128
# 输出会包含:
# encode: XX.XX tok/s (提示处理速度)
# decode: XX.XX tok/s (生成速度,关键指标)

decode 速度就是你聊天时模型"打字"的速度。手机上 1.5B 模型 Q4 量化通常能到 5-12 token/s,3B 模型大约 2-5 token/s。一般 5 token/s 以上体验就比较流畅了,低于 2 token/s 会明显感觉慢。

04 模型选择与下载

模型决定了 AI 的能力上限。手机端选模型就三个标准:中文好不好、体积够不够小、license 能不能商用/个人用。以下是目前(2026 年)最适合在手机上跑的几款模型。

推荐模型对比

模型 参数量 中文能力 Q4_K_M 体积 特点
Qwen2.5-1.5B-Instruct 1.5B 优秀 ~1 GB 入门首选,速度快
Qwen2.5-3B-Instruct ⭐ 3B 非常好 ~2 GB 质量速度平衡最佳
Phi-3-mini-4k 3.8B 一般 ~2.3 GB 微软出品,英文强
Llama 3.2-3B-Instruct 3B 一般 ~2 GB Meta 出品,生态好
Gemma-2-2B-it 2.7B 一般 ~1.7 GB Google 出品,许可宽松

中文用户首选 Qwen2.5 系列,通义千问的小模型中文表现在同级别里是最好的。6GB 内存的手机选 1.5B,8GB 以上选 3B,12GB 以上可以试试 7B(Q4 量化约 4.5GB)。

下载模型

GGUF 模型文件主要从 Hugging Face 下载。推荐用 huggingface-cli 或直接 wget 下载单个文件。

Bash · 下载 Qwen2.5-1.5B-Instruct Q4_K_M
# 方式一:pip 装 huggingface-hub 后下载
pip install huggingface-hub
huggingface-cli download \
  Qwen/Qwen2.5-1.5B-Instruct-GGUF \
  qwen2.5-1.5b-instruct-q4_k_m.gguf \
  --local-dir ~/models/
# 方式二:直接 wget 下载(国内可能需要代理)
mkdir -p ~/models && cd ~/models
wget https://huggingface.co/Qwen/Qwen2.5-1.5B-Instruct-GGUF/\
resolve/main/qwen2.5-1.5b-instruct-q4_k_m.gguf
💡 小贴士:国内下载加速
Hugging Face 在国内访问不稳定,可以用镜像站:把域名换成 hf-mirror.com 即可。例如 https://hf-mirror.com/Qwen/Qwen2.5-1.5B-Instruct-GGUF/resolve/main/...。

05 运行推理与参数调优

模型下载好了,终于可以跑起来了。llama.cpp 提供了两个主要工具:llama-cli 用于命令行对话,llama-server 用于启动 API 服务。先从 cli 开始,体验第一次本地对话。

第一次对话

Bash · 交互对话模式
1
2
3
4
5
6
7
./build/bin/llama-cli \
  -m ~/models/qwen2.5-1.5b-instruct-q4_k_m.gguf \
  -cnv \    # 对话模式(chat no verbose)
  -t 4 \    # 线程数,设为 CPU 核心数
  -c 2048 \ # 上下文长度(token)
  --temp 0.7 \ # 温度,越低越确定
  -p "你好,请简单介绍一下你自己"

运行后会先看到模型加载信息(加载耗时、模型大小、内存占用),然后开始生成回复。如果用了 -cnv 参数,进入对话模式后可以继续输入新问题,输入 /exit 退出。

核心参数调优

参数 作用 手机端推荐值
-t, --threads 推理使用的 CPU 线程数 CPU 核心数(如 8 核设 6-8)
-c, --ctx-size 上下文窗口大小(token) 2048(省内存)~ 4096
-n, --n-predict 最大生成 token 数 512(短对话)~ 2048
--temp 采样温度,0=确定性输出 0.7(平衡)~ 1.0(创意)
--top-p 核采样,限制候选词范围 0.9
-b, --batch-size 提示词批处理大小 512(提示长时调大)
--mlock 锁定模型在内存,防止被换出 内存充足时开启

手机性能优化技巧

🔥 性能优化清单
1. 线程数设为大核数:手机通常 4 大核 + 4 小核,用 -t 6 或 -t 8 测试哪个更快
2. 关闭其他后台应用:腾出更多 RAM,避免系统杀进程
3. 插电玩:推理耗电快,插电避免降频
4. 用 Q4_K_M 量化:质量和速度的最佳平衡点
5. 上下文别贪大:2048 token 足够日常对话,4096 会明显变慢
6. Termux 保持前台:按 Home 键后台可能被系统限制 CPU

06 本地 API 服务模式

命令行对话虽然直接,但和其他程序集成不方便。llama.cpp 提供了 llama-server,启动后就是一个本地 API 服务,兼容 OpenAI 的 /v1/chat/completions 接口。上一篇写的所有调用 DeepSeek API 的代码,只要把 base_url 改成本地地址,就能无缝切换到本地模型。

Bash · 启动本地 API 服务
1
2
3
4
5
6
7
8
./build/bin/llama-server \
  -m ~/models/qwen2.5-1.5b-instruct-q4_k_m.gguf \
  --port 8080 \
  -t 6 \
  -c 2048 \
  --host "0.0.0.0" \ # 允许局域网访问
  --parallel 2   # 并发请求数
# 启动后访问 http://localhost:8080 可看到管理页面

服务启动后,在 Termux 里开另一个终端或者用 curl 测试一下:

Bash · 用 curl 测试本地 API
1
2
3
4
5
6
7
8
9
10
curl http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
  "model": "qwen2.5-1.5b",
  "messages": [{"role":"user","content":"1+1等于几"}],
  "stream": false
}'
# 返回 JSON 格式与 OpenAI 完全一致
# {"choices":[{"message":{"content":"1+1 等于 2。"}}]}

与上一篇的 AI 助手无缝切换

上一篇写的 ai_chat.py,把初始化客户端的 base_url 改成 http://localhost:8080/v1,api_key 随便填个字符串(本地服务不验证),就从云端 API 切换成本地模型了。代码一行都不用改。

Python · 本地模型版 AI 助手
client = OpenAI(
    api_key="local",  # 本地模型不需要真实 key
    base_url="http://localhost:8080/v1"
)
# 其余代码完全不变!
💡 小贴士:服务常驻后台
想让 llama-server 一直在后台跑?用 tmux(第 05 篇学过)开一个 session 运行服务,需要时 attach 回去查看日志。但要注意 Android 后台限制——屏幕关闭后 Termux 可能被系统降速或杀死,建议配合 termux-wake-lock 获取 CPU 唤醒锁。
✏️ 分级练习
🟢 基础验证 跑通第一次本地对话
编译 llama.cpp(任选原生或 proot 方式),下载 Qwen2.5-1.5B-Instruct Q4_K_M 模型,使用 llama-cli 进行一次交互对话,向模型提问"什么是 GGUF 量化",记录回复和推理速度(token/s)。
💡 参考解法:git clone → cmake 编译 → 下载模型 → ./llama-cli -m 模型路径 -cnv -p "什么是GGUF量化",从终端输出中找到 eval time 行计算 token/s。
🟡 组合应用 本地 API + Python 脚本调用
启动 llama-server 本地 API 服务,用 Python 的 openai SDK 调用本地模型(base_url 指向 localhost:8080/v1),写一个脚本:读取一个 Python 文件内容,让本地模型解释这段代码的功能,并将解释结果保存到 explanation.md 文件中。要求:1)使用流式输出逐字打印;2)服务和脚本都在 Termux 中运行;3)验证本地模型确实不联网也能工作(关闭 WiFi 测试)。
💡 参考解法:llama-server 启动后,上一篇的 stream_chat 函数几乎不用改,只改 base_url 和 api_key。读取文件用 pathlib,保存结果用 write_text。
🔴 开放挑战 性能对比实验报告
设计一个性能对比实验,在你的手机上测试以下变量对推理速度的影响:1)不同量化等级(Q2_K vs Q4_K_M vs Q5_K_M vs Q8_0,同一模型同一大小);2)不同线程数(2/4/6/8 线程);3)不同上下文长度(512/2048/4096 token)。用 llama-bench 或自行编写测试脚本测量 decode 速度(token/s)和内存占用,将结果整理成 Markdown 表格,并撰写 300 字以内的结论说明在你的设备上最优配置是什么。思考:为什么线程数增加到一定程度速度不再提升?为什么上下文越长速度越慢?
提示:可以用不同大小的同系列模型近似对比,也可以用同一模型不同量化等级精确对比。用 /usr/bin/time -v 或 termux-battery-status 辅助测量内存和电量消耗。
🏷️ 知识回顾
llama.cpp GGUF 量化 Q4_K_M Qwen2.5 cmake 编译 llama-cli llama-server 本地 API 服务 OpenAI 兼容 离线推理 性能调优
📬 下一篇预告
第 20 篇:RAG 知识库与本地文档问答——本地模型虽好但知识是固化的,RAG(检索增强生成)让模型能读取你的本地文档。从文档切分、向量嵌入到 ChromaDB 向量库,再到检索+生成的完整流程,手把手搭建你自己的离线知识库问答系统。
关注系列,持续更新中 · 点赞在看支持作者