我在 12 年前的树莓派上跑通了大模型(居然真的成了!)

BBetter Stack
컴퓨터/소프트웨어가전제품/카메라

Transcript

00:00:00这是第一代树莓派 (Raspberry Pi),发布于 2014 年。
00:00:05它配备了 700 MHz 单核处理器和 512 MB 内存。
00:00:12按现代标准来看,这基本上就是一个计算器。
00:00:16但今天,我们要看看是否能挑战这台有 12 年历史的硬件的
00:00:21绝对极限,即在上面本地运行大型语言模型。
00:00:26在本视频中,我将向你展示哪种微型模型可以在树莓派上运行,
00:00:30我们会观察它的表现,我还会教你如何安装所有必要的依赖项,
00:00:35这样你就可以亲自尝试了。
00:00:37这会非常有趣,让我们开始吧。
00:00:40老实说,我原本不认为能找到一个
00:00:47精简到足以适配这种架构的模型。
00:00:49但经过一番挖掘,我确实找到了一个候选者。
00:00:52它就是 Falcon H1 Tiny。
00:00:54这是一个极其紧凑的模型,仅有 9000 万个参数。
00:00:59它由阿布扎比的技术创新研究所 (TII) 开发,
00:01:03专门用于探索语言建模的极端下限。
00:01:08但他们是怎么把模型做得这么小的?
00:01:10背后是否有某种技术“秘方”?
00:01:13其实不然。
00:01:14他们基本上使用的是与 IBM 旗下的
00:01:19微型 Granite 4 模型相同的混合 Transformer 加 Mamba 架构。
00:01:24关于那个我也做过视频,感兴趣的可以去看看。
00:01:27但重点在这里。
00:01:28为了成功将此模型挤入内存,我们必须讨论量化。
00:01:33Falcon 模型有 2-bit、4-bit 和 8-bit 版本。
00:01:38你可能会想尝试超精简的 IQ 或重要性量化。
00:01:43但麻烦在于:
00:01:45这些较新的方法依赖于复杂的位操作,
00:01:49需要现代 CPU 指令集才能高效运行。
00:01:52但在我们树莓派上那块老旧的 ARMv6 芯片上,这行不通。
00:01:57所以我们只能选择老牌的 Q4 模型,
00:02:01它是我们这种场景下的黄金标准。
00:02:04它使用了一种中等规模的传统量化方法,
00:02:07树莓派的处理器确实能够处理而不会卡死。
00:02:11它在保持逻辑完整的同时,为我们提供了最佳的“每兆字节智能比”。
00:02:17但在第一代树莓派上运行这个模型绝非易事。
00:02:22由于该派使用的是 ARMv6 架构,
00:02:26它缺少几乎所有 AI 库都依赖的现代 NEON 指令。
00:02:31好在有 llama.cpp,我们可以用它来进行推理。
00:02:36但为了实现这一点,我们必须专门针对 ARMv6 编译其二进制文件。
00:02:42如果你尝试直接在派上编译,
00:02:45编译器可能需要 18 个小时才能完成。
00:02:49前提是它没有先因为内存不足错误而崩溃。
00:02:53所以为了绕过这一点,我们得动点脑筋。
00:02:56我们需要先在笔记本电脑上使用 dockcross 交叉编译这些二进制文件,
00:03:02专门针对启用了 VFP 数学单元的 ARMv6 指令集,
00:03:08然后通过 SSH 复制过去,这样我们就能直接开始推理了。
00:03:13这就是我们现在要做的事情。
00:03:15首先,我们需要使用 Raspberry Pi Imager 将最精简的操作系统烧录到派中。
00:03:22对于一块只有 512MB 内存的主板,每一兆都至关重要。
00:03:28所以我选择了 32 位版本的 Raspberry Pi OS Lite,
00:03:32因为它没有桌面界面,且闲置时的内存占用仅为
00:03:38标准系统的一小部分,几乎能把所有的 RAM 都留给模型运行。
00:03:44还有个重点,记得使用高级设置
00:03:47预先配置好 Wi-Fi 并启用 SSH。
00:03:51因为在这些旧板子上,远程管理要容易得多,
00:03:55这样你就不必忍受迟钝的本地终端了。
00:03:58现在,派启动并成功 SSH 进入后,我们需要解决 ARMv6 的问题。
00:04:05如果我们尝试在这里编译 llama.cpp,
00:04:08派真的会花上一天半的时间在处理头文件上。
00:04:13所以,我们将在普通的笔记本电脑上完成,以加快计算速度并节省时间。
00:04:18让我们克隆 llama.cpp 的源代码并创建一个专门的构建
00:04:23目录,我们将在这里存放要在树莓派上使用的构建版本。
00:04:28现在又有一个问题。
00:04:29我的 Mac 使用的是 ARMv8(64 位版本),而不是 32 位的 ARMv6。
00:04:37它们的指令集不同。
00:04:40所以为了专门为派编译二进制文件,我们需要使用 dockcross,
00:04:45这是一个运行在 Mac 上的交叉编译器工具链,
00:04:48但生成的二进制文件是专门针对派的老旧架构的。
00:04:53接下来,我们需要配置构建。
00:04:55这里必须非常精确。
00:04:58我们需要传递一些特定的标志。
00:05:00首先,我们需要关闭共享库 (shared libs) 以创建一个单一的可移植二进制文件。
00:05:05然后必须关闭 NEON,因为我们的派缺少那些现代数学指令。
00:05:10我们还需要禁用 OpenMP,以保持尽可能精简的内存占用。
00:05:15我们实际上是在剥离所有现代“奢侈品”,
00:05:18以确保二进制文件与我们老旧的派主板兼容。
00:05:22现在如果我们点击构建,大约两分钟后,我们就会得到一个
00:05:26完整编译并优化的 llama completion 二进制文件,可以复制到派上了。
00:05:31现在我将使用 SSH 通过网络直接连接到我的派,
00:05:35在派上创建一个新目录,然后使用 SCP 将我们自定义构建的二进制文件复制过去。
00:05:42最后还有一件事要做。
00:05:44让我们下载 Falcon 的 2-bit、4-bit 和 8-bit 传统量化模型,
00:05:50因为我们将依次测试所有的模型。
00:05:53然后通过网络将它们逐个复制到派的 models 文件夹中。
00:05:58现在最有趣的部分来了。
00:05:59让我们回到派上,执行我们的第一次推理测试。
00:06:03我们将从压缩最厉害的 2-bit 量化模型开始。
00:06:07在这里我们需要运行这条长命令。
00:06:10我在这里做的基本上是给它一个简单的提示词:
00:06:13“Hello, how are you?” 并将输出限制在 32 个 token。
00:06:18我们指定只使用一个线程,因为,嗯,我们也只有这一个。
00:06:22我们还将上下文大小保持在极小的 128 个 token,以节省每一字节的 RAM。
00:06:29但这里最重要的标志是 no M map。
00:06:32通常 llama.cpp 使用内存映射 (mmap) 来加载模型,这在高端 GPU 上很棒,
00:06:38但对我们的派来说是一场噩梦。
00:06:41在一个只有 512MB 内存的 32 位系统上,
00:06:45如果 mmap 找不到连续的地址空间块,就会失败。
00:06:50因此,通过禁用它,我们强迫模型直接加载到堆 (heap) 中,
00:06:55让我们对有限的内存有更稳定的控制。
00:06:58话虽如此,让我们运行命令吧。
00:07:00出来了,我们的第一批 token。
00:07:03我们可以看到,2-bit 版本运行得非常吃力。
00:07:08首先,它处理一个 token 大约需要三秒钟,
00:07:14而在旧款的树莓派板子上,这确实是意料之中的。
00:07:18但更重要的是,回答完全是胡言乱语。
00:07:21在一个 9000 万参数的模型上,权重被压缩得太厉害,
00:07:25以至于语言逻辑基本上崩溃了。
00:07:28它几乎不连贯,但从技术上讲,它确实在运行。
00:07:32现在让我们看看换成 4-bit 模型会发生什么。
00:07:35看!现在我们得到了一个连贯的问候回复。
00:07:40所以这是成功的。
00:07:42我们现在有一个真实的 AI 模型在派上本地运行,
00:07:47并能对我们的提示词做出逻辑回应。
00:07:49太棒了!
00:07:50现在让我们更进一步。
00:07:53看看派能不能处理 8-bit 模型。
00:07:56这次我要问它一些更智能的问题,
00:07:59比如阿尔巴尼亚的首都是哪里?
00:08:02嗯,这个回答是错的,因为阿尔巴尼亚的首都是地拉那,
00:08:08这显然在事实层面上是不正确的。
00:08:10但如果我问比利时的首都是哪里,它的回答是正确的。
00:08:15这向我们展示了一些非常有趣的东西。
00:08:17看来 9000 万参数的极限压缩是有代价的。
00:08:22它可能拥有关于较大、较知名国家的准确知识,
00:08:26但缺乏关于冷门国家以及可能较为冷门的话题的知识。
00:08:31这就是知识的本质。
00:08:33在这 9000 万个参数中,所能容纳的知识量是有限的。
00:08:38尽管如此,结果还是超级酷。
00:08:41这证实了确实存在足够小、
00:08:46而且足够精简,可以在一台有 12 年历史的树莓派上运行。
00:08:50它快吗?
00:08:51完全不快。
00:08:52它精确吗?
00:08:53可能并不精确。
00:08:54你应该在生产环境中使用它吗?
00:08:55大概不应该。
00:08:57除非你想造一个非常非常非常慢的机器人。
00:09:02但最重要的是,现在我们知道这在理论上是可能的。
00:09:06所以,这基本上就是我在这段视频中想要证明的一切。
00:09:09老实说,这次实验非常有趣。
00:09:13以上就是全部内容,各位。
00:09:14这就是 Falcon H1 Tiny 模型。
00:09:17大概是目前市面上最小的 AI 模型了。
00:09:20现在我们知道了,它们确实小到可以在第一代树莓派上运行,
00:09:25这超级酷。
00:09:27我简直停不下来想感叹这件事有多酷。
00:09:30虽然实际应用起来没什么用,但还是很酷。
00:09:35大家如果有任何有趣的想法、
00:09:37评论或关于刚才所见的见解,请告诉我。
00:09:40在下方的评论区留言吧。
00:09:42各位,如果你喜欢这类技术解析,
00:09:45请一定要狂点视频下方的点赞按钮。
00:09:49也不要忘记订阅我们的频道。
00:09:51我是来自 Better Stack 的 Andris,我们下期视频再见。

Key Takeaway

通过在现代电脑上使用 dockcross 交叉编译禁用 NEON 和 OpenMP 的二进制文件,并结合禁用 mmap 标志,可以在仅有 512 MB 内存的 12 年前的初代树莓派上成功本地运行 9000 万参数的 Falcon H1 Tiny 4-bit 量化语言模型。

Highlights

  • 2014年发布的初代树莓派配备 700 MHz 单核处理器和 512 MB 内存,属于极度受限的硬件环境。

  • Falcon H1 Tiny 模型仅包含 9000 万个参数,采用混合 Transformer 加 Mamba 架构,专为探索语言模型下限而设计。

  • 在初代树莓派的 ARMv6 芯片上,无法运行依赖复杂位操作的现代 IQ 或重要性量化模型,只能使用传统的 Q4 (4-bit) 量化版本。

  • 在树莓派本地编译 llama.cpp 库需要耗时约 36 小时,且极易因内存不足而崩溃,因此必须使用 dockcross 在笔记本电脑上进行交叉编译。

  • 运行大模型时必须禁用内存映射(-no-mmap 标志),强迫模型直接加载到堆内存中,以防止 512 MB 内存的 32 位系统因找不到连续地址空间而失败。

  • 4-bit 和 8-bit 版本的 9000 万参数模型能够生成连贯的文本,但由于参数量极小导致其逻辑和事实准确度有限,例如能正确回答比利时的首都,却错误回答了阿尔巴尼亚的首都有哪些。

Timeline

初代树莓派运行大模型的硬件局限与模型选择

  • 初代树莓派硬件配置仅有 700 MHz 单核处理器和 512 MB 内存。
  • 适配该架构的目标模型为技术创新研究所开发的 9000 万参数 Falcon H1 Tiny 模型。
  • 老旧的 ARMv6 芯片不支持新型量化方法所需的现代 CPU 指令集,只能采用传统的 4-bit 量化版本。

初代树莓派的计算能力极度受限,在现代标准下接近计算器。Falcon H1 Tiny 模型采用与 IBM Granite 4 相同的混合 Transformer 加 Mamba 架构,通过极端压缩实现了超小体积。尽管存在更精简的 IQ 或重要性量化方法,但由于它们依赖复杂的位操作,无法在缺乏现代指令集的 ARMv6 芯片上高效运行。因此,传统的 Q4 模型成为在保持逻辑完整性的同时兼顾内存占用的最佳选择。

针对 ARMv6 架构的交叉编译与系统优化配置

  • 直接在树莓派上编译推理库会因内存不足崩溃或耗费长达 36 小时。
  • 使用精简版 32 位 Raspberry Pi OS Lite 操作系统可最大化释放闲置内存。
  • 通过 dockcross 工具链在现代电脑上交叉编译可生成专属于 ARMv6 架构的单一可移植二进制文件。

初代树莓派缺少几乎所有 AI 库都依赖的现代 NEON 指令,必须专门针对 ARMv6 编译 llama.cpp。为了避免漫长的本地编译时间和潜在的内存崩溃,需要利用笔记本电脑上的 dockcross 交叉编译器。在配置构建时,必须精准关闭共享库、禁用 NEON 数学指令以及禁用 OpenMP,从而剥离所有现代功能以确保硬件兼容性。操作系统则选用无桌面界面的官方轻量版,并通过高级设置预先配置 Wi-Fi 和 SSH 方便远程管理。

微型大模型在极限制冷硬件上的推理测试与性能表现

  • 推理命令必须设置单线程、128 个 token 的极小上下文并禁用 mmap 标志。
  • 2-bit 量化版本的语言逻辑完全崩溃,而 4-bit 和 8-bit 版本能够生成连贯的逻辑回应。
  • 9000 万参数模型表现出明显的知识容量极限,无法保证常识和事实的完全准确。

在 512 MB 内存的 32 位系统上,如果 llama.cpp 使用默认的内存映射(mmap),会因找不到连续的地址空间块而导致加载失败,因此必须强制将模型直接加载到堆中。实际测试显示,2-bit 版本处理一个 token 需要大约三秒钟且输出内容皆为胡言乱语。换成 4-bit 之后模型可以正确回应简单的问候,8-bit 版本虽然能够运行,但在回答冷门地理知识时出现了事实性错误。实验证明了在 12 年历史的硬件上本地运行大模型在理论上具有可行性。

Community Posts

No posts yet. Be the first to write about this video!

Write about this video