LWN:llamafile让LLM更易用!

关注了就能看到更多这么棒的文章哦~

Portable LLMs with llamafile

By Daroc Alden
May 14, 2024
ChatGLM translation
https://lwn.net/Articles/971195/

大型语言模型 (LLM) 近期成为了许多讨论和审查(scrutiny)的主题。开源爱好者尤其感兴趣的是如何在自己的硬件上运行大型语言模型,特别是当这样做需要 NVIDIA 的专有 CUDA 工具包而该工具包在许多环境中仍然不可用的情况下。Mozilla 开发了 llamafile,将其作为解决这些问题的方案之一。Llamafile 可以将大型语言模型权重编译成可移植的(portable)原生可执行文件,以便于集成、存档或分发。在系统中有支持的 GPU 时这些可执行文件可以直接利用它们,但并不作为强制要求。

可移植性

Llamafile 基于 MIT 许可的 llama.cpp 库,这是一个用 C/C++ 实现的库,包含评估几种不同架构的大型语言模型所需的代码。Llamafile 维护着自己的 llama.cpp 副本,并进行了一些额外的 MIT 许可的更改。llamafile 本身的代码是在 Apache 2.0 许可下提供的。Llamafile 的价值在于以一种可以在许多不同环境中无缝工作的方式构建 llama.cpp 。4 月 25 日,Mozilla 发布了 一篇更新,介绍了 llamafile 的进展,称其为“运行各种开源大语言模型最简单/最快捷的方式”。

llamafile 的主要开发者 Justine Tunney 选择重用她之前在 Cosmopolitan Libc 上的工作。该项目实现了一个 C 标准库和相关的编译器基础设施,可以将用 C 编写的程序编译成多格式可执行文件,这些文件可以在 Linux、macOS、Windows、几种 BSD 或没有操作系统的环境下运行。

在宣布启动 Cosmopolitan Libc 的 博客文章 中,Tunney 说:

我喜欢这种想法,即能够自由地编写软件,不受限制,超越传统的界限。我的目标是帮助 C 成为一种“一次构建,随处运行”的语言,适合于从头开始的开发,同时避免任何可能阻碍技术社区之间共享软件的假设。

为了实现这一目标,Cosmopolitan Libc 使用了一些巧妙的技术来创建可执行文件,这些文件可以同时被解释为几种不同的格式。它生成的可执行文件以一个 shell 脚本开头,该脚本在不同的操作系统上的行为不同,程序利用这一点在运行时选择适合操作系统和体系结构的预编译静态二进制文件。这些文件(以及大型语言模型的权重,在 llamafile 中)被打包成一个 zip 文件。由于 zip 文件将其元数据存储在文件的末尾,因此同一个文件可以同时作为 shell 脚本、可执行文件和 zip 存档。

对于大多数程序来说,这种方法的使用价值值得怀疑,但对于 Mozilla 来说,它代表了一种使大型语言模型的访问更加民主化的重要方式。越来越多的存储库(最著名的是 HuggingFace)分发原始的大型语言模型权重,但原始权重实际上不足以让人直接使用这些模型。用户还依赖于推理代码软件来提供 API,以便实际访问模型的输出结果。更糟糕的是,这些推理代码通常跟特定品牌的 GPU 或机器学习工具链相关,这使得大型语言模型很难在特定环境之外运行。

Llamafile 将 Cosmopolitan Libc 在运行时选择适当实现的理念应用于机器学习。它会自动检测用户是否可以使用 AMD 或 NVIDIA 的 GPU 工具链,如果可以,则使用它们。如果不能,它会使用一个名为 tinyBLAS 的新的开源线性代数库。该库支持使用现有图形驱动程序提供的 API 来利用 GPU 加速,而无需安装工具链。这比用针对 NVIDIA 的 CUDA 或 AMD 的 ROCm 的特定型号的显卡编译原生程序的性能要低,但对于那些没有 GPU SDK 但拥有合适硬件的用户来说仍然很有用。

然而,TinyBLAS 并非适用于所有驱动程序。如果没有可用的 GPU 加速,llamafile 会退回到核心线性代数库的 CPU 实现,这些实现针对特定的微架构和特定硬件进行了专门优化。3 月 31 日,Tunney 发表了一篇 详细的博客文章,讨论了她如何提高各种硬件上的 CPU 推理性能,通常是通过手工编写针对特定硬件调整的矩阵乘法 内核。

不过,llamafile 还使用了另一种技巧来加速矩阵乘法,这种技巧更特定于其作为运行大型语言模型的平台的用途。像 BLAS 这样的通用线性代数库需要能够将维度未知的任意矩阵相乘,这些矩阵可能以某种方式进行了转置或加权。大型语言模型推理过程中,因为一次处理一个标记 (token),所以会花费大量时间进行矩阵向量乘法,而这些乘法可以用更简单的形式编写。

即使当大型语言模型进行通用矩阵乘法时(在初始化期间),这些模型先按架构来处理,从而这些矩阵的大小就变成了已知的,通常是 64 的倍数。这使得针对这些大小进行手工展开的实现比更通用的算法性能更好。Tunney 对一个 513x512 矩阵和一个 512x512 矩阵的乘法(llamafile 经常使用的大小)进行了基准测试,发现在特定大小之下,她的代码性能优于 Intel 的专有数学内核库 (MKL) 。MKL 在其他大小上仍然更快。然而,由于 llamafile 控制着大型语言模型初始化期间使用的批次(batch)的大小,因此这仍然是一个明显的性能改进。

使用 llamafile

使用 llamafile 打包的大型语言模型相当简单。该项目的 README 链接了几个不同大小的例子。在绝大多数情况下,下载文件、将其标记为可执行文件并运行它就足够了。拥有 binfmt_misc WINE 注册的用户可能需要添加更具体的规则,以防止 WINE 被用作程序的解释器。在不带参数的情况下运行程序将打开 llama.cpp 的简单聊天界面:

235735516b6300ad600a48e01f24570e.png

内置的网络服务器还提供了一个与 OpenAI 兼容的 API,因此,那些期望与专有服务对话的工具可以无缝地重定向到该 API,使用 OpenAI 的 API 设计作为大型语言模型推理的实际标准的工具也可以这样做。更习惯于使用命令行的用户可以将参数和指令作为参数传递。

参数也可以嵌入到 llamafile 可执行文件中。如上所述,这些文件实际上是 zip 文件;在可执行文件中添加一个名为 .args 的文件将使其将这些参数视为额外的命令行参数。将构建项目生成的 llamafile 二进制文件转换为用于分发的特定于大型语言模型的 llamafile 的过程实际上是相同的:将权重和任何需要的参数添加到 zip 文件中。

然而,出于性能方面的考虑,非常重要的一点是能在不压缩的情况下添加权重,并且理想情况下应与 4K 边界对齐。这就可以让 llamafile 将权重直接映射到内存中,这比将它们解压缩到那些非磁盘文件的内存中要快得多。为此,该项目还提供了一个名为 zipalign 的实用程序,可以以正确的方式将文件添加到 zip 存档中。

我的笔记本电脑没有任何相关的 GPU,但有一个很棒的第 12 代 Intel i7 处理器,作为示例提供的 Meta-Llama-3-8B-Instruct.Q5_K_M.llamafile 下载版以每秒约 16 个标记的速度评估提供的提示。实际答案本身的评估速度约为每秒 3.5 个标记。造成这种差异的原因是,在对提示词的评估过程中,模型可以使用矩阵-矩阵乘法而不是矩阵-向量乘法。但这种性能水平(虽然可能太慢,无法处理许多大型文档)对于本地使用来说似乎完全足够。

随着大型语言模型越来越多地集成到其他软件中,努力使它们更加容易在现有的消费类硬件上运行,是确保用户能够从这项技术中受益而不必将其数据发送给第三方的重要组成部分。一种格式是否适合广泛使用的最终试金石,就是它是否真的被采用;由于 llamafile 只有几个月的时间,现在就断言该项目是否已经实现其目标还为时过早。然而,它似乎正在朝着这个方向发展。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

00ecc326366bee051929bf00477fa112.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值