【LLMs 入门实战】基于 PEFT 在私有数据集上高效微调ChatGLM2-6B

原文链接  【LLMs 入门实战】基于 PEFT 在私有数据集上高效微调ChatGLM2-6B - 知乎

本次微调是基于github的hiyouga/ChatGLM-Efficient-Tuning项目进行微调的。

运行环境

采用Anaconda的虚拟环境,为该项目创建一个虚拟环境,再将项目所需的依赖包安装好即可。

  • 创建conda虚拟环境
conda create -n env_name chatglm_efficient_tuning --clone base
  • 激活新建好的虚拟环境
conda activate chatglm_efficient_tuning
  • 下载本项目的依赖包
pip install -r requirements.txt

数据准备

我微调的下游任务是文本匹配任务,也就是给定两个句子,让模型来判断这两个句子是相似还是不相似;构建好任务的prompt之后,训练数据入下所示,训练数据为json格式,一条训练样本,一个字典,分别由prompt和target两个字段:

接下来需要将私有的数据信息,添加到该项目下的data/dataset_info.json中,添加后的信息如图所示:

【LLMs 入门实战】基于 PEFT 在私有数据集上高效微调ChatGLM2-6B_第1张图片

其中faq:是我数据集的名称;file_name:具体我的数据路径;file_sha1可以不填;columns:包括了数据的具体信息,prompt设置为我的数据的prompt字段的数据,response设置为我的数据的target字段,在我的数据里没有query和history就不需要填了;配置好了数据之后就可以开始运行训练脚本了;

开始训练

由于我的数据量比较大,所以采用的是多卡来进行微调;按照该项目的提示,分布式微调的话,首先得配置环境;在命令行输入:

accelerate config

接下来会出现一个交互界面,只需要按照一步一步的提示输入自己的配置即可,如果在配置的过程中有什么不清楚的地方可以参照此项目的这个说明来进行配置,配置好了之后会默认生成一个配置文件,在我的实践中,配置好了之后,生成的配置文件路径如下:/data/home/huangying-ghq/.cache/huggingface/accelerate/default_config.yaml。

接着是开始Run了,这里我采用的是LoRA来进行微调:

task="faq"
dataset="20230713"
path="/data/home/huangying-ghq/project/ChatGLM-Efficient-Tuning-main/"
batch_size=24
gradient_accumulation_steps=4
lora_rank=8
learning_rate=2e-4
epochs=5
logfile="${task}-${dataset}-bsz${batch_size}-ga${gradient_accumulation_steps}-rank${lora_rank}-lr${learning_rate}-epochs${epochs}.log"

cd ${path}
CUDA_VISIBLE_DEVICES=1,4,5 accelerate launch --config_file /data/home/huangying-ghq/.cache/huggingface/accelerate/default_config.yaml src/train_bash.py \
    --stage sft \
    --model_name_or_path /data/home/huangying-ghq/download/models/chatglm2-6b \
    --do_train \
    --dataset faq \
    --finetuning_type lora \
    --output_dir ${path}/models/${task} \
    --per_device_train_batch_size ${batch_size} \
    --gradient_accumulation_steps ${gradient_accumulation_steps} \
    --lr_scheduler_type cosine \
    --logging_steps 100 \
    --save_steps 1000 \
    --learning_rate ${learning_rate} \
    --num_train_epochs ${epochs} \
    --fp16 \
    --lora_rank ${lora_rank} \
    >> ${path}/logs/${logfile} 2>&1 &

这是我个人的训练参数配置,我是将所有的参数配置写进了一个train.sh的文件中,运行的时候只需要

sh train.sh

就行。使用了第1,4,5号卡,可以看见,已经在我的机子上run起来了,batch size设置的为24,显存占用如图所示。

【LLMs 入门实战】基于 PEFT 在私有数据集上高效微调ChatGLM2-6B_第2张图片

实践过程中遇到的坑

基本上比较顺利,出现的问题也比较好解决;

  • 配置环境的过程中,下的包版本不太对,只需要根据报错提示,重新安装所需版本即可;
  • 数据配置过程中有点小问题:在我的数据集里,模型input的字段为prompt,模型输出的字段为target,最开始的时候,在配置data/dataset_info.json的时候,将query字段设置为prompt,运行始终报错,因为该名和data/dataset_info.json的prompt字段重复,修改query字段为空,将prompt赋到prompt字段即可,具体可看前面的数据配置文件。

你可能感兴趣的:(LLMs,ChatGLM,prompt)