ChatGLM-6B
ChatGLM-6B一、介绍
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 正在内测开发中。
二、使用方式
硬件需求
量化等级 最低 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
即可。
代码调用
可以通过如下代码调用 ChatGLM-6B 模型来生成对话:
python代码解读复制代码>>> 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)
你好?!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。
>>> response, history = model.chat(tokenizer, "晚上睡不着应该怎么办", history=history)
>>> print(response)
晚上睡不着可能会让你感到焦虑或不舒服,但以下是一些可以帮助你入睡的方法:
1. 制定规律的睡眠时间表:保持规律的睡眠时间表可以帮助你建立健康的睡眠习惯,使你更容易入睡。尽量在每天的相同时间上床,并在同一时间起床。
2. 创造一个舒适的睡眠环境:确保睡眠环境舒适,安静,黑暗且温度适宜。可以使用舒适的床上用品,并保持房间通风。
3. 放松身心:在睡前做些放松的活动,例如泡个热水澡,听些轻柔的音乐,阅读一些有趣的书籍等,有助于缓解紧张和焦虑,使你更容易入睡。
4. 避免饮用含有咖啡因的饮料:咖啡因是一种刺激性物质,会影响你的睡眠质量。尽量避免在睡前饮用含有咖啡因的饮料,例如咖啡,茶和可乐。
5. 避免在床上做与睡眠无关的事情:在床上做些与睡眠无关的事情,例如看电影,玩游戏或工作等,可能会干扰你的睡眠。
6. 尝试呼吸技巧:深呼吸是一种放松技巧,可以帮助你缓解紧张和焦虑,使你更容易入睡。试着慢慢吸气,保持几秒钟,然后缓慢呼气。
如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。
完整的模型实现可以在 Hugging Face Hub 上查看。如果你从 Hugging Face Hub 上下载 checkpoint 的速度较慢,也可以从这里手动下载。
Demo
我们提供了一个基于 Gradio 的网页版 Demo 和一个命令行 Demo。使用时首先需要下载本仓库:
shell代码解读复制代码git clone https://github.com/THUDM/ChatGLM-6B
cd ChatGLM-6B
网页版 Demo
首先安装 Gradio:pip install gradio
,然后运行仓库中的 web_demo.py:
shell
代码解读
复制代码python web_demo.py
程序会运行一个 Web Server,并输出地址。在浏览器中打开输出的地址即可使用。最新版 Demo 实现了打字机效果,速度体验大大提升。注意,由于国内 Gradio 的网络访问较为缓慢,启用 demo.queue().launch(share=True, inbrowser=True)
时所有网络会经过 Gradio 服务器转发,导致打字机体验大幅下降,现在默认启动方式已经改为 share=False
,如有需要公网访问的需求,可以重新修改为 share=True
启动。
感谢 @AdamBear 实现了基于 Streamlit 的网页版 Demo,运行方式见#117.
命令行 Demo
运行仓库中 cli_demo.py:
shell
代码解读
复制代码python cli_demo.py
程序会在命令行中进行交互式的对话,在命令行中输入指示并回车即可生成回复,输入 clear
可以清空对话历史,输入 stop
终止程序。
API部署
首先需要安装额外的依赖 pip install fastapi uvicorn
,然后运行仓库中的 api.py:
shell
代码解读
复制代码python api.py
默认部署在本地的 8000 端口,通过 POST 方法进行调用
shell代码解读复制代码curl -X POST "http://127.0.0.1:8000" \
-H 'Content-Type: application/json' \
-d '{"prompt": "你好", "history": []}'
得到的返回值为
shell代码解读复制代码{
"response":"你好?!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。",
"history":[["你好","你好?!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。"]],
"status":200,
"time":"2023-03-23 21:38:40"
}
低成本部署
模型量化
默认情况下,模型以 FP16 精度加载,运行上述代码需要大概 13GB 显存。如果你的 GPU 显存有限,可以尝试以量化方式加载模型,使用方法如下:
python代码解读复制代码# 按需修改,目前只支持 4/8 bit 量化
model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().quantize(4).cuda()
进行 2 至 3 轮对话后,8-bit 量化下 GPU 显存占用约为 10GB,4-bit 量化下仅需 6GB 占用。随着对话轮数的增多,对应消耗显存也随之增长,由于采用了相对位置编码,理论上 ChatGLM-6B 支持无限长的 context-length,但总长度超过 2048(训练长度)后性能会逐渐下降。
模型量化会带来一定的性能损失,经过测试,ChatGLM-6B 在 4-bit 量化下仍然能够进行自然流畅的生成。使用 GPT-Q 等量化方案可以进一步压缩量化精度/提升相同量化精度下的模型性能,欢迎大家提出对应的 Pull Request。
[2023/03/19] 量化过程需要在内存中首先加载 FP16 格式的模型,消耗大概 13GB 的内存。如果你的内存不足的话,可以直接加载量化后的模型,仅需大概 5.2GB 的内存:
python
代码解读
复制代码model = AutoModel.from_pretrained("THUDM/chatglm-6b-int4", trust_remote_code=True).half().cuda()
[2023/03/24] 我们进一步提供了对Embedding量化后的模型,模型参数仅占用4.3 GB显存:
python
代码解读
复制代码model = AutoModel.from_pretrained("THUDM/chatglm-6b-int4-qe", trust_remote_code=True).half().cuda()
CPU 部署
如果你没有 GPU 硬件的话,也可以在 CPU 上进行推理,但是推理速度会更慢。使用方法如下(需要大概 32GB 内存)
python
代码解读
复制代码model = AutoModel.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).float()
[2023/03/19] 如果你的内存不足,可以直接加载量化后的模型:
python
代码解读
复制代码model = AutoModel.from_pretrained("THUDM/chatglm-6b-int4",trust_remote_code=True).float()
如果遇到了报错 Could not find module 'nvcuda.dll'
或者 RuntimeError: Unknown platform: darwin
(MacOS) 的话请参考这个Issue.
Mac 上的 GPU 加速
对于搭载了Apple Silicon的Mac(以及MacBook),可以使用 MPS 后端来在 GPU 上运行 ChatGLM-6B。首先需要参考 Apple 的 官方说明 安装 PyTorch-Nightly。然后将模型仓库 clone 到本地(需要先安装Git LFS)
shell代码解读复制代码git lfs install
git clone https://huggingface.co/THUDM/chatglm-6b
将代码中的模型加载改为从本地加载,并使用 mps 后端
python
代码解读
复制代码model = AutoModel.from_pretrained("your local path", trust_remote_code=True).half().to('mps')
即可使用在 Mac 上使用 GPU 加速模型推理。
高效参数微调
基于 P-tuning v2 的高效参数微调。具体使用方法详见 ptuning/README.md。
ChatGLM-6B 示例
以下是一些使用 web_demo.py
得到的示例截图。更多 ChatGLM-6B 的可能,等待你来探索发现!
局限性
由于 ChatGLM-6B 的小规模,其能力仍然有许多局限性。以下是我们目前发现的一些问题:
模型容量较小:6B 的小容量,决定了其相对较弱的模型记忆和语言能力。在面对许多事实性知识任务时,ChatGLM-6B 可能会生成不正确的信息;它也不擅长逻辑类问题(如数学、编程)的解答。
点击查看例子产生有害说明或有偏见的内容:ChatGLM-6B 只是一个初步与人类意图对齐的语言模型,可能会生成有害、有偏见的内容。(内容可能具有冒犯性,此处不展示)
英文能力不足:ChatGLM-6B 训练时使用的指示/回答大部分都是中文的,仅有极小一部分英文内容。因此,如果输入英文指示,回复的质量远不如中文,甚至与中文指示下的内容矛盾,并且出现中英夹杂的情况。
易被误导,对话能力较弱:ChatGLM-6B 对话能力还比较弱,而且 “自我认知” 存在问题,并很容易被误导并产生错误的言论。例如当前版本的模型在被误导的情况下,会在自我认知上发生偏差。
读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用
对于0基础小白入门:
如果你是零基础小白,想快速入门大模型是可以考虑的。
一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。
资源分享
大模型AGI学习包
资料目录
成长路线图&学习规划 配套视频教程 实战LLM 人工智能比赛资料 AI人工智能必读书单 面试题合集《人工智能\大模型入门学习大礼包》,可以扫描下方二维码免费领取!
1.成长路线图&学习规划
要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
2.视频教程
很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,其中一共有21个章节,每个章节都是当前板块的精华浓缩。
3.LLM
大家最喜欢也是最关心的LLM(大语言模型)
《人工智能\大模型入门学习大礼包》,可以扫描下方二维码免费领取!
总结
**ChatGLM-6B 综述**### 一、介绍
**ChatGLM-6B** 是一个基于General Language Model (GLM) 架构的开源双语(中英文)对话语言模型,拥有62亿参数。通过模型量化技术,用户能够轻松在消费级显卡上本地部署(INT4量化下仅需6GB显存)。该模型借鉴了ChatGPT技术,并专门优化了中文问答能力。经过约1T标识符的双语训练和多种技术的加持,ChatGLM-6B能生成较为贴近人类偏好的回答。尽管模型潜力较大,但由于规模小,存在诸如事实逻辑错误、有害内容生成、上下文处理能力弱等局限性。未来,更大规模的GLM-130B模型正在开发中。
### 二、使用方式与硬件需求
#### 硬件需求
- 各种量化等级下的最低显存要求不同:FP16需13GB显存,INT8需8GB,INT4则最低仅需6GB(推理)和7GB(高效参数微调)。
#### 环境安装
通过pip安装依赖(如`transformers` 4.27.1及以上版本),然后可以调用模型进行对话。
#### 代码调用
使用`transformers`库中的`AutoTokenizer`和`AutoModel`加载模型,通过`model.chat`方法生成对话内容。
#### Demo与API部署
1. **网页版Demo**:基于Gradio构建,提供打字机效果的交互体验。
2. **命令行Demo**:在终端中进行交互式对话。
3. **API部署**:通过FastAPI和Uvicorn在本地运行,可通过POST请求进行调用。
### 三、低成本部署
#### 模型量化
- 支持4/8位量化以减少显存使用,4位量化下模型仍能自然流畅生成回答。
- 提供直接加载量化后模型的选项,显著降低内存需求。
#### CPU部署
- 在CPU上可进行模型推理,适合无GPU环境(内存需求较大)。
#### Mac GPU加速
- 使用MPS后端在Apple Silicon Mac上实现GPU加速。
### 四、高效参数微调
基于P-Tuning v2的方法,详见官方文档,方便开发者针对特定应用场景进行模型定制。
### 五、局限性与未来展望
ChatGLM-6B目前存在着模型容量有限、可能生成有害内容、中英文能力不平衡及对话能力较弱等局限。随着更大规模的模型开发及技术进步,这些问题将得到缓解。
### 六、资源分享
- 提供大模型AGI学习资料包,包括学习路线图、视频教程、LLM实战、AI必读书单及面试题合集等。
- 扫描二维码可免费领取《人工智能\大模型入门学习大礼包》。
### 结论
ChatGLM-6B作为一款开源的双语对话语言模型,展现出强大的灵活性和应用潜力,尤其在中文问答优化方面表现出色。尽管面临一些技术挑战,但其低成本部署选项和高效参数微调方法使其易于使用和定制,为AI语言模型的普及和研究提供了新的思路。