GPT实战系列-如何用自己数据微调ChatGLM2模型训练

GPT实战系列-如何用自己数据微调ChatGLM2模型训练

1、训练数据

广告文案生成模型

输入文字:类型#裙颜色#蓝色风格#清新*图案#蝴蝶结

输出文案:裙身处采用立体蝴蝶结装饰辅以蓝色条带点缀,令衣身造型饱满富有层次的同时为其注入一丝甜美气息。将女孩清新娇俏的一面衬托而出。

训练和测试数据组织:
{"content": "类型#裙*颜色#蓝色*风格#清新*图案#蝴蝶结", "summary": "裙身处采用立体蝴蝶结装饰辅以蓝色条带点缀,令衣身造型饱满富有层次的同时为其注入一丝甜美气息。将女孩清新娇俏的一面衬托而出。"}

{"content": "类型#裙*颜色#白色*风格#清新*图案#碎花*裙腰型#松紧腰*裙长#长裙*裙衣门襟#拉链*裙款式#拉链", "summary": "这条颜色素雅的长裙,以纯净的白色作为底色,辅以印在裙上的点点小碎花,<UNK>勾勒出一幅生动优美的“风景图”,给人一种大自然的清新之感,好似吸收新鲜空气的那种舒畅感。腰间贴心地设计成松紧腰,将腰线很好地展现出来,十分纤巧,在裙子的侧边,有着一个隐形的拉链,能够让你穿脱自如。"}

数据可以从 下载链接,test.json
或者Tsinghua Cloud 下载处理好的 ADGEN 完整数据集。可以看到解压后的文件有两个,分别是train.json和dev.json。

2、训练脚本

ChatGLM2的训练源代码:https://github.com/THUDM/ChatGLM2-6B

文件目录结构:

├── FAQ.md
├── MODEL_LICENSE
├── README.md   说明文档
├── README_EN.md
├── api.py
├── cli_demo.py
├── evaluation
│  ├── README.md
│  └── evaluate_ceval.py
├── openai_api.py
├── ptuning
│  ├── README.md 说明文档
│  ├── arguments.py
│  ├── deepspeed.json
│  ├── ds_train_finetune.sh
│  ├── evaluate.sh
│  ├── evaluate_finetune.sh
│  ├── main.py
│  ├── train.sh  训练脚本
│  ├── train_chat.sh
│  ├── trainer.py
│  ├── trainer_seq2seq.py
│  ├── web_demo.py
│  └── web_demo.sh 测试脚本
├── requirements.txt 环境依赖文件
├── resources
│  ├── WECHAT.md
│  ├── cli-demo.png
│  ├── knowledge.png
│  ├── long-context.png
│  ├── math.png
│  ├── web-demo.gif
│  ├── web-demo2.gif
│  └── wechat.jpg
├── utils.py
├── web_demo.py
└── web_demo2.py

# 安装python3.10
pyenv install 3.10.4

# 安装相关依赖

pip install rouge_chinese nltk jieba datasets

pip install -f requirements.txt

p-tuning

P-tuning的全称是Prefix-tuning,意为“前缀调优”。它通过在模型输入前添加小段Discrete prompt(类似填空句),并只优化这个prompt来实现模型微调。P-tuning-v2是基于Prompt-tuning方法的NLP模型微调技术。总体来说,P-tuning-v2是Prompt tuning技术的升级版本,使得Prompt的表示能力更强,应用也更灵活广泛。它被认为是Prompt tuning类方法中效果最优且易用性最好的版本。

进入ptuning目录

代码实现对于 ChatGLM2-6B 模型基于 P-Tuning v2 的微调。P-Tuning v2 将需要微调的参数量,减少到原来的 0.1%,再通过模型量化、Gradient Checkpoint 等方法,预测最低只需要 7GB 显存即可运行。

将训练和测试数据解压后的 AdvertiseGen 目录放到ptuning目录下。

3、执行训练

训练之前,需要根据自己的训练需求,训练数据和机器配置情况修改代码。

调整

修改训练配置

修改train.sh

# 这两处改为自己数据集的路径
–train_file AdvertiseGen/train.json
–validation_file AdvertiseGen/dev.json
# 数据集少的话,训练步数可以调整
–max_steps 3000

–PRE_SEQ_LEN 和 LR 分别是 soft prompt 长度和训练的学习率,可以进行调节以取得最佳的效果。

–模型量化、批次参数 P-Tuning-v2 方法会冻结全部的模型参数,可通过调整 quantization_bit 来被原始模型的量化等级,不加此选项则为 FP16 精度加载。

在默认配置 quantization_bit=4、per_device_train_batch_size=1、gradient_accumulation_steps=16 下,INT4 的模型参数被冻结,一次训练迭代会以 1 的批处理大小进行 16 次累加的前后向传播,等效为 16 的总批处理大小,此时最低只需 6.7G 显存。若想在同等批处理大小下提升训练效率,可在二者乘积不变的情况下,加大 per_device_train_batch_size 的值,但也会带来更多的显存消耗,请根据实际情况酌情调整。

–模型目录。如果你想要从本地加载模型,可以将 train.sh 中的 THUDM/chatglm2-6b 改为你本地的模型路径。

修改main.py

在代码的351行,代码注释掉了 trainer.save_model(),这是保存模型的语句。当训练完成后就会生成一个pytorch_model.bin文件,后面测试时会用到。

运行

执行以下指令进行训练:

./train.sh

当出现以下信息后,模型训练迭代开始。

{'loss': 3.0614, 'learning_rate': 0.018000000000000002, 'epoch': 4.21}
{'loss': 2.2158, 'learning_rate': 0.016, 'epoch': 8.42}

训练完成后,屏幕将打印这类信息:

***** train metrics *****
 epoch          =   xx
 train_loss        =   xx
 train_runtime      = xx
 train_samples      =   xx
 train_samples_per_second =   xx
 train_steps_per_second  =   xx

4、问题解决

问题一
from rouge_chinese import Rouge
ModuleNotFoundError: No module named 'rouge_chinese'

解决:

没有安装rouge模块,pip安装即可。

pip install rouge_chinese

问题二
[W socket.cpp:558] [c10d] The client socket has failed to connect to [localhost]:12355 (errno: 99 - Cannot assign requested address).

解决:
因为之前安装云容器,云主机访问不到,hosts把相应的配置注释掉即可。

问题三
 RuntimeError: Default process group has not been initialized, please make sure to call init_process_group.

解决:

检查transforms版本,调整transformers版本即可。

问题四
ValueError: Unable to create tensor, you  should probably activate truncation and/or padding with 'padding=True'  'truncation=True' to have batched tensors with the same length. Perhaps  your features 。。

ERROR:torch.distributed.elastic.multiprocessing.api:failed (exitcode: 1) local_rank: 0 (pid: 16858) of binary

torch.distributed.elastic.multiprocessing.errors.ChildFailedError: 


解决:

显存不够,调小batch_size等调低显存的方式。

End


相关文章:

GPT实战系列-ChatGLM2模型的微调训练参数解读

GPT实战系列-如何用自己数据微调ChatGLM2模型训练

GPT实战系列-ChatGLM2部署Ubuntu+Cuda11+显存24G实战方案

GPT实战系列-Baichuan2本地化部署实战方案

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
你可以按照如下步骤来微调 GPT-Neo 125M: 1.准备数据集。将文本数据整理成每行一句话的形式,并存储成文本文件(如txt格式)。 2.下载 GPT-Neo 125M 模型的代码和预训练模型,然后对其进行微调。可以使用 Hugging Face Transformers 中的库对模型进行微调,代码示例为: ```python from transformers import pipeline, set_seed, GPTNeoForCausalLM, GPT2TokenizerFast, LineByLineTextDataset, DataCollatorForLanguageModeling, Trainer, TrainingArguments # 加载预训练GPT-Neo 模型和tokenizer model = GPTNeoForCausalLM.from_pretrained('EleutherAI/gpt-neo-125M') tokenizer = GPT2TokenizerFast.from_pretrained('EleutherAI/gpt-neo-125M') # 加载用于微调的文本数据集 dataset = LineByLineTextDataset(tokenizer=tokenizer, file_path="path/to/textfile.txt", block_size=128) # 创建数据收集器 data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False) # 定义微调的具体参数 training_args = TrainingArguments( output_dir='./results', # 训练结果输出目录 overwrite_output_dir=True, # 是否覆盖输出目录 num_train_epochs=2, # 微调的epochs数目 per_device_train_batch_size=32, # 每个设备的训练批次大小,建议使用大于等于单卡批次大小的值 save_steps=10000, # 保存模型的步骤数 learning_rate=1e-4, warmup_steps=1000, save_total_limit=2, prediction_loss_only=True ) # 训练微调模型 trainer = Trainer( model=model, args=training_args, data_collator=data_collator, train_dataset=dataset, ) trainer.train() ``` 在这个示例中,我们使用了 GPTNeoForCausalLM 来加载预训练模型,然后使用 GPT2TokenizerFast 加载了预训练模型的tokenizer。接下来,我们使用 LineByLineTextDataset 加载了微调的文本数据集,然后创建了一个数据收集器 DataCollatorForLanguageModeling,这个收集器将数据集包装成适合模型训练的批处理的形式。 然后,我们定义了微调的参数,包括训练结果的输出目录、训练的epochs数目、每个设备的训练批次大小、保存模型的步数、学习率等参数,然后使用Trainer开始训练微调模型。 3.保存微调后的模型。在完成微调后,可以使用以下代码将训练得到的微调模型保存下来: ```python trainer.save_model("path/to/model") ``` 在这里,我们使用 trainer.save_model() 函数将微调后的模型保存在指定的路径下。 这就是用自己的数据微调 GPT-Neo 125M 的完整过程。当然,这只是基本示例,你可以根据你的需求进行微调模型的调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alex_StarSky

你的鼓励是创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值