原文链接 【LLMs 入门实战】基于 PEFT 在私有数据集上高效微调ChatGLM2-6B - 知乎
本次微调是基于github的hiyouga/ChatGLM-Efficient-Tuning项目进行微调的。
采用Anaconda的虚拟环境,为该项目创建一个虚拟环境,再将项目所需的依赖包安装好即可。
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中,添加后的信息如图所示:
其中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,显存占用如图所示。
基本上比较顺利,出现的问题也比较好解决;