【项目】多模态图文理解-GLM-Edge实战
【项目】多模态图文理解-GLM-Edge实战
- (一)模型初体验
- (二)模型介绍
- (三)性能指标
- (1)高通
- (2)Intel
- (四)安装依赖
- (五)模型推理
- (1)Transformers / OpenVINO / vLLM Demo
- (2)XInference
- (六)微调模型
- (1)多轮对话格式
- (2)配置文件
- (3)模型微调
- (4)从保存点进行微调
(一)模型初体验
GLM-Edge-1.5B-Chat 端侧模型体验地址:HuggingFace
GLM-Edge-V-5B 端侧模型体验地址:HuggingFace | 魔搭社区
(二)模型介绍
GLM-Edge 系列是我们在面向端侧真实落地使用的场景下的一次尝试,由两种尺寸的大语言对话模型和多模态理解模型组成
GLM-Edge-1.5B-Chat
GLM-Edge-4B-Chat
GLM-Edge-V-2B
GLM-Edge-V-5B
其中,1.5B / 2B
模型主要面向手机、车机等平台,4B / 5B
模型主要面向PC等平台。
基于GLM-4系列的技术积累,我们针对端侧实际部署情况,对模型结构和尺寸做了针对性的调整,以求在模型表现、实机推理效果和落地便利度之间达到平衡。同时,通过与伙伴企业的深入合作和在推理优化上的不懈努力,在一些端侧平台上,GLM-Edge系列模型能以极快的速度运行。
例如,在高通骁龙8 Elite平台上,借助其强大的NPU算力,GLM-Edge通过混合量化方案,1.5B对话模型、2B多模态模型能实现60tokens/s以上的解码速度。在应用投机采样技术之后,两个模型能以峰值100 tokens/s以上的解码速度运行。
模型下载地址:
Model | HuggingFace Model | GGUF Model |
---|---|---|
GLM-Edge-1.5B-Chat | 🤗 Huggingface 🤖 ModelScope 🟣 WiseModel | 🤗 Huggingface 🤖 ModelScope 🟣 WiseModel |
GLM-Edge-4B-Chat | 🤗 Huggingface 🤖 ModelScope 🟣 WiseModel | 🤗 Huggingface 🤖 ModelScope 🟣 WiseModel |
GLM-Edge-V-2B | 🤗 Huggingface 🤖 ModelScope 🟣 WiseModel | 🤗 Huggingface 🤖 ModelScope 🟣 WiseModel |
GLM-Edge-V-5B | 🤗 Huggingface 🤖 ModelScope 🟣 WiseModel | 🤗 Huggingface 🤖 ModelScope 🟣 WiseModel |
(三)性能指标
数据采集日截止到2024年11月28日。
(1)高通
模型 | 任务 | 量化方案 | 框架 | 1st token latency (ms) | Token Rate (tokens/s) | Peak Memory Footprint (GB) |
---|---|---|---|---|---|---|
GLM-Edge-4B-Chat | (input/output=512/128) | INT4 | QNN | 660 | 24 | 2.9 |
GLM-Edge-1.5B-Chat | (input/output=512/128) | INT4 | QNN | 260 | 65 | 1.2 |
- 在高通8 Elite(Gen4)平台上测试,模型全部运行在NPU上
- 如运行V模型,另外需要单图890ms的处理时间和约660M的额外内存
- 使用投机解码方案时,Token Rate还有最高50%的提升
(2)Intel
模型 | 任务 | 量化方案 | 框架 | 1st token latency (ms) | Token Rate (tokens/s) | Peak Memory Footprint (GB) |
---|---|---|---|---|---|---|
GLM-Edge-4B-Chat | (input/output=1024/128) | INT4 | OPENVINO | 541.2 | 27 | 3.9 |
GLM-Edge-1.5B-Chat | (input/output=1024/128) | INT4 | OPENVINO | 228.2 | 63 | 2.3 |
GLM-Edge-V-2B | Single image understanding (672x672) | INT4 | OPENVINO | 362.1 | 70 | 3.4 |
- 在Intel LNL 288V (ARC 140V 8X@2.05GHz) 平台上测试。
- 如运行V模型,另外需要单图1.7s的处理时间和约2G的额外内存。
(四)安装依赖
# Python>=3.10
git clone https://github.com/THUDM/GLM-Edge.git
cd GLM-Edge
pip install -r requirements.txt
(五)模型推理
(1)Transformers / OpenVINO / vLLM Demo
提供了 vLLM, OpenVINO 和 Transformers 三种后端推理方式。
python inference/cli_demo.py --backend transformers --model_path THUDM/glm-edge-1.5b-chat --precision bfloat16
python inference/cli_demo.py --backend vllm --model_path THUDM/glm-edge-1.5b-chat --precision bfloat16
python inference/cli_demo.py --backend ov --model_path THUDM/glm-edge-1.5b-chat-ov --precision int4
注意:
OpenVINO 版本模型需要进行转换,请前往 这里 运行转换代码。
python convert_chat.py --model_path THUDM/glm-edge-1.5b-chat --precision int4
转换对话模型。
python convert.py --model_path THUDM/glm-edge-v-2b --precision int4
转换视觉理解模型。你也可以在 这里 查看原始的转换代码。
vLLM 版本模型需要从 这里 源代码 安装 vLLM 以正常运行。
如果你想使用 glm-edge-v 系列模型,你可以运行以下命令行交互代码
python inference/cli_demo_vision.py --backend transformers --model_path THUDM/glm-edge-v-2b --precision bfloat16
python inference/cli_demo.py --backend ov --model_path THUDM/glm-edge-1.5b-chat-ov --precision int4
你也可以使用 Gradio 启动 WebUI。
python inference/cli_demo.py --backend transformers --model_path THUDM/glm-edge-1.5b-chat --precision bfloat16
python inference/cli_demo.py --backend vllm --model_path THUDM/glm-edge-1.5b-chat --precision int4 # For Int4 Inference
(2)XInference
如果你使用 XInference 进行推理,你可以通过运行以下命令来运行模型。这是一个命令行交互代码。
xinference launch --model-engine Transformers --model-name glm-edge-v --size-in-billions 2 --model-format pytorch --quantization none
使用 OpenAI API进行推理:
import openai
client = openai.Client(
api_key="cannot be empty",
base_url="http://<XINFERENCE_HOST>:<XINFERENCE_PORT>/v1"
)
output = client.chat.completions.create(
model="glm-edge-v",
messages=[
{
"role": "user",
"content": [
{
'type': 'text',
'text': 'describe this image',
},
{
'type': 'image_url',
'image_url': {
"url": "img.png",
}
},
],
}
],
max_tokens=512,
temperature=0.7
)
print(output)
(六)微调模型
(1)多轮对话格式
多轮对话微调示例采用 GLM-Edge 对话格式约定,对不同角色添加不同 loss_mask
从而在一遍计算中为多轮回复计算 loss
。
对于数据文件,样例采用如下格式:
对于glm-edge-chat系列模型,您应该按照以下格式整理数据。
[
{
"messages": [
{
"role": "system",
"content": "<system prompt text>",
},
{
"role": "user",
"content": "<user prompt text>"
},
{
"role": "assistant",
"content": "<assistant response text>"
},
// Multi_turns
{
"role": "user",
"content": "<user prompt text>"
},
{
"role": "assistant",
"content": "<assistant response text>"
},
]
}
]
这里是一个单轮对话的例子:
{
"messages": [
{
"role": "user",
"content": "类型#裤*材质#牛仔布*风格#性感"
},
{
"role": "assistant",
"content": "3x1的这款牛仔裤采用浅白的牛仔面料为裤身材质,其柔然的手感和细腻的质地,在穿着舒适的同时,透露着清纯甜美的个性气质。除此之外,流畅的裤身剪裁将性感的>腿部曲线彰显的淋漓尽致,不失为一款随性出街的必备单品。"
}
]
}
对于glm-edge-v系列模型,您应该按照以下格式整理数据。
[
{
"messages": [
{
"role": "user",
"content": [
{
"type": "image",
"image": "path/to/image"
},
{
"type": "text",
"text": "图片中的狗在做什么?"
}
]
},
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "zRzRzRzRzRzRzR!这只狗躺在公寓客厅的绿色沙发上。"
}
]
},
{
"role": "user",
"content": [
{
"type": "text",
"text": "这只狗是什么颜色的?"
}
]
},
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "zRzRzRzRzRzRzR!这只狗是棕色和白色的。"
}
]
}
]
}
]
(2)配置文件
微调配置文件位于 config
目录下,包括以下文件:
-
ds_zereo_2 / ds_zereo_3.json
: deepspeed 配置文件。 -
lora.yaml / sft.yaml
: 模型不同方式的配置文件,包括模型参数、优化器参数、训练参数等。 部分重要参数解释如下:- data_config 部分
- train_file: 训练数据集的文件路径。
- val_file: 验证数据集的文件路径。
- test_file: 测试数据集的文件路径。
- num_proc: 在加载数据时使用的进程数量。
- max_input_length: 输入序列的最大长度,对于glm-edge-v系列模型,由于图片占位token个数是584,因此值需要设置大些。
- max_output_length: 输出序列的最大长度。
- training_args 部分
- output_dir: 用于保存模型和其他输出的目录。
- max_steps: 训练的最大步数。
- per_device_train_batch_size: 每个设备(如 GPU)的训练批次大小。
- dataloader_num_workers: 加载数据时使用的工作线程数量。
- remove_unused_columns: 是否移除数据中未使用的列。
- save_strategy: 模型保存策略(例如,每隔多少步保存一次)。
- save_steps: 每隔多少步保存一次模型。
- log_level: 日志级别(如 info)。
- logging_strategy: 日志记录策略。
- logging_steps: 每隔多少步记录一次日志。
- per_device_eval_batch_size: 每个设备的评估批次大小。
- evaluation_strategy: 评估策略(例如,每隔多少步进行一次评估)。
- eval_steps: 每隔多少步进行一次评估。
- predict_with_generate: 是否使用生成模式进行预测。
- generation_config 部分
- max_new_tokens: 生成的最大新 token 数量。
- peft_config 部分
- peft_type: 使用的参数有效调整类型 (支持 LORA 和 PREFIX_TUNING)。
- task_type: 任务类型,这里是因果语言模型 (不要改动)。
- Lora 参数:
- r: LoRA 的秩。
- lora_alpha: LoRA 的缩放因子。
- lora_dropout: 在 LoRA 层使用的 dropout 概率。
- data_config 部分
(3)模型微调
通过以下代码执行 单机多卡/多机多卡 运行,这是使用 deepspeed
作为加速方案的,您需要安装 deepspeed
。接着,按照此命令运行:
OMP_NUM_THREADS=1 torchrun --standalone --nnodes=1 --nproc_per_node=8 finetune.py data/AdvertiseGen/ THUDM/glm-edge-4b-chat configs/lora.yaml # For Chat Fine-tune
OMP_NUM_THREADS=1 torchrun --standalone --nnodes=1 --nproc_per_node=8 finetune_vision.py data/CogVLM-311K/ THUDM/glm-edge-v-5b configs/lora.yaml # For VQA Fine-tune
通过以下代码执行 单机单卡 运行。
python finetune.py data/AdvertiseGen/ THUDM/glm-edge-4b-chat configs/lora.yaml # For Chat Fine-tune
python finetune_vision.py data/CogVLM-311K/ THUDM/glm-edge-v-5b configs/lora.yaml # For VQA Fine-tune
(4)从保存点进行微调
如果按照上述方式进行训练,每次微调都会从头开始,如果你想从训练一半的模型开始微调,你可以加入第四个参数,这个参数有两种传入方式:
yes
, 自动从最后一个保存的 Checkpoint开始训练XX
, 断点号数字 例600
则从序号600 Checkpoint开始训练
例如,这就是一个从最后一个保存点继续微调的示例代码
python finetune.py data/AdvertiseGen/ THUDM/glm-edge-4b-chat configs/lora.yaml yes
python finetune_vision.py data/CogVLM-311K/ THUDM/glm-edge-4b-chat configs/lora.yaml yes