1. 项目概述
在移动设备上本地运行大语言模型曾经是天方夜谭,但随着模型优化和终端算力提升,这个想法正逐渐成为现实。我最近成功在一台2018年发布的华为Mate20 Pro(6GB内存)上部署了通义千问1.8B参数版本,实测对话响应速度在5-8秒之间,完全可满足基础问答需求。这可能是目前最接地气的大模型本地化方案,特别适合想体验AI能力又不想购买新设备的用户。
2. 环境准备与工具选型
2.1 设备要求实测数据
经过多款设备测试,得出以下可运行配置:
- 最低配置:骁龙835/麒麟970+4GB内存(需启用swap)
- 推荐配置:骁龙855/麒麟980+6GB内存
- 理想配置:骁龙8系/天玑旗舰+8GB内存
我的华为Mate20 Pro(麒麟980)实测内存占用:
- 空载Termux:300MB
- 加载千问1.8B:3.2GB(含800MB swap)
2.2 Termux配置优化
安装后必须执行以下优化:
bash复制pkg update -y && pkg upgrade -y
pkg install -y python cmake libopenblas
termux-setup-storage
关键配置项:
bash复制echo "allow-external-apps = true" >> ~/.termux/termux.properties
echo "export LD_PRELOAD=$PREFIX/lib/libopenblas.so" >> ~/.bashrc
2.3 存储空间管理
模型文件约3.5GB,建议:
- 使用termux-change-repo切换为国内镜像
- 创建专用存储目录:
bash复制mkdir -p ~/qwen_model && cd ~/qwen_model
3. 千问模型部署全流程
3.1 模型获取与转换
推荐使用HuggingFace上的量化版本:
bash复制pip install transformers==4.31.0
python -c """
from transformers import AutoModelForCausalLM
AutoModelForCausalLM.from_pretrained('Qwen/Qwen-1_8B-Chat-Int4',
trust_remote_code=True).save_pretrained('./qwen-1.8B-int4')
"""
3.2 依赖安装避坑指南
必须按顺序安装:
bash复制pip install torch==2.0.1 --index-url https://download.pytorch.org/whl/cpu
pip install sentencepiece einops tiktoken
常见问题解决:
- 如遇"ERROR: Failed building wheel for tokenizers":
bash复制pkg install rust export CARGO_BUILD_TARGET=aarch64-linux-android
3.3 内存优化配置
创建2GB swap文件:
bash复制dd if=/dev/zero of=/data/data/com.termux/files/usr/swapfile bs=1M count=2048
mkswap /data/data/com.termux/files/usr/swapfile
swapon /data/data/com.termux/files/usr/swapfile
添加到启动配置:
bash复制echo "swapon /data/data/com.termux/files/usr/swapfile" >> ~/.bashrc
4. 实际运行与性能调优
4.1 启动脚本编写
创建qwen_cli.py:
python复制from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("./qwen-1.8B-int4", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
"./qwen-1.8B-int4",
device_map="auto",
trust_remote_code=True
).eval()
while True:
query = input("\n用户:")
inputs = tokenizer(query, return_tensors="pt")
outputs = model.generate(**inputs, max_new_tokens=50)
print("千问:" + tokenizer.decode(outputs[0]))
4.2 性能优化参数
实测有效的启动参数:
python复制outputs = model.generate(
**inputs,
max_new_tokens=100,
do_sample=True,
top_k=40,
temperature=0.8,
repetition_penalty=1.1
)
4.3 实测性能数据
在麒麟980设备上:
- 首次加载时间:约3分钟
- 单次推理耗时:5-8秒(50 tokens)
- 内存占用峰值:3.4GB
5. 进阶技巧与问题排查
5.1 常见错误解决方案
| 错误现象 | 解决方法 |
|---|---|
| Illegal instruction | 添加export LD_PRELOAD=$PREFIX/lib/libopenblas.so |
| OOM killed | 增加swap空间或改用更小模型 |
| 中文乱码 | 安装中文字体:pkg install fontconfig-wqy-microhei |
5.2 模型裁剪技巧
如需进一步减小内存占用:
python复制model = AutoModelForCausalLM.from_pretrained(
"./qwen-1.8B-int4",
device_map="auto",
torch_dtype=torch.float16,
low_cpu_mem_usage=True
)
5.3 后台运行方案
使用tmux保持会话:
bash复制pkg install tmux
tmux new -s qwen
python qwen_cli.py
# 按Ctrl+B然后按D退出会话
# 恢复:tmux attach -t qwen
6. 实际应用场景演示
6.1 本地知识问答
测试案例:
code复制用户:如何用Termux编译C程序?
千问:在Termux中编译C程序需要先安装gcc:`pkg install clang`。创建test.c文件后,使用`clang test.c -o test`编译,最后`./test`运行...
6.2 代码辅助功能
Python代码补全示例:
code复制用户:写一个Python快速排序实现
千问:以下是Python实现的快速排序算法:
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr)//2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
6.3 持续对话模式
添加对话历史支持:
python复制history = []
while True:
query = input("\n用户:")
history.append(query)
full_query = "\n".join(history[-3:])
inputs = tokenizer(full_query, return_tensors="pt")
outputs = model.generate(**inputs, max_length=200)
response = tokenizer.decode(outputs[0])
print("千问:" + response.split("\n")[-1])
history.append(response)
经过两周的实测验证,这套方案在老旧设备上的稳定性超出预期。建议每天重启一次Termux以释放内存碎片,长期运行可能会出现性能下降。对于6GB内存设备,将swap增加到3GB可以显著提升多轮对话的流畅度。
