如下是损失图片,验证集损失和训练参数:
参数:
model_path=/opt/workspace-cyx/model_test/Qwen1.5-14B
train_dataset_dir=alpaca_gpt4_data_en,alpaca_gpt4_data_zh,oaast_sft_zh,oaast_sft
per_device_train_batch_size=4
gradient_accumulation_steps=2
output_dir=/opt/workspace-cyx/model_test/output_dir
accelerate launch --config_file accelerate_config.yaml src/train_bash.py \
--max_samples 1000000 \
--stage sft \
--do_train \
--model_name_or_path ${model_path} \
--dataset ${train_dataset_dir} \
--template qwen \
--finetuning_type lora \
--lora_target q_proj,v_proj \
--output_dir ${output_dir} \
--per_device_train_batch_size ${per_device_train_batch_size} \
--gradient_accumulation_steps ${gradient_accumulation_steps} \
--lr_scheduler_type cosine \
--logging_steps 5 \
--save_steps 2000 \
--learning_rate 1e-5 \
--num_train_epochs 1.0 \
--plot_loss \
--fp16
--do_eval
--save_steps 100 \
--eval_steps 100 \
--val_size 0.01 \
--evaluation_strategy steps \
Qwen和Qwen1.5的7B和14B都有微调,使用的是llama_factory自带的alpaca_gpt4_data_en,alpaca_gpt4_data_zh,oaast_sft_zh,oaast_sft这四个数据集。
训练历程:
1.我初步想的是不是参模型不适用,但是试了好几个千问的模型,都有不同程度的震荡
2.然后开始修改参数,但是修改batch-size,lora_rank等参数,结果还是相差无几
3.数据集是官方提供的,应该是没有问题,总的指令有几十W条
现在的想法是:
1.这个模型到底是不是有没有收敛,是不是模型训练没有问题,只是Qwen1.5能力很强,对于这些数据集接收能力很强,正常震荡【因为验证集没啥问题】
2.参数/数据集存在问题,但是调过很多次了还是没能解决
不知道大家在微调有没有遇到此类问题,是如何解决的,还希望有大佬为我解惑!
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您提供的信息,您在微调Qwen1.5-14B模型时遇到了训练损失震荡的问题,并且尝试了多种参数调整和数据集验证,但仍未解决。以下是基于知识库资料和您的描述的详细分析与建议。
从您描述的现象来看,验证集损失没有明显异常,这表明模型可能已经收敛,但训练损失存在震荡。这种情况可能由以下原因导致:
学习率是影响模型训练稳定性的关键因素。如果学习率过高,可能会导致训练过程中的震荡现象。
建议: - 尝试降低学习率(例如从1e-5
调整为5e-6
或更低)。 - 使用warmup
策略(lr_warmup=true
),让学习率在训练初期逐渐增加,避免初始阶段的剧烈波动。
虽然您提到数据集是官方提供的,但如果数据集中某些类别的样本数量差异较大,可能会导致模型在训练过程中对不同类别样本的学习效果不一致,从而引发震荡。
建议: - 检查数据集的分布情况,确保各类别样本数量均衡。 - 如果数据分布不均,可以使用加权采样(weighted sampling)来平衡不同类别的样本权重。
Qwen1.5-14B是一个大模型,其强大的表达能力可能导致在小规模数据集上出现过拟合或震荡现象。
建议: - 增加正则化手段,例如: - 提高lora_rank
值以增强LoRA模块的表达能力。 - 添加weight_decay
参数(如0.01
)以抑制过拟合。 - 减少训练轮数(num_train_epochs
),避免模型过度拟合训练数据。
您提到已经尝试调整batch_size
、lora_rank
等参数,但效果不明显。以下是一些进一步的优化建议:
当前配置中,per_device_train_batch_size=4
,gradient_accumulation_steps=2
,实际的全局批量大小为4 * 2 = 8
。对于Qwen1.5-14B这样的大模型,较小的批量大小可能导致梯度更新不稳定。
建议: - 增大per_device_train_batch_size
(如8
或16
),并相应减少gradient_accumulation_steps
,以提高梯度更新的稳定性。 - 如果显存不足,可以通过混合精度训练(fp16
)或分布式训练来缓解资源限制。
LoRA(Low-Rank Adaptation)是一种高效的微调方法,但其效果依赖于lora_rank
和lora_alpha
的合理配置。
建议: - 增大lora_rank
(如从默认值8
调整为16
或32
),以增强LoRA模块的表达能力。 - 调整lora_alpha
(通常设置为lora_rank
的2倍),以控制LoRA模块的缩放因子。
您当前使用的是cosine
学习率调度器,这种调度器在训练后期会逐渐减小学习率,有助于模型收敛。但如果学习率下降过快,可能会导致训练过程中的震荡。
建议: - 尝试使用polynomial
调度器,并调整power
参数(如0.9
),以更平滑地降低学习率。
您提到数据集是官方提供的,且包含几十万条指令,理论上应该没有问题。但仍需注意以下几点:
即使数据集来自官方,也可能存在噪声或低质量样本。
建议: - 对数据集进行清洗,移除重复、模糊或无关的样本。 - 确保数据格式符合模型输入要求(如模板qwen
)。
您当前的验证集比例为val_size=0.01
,即仅使用1%的数据作为验证集。如果验证集过小,可能会导致评估结果不够稳定。
建议: - 增大验证集比例(如0.1
),以提高评估结果的可靠性。
您使用的是steps
评估策略,每100
步进行一次评估。如果评估频率过高,可能会增加计算开销,同时导致评估结果波动。
建议: - 调整eval_steps
为更大的值(如500
),以减少评估频率。
如果您使用了预训练模型(pretrained_model
),需要确保模型初始化正确。
建议: - 检查model_name_or_path
是否指向正确的预训练模型路径。 - 如果使用LoRA微调,确保use_pretrained_model=true
,并在训练前加载预训练权重。
大模型训练对硬件资源要求较高,如果显存不足或CPU/GPU性能不足,可能会导致训练过程不稳定。
建议: - 使用分布式训练(如DLC
或BigDL-LLM
容器)来分担计算压力。 - 确保硬件资源分配合理(如cpuset-cpus
和cpuset-mems
参数)。
warmup
策略,同时检查数据集的分布是否均衡。batch_size
、lora_rank
和学习率调度器,确保训练过程稳定。如果以上方法仍无法解决问题,建议尝试使用其他微调方法(如全量微调或P-Tuning),或联系阿里云技术支持团队获取进一步帮助。