[原创] 树莓派部署Qwen

1Awesome1   2026-3-20 08:24 楼主

上一个章节我们进行了大量有趣的实验,尝试了各种游戏玩法,树莓派的性能表现令人印象深刻。不过,老是玩游戏也容易审美疲劳,这一部分我们换换口味,来点不一样的——部署阿里通义千问的Qwen2.5模型,让树莓派变身成为一台能够离线运行的本地AI助手,真正体验一把"小身材,大智慧"的魅力。

 

Qwen 简介

Qwen(通义千问)是阿里云推出的开源大语言模型系列,具备优秀的中英文理解与生成能力。它提供了多个参数规模的版本,其中1.5B版本(15亿参数)虽然小巧,但在对话、问答、文本生成等任务上表现不俗,最关键的是——它对硬件资源的要求相对友好,非常适合在树莓派这类资源受限的设备上运行。想象一下,一个只有信用卡大小的开发板,居然能跑起大语言模型,这本身就是一件很酷的事情!

 

部署Qwen2.5详细步骤

以下部署步骤均整理自我的个人笔记,每一步都经过实测验证,跟着操作基本不会翻车。整个流程主要分为:换源、安装依赖、下载模型、编写脚本、运行测试五个环节。

屏幕截图 2026-02-20 145523.png

 

第一步:更换软件源(提速关键)

树莓派系统(当前是基于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库(隔离环境,避免冲突)

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聊天界面了!

 

接下来就是效果展示

屏幕截图 2026-02-20 173033.png
屏幕截图 2026-02-20 150540.png
_cgi-bin_mmwebwx-bin_webwxgetmsgimg__&MsgID=6685313316508914535&skey=@crypt_.jpg

 

实际体验感受:

  • 加载时间:首次加载模型大约需要2-3分钟(取决于SD卡速度)

  • 生成速度:问一个简单问题大概需要10-20秒

  • 内存占用:运行期间内存占用基本跑满(因为我是使用CPU来跑的),对于树莓派5B(8GB版)来说压力不大

  • CPU温度:持续运行时温度会上升到60-70°C,建议加个小散热片或风扇

虽然速度比不上云端大模型,但在本地离线运行、数据完全私密、无需联网这些优势,让它别有一番风味。想象一下,在野外露营没有网络的时候,还能跟树莓派聊聊天,是不是很酷?

 

进阶玩法(折腾不止)

如果你觉得基本对话不过瘾,还可以试试这些玩法:

  1. 接入语音输入输出:加上麦克风和喇叭,用Whisper语音识别+Qwen+语音合成,做个真正的语音助手

  2. 自定义角色设定:修改系统提示词,让AI扮演特定角色(比如英语老师、故事大王)

  3. 局域网共享:让家里所有人都能访问这个聊天助手

  4. 接入Home Assistant:用AI控制智能家居(脑洞大开!)

 

至此,你的树莓派已经成功变身为一台离线AI助手!虽然在速度上无法与云端大模型媲美,但这种本地运行、完全私密的体验,加上折腾过程中的成就感,本身就是一种乐趣。快去试试吧,看看Qwen能跟你聊些什么! 

 

 

本帖最后由 1Awesome1 于 2026-2-20 17:36 编辑

回复评论 (1)

模型文件大概3GB左右,也是这么大

点赞  2026-3-21 10:26
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复