前言

前不久换了新 Mac ,性能还可以,于是就想试着体验一下 ChatGLM ,看看能不能跑起来。

所以今天就来体验一下 ChatGLM2-6B

安装

我这里使用 Anaconda 创建一个 Python 3.9 的环境进行 ChatGLM2-6B 的环境搭建。

1
2
3
4
5
conda create -n chatglm2 python=3.9
conda activate chatglm2
git clone https://github.com/THUDM/ChatGLM2-6B.git
cd ChatGLM2-6B
pip3 install -r requirements.txt

快速在命令行中体验

安装好之后,打开终端,输入 python 然后把下面的代码敲一遍

1
2
3
4
5
6
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).to('mps')
model = model.eval()
response, history = model.chat(tokenizer, "你好", history=[])
print(response)

这个过程中会从THUDM/chatglm2-6b at main 下载模型,时间会比较久,下载完成之后能看到输出如下响应,说明搭建成功了。如果失败了,可以重新运行,主要还是要解决网络的问题。

1
你好👋!我是人工智能助手 ChatGLM2-6B,很高兴见到你,欢迎问我任何问题。

web 版本

在命令行中体验一下还可以,真的使用起来其实是非常麻烦的,还要手输代码。

所以在 ChatGLM2-6B 中还提供了网页版的,使用起来就非常方便了。

ChatGLM2-6B 中有 web_demo.pyweb_demo2.py 这两个文件,我们都去体验一下,不过在体验之前我们需要改动一下代码,因为我们是在 Apple Silicon 上运行的,而代码默认写的是英伟达的 cuda

找到 web_demo.py 中的

1
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).cuda()

将其改为

1
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).to('mps')

改好之后执行以下命令就能够跑起来了,运行会花点时间。

1
python web_demo.py

启动之后会自动帮你打开浏览器并跳转到 http://127.0.0.1:7860/ 这个界面就非常友好和简单,它是基于 Gradio 的。下面的输入框就是我们输入问题的地方,上面的就是 ChatGLM2-6B 和我们问答。

web 版本 2

除了基于 Gradio 的版本,还有一个基于 Streamlit 的版本,官方说这个版本更流畅。

在使用 Streamlit 之前需要先安装一下

1
pip install streamlit

安装好之后,还是需要改一下代码,把 cuda 改成 mps

找到 web_demo2.py 同样的

1
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).cuda()

将其改为

1
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).to('mps')

改好之后就可以使用 streamlit run web_demo2.py 来运行程序了。

同样运行起来之后会自动帮你打开浏览器并跳转到 http://localhost:8501/

streamlit 打开的过程中会有界面,不像 Gradio 只有在准备好之后才会打开,所以在没有准备好之前 Gradio 是看不到界面的,会卡一会。

不过 streamlit 有个 bug,在点击发送之后,输入框的内容还在,并没有清空输入框。

StreamlitGradio 两个版本都有一个同样的问题,是输入回车只会换行,不会发送问题给 ChatGLM

api 部署

作为一个程序员最喜欢的就是有 API 可以用,幸运的是 ChatGLM2-6B 提供了 API 部署的方式。

在部署之前需要先安装 fastapi uvicorn ,可以用如下指令进行安装

1
pip install fastapi uvicorn

老规矩,还是要把 cuda 改成 mps

1
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).cuda()

将其改为

1
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).to('mps')

改好之后就可以运行了

1
python api.py

接着我们就可以使用 POST 进行调用了

1
2
3
curl -X POST "http://127.0.0.1:8000" \
     -H 'Content-Type: application/json' \
     -d '{"prompt": "你好", "history": []}'

得到结果如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
{
  "response": "你好👋!我是人工智能助手 ChatGLM2-6B,很高兴见到你,欢迎问我任何问题。",
  "history": [
    [
      "你好",
      "你好👋!我是人工智能助手 ChatGLM2-6B,很高兴见到你,欢迎问我任何问题。"
    ]
  ],
  "status": 200,
  "time": "2023-08-14 23:13:13"
}

有了 API 就能根据自己想象力,自己拓展开发一些应用出来。

总结

  1. 搭建 ChatGLM2-6B 还是挺简单的,本地回答的速度挺快,几乎能做到秒回。
  2. ChatGLM2-6B 提供了 web 的方式来回答问题,挺好用,但是有一些小问题需要改进。
  3. ChatGLM2-6B 提供 API 的方式,让我们自己开发基于 ChatGLM2-6B 也变得非常方便。

参考