1. 项目概述
在嵌入式设备上运行大语言模型一直是AI边缘计算的热门方向。最近我成功在树莓派4B上部署了Ollama框架并运行了Qwen3.5-0.8B模型,整个过程踩了不少坑,也积累了一些优化经验。这篇教程将详细记录从系统准备到模型推理的全流程,特别针对ARM架构设备的特殊处理。
注意:树莓派4B的内存建议8GB版本,4GB版本运行0.8B模型会非常吃力。实测8GB内存版本在量化后可以较流畅运行。
2. 环境准备与系统配置
2.1 硬件要求清单
- 树莓派4B/5(8GB内存版本)
- 至少32GB的microSD卡(建议U3级别)
- 主动散热风扇(持续推理时CPU温度可达70℃+)
- 5V3A电源适配器(低电压会导致性能下降)
2.2 操作系统选择
经过对比测试,推荐使用64位Raspberry Pi OS Lite版本:
bash复制# 查看系统架构确认
uname -m
# 应显示aarch64
常规桌面版会占用过多内存,而Lite版本可以通过以下命令安装必要组件:
bash复制sudo apt update && sudo apt install -y \
curl git python3-pip \
libopenblas-dev libomp-dev
2.3 交换空间配置
由于物理内存有限,需要扩展交换空间:
bash复制# 禁用默认交换文件
sudo dphys-swapfile swapoff
sudo dphys-swapfile uninstall
sudo systemctl disable dphys-swapfile
# 创建4GB交换文件
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# 添加到fstab永久生效
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
3. Ollama安装与配置
3.1 二进制安装
官方提供了ARM64的预编译版本:
bash复制curl -fsSL https://ollama.com/install.sh | sh
安装后需要添加用户组并重启服务:
bash复制sudo usermod -aG ollama $(whoami)
sudo systemctl restart ollama
3.2 编译安装(可选)
如需最新特性,可从源码编译:
bash复制git clone https://github.com/jmorganca/ollama.git
cd ollama
go build .
sudo cp ollama /usr/local/bin/
编译需要提前安装Go 1.21+:
bash复制wget https://go.dev/dl/go1.21.5.linux-arm64.tar.gz
sudo tar -C /usr/local -xzf go1.21.5.linux-arm64.tar.gz
export PATH=$PATH:/usr/local/go/bin
4. Qwen3.5-0.8B模型部署
4.1 模型下载与转换
Ollama官方尚未提供Qwen的ModelFile,需要手动创建:
bash复制mkdir -p ~/.ollama/models
cat > ~/.ollama/models/modelfile <<EOF
FROM qwen/qwen2:0.5b-instruct
PARAMETER num_ctx 512
PARAMETER num_batch 128
EOF
4.2 量化配置
为减少内存占用,采用4-bit量化:
bash复制ollama create qwen3.5 -f ~/.ollama/models/modelfile \
--quantize q4_0
可用量化选项对比:
| 量化级别 | 内存占用 | 推理速度 | 精度损失 |
|---|---|---|---|
| q4_0 | ~2.5GB | 最快 | 明显 |
| q5_0 | ~3GB | 快 | 中等 |
| q8_0 | ~4GB | 一般 | 轻微 |
4.3 运行优化参数
启动时建议设置以下参数:
bash复制OLLAMA_NUM_PARALLEL=1 OLLAMA_NO_MULMAT=1 ollama run qwen3.5
关键参数说明:
NUM_PARALLEL=1:限制并行计算核心数NO_MULMAT=1:禁用矩阵乘法优化(ARM兼容性更好)
5. 性能测试与调优
5.1 基准测试结果
使用prompt "介绍树莓派"进行测试:
| 指标 | 数值 |
|---|---|
| 首次响应时间 | 28s |
| 平均token生成速度 | 1.2 token/s |
| 内存占用峰值 | 6.8GB |
| CPU温度峰值 | 72℃ |
5.2 温度控制方案
创建节流控制脚本/usr/local/bin/throttle.sh:
bash复制#!/bin/bash
MAX_TEMP=75
while true; do
temp=$(vcgencmd measure_temp | cut -d= -f2 | cut -d\' -f1)
if (( $(echo "$temp > $MAX_TEMP" | bc -l) )); then
echo "scale=2; $MAX_TEMP/$temp" | bc | sudo tee /sys/devices/system/cpu/cpufreq/ondemand/up_threshold
else
echo "85" | sudo tee /sys/devices/system/cpu/cpufreq/ondemand/up_threshold
fi
sleep 30
done
设置为开机启动:
bash复制sudo chmod +x /usr/local/bin/throttle.sh
sudo crontab -e
# 添加
@reboot /usr/local/bin/throttle.sh
6. 常见问题解决
6.1 内存不足错误
症状:
code复制failed to allocate memory (Out of memory)
解决方案:
- 检查交换空间是否生效:
free -h - 降低量化级别:改用q4_0
- 减少上下文长度:修改modelfile中的num_ctx
6.2 段错误(Segmentation Fault)
通常由内存对齐问题引起,尝试:
bash复制export OLLAMA_MMAP=1
export OLLAMA_KEEP_ALIVE=300
6.3 响应速度慢
优化策略:
- 设置CPU性能模式:
bash复制echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
- 禁用桌面环境(如果使用)
- 使用更短的prompt
7. 实际应用案例
7.1 语音助手集成
结合whisper.cpp实现语音输入:
bash复制# 安装语音组件
git clone https://github.com/ggerganov/whisper.cpp
cd whisper.cpp && make -j4
# 交互式语音问答
arecord -f S16_LE -r 16000 -d 5 voice.wav
./main -m models/ggml-base.en.bin -f voice.wav | ollama run qwen3.5
7.2 自动化脚本处理
创建问答脚本ask.sh:
bash复制#!/bin/bash
QUESTION=$(echo "$@" | tr ' ' '+')
curl -s http://localhost:11434/api/generate -d '{
"model": "qwen3.5",
"prompt": "'"$QUESTION"'",
"stream": false
}' | jq -r '.response'
使用示例:
bash复制chmod +x ask.sh
./ask.sh "如何用树莓派控制继电器"