智能家居大脑:树莓派+Ollama

本文的目标不是与数据中心 GPU 竞争。而是构建一个实用的、私有的、始终在线的 AI 节点——你可以将其集成到家庭自动化、开发工作流或离线实验中,而无需依赖外部基础设施。

智能家居大脑:树莓派+Ollama
微信 ezpoda免费咨询:AI编程 | AI模型微调| AI私有化部署
AI工具导航 | Tripo 3D | Meshy AI | ElevenLabs | KlingAI | ArtSpace | Phot.AI | InVideo

在本地运行大语言模型曾经意味着需要一台功耗很高的桌面 GPU,以及相当的耐心。借助 Raspberry Pi 5 和 Raspberry Pi AI HAT+ 2(Hailo-10H),这个门槛大大降低了。你可以构建一个紧凑、低功耗的系统,在你的桌面上——或者就我而言,在电视柜上——完全运行 LLM 推理。

本指南将介绍如何使用 Ubuntu Server 24.04、Raspberry Pi AI HAT+ 2、Hailo 的 Ollama 兼容运行时和 OpenWebUI,在 Raspberry Pi 5 上搭建一个完全本地的 LLM 环境。完成后,你将拥有一个开机自动启动的持久化系统服务,并提供一个完全由本地硬件驱动的基于浏览器的聊天界面。

目标不是与数据中心 GPU 竞争。而是构建一个实用的、私有的、始终在线的 AI 节点——你可以将其集成到家庭自动化、开发工作流或离线实验中,而无需依赖外部基础设施。

在最终的设置中,架构如下:

浏览器
  ↓
OpenWebUI(systemd 服务,端口 8080)
  ↓
hailo-ollama(systemd 服务,端口 8000)
  ↓
/dev/hailo0
  ↓
Hailo-10H 硬件加速器

核心思路是保持技术栈原生化和持久化:不使用 Docker,重启后无需手动启动步骤,并且尽可能减少活动部件。

1、从"从零构建"到"让它稳定"

最初的计划很简单:在 Raspberry Pi 5 上使用 Ubuntu 和 AI HAT+ 2 运行完全本地的 LLM,只使用原生 Linux 组件。

所以我按照很多人会做的方式开始:手动构建所有东西。这意味着针对当前内核编译 Hailo 内核驱动、构建运行时库,并逐个组件地将技术栈组装在一起。理论上,这提供了最大程度的控制。但实际上,这变成了一个维护循环。内核模块构建对微小的变化很敏感——编译器版本、头文件不匹配、内核小版本更新。修复一个问题,又遇到下一个。即使设备正确显示为 /dev/hailo0,用户空间运行时也必须与硬件代次完全匹配。有些版本能检测到设备但无法正确通信,有些则根本还没有 Ubuntu 的打包版本。

在那个阶段,问题已经不是"这能工作吗?"——显然可以。

问题是"这能持续工作吗?"

与其继续手动重新构建一切,我转而使用 Raspberry Pi 仓库来获取 Hailo 驱动和运行时包。起初这感觉像是妥协,因为基础系统是 Ubuntu。但通过严格限制只使用 Hailo 组件,兼容性问题从未出现。差异立竿见影:

  • 内核模块干净加载
  • 运行时与硬件匹配
  • 模型直接初始化
  • 推理服务器在重启后保持稳定

从源代码构建提供控制,但使用厂商维护的包提供稳定性。对于这个项目,稳定性胜出了——正是这一点使它从一个实验变成了可靠的、始终在线的本地 AI 节点。

接下来,让我们一步步介绍安装步骤。

注意! 在撰写本文时,Raspberry Pi 官方针对 AI HAT+ 2 的 LLM 设置指南引用的是 Hailo GenAI Model Zoo 包的 5.1.1 版本。我在此使用了相同版本以与厂商文档保持一致。除此之外,5.2.0 版本在官方仓库中本来也找不到。

2、安装 Hailo 内核驱动

第一步是获取内核级别的组件,以便 Ubuntu 能正确与加速器通信。由于所需的 Hailo 包可以通过 Raspberry Pi 包仓库获取,我添加了该仓库并设置了固定优先级,使只有 Hailo 相关的包会从那里拉取:

curl -fsSL https://archive.raspberrypi.com/debian/raspberrypi.gpg.key \
| sudo gpg --dearmor -o /usr/share/keyrings/raspberrypi-archive-keyring.gpg

echo "deb [arch=arm64 signed-by=/usr/share/keyrings/raspberrypi-archive-keyring.gpg] \
http://archive.raspberrypi.com/debian trixie main" \
| sudo tee /etc/apt/sources.list.d/raspberrypi.list

然后创建一个 APT 固定文件,防止 Ubuntu 对无关组件优先使用 Raspberry Pi 包:

nano /etc/apt/preferences.d/raspberrypi-pin

Package: *
Pin: origin archive.raspberrypi.com
Pin-Priority: 1

Package: h10-hailort-pcie-driver hailort hailort-* libhailort* hailo*
Pin: origin archive.raspberrypi.com
Pin-Priority: 1001

设置完成后,安装内核驱动和匹配的内核头文件:

sudo apt update
sudo apt install h10-hailort-pcie-driver linux-headers-$(uname -r)

要验证系统能看到设备,检查 Hailo 设备节点:

ls -l /dev/hailo*

crw-rw-rw- 1 root root 234, 0 Feb 24 23:00 /dev/hailo0

如果 /dev/hailo0 存在,说明内核层面的设置状态良好。

3、安装 Hailo 运行时

驱动加载并暴露设备后,下一层是 Hailo 运行时本身。这使得用户空间应用程序能够正确与加速器通信。安装 Hailo-10H 运行时:

sudo apt install h10-hailort

然后验证运行时能否与硬件通信:

hailortcli fw-control identify

输出应包含类似以下内容:

Firmware Version: 5.1.1
Device Architecture: HAILO10H

这是一个重要的检查点。在此阶段,硬件不仅被 Linux 检测到——它还通过运行时栈正确响应。

4、安装 Hailo Ollama 运行时

底层组件工作后,下一步是推理层。在这个设置中,该角色由 hailo-ollama 处理,它提供了一个 Ollama 兼容的 API 服务器。安装模型库包:

wget https://dev-public.hailo.ai/2025_12/Hailo10/hailo_gen_ai_model_zoo_5.1.1_arm64.deb
sudo dpkg -i hailo_gen_ai_model_zoo_*.deb

安装后,验证 API 是否响应:

curl http://localhost:8000/hailo/v1/list

如果一切正常,你应该得到一个列出可用模型的 JSON 响应:

{"models":[...]}

至此,后端推理服务已启动并准备就绪。

5、安装和配置 OpenWebUI

对于前端,我想要一个简单的 Web 界面而不引入容器,所以 OpenWebUI 被直接安装到它自己的 Python 虚拟环境中。

首先,创建一个专用的服务用户:

sudo useradd -r -m -d /opt/openwebui -s /usr/sbin/nologin openwebui

然后切换到该用户并在虚拟环境中安装 OpenWebUI:

sudo -u openwebui bash
cd /opt/openwebui
python3 -m venv venv
source venv/bin/activate
pip install open-webui
exit

将 OpenWebUI 放在自己的系统用户下使设置更整洁,也更容易管理。

接下来,为 OpenWebUI 创建一个小型环境文件:

nano /opt/openwebui/env

OLLAMA_BASE_URL=http://localhost:8000
WEBUI_AUTH=False

这里重要的是 OLLAMA_BASE_URL=http://localhost:8000,它将 OpenWebUI 指向本地的 hailo-ollama 服务。

6、为 Hailo Ollama 创建 systemd 服务

推理服务也需要自动启动,因此创建一个 systemd 单元:

nano /etc/systemd/system/hailo-ollama.service

[Unit]
Description=Hailo Ollama Service
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/hailo-ollama serve
Restart=always

[Install]
WantedBy=multi-user.target

启用并启动它:

sudo systemctl daemon-reload
sudo systemctl enable hailo-ollama
sudo systemctl start hailo-ollama

7、为 OpenWebUI 创建 systemd 服务

要使 Web 界面在重启后保持持久化,创建一个 systemd 服务:

nano /etc/systemd/system/openwebui.service

[Unit]
Description=OpenWebUI Service
After=network.target hailo-ollama.service
Wants=hailo-ollama.service

[Service]
Type=simple
WorkingDirectory=/opt/openwebui
EnvironmentFile=/opt/openwebui/env
ExecStart=/opt/openwebui/venv/bin/open-webui serve --host 0.0.0.0 --port 8080

Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

然后重新加载 systemd,启用服务并启动它:

sudo systemctl daemon-reload
sudo systemctl enable openwebui
sudo systemctl start openwebui

启用两个服务后,系统在重启后能干净地恢复,并自动还原完整的本地 LLM 技术栈。

8、访问 Web UI

最后,当两个服务都运行时,打开浏览器并连接到:

http://<raspberry-pi-ip>:8080

如果后端可访问,模型会自动出现在 OpenWebUI 中,系统就可以使用了。

OpenWebUI 界面

9、结束语

Raspberry Pi 5 和 AI HAT+ 2 确实可以变成一个完全本地的 LLM 设备,这本身就令人印象深刻。但实现这一点仍然更关乎精心的集成,而不是开箱即用的简单。一旦技术栈稳定,它是整洁、安静和自包含的——但性能仍然有限,生成速度相对较慢,可用的模型范围也较窄。所以,暂时别指望它能成为你的"ChatGPT 替代品"。

更大的问题是软件支持——尤其是在 Raspberry Pi OS 之外。Raspberry Pi 在 2026 年 1 月推出了 AI HAT+ 2,但其官方文档仍然引用 GenAI 包 5.1.1 版本,而 Hailo 自己的生态系统已经指向 Hailo-10H 的 5.2.0 版本支持。对于一款旨在在 Pi 上实现本地 AI 的产品来说,这种滞后很难忽视。特别是结合某些模型已被替换的事实——最值得注意的是 Llama-3.2-3B-Instruct 模型。这本身不会破坏项目,但它确实让平台显得不够成熟——这也让购买决策更难合理化,除非你特别享受处理粗糙边缘的过程。对于喜欢实验的爱好者来说,这很有趣。对于任何期待一个精致的开箱即用本地 LLM 平台的人来说,它可能还没到那个程度。


原文链接: Running Local LLMs on Raspberry Pi 5 and Hailo AI HAT+ 2

汇智网翻译整理,转载请标明出处