写在前面
大家好,我是刘聪NLP。
不知不觉之间,距开源ChatGLM-Finetuning项目已经过去了8个月。大模型也在飞速的发展,开源社区也是越来越活跃,开源模型越来越多。
中间更新过一次,将代码重构让大家更容易理解,本次更新主要增加ChatGLM3模型和增加模型预测代码。
Github: https://github.com/liucongg/ChatGLM-Finetuning
为什么要再次更新呢?
- 支持ChatGLM3模型是为了让这个项目有一个更好的延续,如果后面有ChatGLM4的话,还会继续更新。
- 细心的朋友应该可以发现本项目的训练数据构造代码,是参考每个模型在chat部分数据构造进行编写的。所以用本项目训练完的模型,预测阶段用model.chat即可。这也是为什么上一次更新没有提供predict代码的原因。
本项目的宗旨,还是带领大家入门学习,带领大家用不同方式的微调(Freeze方法、Lora方法、P-Tuning方法和全量参数)来进行大模型微调实验,欢迎大家Star。
PS:本项目应该不会增加其他系列模型了,如果做的话也是重开一个新的项目,后面争取在该项目上补充增加一些注释内容,帮助更多的初学者或者非专业人员理解代码吧。
项目介绍
本项目主要针对ChatGLM、ChatGLM2和ChatGLM3模型进行不同方式的微调(Freeze方法、Lora方法、P-Tuning方法、全量参数等),并对比大模型在不同微调方法上的效果,主要针对信息抽取任务、生成任务、分类任务等。
本项目支持单卡训练&多卡训练,由于采用单指令集方式微调,模型微调之后并没有出现严重的灾难性遗忘。
由于官方代码和模型一直在更新,目前ChatGLM1和2的代码和模型的为20230806版本(注意如果发现代码运行有误,可将ChatGLM相关源码替换文件中的py文件,因为可能你下的模型版本与本项目代码版本不一致),ChatGLM3是版本20231212。
PS:没有用Trainer(虽然Trainer代码简单,但不易修改,大模型时代算法工程师本就成为了数据工程师,因此更需了解训练流程)
更新简介
- update-2023.12.12 增加ChatGLM3代码支持,通过model_type完成模型切换,并增加推理代码。
- update-2023.08.06 代码和模型已经更新到最新,支持单卡&多卡训练,支持ChatGLM2模型训练、支持全量参数训练,所有代码进行了结构增加可读性。
- update-2023.06.12 增加流水线并行训练方法,请看v0.1 Tag
- update-2023.04.18 增加文本生成任务评测,请看v0.1 Tag
- update-2023.04.05 增加信息抽取任务评测,请看v0.1 Tag
微调方法
Freeze方法-ChatGLM3单卡训练
CUDA_VISIBLE_DEVICES=0 deepspeed --master_port 520 train.py \
--train_path data/spo_0.json \
--model_name_or_path ChatGLM3-6B/ \
--per_device_train_batch_size 1 \
--max_len 1560 \
--max_src_len 1024 \
--learning_rate 1e-4 \
--weight_decay 0.1 \
--num_train_epochs 2 \
--gradient_accumulation_steps 4 \
--warmup_ratio 0.1 \
--mode glm3 \
--train_type freeze \
--freeze_module_name "layers.27.,layers.26.,layers.25.,layers.24." \
--seed 1234 \
--ds_file ds_zero2_no_offload.json \
--gradient_checkpointing \
--show_loss_step 10 \
--output_dir ./output-glm3
Ptuning方法-ChatGLM3单卡训练
CUDA_VISIBLE_DEVICES=0 deepspeed --master_port 520 train.py \
--train_path data/spo_0.json \
--model_name_or_path ChatGLM3-6B/ \
--per_device_train_batch_size 1 \
--max_len 1560 \
--max_src_len 1024 \
--learning_rate 1e-4 \
--weight_decay 0.1 \
--num_train_epochs 2 \
--gradient_accumulation_steps 4 \
--warmup_ratio 0.1 \
--mode glm3 \
--train_type ptuning \
--seed 1234 \
--ds_file ds_zero2_no_offload.json \
--gradient_checkpointing \
--show_loss_step 10 \
--pre_seq_len 16 \
--prefix_projection True \
--output_dir ./output-glm3
Lora方法-ChatGLM3单卡训练
CUDA_VISIBLE_DEVICES=0 deepspeed --master_port 520 train.py \
--train_path data/spo_0.json \
--model_name_or_path ChatGLM3-6B/ \
--per_device_train_batch_size 1 \
--max_len 1560 \
--max_src_len 1024 \
--learning_rate 1e-4 \
--weight_decay 0.1 \
--num_train_epochs 2 \
--gradient_accumulation_steps 4 \
--warmup_ratio 0.1 \
--mode glm3 \
--lora_dim 16 \
--lora_alpha 64 \
--lora_dropout 0.1 \
--lora_module_name "query\_key\_value,dense\_h\_to\_4h,dense\_4h\_to\_h,dense" \
--seed 1234 \
--ds_file ds_zero2_no_offload.json \
--gradient_checkpointing \
--show_loss_step 10 \
--output_dir ./output-glm3
全参方法-ChatGLM3四卡训练,通过CUDA_VISIBLE_DEVICES控制具体哪几块卡进行训练,如果不加该参数,表示使用运行机器上所有卡进行训练
CCUDA_VISIBLE_DEVICES=0,1,2,3 deepspeed --master_port 520 train.py \
--train_path data/spo_0.json \
--model_name_or_path ChatGLM3-6B \
--per_device_train_batch_size 1 \
--max_len 1560 \
--max_src_len 1024 \
--learning_rate 1e-4 \
--weight_decay 0.1 \
--num_train_epochs 2 \
--gradient_accumulation_steps 4 \
--warmup_ratio 0.1 \
--mode glm3 \
--train_type all \
--seed 1234 \
--ds_file ds_zero3_no_offload.json \
--gradient_checkpointing \
--show_loss_step 10 \
--output_dir ./output-glm3
更多内容,请看Github。
写在后面
最近流感高发期,我已中招。 望大家都保重身体。
欢迎多多关注公众号「NLP工作站」,欢迎加入交流群,有问题的朋友也欢迎加我微信「logCong」私聊,交个朋友吧,一起学习,一起进步。我们的口号是“生命不止,学习不停”。
PS:新书已出《ChatGPT原理与实战》,欢迎购买。
往期推荐:
- 大模型微调技巧 | 高质量指令数据筛选方法-MoDS
- 辟谣!微软撤回声称ChatGPT为20B参数的论文,并给出解释。
- 如何看待微软论文声称 ChatGPT 是 20B (200亿) 参数量的模型?
- 大模型微调技巧-在Embeeding上加入噪音提高指令微调效果
- 如何从数据集中自动识别高质量的指令数据
- BaiChuan2技术报告细节分享&个人想法
- 大模型LLM微调经验总结&项目更新
- 打造LLM界的Web UI
- 是我们在训练大模型,还是大模型在训练我们?
- Llama2技术细节&开源影响
- 大模型时代-行业落地再思考
- 垂直领域大模型的一些思考及开源模型汇总
- 如何评估大模型-LLMs的好坏?
- 总结|Prompt在NER场景的应用