本系列将叙述怎么从零开端私有化完结及布置类ChatGPT的对话机器人,主要分环境装置,模型现状与选型,基础chatglm模型详解及布置,chatglm不同环境常见bug,前后端对话简略完结,流式对话完结,chatpdf完结,海量本地知识库搜索才能完结,visualglm图片描绘模型详解,集成,文本生成图片模型集成,语音辨认详解,语音合成详解,语音对话功用集成等等内容。
阅览本系列需求有必定的人工智能算法才能,对nlp算法,语音算法有必定了解,还涉及多方面工程才能知识,如阅览中有任何问题,能够留言,本人会逐个回答。
本章节主要叙述chatglm相较于transformer的一些改善点,以及在gpu机器上的本地化布置和运行作用。
一.chatglm命令行对话作用展现
二.chatglm详解
chatglm的中心原理源自此篇文章《GLM:General Language Model Pretraining with Autoregressive Blank Infilling》。
纵观文章,glm对transformer结构改动并不大,只是更改了layer norm和残差的次序,gelu替换relu激活,针对token运用单一线性层,而在练习目标上glm提出了自回归的空格填充使命。
而在开源出的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)
经过以上代码,我们能够很简单的嵌入各类工程里进行调用或许前后端交互。