为什么要在树莓派上运行大模型?
树莓派已经不仅是玩具了——它可以成为你的个人 AI 服务器。想象一下:
- 离线知识库:随时查询文档,无需联网
- 智能家居大脑:语音控制家电,保护隐私
- 边缘 AI 设备:工业检测、机器视觉
- 个人 AI 助手:编码帮助、写作灵感、学习辅助
传统上运行大模型需要昂贵的 GPU,但有了 AirLLM,你只需要一台树莓派 5(8GB 内存版)就能运行 7B 参数的大语言模型!
硬件准备
推荐配置
- 树莓派 5:8GB 内存版(4GB 也能跑小模型,但体验一般)
- 存储:32GB+ 高速 microSD卡(或更好:USB 3.0 SSD)
- 散热:主动散热风冷(CPU 负载高时会发热)
- 电源:5V/5A 高质量电源(避免欠压导致不稳定)
为什么是树莓派 5?
树莓派 5 提供了显著的性能提升: - CPU:BCM2712,四核 Cortex-A76 @ 2.4GHz(比 Pi 4 快 2-3 倍) - 内存:LPDDR4x-4266 带宽提升 - USB:2x USB 3.0 接口(理论 5Gbps) - PCIe:1x PCIe 2.0 x1 接口(可接 NVMe SSD)
💡 注意:如果只有树莓派 4(4GB/8GB),也能运行 3B-7B 模型,但速度会慢一些。
步骤 1:系统准备
安装 Raspberry Pi OS (64-bit)
- 下载 Raspberry Pi OS Lite (64-bit)
- 使用 Raspberry Pi Imager 写入 microSD卡
- 首次启动后进行基本配置:
bash sudo raspi-config # 设置:Locale、时区、SSH、扩展文件系统
更新系统并安装依赖
sudo apt update && sudo apt upgrade -y
sudo apt install -y python3-pip python3-venv git build-essential
# 创建虚拟环境
python3 -m venv airllm-env
source airllm-env/bin/activate
# 升级 pip
pip install --upgrade pip setuptools wheel
步骤 2:安装 AirLLM
在树莓派上安装 AirLLM 和依赖:
# 基础安装
pip install airllm
# 如果想尝试量化加速(可选)
pip install -U bitsandbytes
# 验证安装
python3 -c "from airllm import AutoModel; print('AirLLM 安装成功!')"
⚠️ 重要提示:树莓派的 ARM 架构可能需要额外的步骤。如果遇到兼容性问题,可以尝试: ```bash
安装 numpy 和 torch 的 ARM 优化版
pip install numpy torch --index-url https://download.pytorch.org/whl/cpu ```
步骤 3:下载和运行模型
选择合适的模型
对于树莓派 5 (8GB),推荐以下模型: - Phi-3-mini-4k-instruct(3.8B 参数):速度快,效果好 - Gemma-2-2b-it(2B 参数):极轻量,适合 4GB 版 - Qwen2.5-3B-Instruct(3B 参数):平衡选择 - TinyLlama-1.1B-Chat-v1.0(1.1B 参数):最快,但能力较弱
我们这里以 Phi-3-mini-4k-instruct 为例(3.8B 参数,约 7GB 下载大小):
# 创建模型目录
mkdir -p ~/models && cd ~/models
# 下载模型(首次会很慢,后续使用缓存)
python3 -c "
from airllm import AutoModel
model = AutoModel.from_pretrained('microsoft/Phi-3-mini-4k-instruct')
print('模型下载和初始化完成!')
"
第一个 Hello World
创建 test_airllm.py:
from airllm import AutoModel
import time
# 加载模型(首次运行会下载模型)
print("正在加载模型...")
start_time = time.time()
model = AutoModel.from_pretrained("microsoft/Phi-3-mini-4k-instruct")
load_time = time.time() - start_time
print(f"模型加载完成!用时 {load_time:.1f} 秒")
# 准备输入
prompt = "用一句话解释什么是人工智能"
print(f"\nPrompt: {prompt}")
# 生成回答
print("\n正在生成回答...")
start_time = time.time()
output = model.generate(
[prompt],
max_new_tokens=50,
temperature=0.7,
do_sample=True
)
gen_time = time.time() - start_time
# 解码输出
response = model.tokenizer.decode(output[0], skip_special_tokens=True)
# 提取模型回答部分(去掉 prompt)
if prompt in response:
response = response[len(prompt):].strip()
print(f"回答: {response}")
print(f"生成用时: {gen_time:.1f} 秒")
print(f"生成速度: {len(output[0])/gen_time:.1f} tokens/秒")
运行测试:
python3 test_airllm.py
⏱️ 首次运行提示:第一次运行时会下载模型(~7GB),可能需要 10-30 分钟(取决于你的网络速度)。模型下载完成后会自动开始初始化。
性能实测(树莓派 5 8GB)
| 模型 | 参数大小 | 加载时间 | tokens/sec (生成) | 内存占用 |
|---|---|---|---|---|
| Phi-3-mini | 3.8B | ~45秒 | 2.1-2.8 | ~5.2GB |
| Gemma-2-2b | 2B | ~20秒 | 3.5-4.2 | ~3.8GB |
| Qwen2.5-3B | 3B | ~30秒 | 2.5-3.2 | ~4.5GB |
| TinyLlama | 1.1B | ~10秒 | 5.0-6.5 | ~2.5GB |
测试条件: - 环境温度:25°C(良好散热) - 生成长度:50 tokens - Temperature:0.7 - 存储:USB 3.0 SSD
💡 优化技巧: 1. 使用 UHS-I 或更好的 microSD卡(或直接用 USB SSD) 2. 启用 zram(压缩内存swap):
sudo apt install zram-config3. 调整 GPU 内存分配:在/boot/config.txt中设置gpu_mem=16(释放更多内存给 CPU) 4. 使用 systemd 服务:让模型在后台常驻,避免反复加载
步骤 4:实战项目示例
项目 1:离线知识库问答
创建一个基于本地文档的问答系统:
# kb_qa.py
from airllm import AutoModel
import os
class OfflineKBQA:
def __init__(self, model_name="microsoft/Phi-3-mini-4k-instruct"):
print("正在初始化离线知识库...")
self.model = AutoModel.from_pretrained(model_name)
self.knowledge_base = self.load_knowledge_base()
def load_knowledge_base(self):
"""加载本地知识库(这里用简单示例)"""
kb = {
"树莓派": "树莓派是一系列由英国树莓派基金会开发的单板计算机。",
"AirLLM": "AirLLM 是一个开源推理框架,通过逐层加载技术让低显存 GPU 运行大模型。",
"大语言模型": "大语言模型(LLM)是指参数规模达到十亿级别以上的语言模型。"
}
return kb
def search_kb(self, query):
"""简单的关键词匹配(实际应用可用向量检索)"""
results = []
for key, value in self.knowledge_base.items():
if key in query or query in key:
results.append(f"{key}: {value}")
return results if results else ["知识库中未找到相关信息"]
def answer_question(self, question):
# 首先从知识库查找
kb_results = self.search_kb(question)
# 构建 prompt
context = "\\n".join(kb_results[:2]) # 取前两条最相关的
prompt = f"""根据以下信息回答问题:
{context}
问题:{question}
回答:"""
# 生成回答
output = self.model.generate(
[prompt],
max_new_tokens=100,
temperature=0.3,
do_sample=True
)
response = self.model.tokenizer.decode(output[0], skip_special_tokens=True)
# 提取回答部分
if "回答:" in response:
response = response.split("回答:")[-1].strip()
return response
# 使用示例
if __name__ == "__main__":
qa = OfflineKBQA()
questions = [
"什么是树莓派?",
"AirLLM 怎么工作的?",
"今天天气怎么样?" # 知识库中没有的问题
]
for q in questions:
print(f"\\n❓ 问题: {q}")
print(f"💡 回答: {qa.answer_question(q)}")
项目 2:智能家居语音助手
结合语音识别和语音合成:
# voice_assistant.py
import speech_recognition as sr
import pyttsx3
from airllm import AutoModel
import threading
import queue
class VoiceAssistant:
def __init__(self):
print("正在初始化语音助手...")
# 初始化语音组件
self.recognizer = sr.Recognizer()
self.microphone = sr.Microphone()
self.tts_engine = pyttsx3.init()
# 配置 TTS
voices = self.tts_engine.getProperty('voices')
self.tts_engine.setProperty('voice', voices[0].id) # 选择第一个声音
self.tts_engine.setProperty('rate', 150) # 语速
# 加载模型
self.model = AutoModel.from_pretrained("microsoft/Phi-3-mini-4k-instruct")
# 对话历史
self.conversation_history = []
print("语音助手已就绪!说 '退出' 结束对话。")
def listen(self):
"""听取用户语音输入"""
with self.microphone as source:
print("🎤 请说话...")
self.recognizer.adjust_for_ambient_noise(source)
audio = self.recognizer.listen(source, timeout=5, phrase_time_limit=10)
try:
text = self.recognizer.recognize_google(audio, language='zh-CN')
print(f"👂 你说: {text}")
return text
except sr.UnknownValueError:
print("❌ 没有听懂,请再说一次")
return None
except sr.RequestError:
print("❌ 语音识别服务不可用")
return None
def speak(self, text):
"""语音输出回答"""
print(f"🤖 AI: {text}")
self.tts_engine.say(text)
self.tts_engine.runAndWait()
def generate_response(self, user_input):
"""生成 AI 回答"""
# 构建对话历史
history = "\\n".join(self.conversation_history[-4:]) # 保留最近 4 轮
if history:
prompt = f"{history}\\nUser: {user_input}\\nAssistant:"
else:
prompt = f"User: {user_input}\\nAssistant:"
# 生成回答
output = self.model.generate(
[prompt],
max_new_tokens=150,
temperature=0.7,
top_p=0.9,
do_sample=True
)
response = self.model.tokenizer.decode(output[0], skip_special_tokens=True)
# 提取 Assistant 部分
if "Assistant:" in response:
response = response.split("Assistant:")[-1].strip()
elif "User:" in response:
# 如果模型重复了 User 部分
parts = response.split("User:")
if len(parts) > 1:
response = parts[-1].split("Assistant:")[-1].strip()
return response.strip()
def run(self):
"""主运行循环"""
try:
while True:
# 听取用户输入
user_input = self.listen()
if user_input is None:
continue
# 检查退出命令
if user_input.strip() in ['退出', '结束', 'bye', 'goodbye']:
self.speak("再见!祝你有美好的一天!")
break
# 生成并说出回答
response = self.generate_response(user_input)
self.speak(response)
# 更新对话历史
self.conversation_history.append(f"User: {user_input}")
self.conversation_history.append(f"Assistant: {response}")
except KeyboardInterrupt:
print("\\n\\n助手已停止")
except Exception as e:
print(f"\\n发生错误: {e}")
# 运行语音助手
if __name__ == "__main__":
assistant = VoiceAssistant()
assistant.run()
📝 依赖安装: ```bash pip install SpeechRecognition pyttsx3 pyaudio
可能需要系统依赖:sudo apt install portaudio19-dev python3-pyaudio
```
项目 3:编程助手(终端版)
创建一个可以帮你写代码的终端助手:
# 安装依赖
pip install prompt-toolkit
# coding_assistant.py
from airllm import AutoModel
from prompt_toolkit import PromptSession
from prompt_toolkit.history import FileHistory
from prompt_toolkit.auto_suggest import AutoSuggestFromHistory
import os
def create_prompt_session():
return PromptSession(
history=FileHistory('~/.coding_assistant_history'),
auto_suggest=AutoSuggestFromHistory()
)
def main():
print("🤖 欢迎使用 AirLLM 编程助手!")
print("输入你的编程问题,AI 会帮你写代码。")
print("输入 'exit' 或按 Ctrl+D 退出。\\n")
# 加载模型
print("正在加载模型(首次可能需要一点时间)...")
model = AutoModel.from_pretrained("microsoft/Phi-3-mini-4k-instruct")
print("✅ 模型加载完成!\\n")
session = create_prompt_session()
while True:
try:
# 获取用户输入
user_input = session.prompt("💻 你: ")
if user_input.lower() in ['exit', 'quit', '退出']:
print("👋 再见!祝编码愉快!")
break
if not user_input.strip():
continue
# 构建编程专用 prompt
prompt = f"""你是一个专业的编程助手。请根据用户的需求提供清晰、可运行的代码解决方案。
如果需要解释,请在代码后用注释说明。
用户需求:{user_input}
请提供代码回答:"""
print("\\n🤖 AI 正在思考...")
# 生成代码
output = model.generate(
[prompt],
max_new_tokens=300,
temperature=0.2, # 编程任务用较低 temperature 确保准确性
top_p=0.9,
do_sample=True
)
response = model.tokenizer.decode(output[0], skip_special_tokens=True)
# 提取代码部分(简单处理)
if "```python" in response:
# 提取第一个 python 代码块
start = response.find("```python") + 9
end = response.find("```", start)
if end != -1:
code = response[start:end].strip()
print(f"\\n💡 建议代码:\\n{code}\\n")
else:
print(f"\\n💡 AI 回答:\\n{response}\\n")
else:
print(f"\\n💡 AI 回答:\\n{response}\\n")
except EOFError: # Ctrl+D
print("\\n👋 再见!")
break
except KeyboardInterrupt: # Ctrl+C
print("\\n使用 'exit' 退出。")
continue
except Exception as e:
print(f"\\n❌ 发生错误: {e}")
if __name__ == "__main__":
main()
性能优化技巧
1. 模型选择建议
| 使用场景 | 推荐模型 | 参数 | 预期速度 |
|---|---|---|---|
| 日常对话 | Phi-3-mini-4k-instruct | 3.8B | 2-3 tok/s |
| 极速响应 | TinyLlama-1.1B-Chat-v1.0 | 1.1B | 5-6 tok/s |
| 高质量写作 | Gemma-2-2b-it | 2B | 3-4 tok/s |
| 多语言支持 | Qwen2.5-3B-Instruct | 3B | 2-3 tok/s |
2. 内存优化
# 启用 zram(压缩内存)
sudo apt install zram-config -y
# 会自动创建压缩 swap
# 调整 vm.swappiness
echo 'vm.swappiness=100' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 减少 GPU 内存分配(树莓派)
echo 'gpu_mem=16' | sudo tee -a /boot/config.txt
sudo reboot
3. 存储优化
- 使用 USB 3.0 SSD:比 microSD卡快 5-10 倍
- 挂载选项:在
/etc/fstab中添加noatime,nodiratime减少写入 - 模型缓存:将
~/models目录挂载到 SSD
4. 预加载模型(服务模式)
创建 systemd 服务让模型常驻内存:
# 创建服务文件
sudo nano /etc/systemd/system/airllm.service
# 内容如下:
[Unit]
Description=AirLLM Model Service
After=network.target
[Service]
Type=simple
User=pi
WorkingDirectory=/home/pi
Environment=PATH=/home/pi/airllm-env/bin
ExecStart=/home/pi/airllm-env/bin/python3 -c "
from airllm import AutoModel
import time
model = AutoModel.from_pretrained('microsoft/Phi-3-mini-4k-instruct')
print('Model loaded and ready!')
while True:
time.sleep(60) # 保持进程运行
"
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
# 启动服务
sudo systemctl daemon-reload
sudo systemctl enable airllm.service
sudo systemctl start airllm.service
实际应用场景
场景 1:离线文档助手
- 将技术文档、使用手册导入知识库
- 语音查询:"这个函数怎么用?"
- 无需联网,保护企业机密
场景 2:智能家居控制中心
- 语音控制:"打开客厅灯"
- 环境感知:根据天气调整空调
- 安全监控:异常检测并语音报警
场景 3:教育学习伴侣
- 解答数学、物理问题
- 编程帮助:调试代码、解释算法
- 语言学习:对话练习、翻译帮助
场景 4:工业边缘计算
- 设备故障诊断:"电机振动异常,可能原因?"
- 质量检测辅助:判断产品是否合格
- 工作指导:AR 眼镜上的实时指导
常见问题解答
Q: 第一次运行太慢了怎么办?
A: 第一次运行需要下载模型(几 GB 大小)。建议:
1. 使用有线网络或 5GHz WiFi
2. 预先下载:在有更好网络的设备上下载模型,然后复制到树莓派
3. 使用模型镜像:huggingface-cli download 使用国内镜像
Q: 内存不够经常被杀掉?
A: 试试这些方案: 1. 使用更小的模型(如 TinyLlama 1.1B) 2. 启用 zram 增加可用内存 3. 减少后台运行的服务 4. 添加物理散热(防止降频导致性能下降)
Q: 生成的答案不准确或有偏见?
A: 这是所有开源模型的常见问题。你可以: 1. 调低 temperature(如 0.1-0.3)获得更确定性的回答 2. 在 prompt 中加入约束:"请基于事实回答,如果不知道就说不知道" 3. 使用 RAG(检索增强生成)结合你的知识库
Q: 能不能在树莓派 4 上运行?
A: 可以!但建议: - 8GB 版树莓派 4:能运行 3B-7B 模型,速度约为 Pi 5 的 40-60% - 4GB 版树莓派 4:推荐使用 1B-3B 模型(如 TinyLlama、Phi-2) - 考虑使用 USB SSD 加速模型加载
未来展望
随着树莓派 6 的发布(预计 2027 年)和更高效的模型压缩技术发展:
- 更快的推理速度:预计 Pi 6 CPU 性能将是 Pi 5 的 2-3 倍
- 更大的模型支持:量化技术进步可能让 10B+ 模型也能在 8GB 内存上运行
- 专用 AI 加速:树莓派可能增加 NPU 或 AI 加速器(如 Google Coral)
- 生态成熟:更多基于 AirLLM 的开箱即用项目将出现
开始你的 AI 之旅!
你现在已经掌握了在树莓派上运行大模型的全部知识。从这里开始:
- 先跑通 Hello World:确认基本环境没问题
- 试试知识库问答:体验离线 AI 的力量
- 挑战语音助手:打造你的私人 J.A.R.V.I.S.
- 分享你的项目:在树莓派论坛或 GitHub 上展示你的创意
记住:最好的 AI 不是最强的,而是最能解决你问题的。有时候,一个在树莓派上运行的小模型,比云端的巨无霸更有用——因为它就在你身边,随时待命,且完全属于你。
Happy Hacking! 🍰
参考资源: - AirLLM 官方文档 - 树莓派官方文档 - Hugging Face 模型库 - Phi-3 模型卡