在MacM1上运行ChatGLM-6B推理

1. 简介

ChatGLM 6B是清华大学和智谱合作的一个62亿参数的大语言模型。基于清华的GLM模型开发。和Meta的LLaMA模型还不是一种模型。

由于LLaMA缺乏中文语料,中文能力不佳。在中文大模型中,ChatGLM 6B参数较小,运行硬件要求较低。而表现可谓出色。所以这里作为一个基础模型先让他运行起来看看有多大的能力。

2. 准备环境

在这里我们一般使用miniconda来做python的包管理。

新建一个Python3.10环境,环境名叫chatglm-6b

conda create -n chatglm-6b python=3.10

激活这个环境,从此之后都在这个环境chatglm-6b中操作

conda activate chatglm-6b

 

3. 下载代码

执行下列命令

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

这里没有什么花哨的地方,下载下来就可以了。

 

4. 安装Python依赖

python环境切到chatglm-6b, 在上面克隆下来的ChatGLM-6B代码目录中执行下列命令

pip install -r requirements.txt

根据ChatGLM-6B的官方文档,需要安装Pytorch Nightly(似乎不安装nightly也可以)。所以我们在装完上面的依赖包之后,删除torch,重新安装pytorch nightly。

安装方法:链接

执行命令

pip uninstall torch
pip install --pre torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/nightly/cpu

 

然后,我们看下下载下来的pytorch是不是支持m1的gpu加速

执行python进入python命令行

输入命令

import torch; torch.backends.mps.is_available()

输出True即为可以用M1的GPU加速。但是这里int4量化后的版本不支持MPS GPU加速。而非量化的版本虽然支持MPS GPU加速,但是如果没有32G内存的话,内存不足导致执行速度非常的慢。所以在用int4量化后的模型后,有没有MPS GPU加速都会使用CPU推理。

Python 3.10.11 (main, Apr 20 2023, 13:58:42) [Clang 14.0.6 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch; torch.backends.mps.is_available()
True
>>> 

 

安装icetk

奇怪的是运行web_demo.py需要icetk包,但是没有写在requirements.txt里

补上

pip install icetk

这样就把包依赖安装好了。

 

5. 使用模型推理

5.1. 使用int4量化模型

Mac M1上如果没有32G及32G以上内存,一般还是int4量化模型会快一点。

5.1.1. 下载模型到本地

先运行huggingface.co下的ChatGLM 6B 4int量化后的模型。这个模型推理需要6G内存,finetune需要7G内存。对于小内存用户来说是最小硬件需求的模型。

huggingface.co克隆git repo需要git-lfs

所以先运行

git lfs install

如果没有装过git-lfs,可以看这个链接安装git-lfs

克隆int4量化model

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

Mac上没有CUDA可以用,而量化模型是基于CUDA开发的。所以M1/M2的MPS GPU加速也不可用,这里只能用CPU推理。CPU推理需要安装g++和openmp

由于本机安装的g++版本是14.x,所以可以按照链接的指示安装openmp

然后把THUDM/chatglm-6b-int4拷贝到代码的ChatGLM-6B下。所以在本地克隆下来的代码目录下,模型放在

代码目录/THUDM/chatglm-6b-int4下

5.1.2. 修改代码

打开web_demo.py,修改代码。

把下面代码

tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()

改为

tokenizer = AutoTokenizer.from_pretrained("./THUDM/chatglm-6b-int4/", trust_remote_code=True)
model = AutoModel.from_pretrained("./THUDM/chatglm-6b-int4/", trust_remote_code=True).float()

5.1.3. 执行推理

执行命令

python web_demo.py

输出

Arguments: (RuntimeError('Unknown platform: darwin'),)
No compiled kernel found.
Compiling kernels : ...
Compiling clang -O3 -fPIC -pthread -Xclang -fopenmp -lomp -std=c99 /Users/heye/.cache/huggingface/modules/transformers_modules/quantization_kernels_parallel.c -shared -o ...
Load kernel : ...
Setting CPU quantization kernel threads to 4
Using quantization cache
Applying quantization to glm layers
Running on local URL:  http://127.0.0.1:7860

自动弹出浏览器:http://127.0.0.1:7860/

就可以用了。

可以试试输入几个问题

1. 方程和函数有什么区别


 

 

2.

6. 性能

由于用CPU推理,一个词一个词往外蹦,每个词耗时大约是3-4秒。

如果在Windows下用GPU推理的话速度大约会提升十倍。

量化和非量化版本在表现上差异很少。这点比LLaMA要好很多。LLaMA的7Bint4量化版本表现比较差。

7. 评价

这个模型部署的坑非常少,清大的工程能力可谓出色。整体完成度很高。

 

热门相关:冉冉心动   小姨子的初恋   梦回大明春   最强反套路系统