大模型应用的平民化:LLaMA.cpp

Description
Published
April 11, 2023
Tags
AI
OpenSource

大模型应用的平民化:LLaMA.cpp

notion image
上篇聊到,LoRA 可以缓解大模型精调的难题,从而每位研究者都可以站在巨人的肩膀上,训练自己的个性化模型。但当完成精调后,这些模型如何传播,是否能在消费级硬件上用起来,仍存在很大挑战:
  1. LLMs 动辄数十上百亿的参数,对运行机器的内存提出了很高的要求,毕竟只有将模型权重塞进 RAM,推理方可进行;
  1. 模型加载至内存后,推理顺畅与否,又与 CPU、GPU 等计算单元密切相关,要知道很多大语言模型是在顶级专用 GPU 集群上加速训练的,换到个人电脑上,五秒蹦出一个词,也很难说用了起来。
好在上游已有羊驼和 LoRA 打下基础,开源社区的大神们正想方设法,让 AI 真正走进千家万户。

LLaMA.cpp

就像这个名字,LLaMA.cpp 项目是开发者 Georgi Gerganov 基于 Meta 释出的 LLaMA 模型(简易 Python 代码示例)手撸的纯 C/C++ 版本,用于模型推理。所谓推理,即是给输入-跑模型-得输出的模型运行过程。
那么,纯 C/C++ 版本有何优势呢?
  • 无需任何额外依赖,相比 Python 代码对 PyTorch 等库的要求,C/C++ 直接编译出可执行文件,跳过不同硬件的繁杂准备;
  • 支持 Apple Silicon 芯片的 ARM NEON 加速,x86 平台则以 AVX2 替代;
  • 具有 F16 和 F32 的混合精度;
  • 支持 4-bit 量化;
  • 无需 GPU,可只用 CPU 运行;
按照作者给出的数据,其在 M1 MacBook Pro 上运行 LLaMA-7B 模型时,推理过程每个词(token)耗时约 60 毫秒,换算每秒十多词,速度还是相当理想的。
由于纯 C/C++ 实现,无其他依赖,运行效率很高,除 MacBook Pro 外,甚至可以在 Android 上运行:
 
那么模型是如何装进内存的呢?LLaMA.cpp 的答案是量化

关于量化

深度神经网络模型在结构设计好之后,训练过程的核心目的是确定每个神经元的权重参数,通常是记为浮点数,精度有 16、32、64 位不一,基于 GPU 加速训练所得,量化就是通过将这些权重的精度降低,以降低硬件要求的过程。
举例而言,LLaMA 模型为 16 位浮点精度,其 7B 版本有 70 亿参数,该模型完整大小为 13 GB,则用户至少须有如此多的内存和磁盘,模型才能可用,更不用提 13B 版本 24 GB 的大小,令人望而却步。但通过量化,比如将精度降至 4 位,则 7B 和 13B 版本分别压至约 4 GB 和 8 GB,消费级硬件即可满足要求,大家便能在个人电脑上体验大模型了。
LLaMA.cpp 的量化实现基于作者的另外一个库—— ggml,使用 C/C++ 实现的机器学习模型中的 tensor。所谓 tensor,其实是神经网络模型中的核心数据结构,常见于 TensorFlow、PyTorch 等框架。改用 C/C++ 实现后,支持更广,效率更高,也为 LLaMA.cpp 的出现奠定了基础。

一些番外

作者 Georgi Gerganov 是一位硬核程序员,信仰 Vim,C/C++ 的狂热拥趸。
notion image
他提到 LLaMA.cpp 这个项目仅仅是一个晚上的 hacking,由于核心在于 ggml 这个 tensor 库,在社区广为应用的情况下,大家也用 ggml 格式来称呼此类经过转换的模型,于是大哥 GG 便冠名定义了一种格式。
根据作者在 GitHub 上的定位,似乎是位于索菲亚,保加利亚的首都。突感有趣,开源社区的大神可能来自五湖四海,互相提供自己的肩膀,引领一群人参与进去,最终使得技术成果走入千家万户,实现普惠,感恩。