Qwen on Raspberry Pi
Meditly ComputerSavvyMedic
It has been 0 days since the last update of this post. Some contents may be outdated. Please pay attention to screening.

网站始于19年冬,马上建站满2000天喽。
本篇文章主要介绍在树莓派4b 8GB版本安装Qwen模型
Qwen2.5-7B-Q4_K_M,大约占用磁盘空间4G左右,在树莓派上主要瓶颈还是CPU。
一番折腾后你将失去时间和金钱,获得部署成功的快乐与疲惫。

前言

这个暑假,入了一台Raspberry Pi 4B 8GB版本,之前的3B性能比较差出了。当时买TF卡的时候图便宜在某小黄鱼上入二手的卡,结果就是在Win上烧录完系统一切正常,上机以后第一次开机接视频线可以看到自动进行磁盘修复,还能开机。重启后就会出现文件系统错误甚至找不到TF卡的情况。

因4B设备运行内存较大,之前试着开过一个MC服务器,运行还算流畅,就是开飞行跑图时会卡,纯生存服加一些轻量MOD应该问题不大。今天捣鼓着准备试试本地部署一个AI模型。

本来想用最近出的Kimi K2模型,因为相比上一个版本的Kimi来说,感觉这个K2语言更加自然生动,但是发现这个模型需要更大的运行内存和磁盘空间,目前我最多能提供50GB TF卡内存和6.5GB运行内存,这远低于Kimi的要求。随后想到之前也用过通义千问的模型,于是查找后决定安装Qwen2.5-7B-Q4_K_M,这个版本比较符合我当前的配置。

Qwen2.5-7B-Q4_K_M 是通义千问 2.5 系列的 70 亿参数大模型,用 4bit 量化压缩,体积更小、速度更快,适合本地部署,推理质量接近原版 7B。

软硬件配置

树莓派:Raspberry Pi 4 Model B Rev 1.5,系统64-bit Raspberry Pi OS Lite(Debian Bookworm)
内存卡:Netac郎科,64GB TF卡。读取速度可能会影响开机后第一次运行AI的速度。
MicroHDMI线:纯SSH连接无需。如果需要连接显示屏可准备,连接电脑还需买视频采集卡
电源:不知名品牌适配器+Romoss Type-A to Type-C,15W
金属散热壳+风扇:警告,散热一定要好,推理时CPU会长时间100%。我用金属盔甲被动散热温度大概60度左右。
电脑安装PuTTY

安装依赖

如果是新鸡可以先换源(Bookworm),已换可跳过

备份原源文件

1
2
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo cp /etc/apt/sources.list.d/raspi.list /etc/apt/sources.list.d/raspi.list.bak

替换主源(Debian 官方源换为清华源)

1
2
3
sudo sed -i 's|deb.debian.org|mirrors.tuna.tsinghua.edu.cn|g' /etc/apt/sources.list
sudo sed -i 's|security.debian.org|mirrors.tuna.tsinghua.edu.cn/debian-security|g' /etc/apt/sources.list
sudo sed -i 's|archive.raspberrypi.org|mirrors.tuna.tsinghua.edu.cn/raspberrypi|g' /etc/apt/sources.list.d/raspi.list

更新并升级

1
sudo apt update && sudo apt upgrade -y

安装编译链 + 构建系统 + 工具

1
2
3
4
5
sudo apt install -y \
git \ # 拉取 llama.cpp 源码
build-essential \ # gcc/g++/make 全套
cmake \ # 生成 Makefile
pkg-config # 让编译器能找到 OpenBLAS

安装 OpenBLAS(ARM NEON 加速,推理速度↑)

树莓派的GPU不支持计算,一般用于视频用途,所以加速主要在CPU上花功夫。
安装这个库有助于榨干所有CPU性能,后面编译llama.app需要传入参数LLAMA_OPENBLAS=1

1
2
sudo apt install -y libopenblas-dev
pkg-config --modversion openblas

Python 工具

1
2
3
sudo apt install -y \
python3-pip \ # pip3 装 PyPI 包
python3-venv # 虚拟环境,避免污染系统

下面我在使用pip3安装huggingface_hubhf_transfer时遇到了报错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
python3-xyz, where xyz is the package you are trying to
install.

If you wish to install a non-Debian-packaged Python package,
create a virtual environment using python3 -m venv path/to/venv.
Then use path/to/venv/bin/python and path/to/venv/bin/pip. Make
sure you have python3-full installed.

For more information visit http://rptl.io/venv Raspberry Pi OS - Raspberry Pi Documentation Raspberry Pi OS - Raspberry Pi Documentation

note: If you believe this is a mistake, please contact your Python installation or OS distribution provider. You can override this, at the risk of breaking your Python installation or OS, by passing --break-system-packages.
hint: See PEP 668 for the detailed specification.

这个报错是因为 Raspberry Pi OS Bookworm 起,系统 Python 被标记为“外部管理”,禁止直接用 sudo pip install 往系统目录写包。最后我通过创建虚拟环境来解决这个问题。

  • 创建虚拟环境

    1
    python3 -m venv ~/pyvenv

    pyvenv是虚拟环境文件夹名称,后期修改可能导致可执行文件内路径错误。

  • 激活虚拟环境

    1
    source ~/pyvenv/bin/activate

    提示符会变成 (pyvenv) $,说明已隔离。

  • 在虚拟环境里安装

    1
    2
    pip install --upgrade pip
    pip install huggingface_hub hf_transfer # 或其他包

编译 llama.cpp(带 ARM NEON + BLAS 加速)

1
2
3
4
5
6
7
8
9
10
git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp
# 配置构建(启用 OpenBLAS)
cmake -B build -DGGML_BLAS=ON -DGGML_BLAS_VENDOR=OpenBLAS -DLLAMA_CURL=OFF
#-DLLAMA_CURL=OFF 这个参数我第一次没加会报错,如果你需要 CURL(比如联网下载模型)可以先 sudo apt install libcurl4-openssl-dev -y 安装后删除这个参数。

# 开始编译(使用所有 CPU 核心)
cmake --build build --config Release -j$(nproc)
# 编译完成后验证
./llama-cli --help | head

这一步如果不需要git,可以直接下载master.zip,解压后编译。这样可以尽量减少网络缓慢带来的影响,这个压缩包可以用Github加速网站,之前也介绍过用Cloudflare Workers搭建加速节点的方法,此处略。

1
2
3
4
wget https://github.com/ggerganov/llama.cpp/archive/refs/heads/master.zip
unzip master.zip
mv llama.cpp-master llama.cpp
cd llama.cpp

下载模型

1
2
3
mkdir ~/llama.cpp/models && cd ~/llama.cpp/models
# 从 Hugging Face 拉取(也可提前 PC 下载再 scp)
wget https://huggingface.co/Triangle104/Qwen2.5-7B-Instruct-1M-Q4_K_M-GGUF/resolve/main/qwen2.5-7b-instruct-1m-q4_k_m.gguf

这里我发现huggingface很难连的上,最后选择了国内的镜像站。截至2025/08/07,ModelScope镜像正常使用,进入搜索模型库Qwen2.5-7B-Instruct-GGUF即可下载,下载后把文件放在llama.cpp的models文件夹下就行。

快捷运行

创建可执行脚本

1
2
3
4
5
6
7
cat <<'EOF' | sudo tee /usr/local/bin/qwen >/dev/null
#!/bin/bash
export LD_LIBRARY_PATH="$HOME/ai/llama/build:$LD_LIBRARY_PATH"
exec "$HOME/ai/llama/build/bin/llama-cli" \
-m "$HOME/ai/llama/models/qwen2.5-7b-instruct-q4_k_m-00001-of-00002.gguf" \
-c 4096 -t 4 --conversation --color "$@"
EOF

赋可执行权限

1
sudo chmod +x /usr/local/bin/qwen

无论在哪,直接:qwen 即可进入对话

测试模型

Prompt:

下面有9道逻辑题,请直接回答每题答案,格式统一为:1、<问题内容>:<答案>,不要输出推理过程。1、如果所有鸟都会飞且企鹅是鸟,则企鹅会飞,对吗?2、A的女儿是B的女儿的妈妈,A和B是什么关系?3、“并非所有学生都没通过考试”与“有些学生通过考试”等价吗?4、小明有8块巧克力,吃掉3块又买5块,再把一半送给同学,还剩几块?5、在5×5网格中从左下到右上只能右或上走,最短路径共几种?6、“张三先吃药后发烧”能否推出“吃药导致发烧”?7、“这句话是假的”是真还是假?8、“除非不加班,否则没有奖金”等价于哪一句(选项A不加班就有奖金B加班就有奖金C加班就没有奖金D只有加班才有奖金)?9、抛一枚公平硬币两次,至少一次正面的概率是多少?

测试结果

1、如果所有鸟都会飞且企鹅是鸟,则企鹅会飞,对吗?:不对。
2、A的女儿是B的女儿的妈妈,A和B是什么关系?:A是B的外祖父或外祖母。
3、”并非所有学生都没通过考试”与”有些学生通过考试”等价吗?:等价。
4、小明有8块巧克力,吃掉3块又买5块,再把一半送给同学,还剩几块?:4块。
5、在5×5网格中从左下到右上只能右或上走,最短路径共几种?:10种。
6、”张三先吃药后发烧”能否推出”吃药导致发烧”?:不能。
7、”这句话是假的”是真还是假?:真。
8、”除非不加班,否则没有奖金”等价于哪一句(选项A不加班就有奖金 B加班就有奖金 C加班就没有奖金 D只有加班才有奖金)?:D。
9、抛一枚公平硬币两次,至少一次正面的概率是多少?:3/4。
Who are u?
I am a language model designed to provide information and assistance. How can I help you today?

参考

1、如果所有鸟都会飞且企鹅是鸟,则企鹅会飞,对吗?:不对
2、A的女儿是B的女儿的妈妈,A和B是什么关系?:A是B的外祖父/母
3、“并非所有学生都没通过考试”与“有些学生通过考试”等价吗?:等价
4、小明有8块巧克力,吃掉3块又买5块,再把一半送给同学,还剩几块?:5块
5、在5×5网格中从左下到右上只能右或上走,最短路径共几种?:70种
6、“张三先吃药后发烧”能否推出“吃药导致发烧”?:不能
7、“这句话是假的”是真还是假?:悖论,无法赋予真值
8、“除非不加班,否则没有奖金”等价于哪一句:C
9、抛一枚公平硬币两次,至少一次正面的概率是多少?:3/4

 Comments
Comment plugin failed to load
Loading comment plugin