Read this in English
本 demo 中,你将体验到如何微调 GLM-Edge 对话开源模型。 请严格按照文档的步骤进行操作,以避免不必要的错误。
多轮对话微调示例采用 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!这只狗是棕色和白色的。"
}
]
}
]
}
]
微调配置文件位于 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 部分
通过以下代码执行 单机多卡/多机多卡 运行,这是使用 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
如果按照上述方式进行训练,每次微调都会从头开始,如果你想从训练一半的模型开始微调,你可以加入第四个参数,这个参数有两种传入方式:
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