使用一个已经训练好的深度学习模型(预训练模型)作为初始状态,在目标任务的训练集上进行微调。

使用有标签的数据对模型进行训练,通过最小化模型预测结果与真实标签之间的差异,来优化模型参数。监督微调的关键在于找到适当的数据集,以确保模型能够学习到目标任务的特征。

监督微调脚本

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。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐