在树莓派 5 上运行 phi-2 模型时使用 int8 优化与 memory swap 的配置

文章导读
树莓派 5 的内存容量决定了它直接加载 phi-2 的完整权重并不宽松。int8 量化能把模型体积明显压缩,swap 则能在内存峰值时兜底,避免进程被 OOM 杀掉。但这两者不是提升性能的常规手段,而是让模型在这块板子上跑起来的可行组合。
📋 目录
  1. A 用 llama.cpp 和 int8 量化运行
  2. B 配置 swap 并控制使用范围
  3. C 运行调参和验证
A A

树莓派 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 提供的转换脚本自行转换。转换脚本的参数在不同版本时有变化,使用前先查看帮助:

在树莓派 5 上运行 phi-2 模型时使用 int8 优化与 memory swap 的配置
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 卡上,否则读写速度会严重拖慢生成。创建流程:

在树莓派 5 上运行 phi-2 模型时使用 int8 优化与 memory swap 的配置
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。

在树莓派 5 上运行 phi-2 模型时使用 int8 优化与 memory swap 的配置

运行调参和验证

第一次运行建议使用很小的上下文长度。上下文越长,激活值占用内存越多,所以先用 -c 256 跑通,再逐步调到 -c 512 或更高。主要参数含义:

  • -m:模型路径,必须保证存在。
  • -c:上下文长度,决定模型能回忆多少历史内容。
  • -n:生成 token 数。
  • -t:线程数,树莓派 5 可设为 4。

验证是否真的用上了 swap,另开终端持续观察:

free -h
swapon `--show`
vmstat 1 3

vmstat 输出中的 si 和 so 列表示换入换出页数。如果这两列数值长期较大,说明系统在内存和 swap 间频繁搬运,生成会明显变慢。这是 swap 兜底时的正常代价。频繁出现时,应继续降低 -c 或改用更小的量化级别,例如 Q4_K_M。

同时可以用 dmesg -T 查看内核日志,确认有没有 out of memory 错误。出现这类错误说明内存或 swap 仍然不足,需要进一步缩小上下文或缩小量化位宽。所有调整都要回到“先稳定跑起来,再逐步提高质量”的思路。