最近 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 的论文吧。