Pi上安装Ollama需先验证aarch64架构和硬件资源,4GB版推荐1B/3B模型,8GB可跑7B/8B,内存不足会导致thrashing而非变慢。
在 Pi 上安装 Ollama 只有一条命令,之后所有决定它是否能用的配置都发生在 daemon 配置和模型文件的存放位置。
Ollama 的 Linux 构建版本分为 x86-64 和 ARM64。运行 32 位系统的 Pi 没有可用的二进制文件安装,这是最常见的第一步失败。先检查:
uname -m # 必须输出 aarch64
free -h # 实际有多少 RAM
df -h / # 根文件系统有多少空间
然后根据机器配置模型大小。生成一个 token 需要读取所有权重,所以如果模型的权重无法放入 RAM,它不是变慢,而是会发生内存抖动。4 GB 的 Pi 上,这意味着 1B 或 3B 模型且量化到 4-bit;8 GB 上 7B 或 8B 可以放入权重并略有富余;16 GB 则有足够的空间处理 context。这背后的计算逻辑(包括每个 token 的 KV cache 成本)在 SBC 的内存预算文章中有详细推导,直接适用此处。
运行安装脚本。它会检测 ARM64,将二进制文件放到 /usr/local/bin/ollama,创建 ollama 系统用户并安装 systemd 单元。
curl -fsSL https://ollama.com/install.sh | sh
如果介意的话,在 pipe 到 shell 之前先读一下脚本;该 URL 下是纯文本。
检查服务状态。
systemctl status ollama
curl http://127.0.0.1:11434/api/tags
从该端点返回空的模型列表意味着 daemon 已启动。
先移动模型存储位置
Ollama 文档中 Linux 默认模型目录是 /usr/share/ollama/.ollama/models,在 Pi 上这意味着 SD 卡。模型以内容寻址的 blob 形式存储,所以每次 pull 都会完整写入一次模型,每次重新 pull 变更后的 tag 又会再次写入。把模型放到 USB SSD 上,既能解决写入耐久度问题,也因为模型每次加载都要从磁盘读取。
sudo mkdir -p /mnt/ssd/ollama-models
sudo chown -R ollama:ollama /mnt/ssd/ollama-models
sudo systemctl edit ollama.service
在打开的覆盖编辑器中,添加:
[Service]
Environment="OLLAMA_MODELS=/mnt/ssd/ollama-models"
sudo systemctl daemon-reload
sudo systemctl restart ollama
chown 很关键:Ollama 文档指出 ollama 用户需要对自定义目录有读写权限,这里的权限失败会表现为一次启动后死亡的 pull。确保 SSD 在服务启动前通过 /etc/fstab 开机挂载,否则 daemon 会好心地在挂载点上创建一个空目录。
Swap,以及为什么它是个陷阱
Raspberry Pi OS 自带一个由 dphys-swapfile 管理的小 swap 文件,各种指南往往会告诉你增大它以便放不下的模型仍然能加载。它确实能加载。但也会变得完全无法使用,因为被 swap 出去的权重页在每个 token 生成时都必须从存储中读回来,而存储比 DRAM 慢三个数量级。
把 swap 视为加载峰值的缓冲和非模型相关事物的备用内存,而不是额外的 RAM:
sudo dphys-swapfile swapoff
sudo sed -i 's/^CONF_SWAPSIZE=.*/CONF_SWAPSIZE=2048/' /etc/dphys-swapfile
sudo dphys-swapfile setup
sudo dphys-swapfile swapon
free -h
两个后续建议。如果你有 SSD,也把 CONF_SWAPFILE 指向它——持续在 SD 卡上 swap 是最快烧坏 SD 卡的方式,原因在《模型文件存储对 SBC 的 SD 卡有什么影响》中有详述。考虑用 zram 代替,它在 RAM 中压缩页面,不产生任何写入:它提供的缓冲空间比 swap 文件少,但不需要耐久度也没有 I/O 开销。
如果一个模型需要 swap 才能加载,答案是用更小的模型或更小的量化,而不是更大的 swap 文件。
这些 daemon 设置很关键
这些都是已文档化的环境变量,设置方式与上面的 OLLAMA_MODELS 相同——通过 systemctl edit ollama.service,每行一个 Environment=,然后 daemon-reload 并 restart。摘自 Ollama 的文档化 FAQ:
OLLAMA_CONTEXT_LENGTH — 文档化的默认值是 4096 tokens。这是仅次于模型本身的最大的内存杠杆,因为 KV cache 与它线性增长。在 4 GB 开发板上降到 2048;只有当你测量出富余空间后才往上加。
OLLAMA_KEEP_ALIVE — 模型保持驻留的时长,默认 5 分钟。在 Pi 上,从存储加载模型足够慢,所以对常驻服务来说更长的值通常更合适;如果需要在请求之间回收 RAM,设为 0。
OLLAMA_NUM_PARALLEL — 每个模型的并行请求数,文档化默认值 1。不要动它。在带宽受限的机器上并发不会增加总吞吐量;反而会倍增 KV cache 让每个请求都变慢。
OLLAMA_MAX_LOADED_MODELS — 文档化默认值 CPU 上是 3。在 Pi 上这等于三种方式耗尽内存;设为 1。
OLLAMA_KV_CACHE_TYPE — 文档化默认值 f16。将 KV cache 量化减半内存成本,但有质量风险;在内存受限的开发板上这是换取 context 长度的杠杆。
OLLAMA_HOST — 文档化默认值 127.0.0.1:11434。设为 0.0.0.0:11434 会将 API 暴露到网络且没有任何认证,所以在这么做之前先把它放在某个保护层后面。
Ollama 在版本之间会新增和淘汰环境变量,上面的默认值是撰写时的文档化值。查看当前的 FAQ 和你安装版本的 ollama serve --help,而不是相信旧指南里的变量名。
两个习惯让剩下的事情更容易忍受。ollama ps 显示哪些模型是驻留的以及它们占用了多少,这是最快发现一小时前用完的模型仍然占用你现在需要的 RAM 的方式。模型被驱逐后的第一个请求要支付完整的存储加载时间——SSD 上几秒,SD 卡上更长——所以在测试中感觉很快而在生产中很慢的服务,通常是 OLLAMA_KEEP_ALIVE 在真实用户之间过期了。如果需要模型保持温热,用定时器发送一个单 token 请求,而不是在有其他工作要做的机器上将 keep-alive 设为无限。
在同一硬件上、用分离了 prompt 处理和生成的基准测试工具直接驱动,参见《用 llama.cpp 在树莓派上跑小型聊天模型》。