ChatGLM2-6B本地化部署

一. 背景介绍

ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本,在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础之上,ChatGLM2-6B 引入了如下新特性:

  1. 更强大的性能:基于 ChatGLM 初代模型的开发经验,我们全面升级了 ChatGLM2-6B 的基座模型。ChatGLM2-6B 使用了 GLM 的混合目标函数,经过了 1.4T 中英标识符的预训练与人类偏好对齐训练,评测结果显示,相比于初代模型,ChatGLM2-6B 在 MMLU(+23%)、CEval(+33%)、GSM8K(+571%) 、BBH(+60%)等数据集上的性能取得了大幅度的提升,在同尺寸开源模型中具有较强的竞争力。
  2. 更长的上下文:基于 FlashAttention 技术,我们将基座模型的上下文长度(Context Length)由 ChatGLM-6B 的 2K 扩展到了 32K,并在对话阶段使用 8K 的上下文长度训练。对于更长的上下文,我们发布了 ChatGLM2-6B-32K 模型。LongBench 的测评结果表明,在等量级的开源模型中,ChatGLM2-6B-32K 有着较为明显的竞争优势。
  3. 更高效的推理:基于 Multi-Query Attention 技术,ChatGLM2-6B 有更高效的推理速度和更低的显存占用:在官方的模型实现下,推理速度相比初代提升了 42%,INT4 量化下,6G 显存支持的对话长度由 1K 提升到了 8K。
  4. 更开放的协议:ChatGLM2-6B 权重对学术研究完全开放,在填写问卷进行登记后亦允许免费商业使用

二. 本地化部署工作

2.1 基础了解

transformers 大模型中的github,通过如下方式可以自动下载模型实现和参数

//对应的实际地址为 huggingface.co/THUDM/chatglm2-6b
AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).cuda()

cuda(Compute Unified Device Architecture),是显卡厂商NVIDIA推出的运算平台。 pytorch是一个开源的Python机器学习库,基于Torch,用于自然语言处理等应用程序。PyTorch既可以看作加入了GPU支持的numpy,同时也可以看成一个拥有自动求导功能的强大的深度神经网络。

2.2 版本选择和适配
2.2.1 确认本地环境可以运行的模型量化等级

注意该项目的说明:https://github.com/THUDM/ChatGLM-6B/blob/main/README.md,结合本地机器的显存大小(gpu运行)或内存大小(cpu运行),选择本地部署的模型的量化等级

Multi-Query Attention 同时也降低了生成过程中 KV Cache 的显存占用,此外,ChatGLM2-6B 采用 Causal Mask 进行对话训练,连续对话时可复用前面轮次的 KV Cache,进一步优化了显存占用。因此,使用 6GB 显存的显卡进行 INT4 量化的推理时,初代的 ChatGLM-6B 模型最多能够生成 1119 个字符就会提示显存耗尽,而 ChatGLM2-6B 能够生成至少 8192 个字符。

量化等级

编码 2048 长度的最小显存

生成 8192 长度的最小显存

FP16 / BF16

13.1 GB

12.8 GB

INT8

8.2 GB

8.1 GB

INT4

5.5 GB

5.1 GB

2.2.2 版本适配

访问pytorch官网 ,根据自身的情况选择pytorch适配版本

ChatGLM2-6B本地化部署_chatglm2

注意说明:

  1. 如上windows系统,显卡是amd显卡,不支持,可以选择CPU运行,不过较慢;或者选择基于容器或者虚拟机等形式搭建linux环境
  2. 注意先后顺序,需要先安装cuda对应的版本(确认当前的系统的N卡是否支持对应的版本)
  3. 安装对应的torch版本
2.3 本地运行问题处理
2.3.1 选择的模型太大,下载中断

安装git LFS,先下载,然后本地运行

# chatglm2-6b 15G左右
git clone https://huggingface.co/THUDM/chatglm2-6b
# chatglm2-6b-int4 4G左右
git clone https://huggingface.co/THUDM/codegeex2-6b-int4

下载完成之后,选择加载本地模型运行

# 本地加载模型,因为是笔记本,只有6G显存,所以选择加载运行chatglm2-6b-int4模型
tokenizer = AutoTokenizer.from_pretrained("E:\\ChatGLM2-6B\\models\\chatglm2-6b-int4", trust_remote_code=True)  
model = AutoModel.from_pretrained("E:\\ChatGLM2-6B\\models\\chatglm2-6b-int4", trust_remote_code=True).cuda()
2.3.2 版本问题,无法运行

AssertionError: Torch not compiled with CUDA enabled 说明:主要为Torch版本和CUDA版本不适配问题 不匹配前,操作为先卸载torch,然后根据2.2.2版本适配,重新下载适配的版本,注意先安装cuda,然后pip安装对应的torch版本

import torch  
print(torch.__version__)  
print(torch.cuda.is_available())  
2.0.1+cpu  
False

匹配后

import torch  
print(torch.__version__)  
print(torch.cuda.is_available())  
2.0.1+cu117
True
2.3.2 选择web_demo.py运行

初步看,可以简单的聊天,并能写程序。

ChatGLM2-6B本地化部署_chatgpt_02

三. 简单聊聊场景

3.1 结合LangChain实现本地知识库

实现过程:包括加载文件 -> 读取文本 -> 文本分割 -> 文本向量化 -> 问句向量化 -> 在文本向量中匹配出与问句向量最相似的top k个 -> 匹配出的文本作为上下文和问题一起添加到prompt中 -> 提交给LLM生成回答

3.2 ai编程助手

https://github.com/THUDM/CodeGeeX2

CodeGeeX2 是多语言代码生成模型 CodeGeeX (KDD’23) 的第二代模型。不同于一代 CodeGeeX(完全在国产华为昇腾芯片平台训练) ,CodeGeeX2 是基于 ChatGLM2 架构加入代码预训练实现,得益于 ChatGLM2 的更优性能,CodeGeeX2 在多项指标上取得性能提升(+107% > CodeGeeX;仅60亿参数即超过150亿参数的 StarCoder-15B 近10%),更多特性包括:

  • 更强大的代码能力:基于 ChatGLM2-6B 基座语言模型,CodeGeeX2-6B 进一步经过了 600B 代码数据预训练,相比一代模型,在代码能力上全面提升,HumanEval-X 评测集的六种编程语言均大幅提升 (Python +57%, C++ +71%, Java +54%, JavaScript +83%, Go +56%, Rust +321%),在Python上达到 35.9% 的 Pass@1 一次通过率,超越规模更大的 StarCoder-15B。
  • 更优秀的模型特性:继承 ChatGLM2-6B 模型特性,CodeGeeX2-6B 更好支持中英文输入,支持最大 8192 序列长度,推理速度较一代 CodeGeeX-13B 大幅提升,量化后仅需6GB显存即可运行,支持轻量级本地化部署。
  • 更全面的AI编程助手:CodeGeeX插件(VS Code, Jetbrains)后端升级,支持超过100种编程语言,新增上下文补全、跨文件补全等实用功能。结合 Ask CodeGeeX 交互式AI编程助手,支持中英文对话解决各种编程问题,包括且不限于代码解释、代码翻译、代码纠错、文档生成等,帮助程序员更高效开发。
  • 更开放的协议:CodeGeeX2-6B 权重对学术研究完全开放,填写登记表申请商业使用。

CodeGeeX插件测试使用:

ChatGLM2-6B本地化部署_机器学习‘’_03