GPT实战系列-ChatGLM2部署Ubuntu+Cuda11+显存24G实战方案
自从chatGPT掀起的AI大模型热潮以来,国内大模型研究和开源活动,进展也如火如荼。模型越来越大,如何在小显存部署和使用大模型?
本实战专栏将评估一系列的开源模型,尤其关注国产大模型,重点在于可私有化、轻量化部署,比如推理所需的GPU资源控制在24G显存内。
目录
GPT实战系列-ChatGLM2部署Ubuntu+Cuda11+显存24G实战方案
[一、ChatGLM2 模型介绍](#一、ChatGLM2 模型介绍)
[四、启动 ChatGLM2大模型](#四、启动 ChatGLM2大模型)
一、ChatGLM2 模型介绍
ChatGLM2模型是清华研究团队领衔开发的:
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 对单轮超长文档的理解能力有限,会在后续迭代升级中着重进行优化。
-
更高效的推理 :基于 Multi-Query Attention 技术,ChatGLM2-6B 有更高效的推理速度和更低的显存占用:在官方的模型实现下,推理速度相比初代提升了 42%,INT4 量化下,6G 显存支持的对话长度由 1K 提升到了 8K。
github链接:GitHub - THUDM/ChatGLM2-6B: ChatGLM2-6B: An Open Bilingual Chat LLM | 开源双语对话语言模型
二、资源需求
模型文件类型
chatglm2的6b中英对话模型,分为6b,上下文长度8K,分为FP16,INT8,INT4三个子类型。
6b-32k,上下文长度32K,分为FP16,INT8,INT4量化模型3个子类型。
一共6种类型,可根据自身情况选择。
推理的GPU资源要求
因此,使用 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 |
ChatGLM2-6B 利用了 PyTorch 2.0 引入的
torch.nn.functional.scaled_dot_product_attention
实现高效的 Attention 计算,如果 PyTorch 版本较低则会 fallback 到朴素的 Attention 实现,出现显存占用高于上表的情况。
模型获取途径
下载链接:
Github地址 git clone GitHub - THUDM/ChatGLM2-6B: ChatGLM2-6B: An Open Bilingual Chat LLM | 开源双语对话语言模型
国外: Huggingface
ChatGLM2-6b-32k : https://huggingface.co/THUDM/chatglm2-6b-32k
ChatGLM2-6b : https://huggingface.co/THUDM/chatglm2-6b
国内:ModelScope
ChatGLM2-6B-32k : chatglm2-6b-32k
三、部署安装
配置环境
项目在本地普通设备,部署非量化版本。
显卡双显卡Nivdia Titan xp,每块12G, 共24G显卡
ubuntu 20.04
python 3.10版本,推荐3.8以上版本
pytorch 2.01,推荐2.0及以上版本,如果 PyTorch 版本较低则会 fallback 到朴素的 Attention 实现,出现显存占用高情况。
CUDA 11.4,建议使用11.4及以上版本
安装过程
创建虚拟环境
conda create -n chatglm2 python==3.10.6 -y
conda activate chatglm2
安装ChatGLM2 依赖配套软件
git clone --recursive https://github.com/THUDM/ChatGLM2-6B.git;
cd ChatGLM2-6B
pip install -r requirements.txt -i https://mirror.sjtu.edu.cn/pypi/web/simple
其中 transformers
库版本推荐为 4.30.2
,torch
推荐使用 2.0 及以上的版本,以获得最佳的推理性能。
下载模型文件
推理所需的模型权重、源码、配置已发布在 Hugging Face,见上面的下载链接。
代码会由 transformers
自动下载模型实现和参数。完整的模型实现在 Hugging Face Hub。
另外,模型权重比较大,如果你的网络环境较差,下载模型参数可能会花费较长时间甚至失败。此时可以先将模型下载到本地,然后从本地加载。
也可以从modelscope,或者清华链接(清华大学云盘)下载手动下载,国产模型的一个好处。并将下载的文件替换到本地的 chatglm2-6b
目录下。加载程序同时需要修改,为模型下载到本地的目录,如将以上代码中的 THUDM/chatglm2-6b
替换为你本地的 chatglm2-6b
文件夹的路径,即可从本地加载模型。
低成本部署方案
量化模型加载
默认情况下,模型以 FP16 精度加载,运行上述代码需要大概 13GB 显存。如果你的 GPU 显存有限,可以尝试以量化方式加载模型,使用方法如下:
model = AutoModel.from_pretrained("THUDM/chatglm2-6b-int4",trust_remote_code=True).cuda()
模型量化会带来一定的性能损失,经过测试,ChatGLM2-6B 在 4-bit 量化下仍然能够进行自然流畅的生成。 量化模型的参数文件也可以从这里手动下载。
多卡部署加载
如果有多张 GPU,但是每张 GPU 的显存大小都不足以容纳完整的模型,那么可以将模型切分在多张GPU上。首先安装 accelerate: pip install accelerate
,然后通过如下方法加载模型:
from utils import load_model_on_gpus
model = load_model_on_gpus("THUDM/chatglm2-6b", num_gpus=2)
即可将模型部署到两张 GPU 上进行推理。你可以将 num_gpus
改为你希望使用的 GPU 数。默认是均匀切分的,你也可以传入 device_map
参数来自己指定。
CPU部署
如果没有 GPU 硬件的话,也可以在 CPU 上进行推理,但是推理速度会更慢。使用方法如下(需要大概 32GB 内存)
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).float()
如果内存不足的话,也可以使用量化后的模型
model = AutoModel.from_pretrained("THUDM/chatglm2-6b-int4",trust_remote_code=True).float()
在 cpu 上运行量化后的模型需要安装 gcc
与 openmp
。多数 Linux 发行版默认已安装。对于 Windows ,可在安装 TDM-GCC 时勾选 openmp
。 Windows 测试环境 gcc
版本为 TDM-GCC 10.3.0
, Linux 为 gcc 11.3.0
。
四、启动 ChatGLM2大模型
命令行对话界面
python cli_demo.py
程序会在命令行中进行交互式的对话,在命令行中输入指示并回车即可生成回复,输入 clear
可以清空对话历史,输入 stop
终止程序。
网页demo
python web_demo.py
可以通过命令启动基于 Gradio 的网页版 demo,会在本地启动一个 web 服务,把控制台给出的地址放入浏览器即可访问。
还可以通过以下命令启动基于 Streamlit 的网页版 demo:
streamlit run web_demo2.py
网页版 demo 会运行一个 Web Server,并输出地址。在浏览器中打开输出的地址即可使用。 经测试,基于 Streamlit 的网页版 Demo 会更流畅。
五、功能测试
认识自己问题:你是谁
鸡土同笼问题:鸡兔共有100只,鸡的脚比兔的脚多80只,问鸡与兔各多少只?
python编程:写一个python程序,打印每个二叉树的每个树节点的值
觉得有用 点个赞 + 收藏 吧
end
相关文章: