树莓派 AI 模块:本地运行大模型的低成本方案
树莓派 AI Hat 配备 8GB RAM 支持本地 LLM 运行,大幅降低边缘设备 AI 应用的部署成本。
树莓派 AI Hat 配备 8GB RAM 支持本地 LLM 运行,大幅降低边缘设备 AI 应用的部署成本。
今天树莓派推出了新款售价 $130 的 AI HAT+ 2,其中包含一个 Hailo 10H 和 8 GB 的 LPDDR4X RAM。
有了这个,Hailo 10H 可以完全独立运行 LLM,解放树莓派的 CPU 和系统 RAM 来处理其他任务。该芯片最高功耗为 3W,INT8 NPU 推理性能达 40 TOPS,相比早期搭载 Hailo 8 的 AI HAT 的 26 TOPS INT4 机器视觉性能有所提升。
不过在实际使用中,效果没有听起来那么神奇。
你仍然不能升级树莓派上的 RAM,但至少这样的话,如果你确实需要 AI 协处理器,就不必牺牲树莓派的内存来运行这些任务了。
而且比在树莓派上运行 eGPU 便宜得多、紧凑得多。从这个角度来说,它比微软硬推到"AI PC"中的那些无用 NPU 更有用。
但它仍然是一个解决问题的方案,只是对于大多数小众用例而言。
除了每次测试 AI 硬件时都感觉自己生活在《Turbo Encabulator》的世界里,我发现这些东西的营销宣传非常模糊,应用场景也不够广泛。
例如,Hailo 10H 被宣传用于富士通的一个自助收银自动缩水检测的演示。
这当然不是毫无价值的用例,但这不是我曾经需要做的事情。我觉得这块板子更多是为开发而设计的,用于想在其他设备上部署 10H 的人,而不是作为个人树莓派用户需要解决的问题的完整解决方案。
尤其是涉及到头条功能时:运行推理,比如使用 LLM。
我也发布了一段视频,包含这篇博文的所有信息,但如果你喜欢文字而不是视频,就继续往下滚吧——我不会介意的!
我在一个 8GB 的树莓派 5 上运行了所有测试,这样我可以做一个同样的对比,在树莓派的 CPU 上运行相同的模型,就像我在 AI HAT 的 NPU 上所做的一样。
它们都有相同的 8GB LPDDR4X RAM 配置,理想情况下,它们应该有类似的性能。
我测试了迄今为止 Hailo 推出的每一个模型,并进行了比较,树莓派 5 与 Hailo 10H:
树莓派的内置 CPU 大幅超越了 Hailo 10H。
Hailo 只有在 Qwen2.5 Coder 1.5B 上才勉强接近。
在大多数情况下,它的效率略高:
但更仔细地看功耗,我们可以看到为什么 Hailo 跟不上:
树莓派的 CPU 被允许最大化其功耗限制(SoC 上的 10W),这比 Hailo 的限制(3W)高得多。
所以功耗制约了它,但对于 LLM 用例(相对于仅在树莓派 CPU 上运行),8GB RAM 的限制最大。树莓派 5 可以购买最高 16GB 的配置。这和不错的消费级显卡的内存一样多¹。
正因为如此,许多量化的中等规模模型的目标是使用 10-12 GB 的 RAM(为上下文留出空间,这会额外占用 2+ GB 的 RAM)。
几周前,ByteShape 成功让 Qwen3 30B A3B Instruct 适配到 16GB 的树莓派 5 中。现在这篇文章不是关于 LLM 的,但简而言之,他们找到了一种新颖的方式来压缩模型,使其适配 10 GB 的 RAM。
虽然质量有所损失,但就像 JPEG 一样,它仍然足够好,能够通过所有人为设计的测试(比如构建一个 TODO 列表应用,或排序一个复杂列表),而我在 Hailo 10H 上运行的微型模型没有完成得很好(详见本文早前的视频)。
为了测试 30B 模型,我按照我博客上的指南安装了 llama.cpp,并下载了压缩后的模型。
我要求它生成一个单页 TODO 列表应用,虽然它不是速度之王(这毕竟是一台树莓派 CPU,配 LPDDR4x RAM),但过了一会儿,它给了我这个:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>TODO List App</title>
<style>
body {
font-family: Arial, sans-serif;
max-width: 500px;
margin: 50px auto;
padding: 20px;
background-color: #f5f5f5;
}
.container {
background-color: white;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
h1 {
color: #333;
text-align: center;
}
.input-container {
display: flex;
gap: 10px;
margin-bottom: 20px;
}
input {
flex: 1;
padding: 10px;
border: 1px solid #ddd;
border-radius: 4px;
font-size: 14px;
}
button {
padding: 10px 20px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 14px;
}
button:hover {
background-color: #45a049;
}
.todo-item {
display: flex;
align-items: center;
padding: 12px;
margin-bottom: 8px;
background-color: #f9f9f9;
border-left: 4px solid #4CAF50;
cursor: move;
border-radius: 4px;
}
.todo-item.completed {
opacity: 0.6;
border-left-color: #999;
}
.todo-item checkbox {
margin-right: 10px;
}
.todo-text {
flex: 1;
word-break: break-word;
}
.todo-item.completed .todo-text {
text-decoration: line-through;
color: #999;
}
.delete-btn {
background-color: #f44336;
padding: 5px 10px;
margin-left: 10px;
font-size: 12px;
}
.delete-btn:hover {
background-color: #da190b;
}
.completed-section {
margin-top: 30px;
padding-top: 20px;
border-top: 2px solid #ddd;
}
</style>
</head>
<body>
<div class="container">
<h1>My TODO List</h1>
<div class="input-container">
<input type="text" id="todoInput" placeholder="Add a new task...">
<button onclick="addTodo()">Add</button>
</div>
<div id="todoList"></div>
<div id="completedList" class="completed-section" style="display: none;">
<h2>Completed</h2>
<div id="completedItems"></div>
</div>
</div>
<script>
let todos = [];
let completedTodos = [];
function addTodo() {
const input = document.getElementById('todoInput');
const text = input.value.trim();
if (text === '') return;
todos.push({
id: Date.now(),
text: text,
completed: false
});
input.value = '';
render();
}
function toggleTodo(id) {
const todoIndex = todos.findIndex(t => t.id === id);
if (todoIndex !== -1) {
const todo = todos.splice(todoIndex, 1)[0];
todo.completed = true;
completedTodos.push(todo);
render();
}
}
function deleteTodo(id, isCompleted) {
if (isCompleted) {
completedTodos = completedTodos.filter(t => t.id !== id);
} else {
todos = todos.filter(t => t.id !== id);
}
render();
}
function render() {
const todoList = document.getElementById('todoList');
const completedList = document.getElementById('completedList');
const completedItems = document.getElementById('completedItems');
todoList.innerHTML = todos.map(todo => `
<div class="todo-item" draggable="true">
<input type="checkbox" onchange="toggleTodo(${todo.id})">
<span class="todo-text">${todo.text}</span>
<button class="delete-btn" onclick="deleteTodo(${todo.id}, false)">Delete</button>
</div>
`).join('');
if (completedTodos.length > 0) {
completedList.style.display = 'block';
completedItems.innerHTML = completedTodos.map(todo => `
<div class="todo-item completed">
<span class="todo-text">${todo.text}</span>
<button class="delete-btn" onclick="deleteTodo(${todo.id}, true)">Delete</button>
</div>
`).join('');
} else {
completedList.style.display = 'none';
}
}
document.getElementById('todoInput').addEventListener('keypress', (e) => {
if (e.key === 'Enter') addTodo();
});
</script>
</body>
</html>
它满足了我的所有要求:
我可以输入任意多的项目
我可以拖动它们来重新排列
我可以勾选项目,它们会移到列表的底部……
说实话,即使在树莓派上使用免费的本地模型,你能完成的小任务数量也多得离谱。自然语言编程在我职业生涯初期还只是个梦想。
除了对谷歌、OpenAI、Anthropic 和所有这些其他公司消耗全世界的金钱和资源来做这些事情感到愤怒——更不用说摧毁了成千上万初级开发者的职业生涯——看到 NLP 对非常明确定义的例子有效还是有点酷的。
但我不认为这块 HAT 是运行本地私有 LLM 的最佳选择(至少不是作为主要目标)。
它真正擅长的是视觉处理。但原始 AI HAT 在这方面也很不错!
在我的测试中,Hailo 的 hailo-rpi5-examples 还没有为这块新 HAT 更新,即使我手动指定了 Hailo 10H,模型文件也无法加载,或者我在检测到板子时遇到了错误。
但树莓派的模型确实能运行,所以我用 Camera Module 3 测试了它们:
我把它对准了我的桌子,它能够识别出我的键盘、我的显示器(它认为是一台电视)、我的手机,甚至躲在后面的鼠标。
它运行得非常快——比在树莓派 CPU 上快 10 倍——但问题是我可以用原始 AI HAT($110)或 AI Camera($70)做同样的事情。
如果你只需要视觉处理,我会坚持使用其中之一。
AI HAT+ 2 的头条功能是能够以"混合"模式运行,其中它可以处理机器视觉(来自摄像头或视频源的帧),同时也运行推理(比如 LLM 或文字转语音)。
不幸的是,当我尝试同时运行两个模型时,我遇到了段错误或"设备未就绪"的问题,由于缺乏来自 Hailo 的任何工作示例,我不得不放弃在时间内完成这项工作。
就像原始 AI HAT 一样,还是有一些成长烦恼。
似乎大多数名字里有"AI"的硬件,都是硬件优先,然后软件后来才推出——如果它推出的话的话。至少从树莓派的历史记录来看,软件确实会推出,只是……通常解决方案只在很小的小众用例中有用。
8GB 的 RAM 很有用,但不足以让这块 HAT 相比支付购买更大内存的 16GB 树莓派有优势,后者会更灵活,运行模型的速度更快。
这块 HAT 的主要用例可能是在需要视觉处理和推理的电源受限应用中。但即使在那里……很难说"是的,买这个东西",因为再增加几瓦的功耗,树莓派在搭配 $70 AI Camera 或 $110 AI HAT+ 进行视觉处理的情况下能实现更好的推理性能。
除了在不足 10 瓦的功耗下运行微型 LLM,也许这块 AI HAT+ 2 的想法是作为一个开发工具包,用于设计使用 10H 的设备,比如自助收银扫描仪(可能甚至不在树莓派上运行)?我不确定。
¹ 需要注意的是,GPU 上的 VRAM 运行速度比树莓派上的等效 LPDDR4 RAM 快得多!
² 需要注意的是,GPU 上的 VRAM 运行速度比树莓派上的等效 LPDDR4 RAM 快得多!