本文内容参考 ChatGLM 团队发布在 B站 上的 GLM官方教程 以及 Github 上的 GLM 官方项目仓库内容编写

概要

2024/6/05 GLM-4-9B 是智谱 AI 推出的最新一代预训练模型 GLM-4 系列中的开源版本。 

在语义、数学、推理、代码和知识等多方面的数据集测评中, GLM-4-9B 及其人类偏好对齐的版本 GLM-4-9B-Chat 均表现出超越 Llama-3-8B 的卓越性能。除了能进行多轮对话,GLM-4-9B-Chat 还具备网页浏览、代码执行、自定义工具调用(Function Call)和长文本推理(支持最大 128K 上下文)等高级功能。本代模型增加了多语言支持,支持包括日语,韩语,德语在内的 26 种语言。

本文内容在以下硬件环境测试:
 
配置项 配置
硬件 CPU Intel® Core™ i5-12490F 3.00 GHz
内存 64.0 GB DDR4 3200Mhz
GPU Nvidia GeForce RTX 4060 8GB
磁盘 2T PCIe4.0 NVMe M.2 SSD
操作系统 Windows 11 专业版 23H2
软件 Python 3.12.3
CUDA 12.4
PyTorch 2.4.0
Flash Attention 2.6.3

模型部署

GLM-4-9B 系列模型对比

模型名 类型 特点
GLM-4-9B 基座模型 8K上下文,不能对话
GLM-4-9B-Chat 对话模型 128K上下文,具备工具调用能力
GLM-4-9B-Chat-1M 对话模型 1M上下文,具备工具调用能力,长文本模型
GLM-4V-9B VQA视觉模型 8K上下文,视觉对话

本文将使用 GLM-4-9B-Chat 进行部署实验

模型下载

GLM 团队已经将模型上传到 HuggingFace、魔搭,可以根据自己的网络环境选择合适的渠道:

魔搭(ModelScope):https://modelscope.cn/models/ZhipuAI/glm-4-9b-chat

glm-4-9b-modelscope下载界面.png

HuggingFace:https://huggingface.co/THUDM/glm-4-9b-chat

glm-4-9b-huggingface下载界面.png

官方视频中推荐使用 git clone 方式下载模型,在 git bash 中进入合适的目录,输入上述下载页面提供的 git clone 命令即可下载。

git clone https://www.modelscope.cn/ZhipuAI/glm-4-9b-chat.git
或
git clone https://huggingface.co/THUDM/glm-4-9b-chat

glm-4-9b-git下载.png

需要提醒的时,执行命令后,在单个文件下载过程中时没有进度提示的,只有文件下载完成时才会提醒 ‘done’ 。因为大模型的文件较大,如果卡住不动就是正在下载。如果不放心,可以在任务管理器中看一下 Git LFS 进程是否在占用网络。耐心等待后,在目录中就可以看到模型文件被逐个下载下来,bash 中也会有相应的更新:

glm-4-9b-git下载-过程中.png

直到 Filtering content: 100% 表示全部文件已下载完毕,截止 2024 年 8 月,GLM-4-9B-Chat 仓库中的全部文件下载下来约占本地存储空间 35.0 GB。

glm-4-9b-git下载-完成.png

硬件配置要求

根据 GLM 团队在其环境的测试,GLM-4 各模型推理时所需的显存如下表:

模型 精度 输入长度限制 显存占用
GLM-4-9B-Chat BF16 1,000 19 GB
8,000 21 GB
32,000 28 GB
128,000 58 GB
INT4 1,000 8 GB
8,000 10 GB
32,000 17 GB
GLM-4-9B-Chat-1M BF16 200,000 75 GB
GLM-4V-9B BF16 1,000 28 GB
8,000 33 GB
INT4 1,000 10 GB
8,000 15 GB
 
由于我本地环境的 4060 显卡只有 8G 显存,因此下文中,我会使用 INT4 量化精度进行推理。

项目 Demo 部署

项目下载

进入 GLM-4 项目的 github 仓库:https://github.com/THUDM/GLM-4 ,下载 zip 或 git clone 到本地。至此,我们的本地分别有上一节中下载的模型,及刚刚下载的项目,两个目录:

glm-4-9b-项目文件结构.png

项目结构

官方开源的项目仓库中为开发者提供基础的 GLM-4-9B 的使用和开发代码:

/basic_demo 包含了:

  • 使用 transformers 和 vLLM 后端的交互代码
  • OpenAI API 后端交互代码
  • Batch 推理代码

/composite_demo 包含了:

  • GLM-4-9B-Chat 以及 GLM-4V-9B 开源模型的完整功能演示代码,包含了 All Tools 能力、长文档解读和多模态能力的展示。

/fintune_demo 包含了:

  • PEFT (LORA, P-Tuning) 微调代码
  • SFT 微调代码

这里,我们将使用 basic_demo 目录中提供的代码来运行官方 demo。

依赖环境部署

确保你已经安装 python,推荐使用 conda,在 conda 命令行中进入 basic_demo 项目目录,创建虚拟环境:

conda create -n glm-4-web-demo python=3.12

项目部署-conda-create.png

进入虚拟环境:

conda activate glm-4-web-demo

项目部署-conda-activate.png

pip 安装所需依赖:

pip install -r requirements.txt

项目部署-pip-install.png

如果需要微调模型,还需安装 peft。如果不需要也可以将代码中的 import peft 注释掉。

pip install peft

另外,还应注意,截止2024年8月11日,使用最新版的 transformers==4.44.0 会报错,需要安装 4.42.4。

8月12日,官方已更新代码,支持 4.44.0。

通过 CLI 对话

尽管可以使用 CPU 进行推理,但是速度极慢。本次实验我们使用 GPU 推理,首先需要确保本地已安装 CUDA。确保在 python 中可以通过 pytorch 使用 cuda,在 Python 命令行中执行如下命令,若返回 True 则正常:

>> import torch
>> torch.cuda.is_available()

确保 CUDA 可以正常使用后,打开项目目录中的 trans_cli_demo.py ,这个文件是使用 Transformers 作为后端的 CLI Demo,允许用户通过命令行与模型进行指令交互。

修改以下代码,指定 torch 的计算设备为 gpu(若可用):

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

修改以下代码,指定模型的路径:

MODEL_PATH = os.environ.get('MODEL_PATH', r'E:\glm4-9b\glm-4-9b-chat')

修改以下代码,使用 BF16 精度并量化至 INT4 进行推理:

model = AutoModel.from_pretrained(
     MODEL_PATH,
     trust_remote_code=True,
     attn_implementation="flash_attention_2", #如果你没有安装flash attention,可以把这行注释掉
     torch_dtype=torch.bfloat16,
     quantization_config=BitsAndBytesConfig(load_in_4bit=True),
     low_cpu_mem_usage=True
 ).eval()

此时,运行  trans_cli_demo.py ,由于配置了 torch_dtype=torch.bfloat16 ,模型的权重首先会以 BF16 精度加载到内存中。BF16 可以在保持较高精度的同时减少内存占用。当模型在内存中就绪后,由于我们设置了 device 为 cuda ,如果有足够的显存来容纳整个模型,模型就会被加载到显存中。如果显存不足,正常来说则会报错,但我们可以使用量化等技术来减少显存占用。这里我们配置了  quantization_config=BitsAndBytesConfig(load_in_4bit=True)  将权重量化至 INT4 精度,从而显著减少显存占用,得以将模型加载到 8G 以内的显存中。

等待模型加载完毕(在我的环境大概20多秒),就可以通过命令行与模型进行交互:

运行cli.png

我们尝试问一些问题,GLM 将给出回答:

运行cli-对话.png

搭建 Web 服务

打开项目目录中的 trans_web_demo.py ,这个文件是使用 Transformers 作为后端的 Web Demo,使用 Gradio 创建了一个可交互的 Web Chat 界面。

与 CLI Demo 一样,修改代码,指定模型路径,使用 INT4 量化。此外,可以修改最后一行的地址和端口号:

demo.launch(server_name="127.0.0.1", server_port=8001, inbrowser=True, share=True)

运行  trans_web_demo.py  ,等待模型加载完毕(在我的环境大概30多秒),将提供一个本地 URL 和一个公网 URL (由 Gradio 提供的反向代理实现公网访问):

运行web.png

我们可以访问本地 URL 来使用 Web Chat 界面:

webchat界面.png

我们尝试问一些问题,GLM 将给出回答:

webchat界面-对话.png