同事在玩 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 上运行量化后的模型,还需要安装 gcc
与 openmp
。多数 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 模型都一样。一用中文就垃圾得不行。