Chinese-LLaMA-Alpaca icon indicating copy to clipboard operation
Chinese-LLaMA-Alpaca copied to clipboard

请教关于继续预训练领域知识的问题

Open andrea-veritas opened this issue 1 year ago • 8 comments

提示:将[ ]中填入x,表示打对钩。提问时删除这行。只保留符合的选项。

详细描述问题

请尽量具体地描述您遇到的问题,必要时给出运行命令。这将有助于我们更快速地定位问题所在。

运行截图或日志

请提供文本log或者运行截图,以便我们更好地了解问题详情。

必查项目(前三项只保留你要问的)

  • [ ] 基础模型:Alpaca-Plus
  • [ ] 运行系统 Linux
  • [ ] 问题分类:模型训练与精调
  • [x] (必选)由于相关依赖频繁更新,请确保按照Wiki中的相关步骤执行
  • [x] (必选)我已阅读FAQ章节并且已在Issue中对问题进行了搜索,没有找到相似问题和解决方案

您好,最近在研究这个项目,并已经做了PT和SFT方面的试验。已经能够学习到新的知识和问答指令,现在有一些更深入的问题,想学习一下。望不吝赐教,深表感谢!

背景:

LLama13B模型,已经合并了Chinese-LLaMa和Alpaca。现在想继续添加垂直领域的专业知识然后,并提供一系列的问答模版给模型学习。最终希望模型能够实现在垂直领域内的辅助专家问答。

问题:

  1. 由于专业领域里面的一些词汇需要单独摘出,已经合并了Chinese-LLaMa和Alpaca两个Lora的模型,是否还可以往tokenizer.model里继续添加词汇了?如果是的话,后续再借助run_clm_pt_with_peft.pyrun_clm_sft_with_peft.py这两个脚本生成Lora模型后,output目录里的token文件也需要更新成扩充词表后的special_tokens_map.json,tokenizer.model,tokenizer.vocab,tokenizer_config.json这四个文件是吗?
  2. 扩充词表以后再运行run_clm_pt_with_peft.pyrun_clm_sft_with_peft.py是否仍可以不训练embed_tokens和lm_head这两个模块?
  3. SFT阶段是否可以训练输入的多轮对话内容?因为prompt的格式里只有instruction, input 和output,似乎没有专门放history的地方。然后看到其它issue里面有提到把input放到instruction里面去的,那么是否可以把某轮对话的历史记录也放到instruction里去?(感觉会很长啊)
  4. 关于多卡训练,是否支持zero3?
  5. 我这边跑zero2的时候到tokenizer的那边就一直卡死不动了,GPU一直在满负荷,显存也占用了30G左右(所有显卡都占用了)

andrea-veritas avatar May 24 '23 10:05 andrea-veritas

4张3090,Zero3配置,内存128GB,可以完成run_clm_pt_with_peft.py训练,刚刚测试完,15Mtxt用时40分钟

chyyf006 avatar May 24 '23 12:05 chyyf006

4张3090,Zero3配置,内存128GB,可以完成run_clm_pt_with_peft.py训练,刚刚测试完,15Mtxt用时40分钟

好啊,我这也试试。之前用了3*V100 32G,看来确实是总显存不够了。

andrea-veritas avatar May 24 '23 12:05 andrea-veritas

扩充后注意只要resize都可以训练。 如果不训练embed_tokens和lm_head,那新token是未经训练的,不清楚在你们的任务上影响有多大。

多轮对话的格式可以参考gradio_demo.py中带有历史对话数据构造方式,总体来说就是把历史都拼起来。

airaria avatar May 24 '23 12:05 airaria

扩充后注意只要resize都可以训练。 如果不训练embed_tokens和lm_head,那新token是未经训练的,不清楚在你们的任务上影响有多大。

多轮对话的格式可以参考gradio_demo.py中带有历史对话数据构造方式,总体来说就是把历史都拼起来。

好的,谢谢。13B如果开启embed_tokens和lm_head训练的话,单卡需要多少显存呢?(我现在就测试一批10MB的语料)之前不开embed_tokens和lm_head的时候是40GB,开了以后一张48GB的A40就直接爆显存了。

andrea-veritas avatar May 24 '23 13:05 andrea-veritas

扩充后注意只要resize都可以训练。 如果不训练embed_tokens和lm_head,那新token是未经训练的,不清楚在你们的任务上影响有多大。 多轮对话的格式可以参考gradio_demo.py中带有历史对话数据构造方式,总体来说就是把历史都拼起来。

好的,谢谢。13B如果开启embed_tokens和lm_head训练的话,单卡需要多少显存呢?(我现在就测试一批10MB的语料)之前不开embed_tokens和lm_head的时候是40GB,开了以后一张48GB的A40就直接爆显存了。

如果有多卡可以借助deepspeed降显存,A40是可以跑的;单卡未测试过。另外你可以尝试更短的长度

airaria avatar May 24 '23 13:05 airaria

扩充后注意只要resize都可以训练。 如果不训练embed_tokens和lm_head,那新token是未经训练的,不清楚在你们的任务上影响有多大。 多轮对话的格式可以参考gradio_demo.py中带有历史对话数据构造方式,总体来说就是把历史都拼起来。

好的,谢谢。13B如果开启embed_tokens和lm_head训练的话,单卡需要多少显存呢?(我现在就测试一批10MB的语料)之前不开embed_tokens和lm_head的时候是40GB,开了以后一张48GB的A40就直接爆显存了。 我用的是官方的配置,13B开启embed_tokens和lm_head训练的,4张3090,可以完成

chyyf006 avatar May 24 '23 13:05 chyyf006

13B开启embed_tokens和lm_head训练的,4张3090,Zero3配置,最高内存是112GB,4张3090显存大概占用在50%

chyyf006 avatar May 24 '23 13:05 chyyf006

13B开启embed_tokens和lm_head训练的,4张3090,Zero3配置,最高内存是112GB,4张3090显存大概占用在50%

这是第二阶段训练,精调还没测试完

chyyf006 avatar May 24 '23 13:05 chyyf006

13B开启embed_tokens和lm_head训练的,4张3090,Zero3配置,最高内存是112GB,4张3090显存大概占用在50%

这是第二阶段训练,精调还没测试完

你在用stage3训练的时候遇到过

RuntimeError: 'weight' must be 2-D

这样的报错嘛? 我一开始用43090训练倒是能跑起来,但时间反而远比单卡A40还要长。然后就换用了4V100 32G跑,结果就出现了这个报错。

andrea-veritas avatar May 24 '23 19:05 andrea-veritas

昨天我4张3090搞到夜里2点多,调各种DeepSpeed配置,ZeRO2/3配置都试过,进行精调训练报OOM,另外,3090单精度擅长,V100双精度擅长,如果有条件,最好V100,看您发出的情况,应该128GB显存能训练精调,可惜我的服务器只能插4张GPU卡,我还有一张,插不上去,今天准备进行7B训练,结果好的话,我准备去再搞一台dell服务器,两台试试

chyyf006 avatar May 25 '23 03:05 chyyf006

昨天我4张3090搞到夜里2点多,调各种DeepSpeed配置,ZeRO2/3配置都试过,进行精调训练报OOM,另外,3090单精度擅长,V100双精度擅长,如果有条件,最好V100,看您发出的情况,应该128GB显存能训练精调,可惜我的服务器只能插4张GPU卡,我还有一张,插不上去,今天准备进行7B训练,结果好的话,我准备去再搞一台dell服务器,两台试试

我刚试了V100 * 4 stage3是可以跑起来,grad_acc=4 per_device_batch_size=2,此时每张卡的显存占用在24G~28G之间,比较安全了。我这边是因为要扩充词表,所以可能得embed_tokenslm_head也一起训练。但加上这两个模块以后,训练时间从3小时(A40 * 1)直线飙升到50小时(V100 * 4)

andrea-veritas avatar May 25 '23 08:05 andrea-veritas

楼主请教下,合并了那两个权重(Chinese-LLaMA和Chinese-Alpaca)以后的新模型,是怎么继续在自己领域精调的?能否看一下脚本bash run_sft.sh文件的设置,我不太清楚,pretrained_model,chinese_tokenizer_path和peft_model都是合并后新模型的路径吗,此外生成的模型怎样和之前模型合并呢。望赐教,谢谢。

YongjiangXu avatar May 28 '23 11:05 YongjiangXu

楼主请教下,合并了那两个权重(Chinese-LLaMA和Chinese-Alpaca)以后的新模型,是怎么继续在自己领域精调的?能否看一下脚本bash run_sft.sh文件的设置,我不太清楚,pretrained_model,chinese_tokenizer_path和peft_model都是合并后新模型的路径吗,此外生成的模型怎样和之前模型合并呢。望赐教,谢谢。

这个项目的WIKI里有写,找指令精调.md这个文件。特别提醒,peft一定要用项目指定的13e53fc版本从源码克隆安装,pip install直接安装的版本会在deepspeed上出现莫名其妙的错误。

andrea-veritas avatar May 28 '23 13:05 andrea-veritas

楼主请教下,合并了那两个权重(Chinese-LLaMA和Chinese-Alpaca)以后的新模型,是怎么继续在自己领域精调的?能否看一下脚本bash run_sft.sh文件的设置,我不太清楚,pretrained_model,chinese_tokenizer_path和peft_model都是合并后新模型的路径吗,此外生成的模型怎样和之前模型合并呢。望赐教,谢谢。

这个项目的WIKI里有写,找指令精调.md这个文件。特别提醒,peft一定要用项目指定的13e53fc版本从源码克隆安装,pip install直接安装的版本会在deepspeed上出现莫名其妙的错误。

感谢楼主,我尝试训练了一下,得到了 输出模型,想问下是怎么合并起来,是使用WIKI手动模型合并中的多LoRA权重合并吗,即原版llama和Chinese-LLaMA,以及我得到的 输出模型吗?谢谢

YongjiangXu avatar May 28 '23 13:05 YongjiangXu

楼主请教下,合并了那两个权重(Chinese-LLaMA和Chinese-Alpaca)以后的新模型,是怎么继续在自己领域精调的?能否看一下脚本bash run_sft.sh文件的设置,我不太清楚,pretrained_model,chinese_tokenizer_path和peft_model都是合并后新模型的路径吗,此外生成的模型怎样和之前模型合并呢。望赐教,谢谢。

这个项目的WIKI里有写,找指令精调.md这个文件。特别提醒,peft一定要用项目指定的13e53fc版本从源码克隆安装,pip install直接安装的版本会在deepspeed上出现莫名其妙的错误。

感谢楼主,我尝试训练了一下,得到了 输出模型,想问下是怎么合并起来,是使用WIKI手动模型合并中的多LoRA权重合并吗,即原版llama和Chinese-LLaMA,以及我得到的 输出模型吗?谢谢

WIKI里也有,用这个脚本scripts/merge_llama_with_chinese_lora

andrea-veritas avatar May 28 '23 13:05 andrea-veritas

楼主请教下,合并了那两个权重(Chinese-LLaMA和Chinese-Alpaca)以后的新模型,是怎么继续在自己领域精调的?能否看一下脚本bash run_sft.sh文件的设置,我不太清楚,pretrained_model,chinese_tokenizer_path和peft_model都是合并后新模型的路径吗,此外生成的模型怎样和之前模型合并呢。望赐教,谢谢。

这个项目的WIKI里有写,找指令精调.md这个文件。特别提醒,peft一定要用项目指定的13e53fc版本从源码克隆安装,pip install直接安装的版本会在deepspeed上出现莫名其妙的错误。

感谢楼主,我尝试训练了一下,得到了 输出模型,想问下是怎么合并起来,是使用WIKI手动模型合并中的多LoRA权重合并吗,即原版llama和Chinese-LLaMA,以及我得到的 输出模型吗?谢谢

WIKI里也有,用这个脚本scripts/merge_llama_with_chinese_lora

好的感谢楼主!想请教下有使用WIKI介绍之外的格式进行训练吗,WIKI要求json结尾的Stanford Alpaca格式的指令精调数据文件,但我看精调代码中好像有涉及txt文件的传入,想了解用txt格式如何去精调,谢谢。

YongjiangXu avatar May 28 '23 14:05 YongjiangXu

楼主请教下,合并了那两个权重(Chinese-LLaMA和Chinese-Alpaca)以后的新模型,是怎么继续在自己领域精调的?能否看一下脚本bash run_sft.sh文件的设置,我不太清楚,pretrained_model,chinese_tokenizer_path和peft_model都是合并后新模型的路径吗,此外生成的模型怎样和之前模型合并呢。望赐教,谢谢。

这个项目的WIKI里有写,找指令精调.md这个文件。特别提醒,peft一定要用项目指定的13e53fc版本从源码克隆安装,pip install直接安装的版本会在deepspeed上出现莫名其妙的错误。

感谢楼主,我尝试训练了一下,得到了 输出模型,想问下是怎么合并起来,是使用WIKI手动模型合并中的多LoRA权重合并吗,即原版llama和Chinese-LLaMA,以及我得到的 输出模型吗?谢谢

WIKI里也有,用这个脚本scripts/merge_llama_with_chinese_lora

好的感谢楼主!想请教下有使用WIKI介绍之外的格式进行训练吗,WIKI要求json结尾的Stanford Alpaca格式的指令精调数据文件,但我看精调代码中好像有涉及txt文件的传入,想了解用txt格式如何去精调,谢谢。

sft里面好像都是输入json文件作为datasets啊

        with training_args.main_process_first(desc="loading and tokenization"):
            path = Path(data_args.dataset_dir)
            files = [os.path.join(path,file.name) for file in path.glob("*.json")]
            logger.info(f"training files: {' '.join(files)}")

data目录里那个.txt文件是pt阶段用的。

andrea-veritas avatar May 28 '23 15:05 andrea-veritas

楼主请教下,合并了那两个权重(Chinese-LLaMA和Chinese-Alpaca)以后的新模型,是怎么继续在自己领域精调的?能否看一下脚本bash run_sft.sh文件的设置,我不太清楚,pretrained_model,chinese_tokenizer_path和peft_model都是合并后新模型的路径吗,此外生成的模型怎样和之前模型合并呢。望赐教,谢谢。

这个项目的WIKI里有写,找指令精调.md这个文件。特别提醒,peft一定要用项目指定的13e53fc版本从源码克隆安装,pip install直接安装的版本会在deepspeed上出现莫名其妙的错误。

感谢楼主,我尝试训练了一下,得到了 输出模型,想问下是怎么合并起来,是使用WIKI手动模型合并中的多LoRA权重合并吗,即原版llama和Chinese-LLaMA,以及我得到的 输出模型吗?谢谢

WIKI里也有,用这个脚本scripts/merge_llama_with_chinese_lora

好的感谢楼主!想请教下有使用WIKI介绍之外的格式进行训练吗,WIKI要求json结尾的Stanford Alpaca格式的指令精调数据文件,但我看精调代码中好像有涉及txt文件的传入,想了解用txt格式如何去精调,谢谢。

sft里面好像都是输入json文件作为datasets啊

        with training_args.main_process_first(desc="loading and tokenization"):
            path = Path(data_args.dataset_dir)
            files = [os.path.join(path,file.name) for file in path.glob("*.json")]
            logger.info(f"training files: {' '.join(files)}")

data目录里那个.txt文件是pt阶段用的。

好的,谢谢您的回复,受教了[抱拳]

YongjiangXu avatar May 29 '23 01:05 YongjiangXu

楼主您好,请教一下,如果只是想对单独领域知识进行扩充回答的话,要必须要先进行预训练再进行精调,还是只是需要精调不需要预训练就可以呀?

henryGao9 avatar Jun 05 '23 03:06 henryGao9

楼主您好,请教一下,如果只是想对单独领域知识进行扩充回答的话,要必须要先进行预训练再进行精调,还是只是需要精调不需要预训练就可以呀?

以我个人实操的情况来看,最好是先继续预训练再做指令微调。我观察到的现象是SFT其实不会给模型增加新的知识,只是让模型学会了对话的套路。

andrea-veritas avatar Jun 05 '23 15:06 andrea-veritas

楼主您好,请教一下,如果只是想对单独领域知识进行扩充回答的话,要必须要先进行预训练再进行精调,还是只是需要精调不需要预训练就可以呀?

以我个人实操的情况来看,最好是先继续预训练再做指令微调。我观察到的现象是SFT其实不会给模型增加新的知识,只是让模型学会了对话的套路。

感谢您的回复和指导,我看看都学习一下,前后也做个对比。

henryGao9 avatar Jun 06 '23 10:06 henryGao9

楼主您好,请教一下,如果只是想对单独领域知识进行扩充回答的话,要必须要先进行预训练再进行精调,还是只是需要精调不需要预训练就可以呀?

以我个人实操的情况来看,最好是先继续预训练再做指令微调。我观察到的现象是SFT其实不会给模型增加新的知识,只是让模型学会了对话的套路。

我现在发现的问题点是:我以一问一答的形式进行SFT精调过后,在对话的过程中,他的回答都是不准确的,完全是所问非所答的情况,没有精准的按照我给他的Stanford Alpaca的答案进行回复。

henryGao9 avatar Jun 06 '23 10:06 henryGao9

楼主您好,请教一下,如果只是想对单独领域知识进行扩充回答的话,要必须要先进行预训练再进行精调,还是只是需要精调不需要预训练就可以呀?

以我个人实操的情况来看,最好是先继续预训练再做指令微调。我观察到的现象是SFT其实不会给模型增加新的知识,只是让模型学会了对话的套路。

我现在发现的问题点是:我以一问一答的形式进行SFT精调过后,在对话的过程中,他的回答都是不准确的,完全是所问非所答的情况,没有精准的按照我给他的Stanford Alpaca的答案进行回复。

LLM不可能完全按照你的训练语料来的,除非你把同样的问题,重复n遍,才可能有近似的效果。如果你要的效果是知识问答类的话,建议用embedding方案试试。(比如langchain)

andrea-veritas avatar Jun 06 '23 11:06 andrea-veritas

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your consideration.

github-actions[bot] avatar Jun 13 '23 22:06 github-actions[bot]

Closing the issue, since no updates observed. Feel free to re-open if you need any further assistance.

github-actions[bot] avatar Jun 17 '23 22:06 github-actions[bot]