在 Ubuntu 2204 上运行 LLaMA.cpp

最近 ChatGPT 着实火了一把,据说 GTP4 也即将发布。现在Large Language Model(LLM )也受到了类似图像生成的 Stable Diffusion 那种高光时刻。

在之前我一直有一个错误的观念,认为谁掌握着计算能力,谁才能得到最好的AI模型。直到 Facebook 2023 年二月 24 号发布了论文“LLaMA: Open and Efficient Foundation Language Models”。粗略阅读之后,我才知道原来在一个限定的预算下,大参数模型并不如小参数模型用更多的数据进行训练。

当前,许多 AI 模型都依赖 CUDA,比如 nanoGPT,这也就意味着必须有 NVIDIA 的 GPU来训练和运行。有这样的硬件限制,对于我这种只是想初步了解一下 LLMs 的一些基本概念的业余爱好者变成了一个比较高的门槛。

所幸的是 Georgi Gerganov 用 C/C++ 基于 LLaMA 实现了一个跑在 CPU 上的移植版本 llama.cpp。llama.cpp 甚至将 Apple silicon 作为一等公民对待,这也意味着苹果 silicon 可以顺利运行这个语言模型。

环境准备

我用来测试的笔记本是非常普通的 AMD Ryzen 7 4700,内存也只有 16G。不过结果看起来还是非常流畅的。

由于需要从源代码编译 llama.cpp,所以 build-essential 是必须得装的。

Python 的版本就使用 Ubuntu2204 默认的 Python 3.10.6 即可。

首先安装编译和运行必须的系统依赖,一般来说 python3 默认应该是装了的,不过这里包括进来并不会有其他影响。

apt install build-essential python3

然后需要从 github 上克隆 llama.cpp 的代码库。

git clone https://github.com/ggerganov/llama.cpp

在 llama.cpp 里,有一个空的 models 目录。需要向 Facebook 申请下载模型。不过既然是开源模型,那么自然就有前人开路。有人在这个 pull request 里提交了 BitTorrent 的种子链接。而我更推荐使用 llama-dl 这个脚本。可以自动下载 7B、13B、30B、65B 四个模型,还会对下载的模型进行自动校验。

这个下载脚本的作者是建议用 curl -o- 下载脚本后,直接管道命令输出到 bash 运行。不过我建议用 wget 下载脚本,并保存到 models 目录。一方面避免了脚本攻击,另一方面,完整的四个模型的总体积非常大。如果只是为了测试的话,只下载 7B 这个模型可以节约大量的下载时间和数百G的磁盘空间。

wget https://raw.githubusercontent.com/shawwn/llama-dl/56f50b96072f42fb2520b1ad5a1d6ef30351f23c/llama.sh

编辑 11 行

MODEL_SIZE="7B,13B,30B,65B"

更改为

MODEL_SIZE="7B"

这样就只会下载 13G 的 7B 模型了。13B模型有25G 大小,30B 模型有 64G 的大小。我的磁盘空间不够下载 65B 模型,不过我猜测至少有 130-140G。

模型准备

模型的转换使用了 python 脚本,因此需要先对 python 的环境进行配置和安装。

pipenv shell --python 3.10
pip install torch numpy sentencepiece

接下来,将 LLaMA 模型转换为”ggml format“,也就是 Georgi Gerganov machine learning format。

python convert-pth-to-ggml.py models/7B/ 1

这个格式转换脚本,会将原始的模型 models/7B/consolidated.00.pth 转换为 models/7B/ggml-model-f16.bin 的一个同样是 13G 的 ggml 模型。第三个参数为0时,使用 float32,转换的结果文件会大一倍。该参数值为 1,则使用 float16 这个默认值。

接下来,就是模型的“量化”,或者说离散化。

这里的第三个参数,同样有两个可选值。2 是 q4_0,3 是 q4_1。由于对人工智能的基本概念不熟悉,我对于这两个类型到底有什么区别完全没有头绪,所以也是随意选择了一个用来测试。如果有知道的朋友,请务必告知一下。

运行模型

在项目跟目录运行 make 可以编译主要使用的工具 main,编译完成后,会显示 main 的帮助信息。

然后只要运行 main 指定 prompt 和量化后的模型文件即可。

例如,

./main -m ./models/7B/ggml-model-q4_0.bin -p 'Zealandia was a continent'

下面是一种可能的结果,

后记

在用惯了 ChatGPT 之后,使用 LLaMA,在选择合适的 prompt 上会有一些不适应。我会在研究之后,再写一些文章来解释。

同时,由于 13B 开始的大模型都是多个文件,需要针对每个转化后的文件都进行量化处理。

对于 Apple silicon 运行模型,建议参考“Running LLaMA 7B and 13B on a 64GB M2 MacBook Pro with llama.cpp”。虽然步骤与本文并无本质差异,不过还是建议读一下。另外,这篇文章展示了如何对大模型进行量化。

至于不同的参数量的模型的运行,到底会有什么差异,也得再多做一些测试才能知道了。

为了玩得更透彻一些,从明天起,我还是开始啃 LLaMA 的论文吧。

Leave a comment

Your email address will not be published. Required fields are marked *