@article{zeng2022glm,
title={Glm-130b: An open bilingual pre-trained model},
author={Zeng, Aohan and Liu, Xiao and Du, Zhengxiao and Wang, Zihan and Lai, Hanyu and Ding, Ming and Yang, Zhuoyi and Xu, Yifan and Zheng, Wendi and Xia, Xiao and others},
journal={arXiv preprint arXiv:2210.02414},
year={2022}
}
@inproceedings{du2022glm,
title={GLM: General Language Model Pretraining with Autoregressive Blank Infilling},
author={Du, Zhengxiao and Qian, Yujie and Liu, Xiao and Ding, Ming and Qiu, Jiezhong and Yang, Zhilin and Tang, Jie},
booktitle={Proceedings of the 60th Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers)},
pages={320--335},
year={2022}
}
ChatGLM2-6B
🤗 HF Repo • 🐦 Twitter • 📃 [GLM@ACL 22] [GitHub] • 📃 [GLM-130B@ICLR 23] [GitHub]
👋 加入我们的 Slack 和 WeChat
📍在 chatglm.cn 体验更大规模的 ChatGLM 模型。
Read this in English
新一代开源模型 ChatGLM3-6B 已发布,拥有10B以下最强的基础模型,支持工具调用(Function Call)、代码执行(Code Interpreter)、Agent 任务等功能。
介绍
ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本,在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础之上,ChatGLM2-6B 引入了如下新特性:
ChatGLM2-6B 开源模型旨在与开源社区一起推动大模型技术发展,恳请开发者和大家遵守开源协议,勿将开源模型和代码及基于开源项目产生的衍生物用于任何可能给国家和社会带来危害的用途以及用于任何未经过安全评估和备案的服务。目前,本项目团队未基于 ChatGLM2-6B 开发任何应用,包括网页端、安卓、苹果 iOS 及 Windows App 等应用。
尽管模型在训练的各个阶段都尽力确保数据的合规性和准确性,但由于 ChatGLM2-6B 模型规模较小,且模型受概率随机性因素影响,无法保证输出内容的准确性,且模型易被误导。本项目不承担开源模型和代码导致的数据安全、舆情风险或发生任何模型被误导、滥用、传播、不当利用而产生的风险和责任。
更新信息
[2023/07/31] 发布 ChatGLM2-6B-32K 模型,提升对于长文本的理解能力。
[2023/07/25] 发布 CodeGeeX2 模型,基于 ChatGLM2-6B 加入代码预训练实现,代码能力全面提升。
[2023/07/04] 发布 P-Tuning v2 与 全参数微调脚本,参见 P-Tuning。
友情链接
对 ChatGLM2 进行加速的开源项目:
基于或使用了 ChatGLM2-6B 的开源项目:
支持 ChatGLM-6B 和相关应用在线训练的示例项目:
评测结果
我们选取了部分中英文典型数据集进行了评测,以下为 ChatGLM2-6B 模型在 MMLU (英文)、C-Eval(中文)、GSM8K(数学)、BBH(英文) 上的测评结果。在 evaluation 中提供了在 C-Eval 上进行测评的脚本。
MMLU
C-Eval
GSM8K
BBH
推理性能
ChatGLM2-6B 使用了 Multi-Query Attention,提高了生成速度。生成 2000 个字符的平均速度对比如下
Multi-Query Attention 同时也降低了生成过程中 KV Cache 的显存占用,此外,ChatGLM2-6B 采用 Causal Mask 进行对话训练,连续对话时可复用前面轮次的 KV Cache,进一步优化了显存占用。因此,使用 6GB 显存的显卡进行 INT4 量化的推理时,初代的 ChatGLM-6B 模型最多能够生成 1119 个字符就会提示显存耗尽,而 ChatGLM2-6B 能够生成至少 8192 个字符。
我们也测试了量化对模型性能的影响。结果表明,量化对模型性能的影响在可接受范围内。
ChatGLM2-6B 示例
相比于初代模型,ChatGLM2-6B 多个维度的能力都取得了提升,以下是一些对比示例。更多 ChatGLM2-6B 的可能,等待你来探索发现!
数理逻辑
知识推理
长文档理解
使用方式
环境安装
首先需要下载本仓库:
然后使用 pip 安装依赖:
其中
transformers
库版本推荐为4.30.2
,torch
推荐使用 2.0 及以上的版本,以获得最佳的推理性能。代码调用
可以通过如下代码调用 ChatGLM2-6B 模型来生成对话:
从本地加载模型
以上代码会由
transformers
自动下载模型实现和参数。完整的模型实现在 Hugging Face Hub。如果你的网络环境较差,下载模型参数可能会花费较长时间甚至失败。此时可以先将模型下载到本地,然后从本地加载。从 Hugging Face Hub 下载模型需要先安装Git LFS,然后运行
如果你从 Hugging Face Hub 上下载 checkpoint 的速度较慢,可以只下载模型实现
然后从这里手动下载模型参数文件,并将下载的文件替换到本地的
chatglm2-6b
目录下。将模型下载到本地之后,将以上代码中的
THUDM/chatglm2-6b
替换为你本地的chatglm2-6b
文件夹的路径,即可从本地加载模型。模型的实现仍然处在变动中。如果希望固定使用的模型实现以保证兼容性,可以在
from_pretrained
的调用中增加revision="v1.0"
参数。v1.0
是当前最新的版本号,完整的版本列表参见 Change Log。网页版 Demo
可以通过以下命令启动基于 Streamlit 的网页版 demo:
网页版 demo 会运行一个 Web Server,并输出地址。在浏览器中打开输出的地址即可使用。 经测试,基于 Streamlit 的网页版 Demo 会更流畅。
命令行 Demo
运行仓库中 cli_demo.py:
程序会在命令行中进行交互式的对话,在命令行中输入指示并回车即可生成回复,输入
clear
可以清空对话历史,输入stop
终止程序。API 部署
首先需要安装额外的依赖
pip install fastapi uvicorn
,然后运行仓库中的 api.py:默认部署在本地的 8000 端口,通过 POST 方法进行调用
得到的返回值为
感谢 @hiyouga 实现了 OpenAI 格式的流式 API 部署,可以作为任意基于 ChatGPT 的应用的后端,比如 ChatGPT-Next-Web。可以通过运行仓库中的openai_api.py 进行部署:
进行 API 调用的示例代码为
低成本部署
模型量化
默认情况下,模型以 FP16 精度加载,运行上述代码需要大概 13GB 显存。如果你的 GPU 显存有限,可以尝试以量化方式加载模型,使用方法如下:
模型量化会带来一定的性能损失,经过测试,ChatGLM2-6B 在 4-bit 量化下仍然能够进行自然流畅的生成。 量化模型的参数文件也可以从这里手动下载。
CPU 部署
如果你没有 GPU 硬件的话,也可以在 CPU 上进行推理,但是推理速度会更慢。使用方法如下(需要大概 32GB 内存)
如果你的内存不足的话,也可以使用量化后的模型
在 cpu 上运行量化后的模型需要安装
gcc
与openmp
。多数 Linux 发行版默认已安装。对于 Windows ,可在安装 TDM-GCC 时勾选openmp
。 Windows 测试环境gcc
版本为TDM-GCC 10.3.0
, Linux 为gcc 11.3.0
。在 MacOS 上请参考 Q1。Mac 部署
对于搭载了 Apple Silicon 或者 AMD GPU 的 Mac,可以使用 MPS 后端来在 GPU 上运行 ChatGLM2-6B。需要参考 Apple 的 官方说明 安装 PyTorch-Nightly(正确的版本号应该是2.x.x.dev2023xxxx,而不是 2.x.x)。
目前在 MacOS 上只支持从本地加载模型。将代码中的模型加载改为从本地加载,并使用 mps 后端:
加载半精度的 ChatGLM2-6B 模型需要大概 13GB 内存。内存较小的机器(比如 16GB 内存的 MacBook Pro),在空余内存不足的情况下会使用硬盘上的虚拟内存,导致推理速度严重变慢。 此时可以使用量化后的模型 chatglm2-6b-int4。因为 GPU 上量化的 kernel 是使用 CUDA 编写的,因此无法在 MacOS 上使用,只能使用 CPU 进行推理。 为了充分使用 CPU 并行,还需要单独安装 OpenMP。
在 Mac 上进行推理也可以使用 ChatGLM.cpp
多卡部署
如果你有多张 GPU,但是每张 GPU 的显存大小都不足以容纳完整的模型,那么可以将模型切分在多张GPU上。首先安装 accelerate:
pip install accelerate
,然后通过如下方法加载模型:即可将模型部署到两张 GPU 上进行推理。你可以将
num_gpus
改为你希望使用的 GPU 数。默认是均匀切分的,你也可以传入device_map
参数来自己指定。协议
本仓库的代码依照 Apache-2.0 协议开源,ChatGLM2-6B 模型的权重的使用则需要遵循 Model License。ChatGLM2-6B 权重对学术研究完全开放,在填写问卷进行登记后亦允许免费商业使用。
引用
如果你觉得我们的工作有帮助的话,请考虑引用下列论文,ChatGLM2-6B 的论文会在近期公布,敬请期待~