书生·浦语大模型训练营第四次课笔记

XTuner大模型单卡低成本微调实战

在这里插入图片描述
本节课主要包括理论和实战两大部分,理论部分介绍微调框架XTuner以及整个微调的工作流程,实战部分讲解如何使用XTuner来微调一个属于自己的开源模型,会以IntenLM为底座模型来进行微调。

1、FineTune简介

在这里插入图片描述
大语言模型是在海量的文本内容上以无监督或半监督的方式进行训练的。这些海量的文本内容,赋予了大语言模型各行各业的知识。但是如果想将这种大语言模型实际应用到具体的生产或科研中,往往会发现模型的回答不尽如人意。这种时候我们就需要对模型进行微调,使其在具体的使用场景或是具体的领域中输出更好的回答。常见的两种微调策略分别是增量预训练微调以及指令跟随微调。

所谓的增量预训练,往往就是给模型投喂一些新的知识,这些新知识就是你目标领域的文本内容。比如说如果现在想微调一个可以诊断癌症的模型。那么在增量预训练微调策略中,我们需要给模型投喂更多关于癌症相关的专业知识。然后经过对新知识的学习,模型在该领域就能获得更好的表现。

另一种微调策略就是叫指令跟随,也叫指令微调。这里举一个更通俗的例子来帮助理解指令跟随。
指令跟随的例子
在这张流程图中,左边就是海量的预训练数据,使用它训练出来的模型,叫做base模型,或者叫pretrained模型,也就是预训练模型。这样的模型在进行指令微调之前,如果给它一个输入,(比如说问他什么是肺癌,它往往会输出什么是胃癌,什么是肝癌…)它并不能意识到你在问它一个问题,只会单纯的去拟合这个训练数据集中的分布。因此如果我们想让模型知道我们的意图,希望它能更加服从我们的指令,就需要在pretrained模型上进行额外的指令微调。通过指令微调,我们获得了instructed大模型。由于它经过了指令微调,它就知道它需要去回答问题。那么我们再对它输入什么是肺癌的问题时,就会获得更令我们满意的结果。

那么,这两种微调方式具体是怎么实现的呢?
在这里插入图片描述
我们在进行指令跟随微调的时候,首先需要对训练数据进行角色指定。比如说,我们现在要给模型投喂一条数据,这条数据是由一问一答两个部分构成的。问的部分,比如说是世界第一高峰是什么?我们希望它给出的结果是珠穆朗玛峰,或者说我们在训练数据中,它的answer部分就是珠穆朗玛峰。那么在进行角色指定的时候,这一条数据对,我们就需要把问题部分指定给user角色,把珠穆朗玛峰指定给assistant的角色,然后这个上面的system部分呢,我们就按照自己微调的目标领域来。假如我们的目标是微调一个安全的AI助手,那我们在system的角色中就写:你是一个安全的AI助手。假如我们想微调一个医疗助手,那我们就可以写:你是一个专业的一个医生,你能总是输出专业且正确、且细致且耐心的回答。当然,在同一次微调中,在同一个数据集中,system部分往往由于你的角色指定或者你的目标使得它是固定的。以上就把原始的一问一答的数据构建成由三个角色组成的一组数据。

在这一步就已经完成了对话模板的构建。完成对话模板之后,就可以直接将这条数据喂给模型,进行微调训练了。但其实这些机械性的工作,XTuner微调框架都已经帮我们打包好了,一键就可以启动。
在这里插入图片描述
由于不同的开源模型,是由不同的单位或组织发行的,所以每个开源模型所使用的对话模板都不尽相同。比如Llama2的对话模板,它是以双尖括号和SYS来包裹System角色的内容,然后以INST和方括号来包裹User的内容,而/INST之后,就是assistant的角色内容。

其实以上所有关于指令微调的内容,都是指微调阶段。而在部署模型后进行的预测阶段,也就是你真正与模型进行对话的时候,用户是不需要去进行这些角色分配的。用户输入的内容被默认放入user部分。System部分是由模板自动添加的,至于具体是使用什么模板,在启动预测的时候是可以进行自定义的,就像我们右边这个图展示的这样。预测阶段的对话模板组装,都是由XTuner自动完成的,我们不需要去干涉它。
在这里插入图片描述
讲完指令微调的这个数据的角色指定,继续来讲指令微调的原理。此时我们已经将一问一答的这一条数据完成了对话模板的角色构建,接下来就要将构建完成的数据输入模型来计算损失,来进行真正的微调部分。由于只有答案部分是我们期望模型来进行回答的内容,所以我们就只对答案部分进行损失的计算,就像图中所展示的这样。(在实际使用时,对于这些内容设计原理只需简单理解即可。)
在这里插入图片描述
进行指令微调的时候,每条数据都是由一问一答的形式构成的。但是增量训练的数据不需要问题,只需要回答,或者说增量训练的数据都是一个一个的陈述句,都是在陈述事实,不是以问答的形式存在。所以依照刚才的对话模板,我们只需要把system和user这两个角色的这个内容留空,把增量预训练的这一条数据放到assistant的角色中即可,在计算损失时,与前面一样,仍然计算system部分的损失。

说完了训练数据的处理,接下来再来讲一下XTuner中使用的微调原理(Lora和QLora)
在这里插入图片描述
为什么要使用LoRA呢?
因为如果我们要对整个模型的所有参数都进行调整的话,需要非常大的显存才能够进行训练,但是用LoRA的方法,就不需要那么大的显存开销了,主要就是为了方便。具体来说,LoRA就是在原本的模型的Linear旁,新增一个旁路分支,这个旁路分支包含了两个连续的小Linear,新增的这个旁路分支就叫Adapter,那其实也就是我们说的这个LoRA。往往说的这个LoRA模型、LoRA模型文件其实指的就是这个旁路分支的这些参数,就是Adapter文件。而这个Adapter的参数量是远远小于原本的Linear的,所以它能大幅地降低训练显存的消耗。

下面用一个简单生动的一个比喻来辅助理解。想象一下,你有一个超级大的玩具(也就是你的大模型)。现在你想改造这个大模型,也就是你想微调这个大模型,但由于对这个玩具进行全面的改动非常昂贵,因此,你找到了一种叫LoRA的方法。只需要使用LoRA方法对这个玩具中的某些零件进行改动,就能达到你的目的,这样就无需整个玩具进行改动了。而QLoRA是LoRA的一种改进。也就是说,即便你手中只有一把生锈的螺丝刀,你也仍然能改造你的玩具,达成你的目的。
在这里插入图片描述
这里把全参数微调、LoRA微调和QLoRA微调放在一起比较一下。在进行全参数微调的时候,首先整个模型都要加载到显存中,然后所有的模型参数的优化器也都要加载到显存中。所以这个步骤就非常的吃显存,显存如果不够的话,就根本无法进行。LoRA微调的时候,当然模型也是要先加载到显存中,但是对于参数优化器,只需要保存LoRA部分的参数优化器就行了,这就已经大大减小了显存占用。而对于QLoRA,首先加载模型的时候,就使用4bit量化的方式加载。也就相当于不那么精确的加载,但是可以节省显存开销。然后QLoRA部分的参数优化器还可以在GPU和CPU之间进行调度,也就是如果显存满了,就自动去内存里面跑,这样当然会慢一点,但至少能跑起来。这里还需要补充一点,就是理论上说,这三种方法都是可以进行CPU和GPU调度的,只不过XTuner给我们对QLoRA方法的CPU调度进行了整合。

2、XTuner介绍

下面介绍书生浦语开发的XTuner微调框架。
在这里插入图片描述

在这里插入图片描述
XTuner是一个打包好的大模型微调工具箱,它支持从HuggingFace和ModelScope加载模型和数集。它支持多款开源大模型,比如说InternLM、Meta的Llama家族、阿里的通义千问家族、百川大模型、清华的ChatGLM家族等等,包括最近出来的多专家的模型(Mistral)也是支持的。

下面就是快速上手部分,这一部分的详细操作,会在下一部分手把手文档教学视频中进行详细讲解,这里先简单地过一遍。
在这里插入图片描述
首先用pip来安装一个XTuner,在安装文档中会指定版本,以防出现一些因为版本问题的不可跟随的情况,当然在这之前也要创一个conda环境,然后挑选一个配置模板,然后进行一键训练,这里也会介绍关于这个config文件的这个命名规则。

关于自定义微调,比如说我们先把配置模板拷出来,然后修改配置文件。然后启动训练以及配置模板里面的一些常用超参。
在这里插入图片描述
训练完成之后,就得到了这个Adapter文件,就是所谓的LoRA文件,这个时候我们就需要在加载底座模型的基础上同时加载这个Adapter,来进行与模型的对话与测试。这里我们就使用XTuner自带的这个chat命令来进行,比如说这里的Float16对话模式,以及4bit量化模式,以及加载Adapt的启动模式。
在这里插入图片描述
同时XTuner还支持工具类模型的对话,有点类似于大家所熟悉的GPT里的plugin。这个会在手把手的文档中ms-agent的部分进行讲解。
在这里插入图片描述
在这里插入图片描述
XTuner具有强大的数据处理引擎。对于格式化的问答对,已进行了统一的数据的指定。然后也对很多开源的数据集进行了映射函数的内置,大家可以很方便的在更多流行的开源数据集上进行一键的启动。这样开发者就可以专注于数据内容,而不必花费精力处理这些复杂的数据格式了。
在这里插入图片描述
XTuner支持多数据的样本拼接。如果使用默认配置的话,在实验中往往会发现它只需要6GB或者8GB的显存消耗。那么如果你有一张更大显存的显卡或者是计算卡,想要利用更大显存增加工作效率,那么就可以使用这种多数据样本拼接,将多条数据进行拼接到一起之后输入模型,然后统一的进行梯度的传播,增强并行性,充分利用GPU资源。
在这里插入图片描述
这里要注意的一点:关于自定义的数据集,建议大家使用json格式,或者叫jsonl格式,这个在手把手文档中也会给大家详细讲解。

3、8GB显卡玩转LLM

在这里插入图片描述
XTuner有许多特色功能。例如:

  • XTuner默认开启Flash attention的加速方式,就相当于黑魔法一样,有了这个方法就可以加速你的训练。
  • 集成了deepspeed_zero的优化方法,可以在训练过程中更快(deepspeed不是默认启动的,因此在启动的时候需要增加一个deepspeed的启动参数。对于QLora算法,后面就跟deepspeed_zero2就行了)。

在这里插入图片描述
上图反映了不同的算法优化前与优化后在不同的计算卡上的显存占用情况。

  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值