当前位置:   article > 正文

大模型微调学习之旅④ — XTuner 大模型单卡低成本微调实战

xtuner

目录

一、Finetune简介

①微调中在中小型应用中常用的训练数据处理的两种模式介绍

1.增量预训练(Incremental Pretraining)

2. 指令微调(Instructional Fine-tuning)

 ②微调的在中小型应用中常用的两种模式工作流程

1. 指令微调(Instructional Fine-tuning)

a. 模型内部角色的指定及其对话模板的角色构建

b. 构建的数据输入模型计算Loss然后微调

 2. 增量预训练(Incremental Pretraining)

a. 增量预训练的流程类似指令微调

二、XTuner介绍

①XTuner的基本介绍

1. 高效的数据引擎

2.多种训练引擎 

3.一键启动训练 

 ②XTuner中的两种微调原理LoRA和QLoRA

1. LORA的原理

2. 三种模式的对比Full Finetuning、LoRA、QLoRA

三、8GB显卡玩转LLM

①. XTuner两个优化技巧Flash Attention和 DeepSpeedZeRO

1. Flash Attention

2. DeepSpeed ZeRO

四、动手实战环节

①大模型微调样例1

②微调一个属于自己的大模型

1. 符合大模型微调格式的数据集

2. 微调的配置文件

3. 将得到的 PTH 模型转换为 HuggingFace 模型

4. 验证和测试


一、Finetune简介

微调中在中小型应用中常用的训练数据处理的两种模式介绍:

图解:

 

 1.增量预训练(Incremental Pretraining):

        增量预训练是一种微调模式,它通过逐步添加新的层或参数来扩展预训练模型。在增量预训练中,首先使用预训练模型在新任务的数据集上进行初步训练,然后逐层或逐步添加新的层或参数,并继续训练模型。这种微调模式适用于具有相似任务特征的不同数据集,可以有效地利用预训练模型的已有知识,提高模型的泛化能力。

使用场景:让基座模型学习到一些新知识,如某个垂类领域的常识训练数据:文章、书籍、代码等

2. 指令微调(Instructional Fine-tuning):

        指令微调是一种微调模式,它通过将预训练模型与特定任务的指令相结合来进行训练。在指令微调中,首先使用预训练模型在新任务的数据集上进行初步训练,然后使用特定任务的指令(如文本描述、图像标签等)来指导模型进行进一步的训练。这种微调模式适用于具有明确任务目标的新数据集,可以有效地利用预训练模型的已有知识,并利用特定任务的指令来提高模型的性能。

使用场景:让模型学会对话模板,根据人类指令进行对话训练数据:高质量的对话、问答数据

 指令微调的图解样例:

 ②微调的在中小型应用中常用的两种模式工作流程

1. 指令微调(Instructional Fine-tuning):

一个问题一个回答

  •  a. 模型内部角色的指定及其对话模板的角色构建
我们使用大模型看到的界面
标题我们使用大模型看到的界面
大模型内部的流程:
大模型内部的流程及不同“角色”的功能

对话模板:为了让模型可以识别出system、user、assistant

  • 下图是不同模型的模板:

  • b. 构建的数据输入模型计算Loss然后微调

流程如下图所示:

 2. 增量预训练(Incremental Pretraining):

陈述句式

a. 增量预训练的流程类似指令微调,不同之处是不需要system和user这两个“角色”。

二、XTuner介绍

①XTuner的基本介绍

1. 高效的数据引擎

XTuner 适配了多个热门开源数据集格式,开发者如已有对应格式的数据集,可以直接使用,并支持多种格式数据源的混合使用:

  • Alpaca 格式,斯坦福大学开源数据集的格式,也是社区开源项目使用较多的一种格式
  • MOSS 格式,复旦大学开源指令微调数据集的格式,包含多轮对话和工具调用
  • Gunacao 格式,QLoRA 项目中所使用数据集的格式
  • OpenAI 格式,GPT-3.5-Turbo Finetune 接口要求的数据集格式

2.多种训练引擎 

XTuner 首次尝试将 HuggingFace 与 OpenMMLab 进行结合,兼顾易用性和可配置性。支持使用 MMEngine Runner 和 HuggingFace Trainer 两种训练引擎,开发者如有深度定制化需求,可根据使用习惯灵活配置。

  1. pip install xtuner
  2. # 使用 MMEngine Runner 训练
  3. xtuner train internlm_7b_qlora_oasst1_e3
  4. # 使用 HugingFace Trainer 训练
  5. xtuner train internlm_7b_qlora_oasst1_e3_hf

3.一键启动训练 

XTuner 内置了增量预训练、单轮&多轮对话指令微调、工具类指令微调的标准化流程,让开发者只需聚焦于数据本身。
同时, XTuner 集成了 QLoRA、DeepSpeed 和 FSDP 等技术,提供各种尺寸模型在各种规格硬件下的训练解决方案,通过XTurner一键式启动训练,仅需8GB显存即可微调7B模型。

  1. pip install 'xtuner[deepspeed]'
  2. # 8G 显存微调 Llama2-7B
  3. xtuner train llama2_7b_qlora_oasst1_512_e3 --deepspeed deepspeed_zero2

 详细简介如图:

 ②XTuner中的两种微调原理LoRA和QLoRA

1. LORA的原理

     LoRA通过在原本的Linear旁,新增一个支路,包含两个连续的小Linear,新增的这个支路通常叫做Adapter(LORA)
     Adapter参数量远小于原本的 Linear,能大幅降低训练的显存消耗。
 

课程中老师的描述挺形象的:

想象一下,你有一个超大的玩具,现在你想改造这个超大的玩具。但是,对整个玩具进行全面的改动会非常昂贵。

        ①因此,你找到了一种叫 LoRA 的方法:只对玩具中的某些零件进行改动,而不是对整个玩具进行全面改动。

        ② 而 QLoRA 是 LoRA 的一种改进:如果你手里只有一把生锈的螺丝刀,也能改造你的玩具。

2. 三种模式的对比Full Finetuning、LoRA、QLoRA

三、8GB显卡玩转LLM

①. XTuner两个优化技巧Flash Attention和 DeepSpeedZeRO

1. Flash Attention

        Flash Attention将Attention计算并行化,避免了计算过程中Attention Score NxN的显存占用(训练过程中的N都比较大)。


2. DeepSpeed ZeRO:

         ZeRO优化,通过将训练过程中的参数、梯度和优化器状态切片保存,能够在多GPU训练时显著节省显存,除了将训练中间状态切片外,DeepSpeed 训练时使用FP16的权重,相较于Pytorch的AMP训练,在单GPU上也能大幅节省显存。

其并非自动启动需要加  --deepspeed deepspeed zero3

QLoRA后面加上  --deepspeed deepspeed zero2

xtuner train internlm_20b_qlora__oasst1_512_e3  --deepspeed deepspeed zero3

四、动手实战环节

模型微调的流程看官方的文档超详细:xtuner单卡微调 

①大模型微调样例1

下载了三个多小时终于下好了

1. 将得到的 PTH 模型即LoRA模型文件转换为 HuggingFace 模型

 2. 将 HuggingFace adapter 合并到大语言模型

3.  与合并后的模型对话:   

注意:prompt-template后的参数需要根据自己选择的底座模型进行更改

可以使用xtuner chat --help参看

  1. # 加载 Adapter 模型对话(Float 16)
  2. xtuner chat ./merged --prompt-template internlm_chat

4. 微调和测试效果

②微调一个属于自己的大模型

1. 符合大模型微调格式的数据集

创建data文件夹用于存放用于训练的数据集

mkdir -p /root/personal_assistant/data && cd /root/personal_assistant/data

使用脚本生成正确格式的数据集

  1. import json
  2. # 输入你的名字
  3. name = 'Shengshenlan'
  4. # 重复次数
  5. n = 10000
  6. data = [
  7. {
  8. "conversation": [
  9. {
  10. "input": "请做一下自我介绍",
  11. "output": "我是{}的小助手,内在是上海AI实验室书生·浦语的7B大模型哦".format(name)
  12. }
  13. ]
  14. }
  15. ]
  16. for i in range(n):
  17. data.append(data[0])
  18. with open('personal_assistant.json', 'w', encoding='utf-8') as f:
  19. json.dump(data, f, ensure_ascii=False, indent=4)

2. 微调的配置文件

下载模型InternLM-chat-7B

InternStudio 平台的 share 目录下已经为我们准备了全系列的 InternLM 模型,可以使用如下命令复制internlm-chat-7b

  1. mkdir -p /root/personal_assistant/model/Shanghai_AI_Laboratory
  2. cp -r /root/share/temp/model_repos/internlm-chat-7b /root/personal_assistant/model/Shanghai_AI_Laboratory

 下载配置文件

拷贝一个配置文件到当前目录:xtuner copy-cfg ${CONFIG_NAME} ${SAVE_PATH} (注意最后有个英文句号,代表复制到当前路径)

xtuner copy-cfg internlm_chat_7b_qlora_oasst1_e3 .

修改配置文件即: 修改拷贝后的文件internlm_chat_7b_qlora_oasst1_e3_copy.py

训练模型

xtuner train /root/personal_assistant/config/internlm_chat_7b_qlora_oasst1_e3_copy.py

3. 将得到的 PTH 模型转换为 HuggingFace 模型

将得到的 PTH 模型转换为 HuggingFace 模型,即:生成 Adapter 文件夹

xtuner convert pth_to_hf ${CONFIG_NAME_OR_PATH} ${PTH_file_dir} ${SAVE_PATH}

例如:

成功标志如下:

将 HuggingFace adapter 合并到大语言模型:

  1. xtuner convert merge ./internlm-chat-7b ./hf ./merged --max-shard-size 2GB
  2. # xtuner convert merge \
  3. # ${NAME_OR_PATH_TO_LLM} \
  4. # ${NAME_OR_PATH_TO_ADAPTER} \
  5. # ${SAVE_PATH} \
  6. # --max-shard-size 2GB

例如:

4. 验证和测试

 与合并后的模型对话:

  1. # 加载 Adapter 模型对话(Float 16)
  2. xtuner chat ./merged --prompt-template internlm_chat
  3. # 4 bit 量化加载
  4. # xtuner chat ./merged --bits 4 --prompt-template internlm_chat

到此为止我们得到了属于自己的专属模型

QAQ翻车,训练轮数太少,导致并没有安装咱设定好的来,不过也和原来的不一样。大家可以看一下下面的两张图片: 【建议大家多训练几轮,我由于怕数据多训练时间长把10000数据变为了1000,大家想要达到自己的预期效果请增加数据集和训练轮数】

原模型的回复:

毕竟是第一次生成专属自己的模型,所以我又重新跑了一遍

但是好像过拟合了,只会回答这一个问题了,哈哈,不过还是成功微调了!!!!

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/577118
推荐阅读
相关标签
  

闽ICP备14008679号