Facico / Chinese-Vicuna

Chinese-Vicuna: A Chinese Instruction-following LLaMA-based Model —— 一个中文低资源的llama+lora方案,结构参考alpaca
https://github.com/Facico/Chinese-Vicuna
Apache License 2.0
4.14k stars 425 forks source link

使用checkpoint-11600训练效果出不来,求指教。 #115

Closed grantchenhuarong closed 1 year ago

grantchenhuarong commented 1 year ago

使用finetune_continue脚本,2080ti单卡,跑了120个小时(跑到17298了。),出来的adapter_model.bin,使用generate.sh脚本加载进行问答,基本不能用。感觉这刚开始炼丹还不是一般的难。看着大神的医疗问答样例,感觉差距太遥远了,深刻求指导。

看了下checkpoint-17200里边的trainer_state.json,发现loss是一直有降,最后情况如下: { "epoch": 9.28, "learning_rate": 2.1804861030352364e-06, "loss": 0.8621, "step": 17180 }, { "epoch": 9.29, "learning_rate": 1.8316083265495987e-06, "loss": 0.8583, "step": 17200 }, { "epoch": 9.29, "eval_loss": 0.8552559018135071, "eval_runtime": 72.3139, "eval_samples_per_second": 13.829, "eval_steps_per_second": 1.729, "step": 17200 } ], "max_steps": 17298, "num_train_epochs": 11, "total_flos": 2.8694665234353226e+19, "trial_name": null, "trial_params": null

grantchenhuarong commented 1 year ago

数据是整理了N多的诗词,定了几个专用prompts, 如prompt_list = ["扮演一位诗词专家,背诵如下诗篇全文", "扮演一位诗词专家,指出如下诗句出处", "扮演一位诗词专家,介绍如下诗词解读", "扮演一位诗词专家,介绍下如下诗人"]。组装了43万6千多的语料。形状如下 { "instruction": "扮演一位诗词专家,背诵如下诗篇全文", "input": "宋·李清照 武陵春 (风住沉香花已尽)", "output": "风住沉香花已尽,日晚倦梳头。物是人非事事休,欲语泪先流。闻说双溪春尚好,也拟泛轻舟。只恐双溪舴艋(zé měng)舟,载不东许多愁。" }, { "instruction": "扮演一位诗词专家,背诵如下诗篇全文", "input": "宋·李清照 声声慢 (寻寻觅觅)", "output": "寻寻觅觅,冷冷清清,凄凄惨惨戚戚。乍暖还寒时候,最难将息。三杯两盏淡酒,怎敌它,万来风急。雁过也,正伤心,却是旧时相识。满地黄花堆积,憔悴损,如今有谁堪摘?守着窗儿,独自怎生得黑!梧桐更兼细雨,到黄昏,点点滴滴。这次第,怎一个愁字了得!" }

grantchenhuarong commented 1 year ago

训练参数大致如下(其它如原代码未改动): MICRO_BATCH_SIZE = 8
BATCH_SIZE = 256

GPU占用稍微超过10GB

grantchenhuarong commented 1 year ago

几个问题困扰中,求大神指导: 1、是训练次数不足么?(我现在把诗文减少到347首,做了只用一条指令的347条全文背诵的语料,再从checkpoint-5800处重跑,这个应该可以重复尝试多次数据了。但是又要跑120小时。。。当然过程当中应该会过拟合吧?中间停了就好。重新验证中) 2、是语料准备有问题么?格式、指令或者其它一些未注意的地方? 3、训练参数需要调整或者设置?

dizhenx commented 1 year ago

你这个应该运行finetune_others_continue.sh吧,因为你这是添加的额外的数据训练的。finetune_continue.sh是数据不变,接着之前继续训练。所以你这样是否新数据把旧数据覆盖了?

Facico commented 1 year ago

@grantchenhuarong 1、第一个是你问题的定义。我们医疗问答的问题定义较为简单,你需要把问题定义的更清楚一点,可以参考这里,写了几个简单的抽象问题定义。比如你可以写instruction:“扮演一位诗词专家,根据指定诗人的风格写出指定主题的诗句“,input:“诗人:李清照,主题:风住沉香花已尽”,类似这样,可以定义的更清楚一点。 2、训练进程的问题:我们垂料训练的代码是根据我们一个epoch 70w数据来训练的(一个epoch 70w/128=5400个step)。所以你把你自己的数据拼接进去也会走5400个step左右,会进行5400*(你的数据大小)/ 128个epoch,比如你的数据大小347,会进行14639个epoch,这样显然是会过拟合的,一般来说进行十几轮epoch就行了,你可以把save_step设置小一点,在每个epoch测测,这个还得看实际效果。 3、finetune_other_continue是用来训练额外数据的,这里的设置是防止跳过额外数据。 4、代码是随时可以中途断掉的,我们支持断点重训,指定最后一个checkpoint,再用finetune_continue继续训练就行了

grantchenhuarong commented 1 year ago

谢谢两位的指导。现在正式启动用finetune_other_continue进行训练,看看效果是否能够出来。

grantchenhuarong commented 1 year ago

finetune_other_continue 以checkpoint-11600为基础,参数如下:

DATA_PATH="./sample/merge_sample.json" #"../dataset/instruction/guanaco_non_chat_mini_52K-utf8.json"

DATA_PATH="./data/instructions.json" OUTPUT_PATH="lora-Vicuna" MODEL_PATH="/data/ftp/models/llama/7b" lora_checkpoint="./lora-Vicuna/checkpoint-11600" from_data_beginning=True # False TEST_SIZE=1

python finetune.py \ --data_path $DATA_PATH \ --output_path $OUTPUT_PATH \ --model_path $MODEL_PATH \ --eval_steps 200 \ --save_steps 200 \ --test_size $TEST_SIZE \ --resume_from_checkpoint $lora_checkpoint \ --ignore_data_skip $from_data_beginning

训练出来的checkpoint-17000,使用generate.sh加载后,回答类似如下信息

input:李白的静夜思 output: Gi:`+b[#CE7jod<F_\=1 Z5!|'RtP*A&u6-smelg{,%H3"O]/8^DaW Mqy$wxz>~rkV(c2L?BY4}I0.NQJvp@Kf;UXhT9S)n Mediabestandenoreferrer PortályederbördITableViewnederbördtatywnaObrázky߬ demselIABotabestanden ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⥤ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ]{' ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ челов╌ ⁇ ⁇

这个真的就很糟糕了,不知道问题出在哪里了。。。求指教。

grantchenhuarong commented 1 year ago

1、重新下载了新版的huggingface的llama-7b模型,对齐了bos_token_id,eos_token_id,重新再训练一下。 2、也将fintune.sh当中加载lora模型参数的代码变更了下,确实将checkpoint-11600叠加上来了。

语料还是固定指令的350首诗,目前看训练速度是比之前快一多半。原来到17298 steps需要116小时,目前看只要60小时左右。 中间将保存的steps改成50了,尽早看看新的训练效果。

grantchenhuarong commented 1 year ago

继续训练中,目前执行到11250,加载generate.sh,交互效果不太好。 image 目前训练语料357首诗文,构造如下 image 跑的微调脚本如下python finetune.py --data_path ./data/instructions.json --output_path ./lora-Vicuna/shici4/ --model_path /data/ftp/models/llama/7b-hf/ --eval_steps 50 --save_steps 50 --test_size 1 --resume_from_checkpoint ./lora-Vicuna/checkpoint-11600 --ignore_data_skip True

请大神帮忙分析下问题出在哪? 1、语料不足? 2、语料格式整理问题? 3、训练欠拟合,继续? 4、测试集只定了1,有无影响? 5、Anything else?

Facico commented 1 year ago

@grantchenhuarong 1、你beam_num是否>1 2、你用我们的模型的lora推理的时候正常吗

grantchenhuarong commented 1 year ago

用lora权重11600推理测试正常 image image image beam_num都是默认的4路。

grantchenhuarong commented 1 year ago

有一个情况是这样的,我用一台2080ti 11GB机器持续训练,然后将生成的权重拷贝到另外一台1080ti 11GB机器进行推理测试。两边的环境、数据、模型是一致的。这个情况应该不会影响效果吧?不然,就只能断掉2080ti的训练,验证一下再进行继续训练了。目前我用的参数是依照 fintune_others_continue.sh的。

Facico commented 1 year ago

@grantchenhuarong 你训练到checkpoint-17000应该有上前个epoch了,应该是过拟合的不可能欠拟合(其实上面说了你不用跑这么久的)。根据我的经验虽然你instruction设置的一般,但是应该也不会有这么差的效果。换到别的机器应该是不会有什么问题的,你可以把你的程序停了测一测,说不定是环境的问题(你数据量这么少,真没必要训这么多轮,你看在我们的note相关的描述)

grantchenhuarong commented 1 year ago

改变语料模仿医疗单指令微调,同时只跑10steps( 10X128X4 / 347 > 10轮) image 测试效果 image image image image image image

基本上训练语料的内容,都没有体现出来。。。有些困惑了。lora只能作为引子,去勾兑出llama底层模型中的数据么?如果原先训练的底层模型,它文字接龙创作出来的东西,其实也很难被有限的新增语料引导么?

那针对私域垂直领域知识模型,是否只能从头开始训练底层模型?这难度可不是一般的大啊。。。

grantchenhuarong commented 1 year ago

但是大神,您那个medical的样例,可是让我羡慕的很啊,一定要整合出来20W数据,再跑一下么?其实也可以,我换个单指令,直接问诗句出处,这样应该能够制作更多的数据出来。

还有哪些要注意的地方么?2080ti都要被我给玩坏了都。

Facico commented 1 year ago

@grantchenhuarong 这么小的数据其实我真没试过。可能上面的训练量还是不够,不过一般垂直语料的数据却是可能比较稀缺。(其实我看我们群里有人调的效果还行) 中文古诗数据我会去试试的

grantchenhuarong commented 1 year ago

制作了20万数据如下 image 又准备开始炼丹了。。。祝我好运吧

Facico commented 1 year ago

@grantchenhuarong 我刚才用300多个诗词快速的试了一下,应该就是训练量的问题。在20多个epoch左右已经能有一定的效果了。对于这种小数据来说你可以把batch size开小一点收敛的快一点(是batch size不是mirco batch size)。 然后你这种重复复制数据的办法是不可取的,你要扩充数据尽量是不同的数据。模型的记忆能力其实很强的。你可以用这里的古诗词数据:https://huggingface.co/datasets/zhangqiaobit/chinese_poetrys

grantchenhuarong commented 1 year ago

谢谢大佬的回应哈,有几个问题咨询一下: 1、您说的20多个epoch,不是指steps,而是覆盖一次全量数据的训练度么? 2、我的batch_size用的默认的128,micro batch size是默认的4。需要调小到多小? 3、还有您是用 continue.sh,还是使用others_continue.sh脚本的参数执行的呀? 4、所给的数据,你是构造单指令微调的方式么?可否参考一下语料的构造方式? 5、您说的有一定效果,是指的能按指令出语料的应答数据么?符合度有多高呀?

Facico commented 1 year ago

1、step也可以看,epoch也可以看,你可以看到你输出栏里面是有epoch的(你首尾减一减就是跑了多少个epoch),一个epoch就是全部数据训一遍 2、我调成batch size=16是这个效果,mirco batch size相当于是per gpu batch size(你可以搜搜是什么意思) 3、当然是other_continue那个 4、我就是按照我上面说的构建方式,这个不能偷懒的,构建的越好模型理解的越好

{
        "instruction": "请扮演一个古诗词生成器,根据给定的题目使用对应的诗人风格生成一首诗。",
        "input": "题目是古歌,诗人是两汉乐府,生成的诗词为:",
        "output": "高田种小麦,终久不成穗。男儿在他乡,焉得不憔悴。"
    }

5、40个epoch左右基本已经能背出来了,然后你测不是数据内东西也是有效果的,这是我随便测的一个效果

请扮演一个古诗词生成器,根据给定的题目使用对应的诗人风格生成一首诗。题目是中秋赏月,诗人是两汉乐府,生成的诗词为:
>秋风起云兮日照渐。草木黄落兮华露徘徊。微风南吹兮万叶翩翩道。色郁郁感兮游鸡鸣声。清丝飞芳兮雀鸣鸣声。美月高飞兮行行飞逢。回顾思兮悠悠心嘉。

当然这个训练量还是不够的

grantchenhuarong commented 1 year ago

也是从checkpoint-11600这两个epoch的lora模型训练的么?我也试着改成您的语料结构,试试347首诗词的训练。

Facico commented 1 year ago

grantchenhuarong commented 1 year ago

继续努力中。。。 image

grantchenhuarong commented 1 year ago

跑到11904异常退出,接着它再断点续传 image

grantchenhuarong commented 1 year ago

确实训练60个epoch后,效果也是出来了,感谢大佬细心指导。 image image image image image

效果确实出来了,咱这种方法确实是可行的。

另外,对于一些超长的诗篇,如屈原的离骚之类的,一般是怎样处理的呢。将256搞成2048,估计都不够呢。

grantchenhuarong commented 1 year ago

尝试去除instruction image image image image image image image image

grantchenhuarong commented 1 year ago

@Facico 再次感谢,炼丹路上刚起步,期望能够跟上大佬脚步。

chengyangfeng commented 1 year ago

@Facico 再次感谢,炼丹路上刚起步,期望能够跟上大佬脚步。

@grantchenhuarong 你好,请问你的模型训练完成后的泛化能力如何,原始知识回答的效果如何?盼复,谢谢

grantchenhuarong commented 1 year ago

个人经验是叠加的Lora训练轮次越多,增加语料越多,对原有网络模型结构参数调整的就会越多,损失的通用能力就越多。你也可以自己测试下生成的权重文件的。这边给一个训练对对子的例子参考哈,几个epoch之后,通用能力已经惨不忍睹了。多实践几回就会晓得了,祝炼丹路顺利哈。 image

下边这个是原有模型的一个测试,你对比对比就清楚了,所以有道友说最好通用语料+专用语料一块混着再炼丹。这块我还没开始尝试,你也可以先试试。 image

chengyangfeng commented 1 year ago

@grantchenhuarong 好的,感谢你

Gzj369 commented 1 year ago

继续训练中,目前执行到11250,加载generate.sh,交互效果不太好。 image 目前训练语料357首诗文,构造如下 image 跑的微调脚本如下python finetune.py --data_path ./data/instructions.json --output_path ./lora-Vicuna/shici4/ --model_path /data/ftp/models/llama/7b-hf/ --eval_steps 50 --save_steps 50 --test_size 1 --resume_from_checkpoint ./lora-Vicuna/checkpoint-11600 --ignore_data_skip True

请大神帮忙分析下问题出在哪? 1、语料不足? 2、语料格式整理问题? 3、训练欠拟合,继续? 4、测试集只定了1,有无影响? 5、Anything else?

你好,我也是初学者,现在也是采用Lora训练Llama-7B模型,数据量500条,BATCH_SIZE = 16,Step 500/16/2个GPU = 15.625, --eval_steps 16 --save_steps 16 --test_size 1,70W/0.05W = 1400 epoch(计划跑30~60个 epoch ,然后终止运行),现在只跑了不到10个epoch,就卡住了,进度条一直是69%,好几个小时都没有动静,查看对应的2个GPU的计算利用率基本是0%,显存利用率也没有到50%,麻烦帮忙看看 @grantchenhuarong @Facico image