同事在玩 gpt4all,不过对中文不怎么支持。回来搜了下,发现国内清华出的 ChatGLM-6B 对中文支持不错。本地部署下,用纯 cpu 玩玩。

操作环境:windows 11 python 3.10

没有多余精力研究,就当感受感受高科技吧


可用量化模型

ChatGLM-6B-INT4

ChatGLM-6B-INT4 是 ChatGLM-6B 量化后的模型权重。具体的,ChatGLM-6B-INT4 对 ChatGLM-6B 中的 28 个 GLM Block 进行了 INT4 量化,没有对 Embedding 和 LM Head 进行量化。量化后的模型理论上 6G 显存(使用 CPU 即内存) 即可推理,具有在 嵌入式设备(如树莓派)上运行的可能。

此外,如果需要在 cpu 上运行量化后的模型,还需要安装 gccopenmp。多数 Linux 发行版默认已安装。对于 Windows ,可在安装 TDM-GCC 时勾选 openmp(components/gcc/opemp)。 Windows 测试环境 gcc 版本为 TDM-GCC 10.3.0, Linux 为 gcc 11.3.0

chatglm-6b-int8

chatglm-6b-int8 是基于 64 位浮点数的指令集,而 chatglm-6b-int4 是基于 32 位浮点数的指令集。

试了下,chatglm-6b-int8 还是很慢,而且需要更大的内存。。

chatglm-6b-int4-slim

ChatGLM-6B-INT4-Slim 是在 ChatGLM-6B-INT4 的基础上通过裁剪词表构建的。因为 ChatGLM-6B 使用了 icetk,在其词表中,前 20000 个 token 是预留给图片的,在文本模型中没有用到这些图片 token,但是在 infer 和微调的时候,这些 token 对应的 embedding 依然需要被加载,并且在解码每一个 token 的时候需要多计算 20K 个 logits,会占用不少显存。因此将这一部分 token 裁剪掉以节省显存。

除了词表外,ChatGLM-6B-INT4-Slim 的其他结构与 ChatGLM-6B-INT4 完全一致,性能也完全一样,可以认为是 ChatGLM-6B-INT4 的一个低显存版等价平替。

chatglm-6b-int4-slim 经测试似乎完全不能用,删掉。

各模型内存使用
量化等级 最低 GPU 显存(推理) 最低 GPU 显存(高效参数微调)
FP16(无量化) 13 GB 14 GB
INT8 8 GB 9 GB
INT4 6 GB 7 GB

随着对话轮数的增多,对应消耗显存也随之增长

下载代码

git clone https://github.com/THUDM/ChatGLM-6B
cd ChatGLM-6B

下载模型

cd ChatGLM-6B

$Env:GIT_LFS_SKIP_SMUDGE=1

git lfs install
git clone https://huggingface.co/THUDM/chatglm-6b
git lfs pull

git lfs install
git clone https://huggingface.co/THUDM/chatglm-6b-int4
git lfs pull

git lfs install
git clone https://huggingface.co/THUDM/chatglm-6b-int8
git lfs pull

配置环境

如果没有 6G 显存,需要使用 CPU 运行,模型会根据硬件自动编译 CPU Kernel ,请确保已安装 GCC 和 OpenMP (Linux 一般已安装,Windows 则需手动安装),以获得最佳并行计算能力。

如果有 6G 显存,则需要安装与显卡版本对应的 cuda,之后再安装与 cuda 版本对应的 pytorch。

安装相关依赖,在 ChatGLM-6B 目录下打开命令行终端,输入

pip install -r requirements.txt 

按回车后,pip 就自动下载和安装相关依赖库了。

启动 demo 程序

在 ChatGLM-6B 目录下有两个 demo 代码:

  • cli_demo.py,直接在命令行中输入进行问答;
  • web_demo.py,利用 gradio 库生成问答网页。
启动 cli_demo.py

修改模型路径。编辑 cli_demo.py 代码,修改 5、6 行的模型文件夹路径,将原始的 “THUDM/ChatGLM-6B” 替换为 “chatglm-6b-int4” 即可。

修改量化版本。如果你的显存大于 14G,则无需量化可以跳过此步骤。如果你的显存只有 6G 或 10G,则需要在第 6 行代码上添加 quantize(4) 或 quantize(8) ,如下:

6G 显存可以 4 bit 量化

model = AutoModel.from_pretrained("chatglm-6b-int4", trust_remote_code=True).half().quantize(4).cuda() 

10G 显存可以 8 bit 量化

model = AutoModel.from_pretrained("chatglm-6b-int4", trust_remote_code=True).half().quantize(8).cuda()

这里用的 cpu,.half().quantize(8).cuda() 改为.float()

执行 python 文件即可,可以在命令行终端输入:

python cli_demo.py 

即可启动 demo

出错,说需要 icetk:

pip install icetk

回答后,如果不输入内容,直接回车,它只再补充内容。

界面如下:

启动 web_demo.py

安装 gradio 库,在 ChatGLM 目录下打开命令行终端,输入:

pip install gradio 

即可安装 demo 所需要的库。

同上,修改 web_demo.py 中的模型路径和纯 cpu 方法。

可以在命令行终端输入:

python web_demo.py 

即可启动 demo。

程序会运行一个 Web Server,并输出地址。在浏览器中打开输出的地址即可使用。

界面如下:

llama 的中文智障强多了,就算加了 vicuna 的 llama 7B 模型都一样。一用中文就垃圾得不行。