ChatGLM-6B 本地部署下玩玩

同事在玩 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

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

界面如下:

----_20230420120233

启动 web_demo.py

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

pip install gradio 

即可安装 demo 所需要的库。

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

可以在命令行终端输入:

python web_demo.py 

即可启动 demo。

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

界面如下:

----_20230420185956

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


Share Tweet Send
0 Comments
Loading...
You've successfully subscribed to 隔窗听雨
Great! Next, complete checkout for full access to 隔窗听雨
Welcome back! You've successfully signed in
Success! Your account is fully activated, you now have access to all content.
豫ICP备19045256号-1