IEIT-Yuan / Yuan-2.0

Yuan 2.0 Large Language Model
Other
681 stars 85 forks source link

使用原生方式(megatron)进行参数微调,微调完成后新的数据集学习到,模型原由的泛化能力几乎完全丢失 #103

Closed fredfany closed 8 months ago

fredfany commented 8 months ago

环境信息

NVIDIA-SMI 545.23.08 Driver Version: 545.23.08 CUDA Version: 12.3 单机 8块 NVIDIA A800-SXM4-80GB

调参信息

examples/pretrain_yuan2.0_2.1B_sft.sh中的参数信息如下,2.1B模型从interation为1开始调,调了200轮左右 GPT_ARGS=" --tensor-model-parallel-size 1 \ --pipeline-model-parallel-size 1 \ --timing-log-level 2 \ --num-workers 2 \ --num-layers 24 \ --hidden-size 2048 \ --num-attention-heads 32 \ --use-lf-gate \ --lf-conv2d-group 1 \ --lf-conv2d-num-pad 1 \ --position-embedding-type rope \ --no-embedding-dropout \ --flash-attn-drop 0.1 \ --fim-rate 0.5 \ --fim-spm-rate 0.5 \ --norm-dtype RMSNorm \ --attention-dropout 0 \ --hidden-dropout 0 \ --disable-bias-linear \ --reset-position-ids \ --use-flash-attn \ --swiglu \ --adam-beta1 0.9 \ --adam-beta2 0.95 \ --seq-length 8192 \ --max-position-embeddings 8192 \ --micro-batch-size 2 \ --global-batch-size 32 \ --lr 0.0001 \ --train-iters 200 \ --lr-decay-iters 200 \ --lr-decay-style cosine \ --min-lr 2.0e-5 \ --weight-decay 1e-1 \ --lr-warmup-iters 5 \ --clip-grad 1.0 \ --recompute-method uniform \ --recompute-granularity full \ --recompute-num-layers 1 \ --bf16 \ --sft-stage \ --override-opt-param-scheduler \ --train-reset \ --finetune "

DATA_ARGS=" --data-path $DATA_PATH \ --tokenizer-type YuanTokenizer \ --tokenizer-model-path $TOKENIZER_MODEL_PATH \ --data-impl mmap \ --split 10,0,0 " OUTPUT_ARGS=" --log-interval 1 \ --save-interval 10000 \ --eval-interval 1000000 \ --eval-iters 10 "

调参的原始数据集

包含50条样例,大致如下: 学生注册管理责任部门: 研究生院。服务对象: 教师。服务主题: 研究生服务。服务内容: 进行学生注册的管理 学籍信息管理责任部门: 研究生院。服务对象: 教师。服务主题: 研究生服务。服务内容: 进行学生学籍信息的查看编辑等操作 新生信息管理责任部门: 研究生院。服务对象: 教师。服务主题: 研究生服务。服务内容: 进行信息数据的导入和转入学籍库的操作

调参结果

其他样例中“研究生院”一词出现次数较多,调参后的结果是,所给用料中的用例都能精确匹配,原始模型完全混乱,提问什么都给出“研究生院”

训练结果

iteration 200/ 200 | consumed samples: 6400 | elapsed time per iteration (ms): 4608.1 | learning rate: 2.000E-05 | global batch size: 32 | lm loss: 8.532206E-02 | loss scale: 1.0 | grad norm: 0.130 | number of skipped iterations: 0 | number of nan iterations: 0 | (min, max) time across ranks (ms): forward-backward ...............................: (4409.62, 4432.80) forward-compute ................................: (1314.67, 1342.39) backward-compute ...............................: (3066.79, 3116.33) batch-generator ................................: (158.93, 172.87) layernorm-grads-all-reduce .....................: (0.02, 0.02) embedding-grads-all-reduce .....................: (0.02, 0.03) grads-all-reduce ...............................: (103.55, 103.58) optimizer-copy-to-main-grad ....................: (0.30, 0.51) optimizer-clip-main-grad .......................: (6.93, 7.16) optimizer-count-zeros ..........................: (0.01, 0.01) optimizer-inner-step ...........................: (40.14, 40.26) optimizer-copy-main-to-model-params ............: (11.75, 11.85) optimizer ......................................: (60.10, 60.20) [after training is done] datetime: 2024-01-29 05:12:11 saving checkpoint at iteration 200 to /workspace/model/Yuan2.0-2B/2B/ successfully saved checkpoint at iteration 200 to /workspace/model/Yuan2.0-2B/2B/

问题

  1. 之前加了3条数据调了100轮效果比较好,训练集及测试集都得到了很好的满足,想了解下50条200轮的话究竟是参数设置不合适,还是数据有点多,导致几乎无法泛化,合理的参数应该是什么 2.给的样例里 --split 10,0,0这个参数是否合适,从字面意思看好像是验证集和测试集数量为0 ,实际调参中这个需要调整吗
  2. 原生方式的调参有没有像LLaMA那种增加--plot_loss参数能画出loss拟合曲线的,或者类似的方式

谢谢!

wangpengfei1013 commented 8 months ago

环境信息

NVIDIA-SMI 545.23.08 Driver Version: 545.23.08 CUDA Version: 12.3 单机 8块 NVIDIA A800-SXM4-80GB

调参信息

examples/pretrain_yuan2.0_2.1B_sft.sh中的参数信息如下,2.1B模型从interation为1开始调,调了200轮左右 GPT_ARGS=" --tensor-model-parallel-size 1 --pipeline-model-parallel-size 1 --timing-log-level 2 --num-workers 2 --num-layers 24 --hidden-size 2048 --num-attention-heads 32 --use-lf-gate --lf-conv2d-group 1 --lf-conv2d-num-pad 1 --position-embedding-type rope --no-embedding-dropout --flash-attn-drop 0.1 --fim-rate 0.5 --fim-spm-rate 0.5 --norm-dtype RMSNorm --attention-dropout 0 --hidden-dropout 0 --disable-bias-linear --reset-position-ids --use-flash-attn --swiglu --adam-beta1 0.9 --adam-beta2 0.95 --seq-length 8192 --max-position-embeddings 8192 --micro-batch-size 2 --global-batch-size 32 --lr 0.0001 --train-iters 200 --lr-decay-iters 200 --lr-decay-style cosine --min-lr 2.0e-5 --weight-decay 1e-1 --lr-warmup-iters 5 --clip-grad 1.0 --recompute-method uniform --recompute-granularity full --recompute-num-layers 1 --bf16 --sft-stage --override-opt-param-scheduler --train-reset --finetune "

DATA_ARGS=" --data-path $DATA_PATH --tokenizer-type YuanTokenizer --tokenizer-model-path $TOKENIZER_MODEL_PATH --data-impl mmap --split 10,0,0 " OUTPUT_ARGS=" --log-interval 1 --save-interval 10000 --eval-interval 1000000 --eval-iters 10 "

调参的原始数据集

包含50条样例,大致如下: 学生注册管理责任部门: 研究生院。服务对象: 教师。服务主题: 研究生服务。服务内容: 进行学生注册的管理 学籍信息管理责任部门: 研究生院。服务对象: 教师。服务主题: 研究生服务。服务内容: 进行学生学籍信息的查看编辑等操作 新生信息管理责任部门: 研究生院。服务对象: 教师。服务主题: 研究生服务。服务内容: 进行信息数据的导入和转入学籍库的操作

调参结果

其他样例中“研究生院”一词出现次数较多,调参后的结果是,所给用料中的用例都能精确匹配,原始模型完全混乱,提问什么都给出“研究生院”

训练结果

iteration 200/ 200 | consumed samples: 6400 | elapsed time per iteration (ms): 4608.1 | learning rate: 2.000E-05 | global batch size: 32 | lm loss: 8.532206E-02 | loss scale: 1.0 | grad norm: 0.130 | number of skipped iterations: 0 | number of nan iterations: 0 | (min, max) time across ranks (ms): forward-backward ...............................: (4409.62, 4432.80) forward-compute ................................: (1314.67, 1342.39) backward-compute ...............................: (3066.79, 3116.33) batch-generator ................................: (158.93, 172.87) layernorm-grads-all-reduce .....................: (0.02, 0.02) embedding-grads-all-reduce .....................: (0.02, 0.03) grads-all-reduce ...............................: (103.55, 103.58) optimizer-copy-to-main-grad ....................: (0.30, 0.51) optimizer-clip-main-grad .......................: (6.93, 7.16) optimizer-count-zeros ..........................: (0.01, 0.01) optimizer-inner-step ...........................: (40.14, 40.26) optimizer-copy-main-to-model-params ............: (11.75, 11.85) optimizer ......................................: (60.10, 60.20) [after training is done] datetime: 2024-01-29 05:12:11 saving checkpoint at iteration 200 to /workspace/model/Yuan2.0-2B/2B/ successfully saved checkpoint at iteration 200 to /workspace/model/Yuan2.0-2B/2B/

问题

  1. 之前加了3条数据调了100轮效果比较好,训练集及测试集都得到了很好的满足,想了解下50条200轮的话究竟是参数设置不合适,还是数据有点多,导致几乎无法泛化,合理的参数应该是什么 2.给的样例里 --split 10,0,0这个参数是否合适,从字面意思看好像是验证集和测试集数量为0 ,实际调参中这个需要调整吗
  2. 原生方式的调参有没有像LLaMA那种增加--plot_loss参数能画出loss拟合曲线的,或者类似的方式

谢谢!

1、合理的微调数据比例很难量化确定,业界的经验是高质量的数据,可能1k左右就能激发出模型不错的指令跟随能力。2、模型丧失泛化性,可以通过调参来缓解(如学习率),也可以通过严控数据质量,过多重复数据可能会让模型产生困惑,毕竟garbage in garbage out,当然这里的数据质量是模型认为的数据质量哈。3、可以通过高效微调的方式来缓解这一现象。

fredfany commented 8 months ago

根据建议把数据混淆之后,不能泛化的问题确实得到抑制了,非常感谢!