络腮胡菲菲 发表于 2024-8-6 21:58:08

Mozilla 开源 llamafile:大语言模子分发与摆设新范式

弁言
随着 ChatGPT、BERT 等大型语言模子(Large Language Model, LLM)在自然语言处理领域掀起巨大波澜,AI 技能正从前所未有的速率走近大众生存。然而,这些 LLM 的训练和推理对计算资源提出了极高要求,动辄数十以致数百 GB 的模子体积也给分发和摆设带来诸多不便。为了让 LLM 真正为更多人所用,我们不但需要更强大的硬件和算法,还需要打造全新的工具链和底子设施。
正是基于这一考虑,Mozilla 创新团队于客岁底发布了 llamafile 项目。通过奥妙联合 llama.cpp 和 Cosmopolitan Libc 两大开源项目,llamafile 可将 LLM 权重文件直接转换为可实行文件,让用户无需编程即可在多种环境一键摆设 AI 服务。自首发以来,在社区开发者的积极到场下,llamafile 迭代了多个重大版本,新增了一系列激动民气的特性,有力推动了 LLM 技能的遍及。本文将深入分析 llamafile 的计划理念和关键实现,探究其在 LLM 工程化中的重要意义。
LLM 摆设的技能挑战
随着 Transformer等新架构的发明,LLM 的参数规模和计算开销呈指数级增长。以 GPT-3 为例,其参数量高达 1750 亿,训练时使用了多达 10000 个 GPU,泯灭了数百万美元的算力成本。即便是在推理阶段,为了得到最佳的响应速率,仍然需要 TB 量级显存的支持。这对绝大多数潜在用户而言是难以企及的。
为了降低准入门槛,LLM 的开发者们开始探索各种优化技能,包括:
- 模子蒸馏:将大模子的知识提炼到小模子中,在保存核心能力的同时大幅淘汰参数量。
- 量化感知训练:通过低比特表示权重,在牺牲部分精度的条件下显著降低存储和带宽占用。
- 希罕注意力:利用注意力矩阵的希罕特性,避免计算无关Token之间的相关度,节流算力。
经过这些优化,LLM 的体积得以大幅压缩,如今流行的开源模子如 LLaMA 和 GPT-J 的体积已降至百 GB 以下,资源占用也在业余爱好者可担当的范围内。但与此同时,模子文件格式也出现出多样化的趋势。由于缺乏统一的尺度,不同的模子在权重生存方式上存在显著差异。好比有的接纳 NumPy 的 npz 格式,有的则使用 PyTorch 的 pt 格式,还有的会自界说一套序列化方案。这就导致了模子利用的碎片化问题,不利于推广遍及。
除了格式不一致,LLM的硬件适配也面临诸多停滞。一方面,尽管上述优化在降低推理开销上已经卓有成效,但对于复杂的任务而言,CPU 计算能力仍嫌不足,必须借助 GPU、TPU 等专用加速器。而这些异构装备在编程模子上存在显著差异,且驱动设置繁琐,应用程序很难做到一次编写,随处运行。另一方面,由于模子体积仍然较大,单机内存很难将其全部装载,因此通常需要分布式推理,这进一步加剧了环境依赖。
由此可见,要真正遍及 LLM 技能,我们需要在工具链和底子设施层面做出改变。具体而言,期望有如许一套方案,可以或许:
1. 屏蔽 LLM 文件格式的差异,提供统一的模子描述和转换机制。
2. 封装异构硬件差异,实现可移植、高性能的加速方案。  
3. 简化分布式环境设置,做到开箱即用、按需扩缩。
llamafile 正是基于这些考量应运而生。通过在两个成熟项目标底子上提供薄薄一层"胶水",它奥妙地化解了上述抵牾,让摆设 LLM 变得无比简单。
llama.cpp:为 LLM 注入 C 的性能
在介绍 llamafile 的核心计划之前,我们有必要先了解其重要组成部分:llama.cpp。
众所周知,Python 以简洁优雅著称,是呆板学习研究人员的首选语言。但在工程实践中,Python 的运行效率一直饱受诟病。这在 LLM 推理场景下尤为突出,由于模子体积巨大,稍有不慎就会引入性能瓶颈。为了避免这一问题,llama.cpp 的作者选择用 C/C++ 从头实现 LLM 推理。
具体而言,llama.cpp 提供了一个通用的推理引擎,可以加载 LLaMA、GPT-J、GPT-NeoX 等主流模子,并实行高效的文本生成。它接纳自界说的权重格式,将模子划分为若干个分片,每个分片包含其全部参数。这种构造方式可以充分利用局部性原理,在加载和访问权重时尽可能淘汰缓存缺失和页面调理。
在算法实现上,llama.cpp 对矩阵乘等关键路径举行了极致优化,充分利用了 SIMD、Loop Unrolling 等现代 CPU 特性,再加上精心调教的多线程并行,使其在工业级服务器上的推理性能可比肩商用办理方案。
为了方便地与现有应用集成,llama.cpp 还提供了一个兼容 OpenAI API 的 HTTP 服务器。用户只需将哀求发送至指定端口,即可得到雷同于 GPT-3 的对话体验。这极大降低了二次开发的门槛。
然而,llama.cpp 仍存在一些不足之处:
1. 尽管提供了 Python binding,但在实际使用中仍不可避免地需要一些 C++ 知识,对非专业开发者不太友爱。
2. 固然权重格式经过优化,但转换过程需要花费较长时间,且占用大量磁盘空间。
3. 固然已经适配了 CUDA 后端,但设置过程较为繁琐,且未考虑 AMD 平台。
llamafile 通过引入 Cosmopolitan Libc,奥妙地办理了这些问题。
Cosmopolitan Libc:赋予 C 跨平台的魂魄
谈到跨平台,很多人首先想到 Java 的"一次编写,随处运行"。然而,对于偏好 C/C++ 的系统级开发者而言,这一理念似乎遥不可及。一个主要原因是,不同操作系统在底层 API 的语义和调用规范上存在显著差异。为了适配多种环境,开发者不得不编写大量胶水代码,人工处理各种边界环境,既繁琐又轻易堕落。这严峻拦阻了 C/C++ 程序的可移植性。
Cosmopolitan Libc 试图从根本上办理这一困境。它的核生理念是:通过提供一层统一的系统调用抽象,让开发者只需面向 Cosmopolitan API 编程,生成的目标码就可以不经修改地在 Linux、Windows、macOS 等各种环境直接运行。
实现这一点的关键是 Cosmopolitan 的链接器。传统的链接器如 ld 只负责剖析符号、分配地点,对目标平台并不作过多假设。而 Cosmopolitan 的链接器则内置了一个微型操作系统,可在裸机环境直接启动。在入口函数实行之前,它会初始化 GDT、页表等关键数据结构,并提供线程调理、虚拟内存、动态链接等现代操作系统的核心功能。这使得 Cosmopolitan 程序可以不依赖宿主机内核,直接控制硬件资源。
在 API 层面,Cosmopolitan 参考了 POSIX 规范,提供了文件、网络、多线程等常用系统服务。为了适配不同 ISA,它还实现了通用的原子操作、锁机制等并发原语。对于跨平台必须的组件如 libc、libm,Cosmopolitan 也提供了自己的实现。这些努力最终使得开发者只需遵照 Cosmopolitan 的编程规范,就能编写可移植的系统级应用。
但光有可移植性还不够,Cosmopolitan 还需为高性能计算提供支持,这主要表如今两个方面:
1. 动态链接。LLM 推理通常需要调用 CUDA、BLAS 品级三方库。为此,Cosmopolitan 实现了自己的动态链接器,可以加载宿主机的共享对象,并自动完成重定位。
2. GPU 加速。考虑到异构计算的广泛应用,Cosmopolitan 通过封装 CUDA driver API,使得 GPU 内核可以直接内联到 Cosmopolitan 程序中,避免了 JIT 编译带来的额外开销。
这两个特性是 Cosmopolitan 区别于传统 Libc 的关键所在,也是 llamafile 实现其计划目标的重要基石。
融合创新:llamafile 的架构计划
有了前面的铺垫,我们就可以具体解读 llamafile 的核心计划思路了。
简单来说,llamafile 直接利用 llama.cpp 作为 LLM 推理后端,通过 Cosmopolitan Libc 将其打包为可实行文件。这里的关键是,llamafile 将模子权重硬编码到可实行文件中,使得最终产物可脱离源码独立运行,且不受环境约束。
具体实现上,llamafile 主要经过如下步调:
1. 模子转换。首先使用 llama.cpp 提供的工具,将各种常见格式的权重文件转换为 llama.cpp 定制格式。这个过程是一次性的,转换结果可供重复使用。
2. 构建 blob。利用 Cosmopolitan 的链接器 objcopy,将转换后的权重文件以 blob 的情势内嵌到目标文件中。
3. 链接可实行文件。将 llama.cpp 的核心代码、Cosmopolitan Libc、权重 blob 等目标文件一起链接,生成最终的可实行文件。在这个过程中,链接器会举行符号剖析和重定位,并生成元数据供启动期使用。
4. 运行时加载。当可实行文件启动时,首先由 Cosmopolitan 运行时完成初始化,并剖析命令行参数。随后,llamafile 利用 mmap 将嵌入的权重 blob 映射到内存,模拟 llama.cpp 的模子加载过程,继而可以开始推理。
整个过程无需依赖 Python 表明器,权重加载也省去了从文件系统读取的 I/O 开销,再加上 Cosmopolitan 对资源的细粒度控制,使得 llamafile 的端到端性能接近原生应用。
为了进一步提高性能,llamafile 还在 Cosmopolitan 的底子上实现了以下增强:
- 利用 GPU 加速矩阵运算,针对 NVIDIA 平台封装了 cuBLAS API,AMD 平台则使用 ROCm。
- 针对 NUMA 架构举行 NUMA-aware 内存分配和线程调理优化。
- 引入 Cosmopolitan 对 JIT 编译的支持,可在运行时生成高度优化的计算内核。
- 在模子并行方面,llamafile 支持多 GPU 横向扩展,并利用 NCCL 实现高效通信。
同时,llamafile 还致力于提供开箱即用的用户体验:
- 提供 llamafile-convert 工具简化模子转换,并与 Hugging Face 等社区生态深度集成。 
- 持续美满 API server,提供易用的 RESTful 接口,同时兼容各种应用框架。
- 针对 CPU 后端实施 Lazy Tensor 优化,淘汰不必要的显存占用。
这些计划使得 llamafile 不但在性能上拔得头筹,也让 LLM 开发和使用前所未有地便捷。
推动大语言模子民主化进程
自面世以来,llamafile 敏捷俘获了开源社区的芳心。凭借卓越的性能和体验,它已跃升为 Mozilla 最受接待的项目之一。在众多贡献者的推动下,llamafile 正以惊人的速率迭
代码开源,技能创新,社区协作,这是 llamafile 项目标三大法宝,也是它不停突破自我、续写传奇的力量源泉。
自 v0.1 发布以来,llamafile 几乎以每月一版的速率迭代。在 v0.8 中,它不但支持了 Meta 最新发布的 LLaMA 3 等 SOTA 模子,还带来了一系列性能优化:通过手写汇编实现的 BLAS 内核将 CPU 运算效率提高了一个数量级;针对 NVIDIA 和 AMD GPU 的异构调理计谋也更加美满;为树莓派等 ARM 平台提供了专门的低比特量化方案,即便在这些小型装备上也能实实际时对话。如此迅猛的进化速率,展现了开源力量的惊人魅力。
与此同时,llamafile 还在架构层面做出了前瞻性的尝试。好比在 v0.7 中,它引入了混合实行引擎,可以根据模子规模和硬件条件动态调整实行计谋。对于超大规模模子,它会自动接纳流水线并行、张量融合等图优化技能,最小化数据移动;对于中小规模模子,则会利用 Lazy Tensor 避免无谓的显存分配,提高缓存利用率。这为 LLM 推理提供了一套全局优化的范式。
llamafile 也在积极拥抱社区生态。通过提供兼容 OpenAI 的 API,它可以直接取代商业方案,为各种创新应用提供底子支持。在 LangChain、AutoGPT 等热门项目中,我们已经可以看到 llamafile 的身影。Mozilla 还专门成立了 MIECO(Mozilla Internet Ecosystem)项目,为 llamafile 等开源技能搭建产学研用协同创新的平台,推动 AI 生态良性发展。
展望未来,随着算法优化的不停突破,以及晶圆代工工艺的持续进步,LLM 推理已展现出阿米巴原生的趋势特性。从云到边、从数据中心到终端,llamafile 如许的"苹果核"有望成为 AI 民主化的助推器,让智能应用遍地开花。
作为这一厘革的先行者,Mozilla 正在 llamafile 的底子上谋划更弘大的蓝图。相信在可见的未来,它必将开释出比肩操作系统和浏览器的颠覆性力量,成为 AI 新纪元的基石。让我们拭目以待,见证 llamafile "出圈"的那一天。
小结
llamafile 是 Mozilla 为推动 LLM 普通化做出的重要努力。它奥妙联合了 llama.cpp 和 Cosmopolitan Libc 两大开源项目,通过将模子权重内嵌到可实行文件,彻底办理了 LLM 分发和摆设的困难。
性能方面,得益于 Cosmopolitan 细粒度的系统调用抽象和 llamafile 在 GPU 加速、BLAS 优化等方面的卓越工作,其端到端响应速率可比肩商业方案,且可轻松横向扩展。
体验方面,llamafile 提供了丰富的工具链支持,简化了模子转换和自界说流程。其 API server 更是开箱即用,无需过多设置即可实现机动调用。
llamafile 的成功离不开开源社区的积极到场。Mozilla 不但以 MIECO 的情势搭建产学研用协同创新的平台,更以 llamafile 为起点规划 AI 普惠的宏伟蓝图。
站在 IT 发展的新起点,Mozilla 正以 llamafile 为引擎,驱动 AI 技能向更广阔的应用场景渗透。我们有来由相信,这场由开源力量领跑的 AI 革命,必将像当年的个人电脑和互联网一样,以摧枯拉朽之势重塑数字世界的格局。让我们携手共进,做 AI 新期间的见证者和开创者!
参考文献
Vaswani A, Shazeer N, Parmar N, et al. Attention is all you need. Advances in neural information processing systems, 2017, 30.
Brown T, Mann B, Ryder N, et al. Language models are few-shot learners. Advances in neural information processing systems, 2020, 33: 1877-1901.
Sanh V, Debut L, Chaumond J, et al. DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter. arXiv preprint arXiv:1910.01108, 2019.
Gholami A, Kwon K, Wu B, et al. Squeezebert: What can computer vision teach nlp about efficient neural networks?. arXiv preprint arXiv:2006.11316, 2020.
Beltagy I, Peters M E, Cohan A. Longformer: The long-document transformer. arXiv preprint arXiv:2004.05150, 2020.
Touvron H, Lavril T, Izacard G, et al. Llama: Open and efficient foundation language models. arXiv preprint arXiv:2302.13971, 2023.
Wang B, Komatsuzaki A. GPT-J-6B: A 6 Billion Parameter Autoregressive Language Model. https://github.com/kingoflolz/mesh-transformer-jax, May 2021.
Dettmers T. LLaMA.cpp: Port of Facebook's LLaMA model in C/C++. https://github.com/ggerganov/llama.cpp, Mar 2023.
Granlund T, Kenner R. Eliminating branches using a superoptimizer and the GNU C compiler//Proceedings of the ACM SIGPLAN 1992 conference on Programming language design and implementation. 1992: 341-352.
Pitts A. Cosmopolitan Libc. https://justine.lol/cosmopolitan/index.html, Jan 2023.

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Mozilla 开源 llamafile:大语言模子分发与摆设新范式