Alpaca-cpp(羊驼-cpp): 可以本地运行的 Alpaca 大语言模型
系列文章
- Stanford Alpaca (羊驼):ChatGPT 学术版开源实现
- Alpaca-Lora (羊驼-Lora): 轻量级 ChatGPT 的开源实现(对标 Standford Alpaca)
前言(可能与正文无关,可以忽略)
I know。这几天介绍了很多 Alpaca,各种羊驼,似乎有些随心所欲、杂乱无章。但实际上,正如《寒战》中梁家辉饰演的李文斌被廉政公署问话时所说:“要在(每一个机构或岗位的)游戏规则里面把线头找出来 ”,找到线头,看似杂乱的内容才会有较好的可解释性。我这几篇文章的逻辑链如下:
从 Stanford-Alpaca 到 Alpaca-Lora,再到本篇要介绍的 Alpaca-cpp,都是为了寻找一种在资源约束下,能本地高效便捷运行大语言模型的方法。当我成功运行 Alpaca-cpp 时,体验很棒,丝滑流畅,而且由于突破了我 8G GPU 显存的限制,能直接使用 CPU 运行,那后续我还可以尝试 30B 甚至更大参数的大语言模型!
先看看效果:
我刚学大语言模型不久,对如何测试它的能力也不是特别清楚,简单问了它几个问题,如 “会不会中文?”、“长对话能力如何?”、“写写代码?” 之类的,初步看还不错,能理解我的意图。后续我可能会用那些我问过 ChatGPT 的复杂问题去测试它。BTW,ChatGPT 太牛了,我已经让它帮我干了点实事,让我的世界变好了 10 ~ 20min。
另外分享一篇比尔盖茨前两天发的文章 《The Age of AI has begun | Bill Gates》,文章稍长,还是提供了一点 insights。AI 正在重塑我们的工作和生活,我应该积极拥抱变化😂😂😂(懂得都懂)。
总览
本文简要介绍 Alpaca-cpp,可以使用本地电脑 CPU 流畅运行大语言模型 Alpaca/LLaMA 的 C++/C 框架。相关资源如下:
- alpaca.cpp: https://github.com/antimatter15/alpaca.cpp
- ggml-alpaca-7b-q4.bin 量化后的Alpaca模型: https://huggingface.co/Sosaka/Alpaca-native-4bit-ggml/blob/main/ggml-alpaca-7b-q4.bin
- llama.cpp (alpaca.cpp 是 fork 本项目,代码基本一致): https://github.com/ggerganov/llama.cpp
太感谢这些开源大佬们,尝试让 AI 进入寻常百姓家,功德无量。
Alpaca-cpp 安装及本地运行
安装和运行方式都极其简单,本文介绍在 Linux 上的安装方法。
首先使用如下命令下载 alpaca.cpp 项目,
git clone https://github.com/antimatter15/alpaca.cpp
进入 alpaca.cpp
后,到 https://huggingface.co/Sosaka/Alpaca-native-4bit-ggml/blob/main/ggml-alpaca-7b-q4.bin 下载量化后的模型 ggml-alpaca-7b-q4.bin,然后使用
make chat
对项目进行编译。最后使用
./chat
直接运行程序即可,就能看到我在 “总览” 这一节中展示的聊天窗口。那种丝滑般的体验,言语无法精确描述,只能实际体验才好体会。
小结
本文非常非常 easy,有水文之嫌。但是及时传递消息也是有一定价值的(至少我是这么安慰自己)。Alpaca-cpp 是基于 llama-cpp 这个项目,代码基本完全相同,差别在 Alpaca-cpp 对 Alpaca-Lora 的权重进行了量化等预处理,然后用 llama-cpp 提供的功能去加载量化后的权重。
我大致看了一下 llama-cpp 的 C++/C code,只感慨大佬太强,代码写的真好,读起来是一种享受,注释非常清晰,核心逻辑读起来不用太费脑。找到优秀的开源项目并进行深入学习,一方面是吸取经验、提升技术,另一方面也趁机洗洗眼睛(仍旧是懂得都懂😂😂😂),获得一种精神上的愉悦~
后面打算深入学习一下 llama-cpp,作者直接手写了一个基于 C++/C 的深度学习框架,支持前向和反向传播。看 ggml.h
的注释,它的建图方式从我有限的理解来看,非常像 Tensorflow v1.0,需要先构建好静态图,传入数据后才能进行推理。而且研究本项目还能学习如何对模型进行 int8/int4 量化,相关函数在 utils.cpp
中实现。
再补充一点,关于 ggml-alpaca-7b-q4.bin 这个模型怎么来的。需要先用 https://github.com/tloen/alpaca-lora/pull/19/files 中提到的 export_state_dict_checkpoint.py
脚本对 Alpaca-Lora 的模型进行导出,应该是个 .pth
文件,然后使用 https://github.com/antimatter15/alpaca.cpp 提供的 convert-pth-to-ggml.py
工具将 .pth
模型转换成 llama-cpp 能识别的 ggml 模型 (llama-cpp 作者的 github 昵称是 ggerganov,所以我猜 ggml 应该指的是 ggerganov-Machine-Learning 的意思),之后再调用 https://github.com/antimatter15/alpaca.cpp/blob/master/quantize.cpp 对模型进行量化。
OK,先到这,要上班了。。。有点急。