一、机器环境及LLM环境
笔者的机器环境是纯国产操作系统Deepin社区免费版V20.9。要想玩转大语言模型LLM必须搭建深度学习环境。主流的都是使用Python加上深度学习框架。深度学习框架有很多,最先火起来的是TensorFlow,但是这几年PyTorch特别受欢迎,不论学术界还是工业界都受追捧。国产的还有百度飞桨PaddlePaddle,华为的MindSpore等。这些深度学习框架基本都是开源的,用哪个看读者喜好。
说一下笔者的选择:
硬件:UNC X15准系统笔记本,GPU为英伟达3070,8GB显存。
软件:操作系统是Deepin V20.9;显卡驱动最新;CUDA Toolkit 安装了cuda11.8;Python 3.8.5;PyTorch安装了2.0版;开发IDE选择了微软的VisualCode,安装了笔记本插件,支持.ipynb格式,这种格式适合教学和实验、调试程序,非常方便。调试通过了再粘贴到.py里面。VisualCode兼容各种格式,使用方便,不用换来换去。关键还免费,笔者整个生态都是开源免费。
(注:这里环境的搭建请搭建先参照网上基于Ubuntu系统的相关文章,后面笔者有时间也会整理出文章来。)
二、部署本地LLM:ChatGLM2-6B
ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本,在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础之上,ChatGLM2-6B 引入了如下新特性:
更强大的性能:基于 ChatGLM 初代模型的开发经验,我们全面升级了 ChatGLM2-6B 的基座模型。ChatGLM2-6B 使用了 GLM 的混合目标函数,经过了 1.4T 中英标识符的预训练与人类偏好对齐训练,评测结果显示,相比于初代模型,ChatGLM2-6B 在 MMLU(+23%)、CEval(+33%)、GSM8K(+571%) 、BBH(+60%)等数据集上的性能取得了大幅度的提升,在同尺寸开源模型中具有较强的竞争力。
更长的上下文:基于 FlashAttention 技术,我们将基座模型的上下文长度(Context Length)由 ChatGLM-6B 的 2K 扩展到了 32K,并在对话阶段使用 8K 的上下文长度训练。对于更长的上下文,我们发布了 ChatGLM2-6B-32K 模型。LongBench 的测评结果表明,在等量级的开源模型中,ChatGLM2-6B-32K 有着较为明显的竞争优势。
更高效的推理:基于 Multi-Query Attention 技术,ChatGLM2-6B 有更高效的推理速度和更低的显存占用:在官方的模型实现下,推理速度相比初代提升了 42%,INT4 量化下,6G 显存支持的对话长度由 1K 提升到了 8K。
更开放的协议:ChatGLM2-6B 权重对学术研究完全开放,在填写问卷进行登记后亦允许免费商业使用。
到github上克隆最新版ChatGLM2-6B。
git clone https://github.com/THUDM/ChatGLM2-6B.git
然后安装必须的支持包:
pip install -r requirements.txt
按照README说明到huggingface上下载预训练模型,根据机器配置下载合适版本。笔者只有8GB显存,下载的是chatglm2-6b-int4量化版。
修改web_demo2.py中关于加载模型的代码。
@st.cache_resource
def get_model():
tokenizer = AutoTokenizer.from_pretrained("./chatglm2-6b-int4", trust_remote_code=True)
model = AutoModel.from_pretrained("./chatglm2-6b-int4", trust_remote_code=True).cuda()
其中"./chatglm2-6b-int4"是笔者的模型路径,就放到了ChatGLM2-6B下面。修改成你下载下来的预训练模型路径即可。然后敲如下命令测试:
streamlit run web_demo.py
这个web演示是用streamlit写的。我们要使用LangChain调用,所以要使用ChatGLM2的api。修改根目录下api.py加载模型代码:
if __name__ == '__main__':
tokenizer = AutoTokenizer.from_pretrained("./chatglm2-6b-int4", trust_remote_code=True)
model = AutoModel.from_pretrained("./chatglm2-6b-int4", trust_remote_code=True).cuda()
确保"./chatglm2-6b-int4"替换成你下载的预训练模型路径。启动api服务:
Python api.py
输出如下:
INFO: Started server process [16048]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
表明服务地址为本机,端口为8000。访问http://127.0.0.1:8000即可。
三、安装LangChain
LangChain在GitHub上开源,可以下载源代码。也可以直接安装:
pip install LangChain
四、定制LangChain的LLM类
定义一个LLM类继承自langchain.llms.base.LLM,用于调用ChatGLM2的api。代码如下:
from langchain.llms.base import LLM
from typing import List, Optional
import requests
import json
LLM_MODEL='http://127.0.0.1:8000'
class ChatGLM2(LLM):
max_token: int = 10000
temperature: float = 0.1
top_p = 0.9
history_len:int=100
#history = []
def __init__(self):
super().__init__()
@property
def _llm_type(self) -> str:
return "http"
def _call(self, prompt: str, stop: Optional[List[str]] = None):
headers = {'Content-Type': 'application/json'}
#history+=stop
data=json.dumps({
'prompt':prompt,
'temperature':self.temperature,
'stop':stop,
'max_length':self.max_token
})
response = requests.post(LLM_MODEL,headers=headers,data=data)
if response.status_code!=200:
return "查询结果错误",[['查询结果错误','error']]
resp = response.json()
response=resp['response']
return response
五、测试并开启新征程
下面我们写一段代码,测试一下我们的LLM类是否好用。
llm=ChatGLM2() #用前面自定义的LLM类声明并初始化一个实例
print(llm("你好")) #开始对话
如果你看到下面输出:
你好👋!我是人工智能助手 ChatGLM2-6B,很高兴见到你,欢迎问我任何问题。
恭喜你成功了。从此可以不用申请openai 的key也可以学习langchain了,我们将一起学习全部开源的大语言模型应用开发实用技术。