XTuner微调LLM课程笔记
一、Finetune简介
1.为什么模型要做微调?
现在其实大部分的大模型应该叫做“基座模型”,也就是基于普遍性的任务去进行与训练的,所以如果想让它落地在特定的下游领域中,它的表现必然是不如在领域内训练的模型,所以现在最好的方式就是对大模型进行一个领域内知识的微调。
比如上一期学生的,中医药助手,食神等等。
2.一般有两种finetune范式
增量预训练微调:增量预训练是一种训练策略,它允许模型在已有的知识基础上不断学习和改进。在QLoRA中,增量预训练意味着模型会在原始预训练数据的基础上,不断添加新的数据并重新进行训练。这样可以不断提高模型的泛化能力,使其更好地适应各种任务。
指令微调:指令微调则是针对特定任务对模型进行微调的过程。在QLoRA中,指令微调基于明确的微调指令对模型进行微调,使得模型更加专注于特定任务的实现。
增量预训练单纯拓展知识库,对语料进行拟合学习,但是你如果问他问题,他不一定能回答你,而是根据你的问题进行拟合回答哈哈哈哈;而指令微调就是通过对话对来进行微调训练的,所以你问他问题之后,他才能很好的回答你(毕竟调教过怎么回)
简单来说:一个是丢知识拓展知识库,一个是用高质量对话和回答数据用于训练特定的任务
下面这图就是表示这两者的区别:上面就是单纯预训练模型或者单纯增量预训练的模型的问答,下面是指令微调的问答
3.关于数据集的建立处理
这就是标准的格式数据,有输入有输出
其实每个基底模型的对话模板都不一样,这个要看各个大模型开发单位自己的想法,比如LlaMa2和InternLM就不太一样,自己可以看到;这玩意就是为了让LLM区分出system/User/Assistant; 关于system/users/assistant的详细内容详见https://zhuanlan.zhihu.com/p/682606003
这里就简单介绍一下system:大部分LLM模型的系统指令System message的权重强化高于人工输入的prompt,并在多轮对话中保持稳定,您可以使用系统消息来描述助手的个性,定义模型应该回答和不应该回答的内容,以及定义模型响应的格式。
对话模板的作用:其实核心就是为了让模型认识这个数据,认识我的输入是什么,认识它应该学哪个输出。
这就是指令微调与增量预训练微调的本质区别了:增量预训练根本就不区分input和output,直接拟合整个增量数据,计算整个增量数据的loss,所以你问他问题的时候他可能有时候直接就是拟合你的问题这句语料输出一个相似的话;而指令微调是input/output对话对进行训练,模型只学会output,训练时只会对output的数据计算loss,这样当模型推理时,就能根据input输出符和这个input的output
3.微调方案LoRA和QLoRA介绍
简单来说:LORA其实就是通过在大模型原有的linear周围,新增几个小的linear(Adapter);Adapter的参数量远小于原本的linear,这样就能大幅降低计算成本的前提下微调这个大模型。其实就是套了一层壳咯,然后再与原模型整合一下不就好了嘿嘿嘿;(主要还是因为要是对整个模型进行调参,参数量太大了,成本太高)
3.1 Full Finetuning VS LoRA VS QLoRA(非常重要!)
这张图已经挺清晰哈,
1.Full Finetuning很显然就是要全部加载base model然后又全部加载参数 然后优化参数 又全部加载/
2.LoRA就是全部加载base model然后优化的时候只有新加入的Adapter部分更新参数并加载/
3.QLoRA就更离谱了,加载base model的时候直接4bit量化了卧槽 更加小了 然后还是只优化Adapter层的参数 而且优化器还是使用的分页优化器,可以在CPU和GPU之间相互转移(offload),具体见此文章https://zhuanlan.zhihu.com/p/654356333
二.正式介绍XTuner
1.XTuner的优越性和特点
1.1 XTuner特点
你自己也实战过,大概也都知道这玩意的方便性;主要就是把模型微调的整个步骤集成为一个个命令;而且还自带模型的配置文件,自己根据微调范式改改就好,还自带优化加速消费级显卡也能干!(总结一下,打包带走,开箱即用,高效便捷!)
还不错还不错
1.2 性能对比:
这就是说XTuner对模型微调过程中的性能优化和显存优化很好,显存占用不多,不容易 Out of the memory
1.3 开箱即用,一键打包带走:
挑选配置文件+拷贝配置文件
原来那个配置文件的命名是这个意思吼
模型的基本参数介绍(咱已经写在源码注释里啦)
访问部署模型与之对话
2. XTuner数据引擎!
Xtuner数据引擎,自动帮你处理原始语料,变成格式化问答对,再变成可训练语料用于模型训练
针对不同的base model Xtuner集成了对应的数据处理引擎,开发者一键调用就好;这样的话大家就可以把精力放在珍贵的原始数据内容的收集上,不用花费精力去处理它啦!太酷啦太酷啦!!!
这就是那个参数(多数据样本拼接!)充分利用GPU的显存啦
3. XTuner的两个优化技巧:Flash Attention和DeepSpeed ZeRo
Flash Attention默认开启,主要看看DeepSpeed ZeRO:这个的话在实战部分的blog已经详细说明 详见:书生·浦语大模型实战训练营第二期第四节--Xtuner微调LLM--notebook-CSDN博客
XTuner直接集成这个优化技巧,一键命令开启 (酷毙了!)
原来InternLM2-chat-1.8B也是基于InternLM2-1.8B基础模型微调而来的chat模型(哈哈哈哈哈,现在可能才知道为什么说,大模型一开源,就可以开始换汤不换药,可以微调建立自己领域的大模型了嘿嘿)
三、基于LLaVA方案------微调多模态LLM
1.多模态LLM其实就是解决输入文本/图像的问题咯,一个是文本的embedding模型,一个是image Projector,训练好这两个玩意,就能转为模型能识别的向量,就可以训练多模态LLM啦
2.训练多模态LLM的方案:LLaVA
大佬说不能简单说LLaVA模型就是:文本单模态模型LLM+训练出来的Image Projector 但是你就大概这样理解就好
原理大致如下图:自己看图就能很好理解,大概分为两个阶段:训练阶段是结合单模态文本LLM和文本图像问答对训练数据进行训练得到“眼睛”image projector(拆开细分来看,这个具体的流程在后面的一节);测试阶段就是将这个眼睛整合到原来的单模态文本LLM就可以变成多模态LLM
3.对比LLaVA和LoRA
对比一下LLaVA和LoRA的基本逻辑其实挺像的:都是在已用的LLM基础上用新的数据添加一个小的玩意加上去,从而实现额外的功能
LLM套上image projector后,装上一双眼睛(多模态LLM)
LLM套上了LoRA后,有了一个新的灵魂(基于特定领域知识的角色)
4.训练Image Projector流程
这个流程就是分为两个阶段嘛:增量预训练+指令微调
Pretrained: 先就是利用文本单模态LLM引入大量的图像及其简单的图像描述(也就是大量的基本知识,就是质量不太好,而且不是对话数据)先预训练一个model;
Finetuned: 然后再引入高质量的图像+复杂对话文本对这个预训练model进行微调,成为image projector;
---------------------------------------------------------------------------------------------------------------------------------
上面就已经训练完了image projector!!!!!!
然后把这个image projector 整合到原来的模型 就相当于加入了一个能解决图像处理的能力咯(adpater),那就变成了多模态LLM
这整个流程,叫做LLaVA方案!如下图!上面这节就是下图左边的LLaVA训练阶段啦!
然后这就是这节课的理论笔记了,下面的基于XTuner的单模态LLM微调和基于LLaVA的多模态LLM微调实战环节,请详见我的下一篇博客!