私有化实现及部署“chatgpt”对话机器人(三)--chatglm模型详解及部署

1,863 阅读3分钟

本系列将讲述如何从零开始私有化实现及部署类ChatGPT的对话机器人,主要分环境安装,模型现状与选型,基础chatglm模型详解及部署,chatglm不同环境常见bug,前后端对话简单实现,流式对话实现,chatpdf实现,海量本地知识库搜索能力实现,visualglm图片描述模型详解,集成,文本生成图片模型集成,语音识别详解,语音合成详解,语音对话功能集成等等内容。

阅读本系列需要有一定的人工智能算法能力,对nlp算法,语音算法有一定了解,还涉及多方面工程能力知识,如阅读中有任何问题,可以留言,本人会一一解答。

本章节主要讲述chatglm相较于transformer的一些改进点,以及在gpu机器上的本地化部署和运行效果。

一.chatglm命令行对话效果展示

img.png

二.chatglm详解

chatglm的核心原理源自此篇文章《GLM:General Language Model Pretraining with Autoregressive Blank Infilling》。
纵观文章,glm对transformer结构改动并不大,只是更改了layer norm和残差的顺序,gelu替换relu激活,针对token使用单一线性层,而在训练目标上glm提出了自回归的空格填充任务。 img_1.png 而在开源出的chatglm-6b相较于glm的改进,修正了二维 RoPE 位置编码实现,使用传统 FFN 结构,并使用了监督微调,RLHF使模型结果更趋近于人类回答,至于序列长度也提升了一倍。
chatglm开源了原始的6b版本,以及int8和int4的版本,都可以通过huggingface直接下载使用。

三.开始部署chatglm

第一步,从github下载chatglm项目到服务器本地。

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

第二步,如果已有pytorch版本,进入requirements里将torch部分删除,执行pip install。
pip install -r requirements.txt
注:transformers包版本可以改为4.23.1

第三步,装好后执行chatglm里的cli_demo.py。

cd chatglm-6b  
python cli_demo.py  

注:如果是非gpu服务器,需要对cli_demo.py进行如下修改。

model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()  
改为  
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).float()  

由于本步骤需要从huggingface拉取模型文件,可以自行上huggingface下载,并将trust_remote_code=True改为False即可

第四步,如果比较顺利,即可在命令行里进行chatglm大模型的对话(如一、),当然一般来说装环境会存在各种bug问题,所以可以参考下一章内容对各种中间出现bug进行解决。

四.chatglm量化版本

量化版本调用也很简单,值得注意的是int4版本基本只需要6g显存就可完成推理。
但是量化虽然减少了显存占用,随之而来的也是推理速度变得缓慢,所以有利有弊。
使用量化版本只需要修改模型名称即可,如下:

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

五.chatglm核心调用代码

实际上chatglm核心调用代码很少,因为大部分都被transformers库封装了,如二、所说chatglm对transformer的修改,实际上在下载模型的时候一并也有transformer的修改与配置代码,所以真正使用很黑盒,只需要五行代码。

from transformers import AutoTokenizer, AutoModel  
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)  
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()  
model = model.eval()  
response, history = model.chat(tokenizer, "你好", history=[])  
print(response)  

值得注意的是history的上下文使用,如果我们的下一次聊天需要关注上次的对话,则在下次调用时将history填入。

response, history = model.chat(tokenizer, "你好,你是谁创造的?", history=history)  
print(response)  

通过以上代码,我们可以很容易的嵌入各类工程里进行调用或者前后端交互。