← 返回目录


rwkv.cpp: CPU 也能跑的 RNN 中文语言大模型

学校≠教育≠技能;文凭溢价=80%信号传递+20%人力资本

182 👍 / 59 💬

最近 LLM(大语言模型)实在火爆,出了不少开源模型,比如 Alpaca[1]、ChatGLM[2]、BELLE[3] 等等,让每个人都有机会运行和训练专属自己的 LLM,我也迫不及待了。

但是,熟悉我的老读者朋友应该知道,虽然我是搞算法的,也发过几篇论文,但我是走的是贫穷科研的路线,一张显卡都没有。像 ChatGLM-6B 这种模型,在我的小破 Mac 上根本跑不起来。Alpaca 的 CPU 版本虽然能跑,但它中文水平实在太烂了。有没有什么模型不仅中文好,又可以不依赖显卡?RWKV[4]进入了我的视野。

RWKV 是一种纯 RNN 的架构,能够进行语言建模[5],目前最大参数规模已经做到了 14B[6]。目前的在线体验地址:

Raven RWKV 7B - a Hugging Face Space by BlinkDL

不过请注意,上面这个体验模型的微调语料英文占 99%,所以中文水平并不是最好的。作者 @PENG Bo 最近发布的 RWKV-4-Raven-7B-v9x-Eng49%-Chn50%-Other1% 这个模型的中文微调语料占 50%,中文水平更好。以下我也会基于该模型进行操作。

下载模型

首先,RWKV 的模型分为很多种,都发布在作者的 huggingface[7] 上:

其中:

我下载的是 RWKV-4-Raven-7B-v9x-Eng49%-Chn50%-Other1%-20230418-ctx4096.pth[8] , 即参数量为 7B 的对话模型,微调预料中 49% 是英文,50% 是中文。ctx4096 表示微调是的上下文长度。

这个模型有 14.8 GB,请务必确保自己电脑的可用硬盘空间在 40 GB 以上(因为后面要对这个模型进行转换和量化,需要占用更多的硬盘空间。)

模型转换

下载好的模型配合 ChatRWKV[9]这个仓库里的代码就可以跑了,但是它对 CPU 策略的支持最低只到 fp32i8,7B 模型需要 12 GB 内存才能跑起来,我用 16GB 内存的 Mac 试了一下,跑是跑起来了,但是非常慢。

所以,这里需要介绍一下能够更充分利用 CPU 的方法:

saharNooby/rwkv.cpp: INT4 and FP16 inference on CPU for RWKV language model (github.com)

rwkv.cpp 可以将 RWKV 原始模型的参数转化为 float16,并量化到 int4,可以在 CPU 上更快地运行,也可以节省更多的内存。

以下是操作步骤。

1. 下载仓库代码

需要安装 git(没有 git 的朋友,可能你要补的前置知识有点多,我建议自行搜索)

git clone --recursive https://github.com/saharNooby/rwkv.cpp.git
cd rwkv.cpp

2. 下载依赖库 or 编译依赖库

rwkv.cpp 的开发者已经预编译了不同平台上的依赖库,可以在这里下载:github.com/saharNooby/r

下载的时候请注意操作系统类型和支持的架构。由于作者没有预编译对 Mac m1 的 ARM64 架构的依赖库,所以我选择自行编译(需要安装 cmake,并在 shell 中移动到 rwkv.cpp 路径下):

cmake -DBUILD_SHARED_LIBS=ON .
cmake --build . --config Release

3. 转换模型

需要装 PyTorch

我直接把下载好的模型放在了 rwkv.cpp 的路径下,然后执行以下命令:

python rwkv/convert_pytorch_to_ggml.py ./RWKV-4-Raven-7B-v9x-Eng49%-Chn50%-Other1%-20230418-ctx4096.pth ./rwkv.cpp-7B.bin float16

其实就是让 python 运行 rwkv/convert_pytorch_to_ggml.py 这个转换模型的代码, ./RWKV-4-Raven-7B-v9x-Eng49%-Chn50%-Other1%-20230418-ctx4096.pth 是待转换的模型的路径, ./rwkv.cpp-7B.bin 是转换后的路径,float16 是要转换成什么类型的参数。

4. 量化模型

其实上面转换好的 ./rwkv.cpp-7B.bin 已经可以用了,但是它要占用 16GB 内存。为了减少内存占用,可以将 ./rwkv.cpp-7B.bin 量化为 int4,可以省一半内存,也就是只占 6GB 内存。只需要执行以下命令:

python rwkv/quantize.py ./rwkv.cpp-7B.bin ./rwkv.cpp-7B-Q4_1_O.bin 4

然后你就会得到一个大小只有 6GB 的模型了。

运行模型

同样,一行命令搞定:

python rwkv/chat_with_bot.py ./rwkv.cpp-7B-Q4_1_0.bin

让我们看看效果,首先是内存占用,不到 6GB

然后是问答和执行命令:

  1. 太阳有几只眼睛?
  2. 知乎是什么网站?
  3. 写一篇介绍数据分析的文章。

效果还不错,不过最后莫名其妙又多说了一段话,可能是量化带来的精度损失?非量化版本的效果如下:

希望开发者之后能对量化版本进行测评,让 rwkv 变得更好用。

更新:补一张 GIF


以上就是我在 Mac 上用 6GB 内存运行 7B 的中文语言模型 RWKV 的过程了,希望对读者朋友们有所帮助。

另外也偷偷推一下自己的项目,使用时序模型来预测学习者的记忆状态,提高间隔重复中的复习效率,目前已经 600+ star:

open-spaced-repetition/fsrs4anki: A modern Anki custom scheduling based on free spaced repetition scheduler algorithm (github.com)

相关文章:

叶峻峣:我是如何在本科期间发表顶会论文的?(内含开源代码和数据集)叶峻峣:KDD'22 | 墨墨背单词:基于时序模型与最优控制的记忆算法 [AI+教育]叶峻峣:如何在 Anki 上使用次世代间隔重复算法 FSRS?


参考

1. https://github.com/antimatter15/alpaca.cpp
2. https://github.com/THUDM/ChatGLM-6B
3. https://github.com/LianjiaTech/BELLE
4. 发布几个RWKV的Chat模型(包括英文和中文)7B/14B欢迎大家玩 - PENG Bo的文章 - 知乎 https://zhuanlan.zhihu.com/p/618011122
5. RWKV-v2-RNN 原理:超越 Transformer,实现 O(T) 的语言建模 - PENG Bo的文章 - 知乎 https://zhuanlan.zhihu.com/p/514840332
6. RWKV:用RNN达到Transformer性能,且支持并行模式和长程记忆,既快又省显存,已在14B参数规模检验 - PENG Bo的文章 - 知乎 https://zhuanlan.zhihu.com/p/599150009
7. BlinkDL (BlinkDL) (huggingface.co) https://huggingface.co/BlinkDL
8. RWKV-4-Raven-7B-v9x-Eng49%-Chn50%-Other1%-20230418-ctx4096.pth https://huggingface.co/BlinkDL/rwkv-4-raven/blob/main/RWKV-4-Raven-7B-v9x-Eng49%25-Chn50%25-Other1%25-20230418-ctx4096.pth
9. https://github.com/BlinkDL/ChatRWKV

专栏:学委叶哥的随笔


← 返回目录