树莓派 5 的内存容量决定了它直接加载 phi-2 的完整权重并不宽松。int8 量化能把模型体积明显压缩,swap 则能在内存峰值时兜底,避免进程被 OOM 杀掉。但这两者不是提升性能的常规手段,而是让模型在这块板子上跑起来的可行组合。
在树莓派 5 上跑 phi-2,内存上限是主要约束。建议采用 llama.cpp 的 GGUF 格式,选用 Q8_0(int8 级量化)模型,配合文件型 swap 作为兜底。操作时要限定上下文长度,优先把模型和 swap 放到固态存储,再启动前使用 free -h 监控。不要指望在低成本 SD 卡上获得流畅体验,swap 本身会明显拖慢生成速度。
先做一步判断:你的树莓派 5 是 4GB 还是 8GB 内存版本。若是 4GB,未量化的 phi-2 权重(FP16)约 5GB 左右,直接加载必然超出物理内存;8GB 版本虽然能放下权重,但在上下文较长时仍可能触顶。所以无论版本,建议都先使用 int8 量化,再配置 swap 做防线。
用 llama.cpp 和 int8 量化运行
树莓派 5 是 ARM 架构,推荐使用 llama.cpp 这类原生编译的推理程序,而不是在 Python 里直接加载 PyTorch 模型。llama.cpp 支持 phi-2 架构,可运行 GGUF 格式的量化模型。这里的 Q8_0 是 8-bit 量化,对应常见的 int8 优化。
安装 llama.cpp
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
make -j4编译耗时较长,建议接好散热片和足够的供电。编译完成后会生成 main 程序。
准备 Q8_0 量化模型
先找一个 phi-2 对应的 GGUF 文件,优先选择 Q8_0 版本。如果你找到的是原始模型,也可以用 llama.cpp 提供的转换脚本自行转换。转换脚本的参数在不同版本时有变化,使用前先查看帮助:
python convert.py `--help`常见用法是输出为 q8_0 格式:
python convert.py `--outfile` phi-2-q8.gguf `--outtype` q8_0没有把握时可以先用默认转换和量化参数,跑通后再优化。
启动生成
./main -m phi-2-q8.gguf -c 512 -n 64 -t 4配置 swap 并控制使用范围
llama.cpp 启动后,除了模型权重,还需要为上下文分配内存。如果系统没有 swap,内存不足时会直接结束进程。先用命令确认现有 swap:
free -h
swapon `--show`如果没有可用的 swap,可以创建文件型 swap。建议把 swap 文件放在 SSD 或高速 U 盘上,不要放在普通 SD 卡上,否则读写速度会严重拖慢生成。创建流程:
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile要开机自动挂载,编辑 /etc/fstab,在末尾加一行:
/swapfile none swap sw 0 0接着调整 swap 使用倾向。默认的 swappiness 值可能偏大,会让系统过早换出内存。临时调低到 15:
sudo sysctl vm.swappiness=15想让配置重启后仍生效,把 vm.swappiness=15 写入 /etc/sysctl.conf。
运行调参和验证
第一次运行建议使用很小的上下文长度。上下文越长,激活值占用内存越多,所以先用 -c 256 跑通,再逐步调到 -c 512 或更高。主要参数含义:
- -m:模型路径,必须保证存在。
- -c:上下文长度,决定模型能回忆多少历史内容。
- -n:生成 token 数。
- -t:线程数,树莓派 5 可设为 4。
验证是否真的用上了 swap,另开终端持续观察:
free -h
swapon `--show`
vmstat 1 3vmstat 输出中的 si 和 so 列表示换入换出页数。如果这两列数值长期较大,说明系统在内存和 swap 间频繁搬运,生成会明显变慢。这是 swap 兜底时的正常代价。频繁出现时,应继续降低 -c 或改用更小的量化级别,例如 Q4_K_M。
同时可以用 dmesg -T 查看内核日志,确认有没有 out of memory 错误。出现这类错误说明内存或 swap 仍然不足,需要进一步缩小上下文或缩小量化位宽。所有调整都要回到“先稳定跑起来,再逐步提高质量”的思路。