SFT监督微调
本文介绍了如何使用预训练深度学习模型进行监督微调(Supervised Fine-Tuning, SFT),以优化模型在特定任务上的表现。微调过程涉及在有标签的数据集上训练模型,通过最小化预测结果与真实标签之间的差异来调整模型参数。关键步骤包括选择合适的数据集、设置训练参数(如学习率、批次大小、训练轮数等),以及使用特定的微调技术(如LoRA)。此外,文章还详细说明了如何通过命令行参数配置训练过程
使用一个已经训练好的深度学习模型(预训练模型)作为初始状态,在目标任务的训练集上进行微调。
使用有标签的数据对模型进行训练,通过最小化模型预测结果与真实标签之间的差异,来优化模型参数。监督微调的关键在于找到适当的数据集,以确保模型能够学习到目标任务的特征。
监督微调脚本
CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \
--stage sft \
--model_name_or_path llama/chinese-alpaca-2-13b-hf \
--do_train \
--dataset cail_law_train \
--template default \
--finetuning_type lora \
--lora_target q_proj,v_proj \
--output_dir saves/2023-09-08-10-16-09/ \
--overwrite_cache \
--per_device_train_batch_size 4 \
--gradient_accumulation_steps 4 \
--lr_scheduler_type cosine \
--logging_steps 10 \
--save_steps 100 \
--learning_rate 5e-4 \
--num_train_epochs 20.0 \
--max_samples 100000 \
--plot_loss \
--fp16
--stage sft: 训练阶段。这里指定为sft,表示进行模型的微调(self-supervised fine-tuning)阶段。
--do_train: 是否进行训练,设置为True表示进行训练。还可以设置为(--do_eval:表示评估,--do_predict:表示预测)
--dataset self_cognition: 数据集名称。这里指定为self_cognition,表示使用自我认知数据集。
--model_name_or_path /ossfs/workspace/models/Chinese-Llama-2-7b: 预训练模型的名称或路径。这里指定为/ossfs/workspace/models/Chinese-Llama-2-7b,表示加载路径下的预训练模型。
--output_dir /ossfs/workspace/llama2-sft/checkpoint-01: 训练输出目录。训练过程中生成的模型和日志将保存在该目录下。
--template default: 模板名称。这里指定为default,表示使用默认模板。
--finetuning_type lora: 微调类型。这里指定为lora,表示使用LoRA(Language Representation with Additive Transformation)微调方法。
--lora_target q_proj,v_proj: LoRA微调的目标层。这里指定为q_proj,v_proj,表示只对q_proj和v_proj两个层进行微调。
--overwrite_cache: 是否覆盖缓存。设置为True表示覆盖缓存。
--per_device_train_batch_size 4: 每个设备的训练批次大小。这里指定为4,表示每个设备上的训练批次大小为4。
--gradient_accumulation_steps 4: 梯度累积步数。这里指定为4,表示每4个步骤累积一次梯度。
--lr_scheduler_type cosine: 学习率调度器类型。这里指定为cosine,表示使用余弦学习率调度器。
--logging_steps 10: 日志记录步数。每训练多少步记录一次训练日志。
--save_steps 2000: 模型保存步数。每训练多少步保存一次模型。
--learning_rate 1e-3: 学习率。这里指定为1e-3,表示初始学习率为0.001。
--num_train_epochs 10.0: 训练轮数。这里指定为10.0,表示进行10轮训练。
--plot_loss: 是否绘制损失曲线。设置为True表示绘制损失曲线。
--fp16: 是否使用混合精度(half-precision)训练。设置为True表示使用混合精度训练。
混合精度训练是指在训练的过程中,同时使用单精度(FP32)和半精度(FP16)。 降低计算时间和显存消耗,
参数说明
1、stage 训练种类
单选项:pt、sft、rm、ppo、dpo
- pt(Pre-Training预训练)
- sft(Supervised Fine-Tuning指令监督微调)
- rm(Reward Modeling奖励模型训练)
- ppo(PPO Training PPO训练)
- dpo(DPO Training DPO训练)
--stage sft \
2、model_name_or_path 大模型路径
3、do_train 是否训练(do_predict 是否预测; do_eval 是否评测)
默认为True
--do_train \
# 也可以这样:
--do_train True \
4、finetuning_type 微调方法
单选项:full、lora、freeze
- full 全参数
- lora 默认项
- freeze
# 当添加下面的量化参数后,即是4比特或8比特的LoRA训练,也就启用了QLoRA训练。
--quantization_bit 4/8
LoRA(Low-Rank Adaptation Of Large Language Models)是一种基于低秩适应的微调技术。它通过在LLM的权重矩阵上应用分解低秩矩阵,将模型的参数量大幅减少,从而降低计算复杂度和内存需求。这使得LoRA在保持模型性能的同时,能够在有限的计算资源下进行高效的微调。
5、per_device_train_batch_size 批大小
训练调整参数前所选取的样本数量
假如训练集中数据有1000条,per_device_train_batch_size为4,那么将该训练集全部学习一遍(即训练一轮)的steps就是1000/4=250。同时其也影响训练时长。待续。。。
6、gradient_accumulation_steps 梯度累计步数
这个和per_device_train_batch_size配合使用。
当训练一个大模型时,每一步迭代都会进行梯度更新和参数更新,当其每一步迭代所训练的样本达到一个适当值时,参数更新的也会比较好(中间涉及前向和后向传播等),其训练效果会比较好。
假如一次迭代训练需要8条样本,per_device_train_batch_size设为8,如果显存足够,就不用设置gradient_accumulation_steps;如果显存不够,就会out of memory,这时候需要调小per_device_train_batch_size,例如调小为4,为了达到迭代所需8条样本,我们可以设置gradient_accumulation_steps为2。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)