请教,在对Qwen1.5-14B大模型做微调的时候,遇到了奇怪的损失震荡,始终无法解决

如下是损失图片,验证集损失和训练参数:
279376996446621162.png
234250793505821488.png
参数:
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.参数/数据集存在问题,但是调过很多次了还是没能解决
不知道大家在微调有没有遇到此类问题,是如何解决的,还希望有大佬为我解惑!

展开
收起
pzdgpwoifyin4 2024-04-19 10:00:21 301 分享 版权
阿里云 AI 助理回答

问题分析与解答

根据您提供的信息,您在微调Qwen1.5-14B模型时遇到了训练损失震荡的问题,并且尝试了多种参数调整和数据集验证,但仍未解决。以下是基于知识库资料和您的描述的详细分析与建议。


1. 模型收敛性分析

从您描述的现象来看,验证集损失没有明显异常,这表明模型可能已经收敛,但训练损失存在震荡。这种情况可能由以下原因导致:

(1) 学习率设置问题

学习率是影响模型训练稳定性的关键因素。如果学习率过高,可能会导致训练过程中的震荡现象。
建议: - 尝试降低学习率(例如从1e-5调整为5e-6或更低)。 - 使用warmup策略(lr_warmup=true),让学习率在训练初期逐渐增加,避免初始阶段的剧烈波动。

(2) 数据分布不均

虽然您提到数据集是官方提供的,但如果数据集中某些类别的样本数量差异较大,可能会导致模型在训练过程中对不同类别样本的学习效果不一致,从而引发震荡。
建议: - 检查数据集的分布情况,确保各类别样本数量均衡。 - 如果数据分布不均,可以使用加权采样(weighted sampling)来平衡不同类别的样本权重。

(3) 模型能力过强

Qwen1.5-14B是一个大模型,其强大的表达能力可能导致在小规模数据集上出现过拟合或震荡现象。
建议: - 增加正则化手段,例如: - 提高lora_rank值以增强LoRA模块的表达能力。 - 添加weight_decay参数(如0.01)以抑制过拟合。 - 减少训练轮数(num_train_epochs),避免模型过度拟合训练数据。


2. 参数配置优化

您提到已经尝试调整batch_sizelora_rank等参数,但效果不明显。以下是一些进一步的优化建议:

(1) Batch Size 和 Gradient Accumulation

当前配置中,per_device_train_batch_size=4gradient_accumulation_steps=2,实际的全局批量大小为4 * 2 = 8。对于Qwen1.5-14B这样的大模型,较小的批量大小可能导致梯度更新不稳定。
建议: - 增大per_device_train_batch_size(如816),并相应减少gradient_accumulation_steps,以提高梯度更新的稳定性。 - 如果显存不足,可以通过混合精度训练(fp16)或分布式训练来缓解资源限制。

(2) LoRA 参数调整

LoRA(Low-Rank Adaptation)是一种高效的微调方法,但其效果依赖于lora_ranklora_alpha的合理配置。
建议: - 增大lora_rank(如从默认值8调整为1632),以增强LoRA模块的表达能力。 - 调整lora_alpha(通常设置为lora_rank的2倍),以控制LoRA模块的缩放因子。

(3) 学习率调度器

您当前使用的是cosine学习率调度器,这种调度器在训练后期会逐渐减小学习率,有助于模型收敛。但如果学习率下降过快,可能会导致训练过程中的震荡。
建议: - 尝试使用polynomial调度器,并调整power参数(如0.9),以更平滑地降低学习率。


3. 数据集与评估策略

您提到数据集是官方提供的,且包含几十万条指令,理论上应该没有问题。但仍需注意以下几点:

(1) 数据清洗

即使数据集来自官方,也可能存在噪声或低质量样本。
建议: - 对数据集进行清洗,移除重复、模糊或无关的样本。 - 确保数据格式符合模型输入要求(如模板qwen)。

(2) 验证集划分

您当前的验证集比例为val_size=0.01,即仅使用1%的数据作为验证集。如果验证集过小,可能会导致评估结果不够稳定。
建议: - 增大验证集比例(如0.1),以提高评估结果的可靠性。

(3) 评估策略

您使用的是steps评估策略,每100步进行一次评估。如果评估频率过高,可能会增加计算开销,同时导致评估结果波动。
建议: - 调整eval_steps为更大的值(如500),以减少评估频率。


4. 其他可能的原因与解决方案

(1) 模型初始化问题

如果您使用了预训练模型(pretrained_model),需要确保模型初始化正确。
建议: - 检查model_name_or_path是否指向正确的预训练模型路径。 - 如果使用LoRA微调,确保use_pretrained_model=true,并在训练前加载预训练权重。

(2) 硬件资源限制

大模型训练对硬件资源要求较高,如果显存不足或CPU/GPU性能不足,可能会导致训练过程不稳定。
建议: - 使用分布式训练(如DLCBigDL-LLM容器)来分担计算压力。 - 确保硬件资源分配合理(如cpuset-cpuscpuset-mems参数)。


总结与下一步行动

  1. 优先检查学习率和数据分布:降低学习率并启用warmup策略,同时检查数据集的分布是否均衡。
  2. 优化参数配置:调整batch_sizelora_rank和学习率调度器,确保训练过程稳定。
  3. 验证模型初始化和硬件资源:确保预训练模型加载正确,并检查硬件资源是否满足需求。

如果以上方法仍无法解决问题,建议尝试使用其他微调方法(如全量微调或P-Tuning),或联系阿里云技术支持团队获取进一步帮助。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址:

通义千问大模型家族全面升级更大参数规模模型首次面世,全新通义千问2.0版本欢迎体验。https://tongyi.aliyun.com/

还有其他疑问?
咨询AI助理