ChatGLM-6B微调实践与问题汇总(fine-tune+p-tuning+知识遗忘解决尝试)

1.介绍

ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。在模型量化技术的加持下,INT4 量化级别下显存占用不到6G,满足一些消费级显卡部署的需要。

https://github.com/THUDM/ChatGLM-6B.git

本文只涉及对官方仓库中模型参数全量fine-tune和p-tuning方案的复现,以及对p-tuning训练后,模型对旧知识遗忘现象的优化。

训练后,丧失了原有的对话功能的优化可直接调到第5节

2.软硬件环境

硬件平台

cpu:Inter Xeon Gold 6130 x2

GPU:Tesla V100 16G x8

预训练模型

chatglm-6B

数据集

adgen

软件环境

deepspeed==0.9.2
protobuf
transformers==4.28.1(不建议用requirements中的4.27.1版本,不要问我怎么知道的)
cpm_kernels
torch>=1.10
gradio
mdtex2html
sentencepiece
accelerate
rouge_chinese
nltk
jieba
datasets

3.模型与数据集下载

模型

https://huggingface.co/THUDM/chatglm-6b

数据集

下载处理好的 ADGEN 数据集 https://cloud.tsinghua.edu.cn/f/b3f119a008264b1cabd1/?dl=1,将解压后备用。

4.训练

训练操作过程参考https://github.com/THUDM/ChatGLM-6B/blob/main/ptuning/README.md

4.1 fine-tune

脚本:

ds_train_finetune.sh

LR=1e-4MASTER_PORT=$(shuf -n 1 -i 10000-65535)deepspeed --num_gpus=4 --master_port $MASTER_PORT main.py \--deepspeed deepspeed.json \--do_train \--train_file AdvertiseGen/train.json \--test_file AdvertiseGen/dev.json \--prompt_column content \--response_column summary \--overwrite_cache \--model_name_or_path THUDM/chatglm-6b \--output_dir ./output/adgen-chatglm-6b-ft-$LR \--overwrite_output_dir \--max_source_length 64 \--max_target_length 64 \--per_device_train_batch_size 4 \--per_device_eval_batch_size 1 \--gradient_accumulation_steps 1 \--predict_with_generate \--max_steps 5000 \--logging_steps 10 \--save_steps 1000 \--learning_rate $LR \--fp16

官方给出的deepspeed配置文件为zero stage2,由于本服务器单卡显存较低,需要使用ZeRO stage3 + offload cpu。

新建deepspeed配置文件:deepspeed_zero3_config.json

{"gradient_accumulation_steps":"auto","train_micro_batch_size_per_gpu": "auto","zero_allow_untested_optimizer": true,"fp16": {"enabled": "auto","loss_scale": 0,"initial_scale_power": 16,"loss_scale_window": 1000,"hysteresis": 2,"min_loss_scale": 1},"bf16": {"enabled": "auto"},"optimizer": {"type": "AdamW","params": {"lr": "auto","betas": "auto","eps": "auto","weight_decay": "auto"}},"zero_optimization": {"stage": 3,"offload_optimizer": {"device": "cpu","pin_memory": true},"offload_param": {"device": "cpu","pin_memory": true},"allgather_partitions": true,"allgather_bucket_size": 5e8,"reduce_scatter": true,"contiguous_gradients" : true,"overlap_comm": true,"sub_group_size": 1e9,"reduce_bucket_size": "auto","stage3_prefetch_bucket_size": "auto","stage3_param_persistence_threshold": "auto","stage3_max_live_parameters": 1e9,"stage3_max_reuse_distance": 1e9,"stage3_gather_16bit_weights_on_model_save": true}}

实际训练时需对如下两个参数进行调整

--num-gpus 8
--deepspeed deepspeed_zero3_config.json

训练过程资源利用情况

cpu men GPU 显存
8*550% 8*4.4% 50%-100% 8*(14.8-16G)

GPU利用率波动较大

训练时长

31h11min

针对ADGEN数据集的评价指标

脚本 ptuning/evaluate_finetune.sh

Bleu-4: 8.6162

rouge-1: 30.7453

rouge-2: 7.6246

rouge-1: 24.832

4.2 p-tuning

训练脚本 train.sh

PRE_SEQ_LEN=128
LR=2e-2CUDA_VISIBLE_DEVICES=0 python3 main.py \--do_train \--train_file AdvertiseGen/train.json \--validation_file AdvertiseGen/dev.json \--prompt_column content \--response_column summary \--overwrite_cache \--model_name_or_path THUDM/chatglm-6b \--output_dir output/adgen-chatglm-6b-pt-$PRE_SEQ_LEN-$LR \--overwrite_output_dir \--max_source_length 64 \--max_target_length 64 \--per_device_train_batch_size 1 \--per_device_eval_batch_size 1 \--gradient_accumulation_steps 16 \--predict_with_generate \--max_steps 3000 \--logging_steps 10 \--save_steps 1000 \--learning_rate $LR \--pre_seq_len $PRE_SEQ_LEN \--quantization_bit 4

训练过程资源占用

model Quantized to 8 bit

cpu 内存 GPU 显存
1core100% 0.5% 80%-100% 8500MB

训练总时间:

3h48min

针对ADGEN数据集的评价指标

脚本 :ptuning/evaluate.sh

指标:

Bleu-4: 7.951

rouge-1: 31.520

rouge-2: 7.219

rouge-1: 24.932

5.效果优化,针对”训练后丧失了原有的对话功能“

根据4中的步骤完成训练后,模型在广告生成效果上表现较好(输入:类型#上衣版型#宽松版型#显瘦图案#线条衣样式#衬衫衣袖型#泡泡袖衣款式#抽绳),切两种训练方式得到的模型效果类似。但是在常规的问答或其他任务中,丧失了原有的对话功能,出现了对旧知识遗忘的现象。

https://github.com/THUDM/ChatGLM-6B/issues/1148

所以后续尝试对两种训练方式的训练超参数进行调整:

fine-tune

学习率调整为1e-6 (原始为1e-4),其他参数不变

模型在训练step=2000时,训练收敛,提前结束训练

模型在广告生成和原始对话功能的表现都正常

实际效果如下:

command :( input something or press Ctrl + c to exit ...)
马掉进海里会变成海马么
马掉进海里不会变成海马。马是一种哺乳动物,属于鸮形目,而海马是海龙的别称,属于腔肠动物门。它们是不同的生物,所以马掉进海里不会变成海马。
time consume :2135.13ms, and speed :31.398970588235297 ms / word
command :( input something or press Ctrl + c to exit ...)
类型#上衣*材质#丹宁*颜色#白色*风格#简约*图案#刺绣*衣样式#外套*衣款式#破洞
这件简约而不简单的丹宁外套,采用白色作为基调,将丹宁外套的硬朗气质与白色调的柔和气息相结合,演绎出时尚与干练兼具的都市摩登感。领口、袖口、下摆以及门襟处的破洞设计,在带来个性时尚的同时,也赋予了外套
time consume :2942.03ms, and speed :29.71747474747475 ms / word
command :( input something or press Ctrl + c to exit ...)
老鼠病了可用吃老鼠药么
不建议使用老鼠药来治疗老鼠病。老鼠药通常是用于杀死老鼠或其他害虫,而不是治疗它们的疾病。使用老鼠药可能会导致其他动物的伤害或死亡,并可能违反当地的动物保护法律。
如果老鼠生病了,建议寻求兽医的帮助。兽医可以通过检查和诊断来找出老鼠病的根本原因,并采取适当的治疗措施来治愈它。
time consume :3605.08ms, and speed :26.123768115942028 ms / word
command :( input something or press Ctrl + c to exit ...)
下岗和下海有啥区别
下岗指的是在原公司、单位或者行业失业后选择再就业的情况;下海指的是离开原来的工作,自己创业当老板的情况。两者的主要区别在于就业方向和创业方式的不同。
time consume :1790.36ms, and speed :24.194054054054053 ms / word
p-tuning

学习率调整为1e-4(原始为2e-2),其他参数不变

训练完成后

模型在广告生成和原始对话功能的表现都正常。

针对ADGEN数据集的评价指标:

Bleu-4: 5.6319

rouge-1: 27.1907

rouge-2: 5.0235

rouge-1: 22.4369

实际效果如下:

command :( input something or press Ctrl + c to exit ...)
马掉进海里会变成海马么
马掉进海里不会变成海马,因为马是陆地上的生物,不会变成海洋中的生物。
time consume :1171.6ms, and speed :34.45882352941176 ms / word
command :( input something or press Ctrl + c to exit ...)
类型#上衣*材质#丹宁*颜色#白色*风格#简约*图案#刺绣*衣样式#外套*衣款式#破洞
这件丹宁外套,采用了简约的直筒款式,搭配白色的刺绣图案,看起来兴起兴起。衣袖处破洞的设计,给这件丹宁外套增加了一点幽默感。
time consume :2121.93ms, and speed :34.78573770491803 ms / word
command :( input something or press Ctrl + c to exit ...)
老鼠病了可用吃老鼠药么
不建议使用老鼠药来治疗老鼠的疾病。老鼠药通常用于捕捉老鼠,而不是治疗它们。使用老鼠药可能会对老鼠造成伤害,并且可能会导致它们死亡。此外,使用老鼠药来治疗其他动物可能会导致道德和伦理问题。因此,建议不要试图使用老鼠药来治疗老鼠的疾病。
command :( input something or press Ctrl + c to exit ...)
下岗和下海有啥区别
下岗和下海下海是两个不同的概念。下岗指的是失业后重新就业的过程,下海则指的是离开工作岗位,从事其他行业或职业的过程。
从字面上看,下岗指的是离开原工作岗位,下海指的是从事其他行业或职业。但是,下海与下岗的本质区别在于,下海是对原有的工作岗位的放弃,而下岗则是因为原工作岗位的失业

6.资源占用

推理对比

训练方式 量化 运行显存 内存 VIRT 加载时间 推理速度
p-Tuning fp16 13197MB 0.4% 26G 13s 25-30ms/word
全量fine-Tuning fp16 12255MB 0.3% 24.6G 11s 25-30ms/word

7.问题与解决

6.1 全量fine-tune时,模型初始化报错“NotImplementedError: Cannot copy out of meta tensor; no data!”

修改main.py:124

model = AutoModel.from_pretrained(model_args.model_name_or_path, config=config, trust_remote_code=True)
改为
model = AutoModel.from_pretrained(model_args.model_name_or_path, config=config, trust_remote_code=True, empty_init=False)
“NotImplementedError: Cannot copy out of meta tensor; no data!
这个错误通常是由于Deepspeed在使用自定义权重初始化时出现问题,而这些初始化可能需要从先前的训练中加载权重。如果在使用Deepspeed进行分布式训练时出现此错误,则需要在初始化模型时指定`empty_init=False`,以便在加载权重之前,权重矩阵不会被初始化为空。
AutoModel.from_pretrained是Hugging Face Transformers库中的一个方法,用于从预训练模型中加载权重。在Deepspeed分布式训练中,模型的初始化和权重加载可能需要特殊处理,因此需要使用`empty_init=False`参数来指定在加载权重之前不要将权重矩阵初始化为空。
在其他模型中,可能不需要这个参数是因为它们的初始化和权重加载不需要特殊处理,或者因为它们的代码已经进行了相应的修改以适应Deepspeed的分布式训练流程。”--https://github.com/THUDM/ChatGLM-6B/issues/530

ChatGLM-6B微调实践与问题汇总(fine-tune+p-tuning+知识遗忘解决尝试)相关推荐

  1. 什么是微调(Fine Tune)?什么时候使用什么样的微调?【数据量和数据相似度决定】

    目录 微调的基本思想 什么是模型微调? 为什么要微调? 什么情况下使用微调? 不同数据集下使用微调? 微调的基本思想 我们的网络架构一般可以分为两部分,分别是:特征抽取和softmax回归, 特征抽取 ...

  2. 信创办公--基于WPS的Word最佳实践系列(汇总目录)

    信创办公–基于WPS的Word最佳实践系列(汇总目录) 本系列基于WPS的Word进行最佳实践讲解,欢迎大家学习查看哦~ 信创办公–基于WPS的Word最佳实践系列(目录的插入及更新) 信创办公–基于 ...

  3. ChatGPT fine tune微调+prompt介绍

    目录 1 如何使用ChatGPT 1.1 图片生成 (image generation) 1.2 对话(chat) 1.3 中文纠错 (Chinese Spelling Correct) 1.4 关键 ...

  4. TensorFlow版本的BERT微调:Fine Tune BERT for Text Classification with TensorFlow

    文章目录 写在前面 Project Structure Task 2: Setup your TensorFlow and Colab Runtime. Install TensorFlow and ...

  5. ChatGLM LoRA微调实战方案

      大家好,我是herosunly.985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用.曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名.拥有多项发明专利.对机器学 ...

  6. 实验课程】MindSpore1.0:MobileNetV2网络实现微调(关键词:MobileNetV2、Fine Tune)

    转载地址:https://bbs.huaweicloud.com/forum/thread-83710-1-1.html 作者: archimekai 使用MobileNetV2网络实现微调(Fine ...

  7. python编程基础知识体系_【汇总】Python 编程核心知识体系

    [汇总]Python 编程核心知识体系 大神著作,源自:https://woaielf.github.io/2017/06/13/python3-all/ 本文主要涵盖了 Python 编程的核心知识 ...

  8. 实践数据湖iceberg 第十四课 元数据合并(解决元数据随时间增加而元数据膨胀的问题)

    系列文章目录 实践数据湖iceberg 第一课 入门 实践数据湖iceberg 第二课 iceberg基于hadoop的底层数据格式 实践数据湖iceberg 第三课 在sqlclient中,以sql ...

  9. 【Bert、T5、GPT】fine tune transformers 文本分类/情感分析

    [Bert.T5.GPT]fine tune transformers 文本分类/情感分析 0.前言 text classification emotions 数据集 data visualizati ...

最新文章

  1. mysql plsql 循环_PL/SQL for...loop循环语句
  2. linux 用户态与内核态通信方式简介
  3. 【Java】6.1 Java 8增强的包装类
  4. jQuery中设置树节点被选中
  5. AndroidStudio设置不自动弹出 Documentation 窗口
  6. linux slub分配器浅析
  7. 二维GROUP BY
  8. 科目二、科目三易挂项目整理和网友支招
  9. Oracle技术之初始化参数REMOTE_OS_AUTHENT
  10. 20180601 -1
  11. 英特尔AIDC2018:神经计算棒二代从天而降,软硬生态合作圈尽露锋芒
  12. 中国石化股票价值线分析
  13. 计算机英语面试翻译,英语面试问题及回答带翻译
  14. 虚拟内存设置在其他盘引发的问题(待解决)
  15. postgresql 事务隔离级别与锁
  16. Fragstats景观分析研究
  17. gfsdgfsragf
  18. win10 ESP盘符问题(隐藏系统分区)
  19. h5物体拖动_【点我解锁】11种网易爆款H5交互手势及案例
  20. 图片 bmp 格式详解

热门文章

  1. Kotlin自定义ListView
  2. 反激系列-详细到每个容阻的原理之RCD吸收(1)
  3. 计算机网络学习笔记-杭电
  4. 微信第三方登录 -- (PC端+移动端)
  5. laravel-orm
  6. JavaWeb----学习(21)----struts2---ActionSupport类
  7. 四维世界概念(机器记忆)
  8. django 单表查询
  9. C#中实现多态的三种方式:抽象类,虚方法,接口
  10. 面试官:说说 typeof 与 instanceof 区别?