本文将正式进入模型微调阶段,构建垂直应用大模型。
一、硬件依赖
LLaMA-Factory框架对硬件和软件的依赖可见以下链接的说明文档。
LLaMA-Factory/README_zh.md at main · hiyouga/LLaMA-Factory · GitHub
https://github.com/hiyouga/LLaMA-Factory/blob/main/README_zh.md
可根据该表格中方法和模型参数体量对应的硬件需求来评估自身硬件能否满足。
二、微调设置
训练方法方面,LLaMA-Factory框架不仅支持预训练(Pre-Training)、指令监督微调训练(Supervised Fine-Tuning),还是支持奖励模型训练(Reward Modeling)、PPO、DPO、ORPO等强化学习训练,可使用各种方法完成全参数训练、部分参数训练、LoRA以及QLoRA。
1)首先进入虚拟环境,启动LLaMA-Factory框架的web网页
选择训练阶段,当前即 指令监督微调训练(SFT),载入数据集
可根据实际需求设置相应的学习率、训练轮数、验证集比例、日志间隔、保存间隔等信息。之后点击预览命令,可查看对应配置的命令行,命令可以本地保存,此后以命令行方式运行也是可行的,点击开始进行训练(需选择基础模型)。命令的具体说明如下(LoRA示例)
CUDA_VISIBLE_DEVICES=1 llamafactory-cli train \
--stage sft \ #指定sft微调训练,可选rm,dpo等
--do_train True \ #训练是do_train,预测是do_predict
--model_name_or_path /hXXXXX \ #模型目录
--finetuning_type lora \ #训练类型为lora,也可以进行full和freeze训练
--quantization_bit 4 \ #量化精度,4bit,可选8bit和none不量化
--template XXXX \ #模版,每个模型要选对应的模版,对应关系见上文
--flash_attn auto \ #flash attention,闪光注意力机制,一种加速注意力计算的方法
--dataset_dir data \ #数据目录
--dataset oaast_sft_zh \ #数据集,可以通过更改dataset_info.json文件配置自己的数据集
--cutoff_len 1024 \ #截断长度
--learning_rate 5e-05 \ #学习率,AdamW优化器的初始学习率
--num_train_epochs 20.0 \ #训练轮数,需要执行的训练总轮数
--max_samples 100000 \ #最大样本数,每个数据集的最大样本数
--per_device_train_batch_size 1 \ #批处理大小,每个GPU处理的样本数量,推荐为1
--gradient_accumulation_steps 1 \ #梯度累积,梯度累积的步数,推荐为1
--lr_scheduler_type cosine \ #学习率调节器,可选line,constant等多种
--max_grad_norm 1.0 \ #最大梯度范数,用于梯度裁剪的范数
--logging_steps 100 \ #日志间隔,每两次日志输出间的更新步数
--save_steps 5000 \ #保存间隔,每两次断点保存间的更新步数。
--warmup_steps 0.1 \ #预热步数,学习率预热采用的步数。
--optim adamw_torch \ #优化器,使用的优化器:adamw_torch、adamw_8bit 或 adafactor
--packing False \
--report_to none \
--output_dir savesXXXXXX \ #数据目录
--fp16 True \ #计算类型,可以fp16、bf16等
--lora_rank 32 \ #LoRA秩,LoRA矩阵的秩大小,越大精度越高,推荐32
--lora_alpha 16 \ #LoRA 缩放系数
--lora_dropout 0 \
--lora_target W_pack \ #模型对应的模块,具体对应关系见上文
--val_size 0.1 \
--evaluation_strategy steps \
--eval_steps 5000 \
--per_device_eval_batch_size 1 \
--load_best_model_at_end True \
--plot_loss True
本文采用LoRA方法对模型进行微调。
LoRA的基本原理是利用模型参数的稀疏性,通过学习模型参数的局部关系来高效地微调模型。具体来说,LoRA通过随机选择一部分模型参数进行微调,而不是对所有参数进行微调。这种方法可以大大减少模型的训练时间和计算资源,同时提高模型的性能。在实现上,LoRA可以分为两个阶段。在第一阶段,LoRA随机选择一部分模型参数进行训练,得到一个初步的微调模型。在第二阶段,LoRA对初步微调模型进行优化,进一步调整模型参数。这个过程可以重复多次,以得到更好的性能。
LoRA的优点在于它能够有效地利用模型参数的稀疏性,减少训练时间和计算资源。同时,由于LoRA只对部分参数进行微调,可以避免过拟合和泛化能力下降的问题。此外,LoRA还可以扩展到大规模深度学习模型中,具有广泛的应用前景。
在实际应用中,LoRA已经被应用于各种深度学习模型和任务中,取得了显著的效果。例如,在自然语言处理领域中,LoRA被用于文本分类、情感分析、机器翻译等任务中,取得了优秀的性能表现。在计算机视觉领域中,LoRA被用于图像分类、目标检测、人脸识别等任务中,也取得了很好的效果。
三、微调llama3-8b-chinese-chat模型
选择已经配置好路径的llama-9b-chinese模型
设置对应的输出目录和配置路径,开启训练
整个指令微调过程耗时约8个小时,需要耐心等待
检查显卡的运行情况
nvidia-smi
在训练的过程中也可随时保存参数,中断训练
之后,可选择相应的配置进行恢复
此后,可接着中断点继续训练模型
模型训练完成后会显示训练情况
导出损失率和训练轮数的折线图
随着训练epoch的增加,损失值总体呈下降趋势。这通常表明模型在学习和改进,对数据的拟合逐渐变得更好。