Tag
Other
Type
Code
Created
Apr 16, 2023 02:25 AM

ChatGLM-6B

notion image
Blog
notion image
notion image
notion image
notion image
加入我们的 SlackWeChat

介绍

ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。 ChatGLM-6B 使用了和 ChatGPT 相似的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答,更多信息请参考我们的博客
为了方便下游开发者针对自己的应用场景定制模型,我们同时实现了基于 P-Tuning v2 的高效参数微调方法 (使用指南) ,INT4 量化级别下最低只需 7GB 显存即可启动微调。
不过,由于 ChatGLM-6B 的规模较小,目前已知其具有相当多的局限性,如事实性/数学逻辑错误,可能生成有害/有偏见内容,较弱的上下文能力,自我认知混乱,以及对英文指示生成与中文指示完全矛盾的内容。请大家在使用前了解这些问题,以免产生误解。更大的基于 1300 亿参数 GLM-130B 的 ChatGLM 正在内测开发中。
Read this in English.

友情链接

部分基于本仓库开发的开源项目参见 PROJECT.md
如果你有其他好的项目/教程的话,欢迎参照上述格式添加到 README 中并提出 Pull Request

使用方式

硬件需求

量化等级
最低 GPU 显存(推理)
最低 GPU 显存(高效参数微调)
FP16(无量化)
13 GB
14 GB
INT8
8 GB
9 GB
INT4
6 GB
7 GB

环境安装

使用 pip 安装依赖:pip install -r requirements.txt,其中 transformers 库版本推荐为 4.27.1,但理论上不低于 4.23.1 即可。
此外,如果需要在 cpu 上运行量化后的模型,还需要安装 gccopenmp。多数 Linux 发行版默认已安装。对于 Windows ,可在安装 TDM-GCC 时勾选 openmp。 Windows 测试环境 gcc 版本为 TDM-GCC 10.3.0, Linux 为 gcc 11.3.0

代码调用

可以通过如下代码调用 ChatGLM-6B 模型来生成对话:

从本地加载模型

以上代码会由 transformers 自动下载模型实现和参数。完整的模型实现可以在 Hugging Face Hub。如果你的网络环境较差,下载模型参数可能会花费较长时间甚至失败。此时可以先将模型下载到本地,然后从本地加载。
从 Hugging Face Hub 下载模型需要先安装Git LFS,然后运行
如果你从 Hugging Face Hub 上下载 checkpoint 的速度较慢,可以只下载模型实现
然后从这里手动下载模型参数文件,并将下载的文件替换到本地的 chatglm-6b 目录下。
将模型下载到本地之后,将以上代码中的 THUDM/chatglm-6b 替换为你本地的 chatglm-6b 文件夹的路径,即可从本地加载模型。

Demo & API

我们提供了一个基于 Gradio 的网页版 Demo 和一个命令行 Demo。使用时首先需要下载本仓库:

网页版 Demo

notion image
首先安装 Gradio:pip install gradio,然后运行仓库中的 web_demo.py
程序会运行一个 Web Server,并输出地址。在浏览器中打开输出的地址即可使用。最新版 Demo 实现了打字机效果,速度体验大大提升。注意,由于国内 Gradio 的网络访问较为缓慢,启用 demo.queue().launch(share=True, inbrowser=True) 时所有网络会经过 Gradio 服务器转发,导致打字机体验大幅下降,现在默认启动方式已经改为 share=False,如有需要公网访问的需求,可以重新修改为 share=True 启动。
感谢 @AdamBear 实现了基于 Streamlit 的网页版 Demo,运行方式见#117.

命令行 Demo

notion image
运行仓库中 cli_demo.py
程序会在命令行中进行交互式的对话,在命令行中输入指示并回车即可生成回复,输入 clear 可以清空对话历史,输入 stop 终止程序。

API部署

首先需要安装额外的依赖 pip install fastapi uvicorn,然后运行仓库中的 api.py
默认部署在本地的 8000 端口,通过 POST 方法进行调用
得到的返回值为

低成本部署

模型量化

默认情况下,模型以 FP16 精度加载,运行上述代码需要大概 13GB 显存。如果你的 GPU 显存有限,可以尝试以量化方式加载模型,使用方法如下:
进行 2 至 3 轮对话后,8-bit 量化下 GPU 显存占用约为 10GB,4-bit 量化下仅需 6GB 占用。随着对话轮数的增多,对应消耗显存也随之增长,由于采用了相对位置编码,理论上 ChatGLM-6B 支持无限长的 context-length,但总长度超过 2048(训练长度)后性能会逐渐下降。
模型量化会带来一定的性能损失,经过测试,ChatGLM-6B 在 4-bit 量化下仍然能够进行自然流畅的生成。使用 GPT-Q 等量化方案可以进一步压缩量化精度/提升相同量化精度下的模型性能,欢迎大家提出对应的 Pull Request。
量化过程需要在内存中首先加载 FP16 格式的模型,消耗大概 13GB 的内存。如果你的内存不足的话,可以直接加载量化后的模型,仅需大概 5.2GB 的内存:

CPU 部署

如果你没有 GPU 硬件的话,也可以在 CPU 上进行推理,但是推理速度会更慢。使用方法如下(需要大概 32GB 内存)
如果你的内存不足,可以直接加载量化后的模型:
如果遇到了报错 Could not find module 'nvcuda.dll' 或者 RuntimeError: Unknown platform: darwin (MacOS) ,请从本地加载模型

Mac 上的 GPU 加速

对于搭载了Apple Silicon的Mac(以及MacBook),可以使用 MPS 后端来在 GPU 上运行 ChatGLM-6B。需要参考 Apple 的 官方说明 安装 PyTorch-Nightly。
目前在 MacOS 上只支持从本地加载模型。将代码中的模型加载改为从本地加载,并使用 mps 后端
即可使用在 Mac 上使用 GPU 加速模型推理。

高效参数微调

基于 P-tuning v2 的高效参数微调。具体使用方法详见 ptuning/README.md

更新信息

[2023/04/06] 优化web demo的界面(感谢 @tuteng0915)。移除embedding中的image token以减小显存占用(需要更新模型文件pytorch_model-00001-of-00008.binpytorch_model-00008-of-00008.bin,感谢 @silverriver 提出的想法)。去掉了对 icetk 的依赖(需要更新模型文件ice_text.model)。
[2023/03/31] 增加基于 P-Tuning-v2 的高效参数微调实现,INT4 量化级别下最低只需 7GB 显存即可进行模型微调。详见高效参数微调方法
[2023/03/23] 增加 API 部署(感谢 @LemonQu-GIT)。增加 Embedding 量化模型 ChatGLM-6B-INT4-QE。增加配备 Apple Silicon 芯片的 Mac 上 GPU 加速的支持。
[2023/03/19] 增加流式输出接口 stream_chat,已更新到网页版和命令行 Demo。修复输出中的中文标点。增加量化后的模型 ChatGLM-6B-INT4

ChatGLM-6B 示例

以下是一些使用 web_demo.py 得到的示例截图。更多 ChatGLM-6B 的可能,等待你来探索发现!
Details Details Details Details Details Details Details Details

局限性

由于 ChatGLM-6B 的小规模,其能力仍然有许多局限性。以下是我们目前发现的一些问题:
  • Details
    • 模型容量较小:6B 的小容量,决定了其相对较弱的模型记忆和语言能力。在面对许多事实性知识任务时,ChatGLM-6B 可能会生成不正确的信息;它也不擅长逻辑类问题(如数学、编程)的解答。
    • 产生有害说明或有偏见的内容:ChatGLM-6B 只是一个初步与人类意图对齐的语言模型,可能会生成有害、有偏见的内容。(内容可能具有冒犯性,此处不展示)
    • 英文能力不足:ChatGLM-6B 训练时使用的指示/回答大部分都是中文的,仅有极小一部分英文内容。因此,如果输入英文指示,回复的质量远不如中文,甚至与中文指示下的内容矛盾,并且出现中英夹杂的情况。
  • Details
    • 易被误导,对话能力较弱:ChatGLM-6B 对话能力还比较弱,而且 “自我认知” 存在问题,并很容易被误导并产生错误的言论。例如当前版本的模型在被误导的情况下,会在自我认知上发生偏差。

协议

本仓库的代码依照 Apache-2.0 协议开源,ChatGLM-6B 模型的权重的使用则需要遵循 Model License

引用

如果你觉得我们的工作有帮助的话,请考虑引用下列论文
  • Twikoo
公告
🎉欢迎光临🎉
-- 感谢您的支持 ---