上一个章节我们进行了大量有趣的实验,尝试了各种游戏玩法,树莓派的性能表现令人印象深刻。不过,老是玩游戏也容易审美疲劳,这一部分我们换换口味,来点不一样的——部署阿里通义千问的Qwen2.5模型,让树莓派变身成为一台能够离线运行的本地AI助手,真正体验一把"小身材,大智慧"的魅力。
Qwen(通义千问)是阿里云推出的开源大语言模型系列,具备优秀的中英文理解与生成能力。它提供了多个参数规模的版本,其中1.5B版本(15亿参数)虽然小巧,但在对话、问答、文本生成等任务上表现不俗,最关键的是——它对硬件资源的要求相对友好,非常适合在树莓派这类资源受限的设备上运行。想象一下,一个只有信用卡大小的开发板,居然能跑起大语言模型,这本身就是一件很酷的事情!
以下部署步骤均整理自我的个人笔记,每一步都经过实测验证,跟着操作基本不会翻车。整个流程主要分为:换源、安装依赖、下载模型、编写脚本、运行测试五个环节。
树莓派系统(当前是基于Debian 13)的默认软件源在国外,下载速度堪比蜗牛爬。如果不换源,光是更新系统就能等到怀疑人生。所以第一步,先把源换成国内的镜像,我这里用的是阿里云+清华的组合拳,速度杠杠的。
直接复制粘贴我的脚本,一键搞定:
# 1. 备份原文件(以防万一,留个后路)
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 2. 一键替换为阿里云源(已包含trixie版本)
sudo bash -c 'cat > /etc/apt/sources.list << EOF
# 阿里云镜像源 for Debian trixie
deb https://mirrors.aliyun.com/debian/ trixie main contrib non-free non-free-firmware
deb https://mirrors.aliyun.com/debian/ trixie-updates main contrib non-free non-free-firmware
deb https://mirrors.aliyun.com/debian-security trixie-security main contrib non-free non-free-firmware
EOF'
# 3. 验证文件是否写入成功(检查一下,确保没写错)
cat /etc/apt/sources.list
# 4. 配置清华树莓派专用源(这个是给树莓派固件用的)
sudo bash -c 'cat > /etc/apt/sources.list.d/raspi.list << EOF
# 清华镜像 for 树莓派 trixie
deb https://mirrors.tuna.tsinghua.edu.cn/raspberrypi/ trixie main
EOF'
换完源之后,就可以愉快地更新系统和安装依赖了。这一步会安装Python和一些基础工具,为后续的模型运行做准备。
同样,直接复制粘贴我的命令:
# 首先更新树莓派系统(速度应该快多了)
sudo apt update && sudo apt upgrade -y
# 安装Python3完整版(如果尚未安装)
sudo apt install python3-full -y
# 配置pip使用清华源,加速Python包的下载(不然装torch能装到天亮)
# 创建pip配置目录(如果不存在)
mkdir -p ~/.pip
# 直接写入清华源配置(覆盖原有配置)
cat > ~/.pip/pip.conf << EOF
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
extra-index-url =
trusted-host = pypi.tuna.tsinghua.edu.cn
[install]
trusted-host = pypi.tuna.tsinghua.edu.cn
EOF
# 查看配置是否生效(确认一下)
pip config list
Python项目最头疼的就是依赖冲突,尤其是牵扯到PyTorch这种重量级库。所以强烈建议使用虚拟环境,把Qwen相关的依赖隔离起来,跟系统自带的Python环境互不干扰。
# 创建项目目录(名字随你喜欢)
mkdir qwen-chat && cd qwen-chat
# 创建虚拟环境(这里取名zzf,你可以改成自己名字)
python3 -m venv zzf
# 激活虚拟环境(看到命令行前面出现(zzf)就说明成功了)
source zzf/bin/activate
# 在虚拟环境中安装所需包
# 首先安装 CPU 版本的 PyTorch(树莓派没有GPU,只能跑CPU版本)
pip install torch torchvision torchaudio \
--index-url https://mirrors.tuna.tsinghua.edu.cn/pytorch/whl/cpu \
--extra-index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 安装其他应用包:streamlit用于创建Web界面,transformers用于加载模型
# accelerate可以优化推理速度(虽然树莓派上提升有限,但有总比没有好)
pip install streamlit transformers accelerate \
--index-url https://pypi.tuna.tsinghua.edu.cn/simple
小贴士: PyTorch的CPU版本比较大(大概100多MB),在树莓派上下载可能需要一点时间,喝杯咖啡耐心等待就好。
Qwen2.5-1.5B-Instruct模型文件可以从官方渠道获取,比如Hugging Face(huggingface.co)或者阿里云的ModelScope。模型文件大概3GB左右,直接在树莓派上下载可能会比较慢,建议你用电脑下载好,然后通过U盘或者SCP命令传到树莓派上。
假设你传输到树莓派的路径是:/home/pi/qwen-chat/models/qwen1.5b/Qwen2.5-1.5B-Instruct(请记住这个路径,后面脚本里要用到)。
接下来就是下载好模型,从官方渠道获取Qwen2.5-1.5B-Instruct模型文件。获得模型后,将其放置在指定目录
等待模型下载好了就可以使用了,为了方便,我这里直接提供好脚本,方便使用
有了模型,还需要一个程序来加载它并提供一个友好的交互界面。这里我们使用Streamlit,它是一个非常方便的Python库,可以快速构建Web应用,而且界面还挺好看。
将以下代码保存为 qwen_app.py,放在 qwen-chat目录下:
# 对应内容
import streamlit as st
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
# ==================== 配置区域 ====================
# 重要:请将此路径修改为您实际的模型存放路径!
# 例如,如果您按照文章示例放在 /home/pi/models/qwen1.5b
MODEL_PATH = "/home/zzf/qwen-chat/models/qwen1.5b/Qwen2.5-1.5B-Instruct"
# ================================================
# 页面标题配置
st.set_page_config(page_title="树莓派Qwen聊天助手", page_icon="🤖")
st.title("🤖 Qwen2.5-1.5B 树莓派聊天助手")
st.write("基于阿里通义千问模型的本地AI助手,所有对话均在本地运行。")
# --- 侧边栏 ---
with st.sidebar:
st.header("⚙️ 控制面板")
# 内存管理:清空对话按钮
if st.button("🧹 清空对话历史"):
st.session_state.messages = []
# 尝试清理缓存(如果是在GPU上)
if torch.cuda.is_available():
torch.cuda.empty_cache()
st.rerun()
st.info("清空对话可以释放内存,建议定期清理。")
st.divider()
st.caption("模型路径: " + MODEL_PATH)
# --- 初始化模型和分词器 (使用缓存,避免重复加载) ---
@st.cache_resource
def load_model_and_tokenizer():
"""加载模型和分词器,并使用缓存"""
with st.spinner("正在加载模型,首次加载需要几分钟,请稍候..."):
# 针对树莓派的优化加载配置
model = AutoModelForCausalLM.from_pretrained(
MODEL_PATH,
torch_dtype=torch.float16, # 使用半精度减少内存占用
device_map="auto", # 自动选择设备(CPU优先)
low_cpu_mem_usage=True # 优化CPU内存使用
)
tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)
return model, tokenizer
# 加载模型和分词器
model, tokenizer = load_model_and_tokenizer()
# --- 初始化对话历史 ---
if "messages" not in st.session_state:
st.session_state.messages = []
# --- 显示历史消息 ---
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
# --- 处理用户输入和生成回复 ---
if prompt := st.chat_input("你好,我是Qwen,有什么可以帮你的?"):
# 1. 添加并显示用户消息
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.markdown(prompt)
# 2. 生成AI回复
with st.chat_message("assistant"):
message_placeholder = st.empty()
full_response = ""
# 准备输入
text = tokenizer.apply_chat_template(
st.session_state.messages,
tokenize=False,
add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
# 推理生成(不计算梯度,节省内存)
with torch.no_grad():
generated_ids = model.generate(
model_inputs.input_ids,
max_new_tokens=512, # 可根据树莓派性能调整 (256-512)
temperature=0.7,
do_sample=True,
pad_token_id=tokenizer.eos_token_id # 避免警告
)
# 解码回复
generated_ids = generated_ids[0][model_inputs.input_ids.shape[-1]:]
response = tokenizer.decode(generated_ids, skip_special_tokens=True)
# 流式显示(简单起见,直接显示完整回复,也可以逐字打印模拟流式)
message_placeholder.markdown(response)
# 3. 将AI回复添加到历史记录
st.session_state.messages.append({"role": "assistant", "content": response})
确保虚拟环境已经激活(命令行前面有 (zzf) 标识),然后在 qwen-chat目录下运行:
streamlit run qwen_app.py
在树莓派的浏览器中打开 http://localhost:8501,或者在同一局域网的电脑/手机上打开 http://<树莓派的IP地址>:8501,就能看到你的专属AI聊天界面了!
接下来就是效果展示
实际体验感受:
加载时间:首次加载模型大约需要2-3分钟(取决于SD卡速度)
生成速度:问一个简单问题大概需要10-20秒
内存占用:运行期间内存占用基本跑满(因为我是使用CPU来跑的),对于树莓派5B(8GB版)来说压力不大
CPU温度:持续运行时温度会上升到60-70°C,建议加个小散热片或风扇
虽然速度比不上云端大模型,但在本地离线运行、数据完全私密、无需联网这些优势,让它别有一番风味。想象一下,在野外露营没有网络的时候,还能跟树莓派聊聊天,是不是很酷?
如果你觉得基本对话不过瘾,还可以试试这些玩法:
接入语音输入输出:加上麦克风和喇叭,用Whisper语音识别+Qwen+语音合成,做个真正的语音助手
自定义角色设定:修改系统提示词,让AI扮演特定角色(比如英语老师、故事大王)
局域网共享:让家里所有人都能访问这个聊天助手
接入Home Assistant:用AI控制智能家居(脑洞大开!)
至此,你的树莓派已经成功变身为一台离线AI助手!虽然在速度上无法与云端大模型媲美,但这种本地运行、完全私密的体验,加上折腾过程中的成就感,本身就是一种乐趣。快去试试吧,看看Qwen能跟你聊些什么!
本帖最后由 1Awesome1 于 2026-2-20 17:36 编辑