第五节课《XTuner 微调 LLM:1.8B、多模态和 Agent》学习笔记

由XTuner 贡献者李剑锋、汪周谦、王群带来本次课程内容与讲解。

1、微调理论讲解及 XTuner 介绍

2、XTuner 微调小助手个人认知实战

3、XTuner 微调 llava 图片理解多模态模型实战

1、Finetune简介

Q:首先我们要清楚为什么要进行微调?

A:目前很多大语言模型其实都是底座模型(foundation model),为普遍的(一般性的)任务而进行预训练,将这类模型应用到特定领域,其表现不如领域内训练的模型,因此要进行领域内微调。

·两种Finetune范式

LLM的下游应用中(也就是微调中),增量预训练指令跟随是经常会用到的两种微调模式。

增量预训练微调

使用场景:让基座模型学习到一些新的知识(如某个垂直领域的常识)

训练数据:文章、书籍、代码等(无需进行“一问一答”有监督标注)

指令跟随微调

使用场景:让模型学会对话模板,根据人类指令进行对话

训练数据:高质量的对话、问答数据(需要高质量的“问答对”标注)

·一条数据的一生:

原始数据→标准格式数据→添加对话模板→Tokenized数据→添加Label→开始训练

2、XTuner介绍

XTuner的特点①傻瓜化:是一个打包好的大模型微调工具箱,以配置文件的形式封装了各种微调场景,无需了解太多代码层面的内容,只需修改配置文件。②轻量级:对于7B参数量的大语言模型,微调所需最小显存仅为8GB(消费级显卡)。

XTuner的功能亮点①适配多种生态:多种微调算法(多种微调策略与算法,覆盖各类SFT场景),适配多种开源生态(支持加载HuggingFace、ModelScope模型或数据集),自动优化加速(开发者无需关注复杂的显存优化与计算加速细节)。②适配多种硬件:训练方案覆盖NVIDIA20系以上所有显卡,最低只需8GB显存即可微调7B模型。

开发者可以专注于数据内容,不必花费精力处理复杂的数据格式。

3、8GB显存玩转LLM

XTuner内置的两种加速方式:Flash Attention默认自动开启的,Flash Attention将Attention计算并行化,避免计算过程中Attention Score NxN的显存占用(训练过程中的N都比较大)】;DeepSpeed ZeRO【ZeRO优化,通过将训练过程中的参数,梯度和优化器状态切片保存,能够在多GPU训练时显著节省显存。除了将训练中间的状态切片外,DeepSpeed训练时使用FP16权重,相较于Pytorch的AMP训练,在单GPU上也能大幅节省显存】

DeepSpeed和Flash Attention虽然能够大幅降低训练成本,但使用门槛相对较高,需要复杂的配置,甚至修改代码。为了让开发者更专注于数据,XTuner会自动dispatch Flash Attention,并一键启动DeepSpeed ZeRO。

4、InternLM2 1.8B模型

5、多模态LLM微调

·给LLM装上电子眼:多模态LLM原理简介

当我们在使用文本单模态大语言模型的时候,我们首先是使用一个文本Embedding模型,对用户输入的文本转换为文本向量,然后将文本向量预测出输出的文本。

文本+图像的多模态模型的其他部分与文本单模态模型是一样的,它只是在输出的部分增加了对图像的输入和处理【Image Projector对输入的图像进行图像的向量化】,将文本向量和图像向量同时进行输入,然后预测出输出文本。我们将文本单模态模型微调为文本多模态模型的过程,其实就是训练Image Projector的过程。

·什么型号的电子眼:LLaVA方案简介

·快速上手:InternLM2_Chat_1.8B+LLaVA

在本节中,将构造<question text><image>--<answer text>数据对,基于InternLM2_Chat_1.8B这个文本单模态模型,使用LLaVA方案,训练一个给InternLM2_Chat_1.8B使用的Image Projector文件。LLaVA方案中,给LLM增加视觉能力的过程,即是训练Image Projector文件的过程。该过程分为2个阶段:Pretrain和Finetune

Pretrain阶段(相当于增量预训练,投入大量知识但知识的质量不能保证):使用大量的“图像+图像标题(不一定是问题,可能是图像的描述/标签)”的数据对,这类数据虽然是有监督的,但也可能是直接从网络上爬取得到的。这个阶段的目的就是让文本单模态模型快速地了解到图像中的普遍特征,得到一个Pretrained Image Projector。Finetune阶段(相当于指令微调,该阶段数据量少但高质量高复杂):经过这个预训练过程后,将预训练得到输出结果加载到显卡中,再输入“图像+复杂对话文本”的这种高质量的有监督数据来训练,得到最终的模型。

6、XTuner微调个人小助手认知

1.环境安装

2.前期准备
2.1数据集准备

为了让模型能够让模型认清自己的身份弟位,知道在询问自己是谁的时候回复成我们想要的样子,我们就需要通过在微调数据集中大量掺杂这部分的数据。

首先我们先创建一个文件夹来存放我们这次训练所需要的所有文件。

之后我们可以在 data 目录下新建一个 generate_data.py 文件,将以下代码复制进去,然后运行该脚本即可生成数据集。假如想要加大剂量让他能够完完全全认识到你的身份,那我们可以吧 n 的值调大一点。

打开该 python 文件后将下面的内容复制进去。

修改完成后运行 generate_data.py 文件即可。

可以看到在data的路径下便生成了一个名为 personal_assistant.json 的文件,这样我们最可用于微调的数据集就准备好啦!里面就包含了 5000 条 input 和 output 的数据对。假如 我们认为 5000 条不够的话也可以调整文件中第6行 n 的值哦!

2.2模型准备

在准备好了数据集后,接下来我们就需要准备好我们的要用于微调的模型。

创建目标文件夹,确保它存在。复制内容到目标文件夹。这个时候我们就可以看到在 model 文件夹下保存了模型的相关文件和内容了。

2.3配置文件选择

2.4小结

完成以上内容后,我就已经完成了所有的准备工作了。我们再来回顾一下我们做了哪些事情:

我们首先是在 GitHub 上克隆了 XTuner 的源码,并把相关的配套库也通过 pip 的方式进行了安装。

然后我们根据自己想要做的事情,利用脚本准备好了一份关于调教模型认识自己身份弟位的数据集。

再然后我们根据自己的显存及任务情况确定了使用 InternLM2-chat-1.8B 这个模型,并且将其复制到我们的文件夹里。

最后我们在 XTuner 已有的配置文件中,根据微调方法、数据集和模型挑选出最合适的配置文件并复制到我们新建的文件夹中。

3.配置文件修改

在选择了一个最匹配的配置文件并准备好其他内容后,下面我们要做的事情就是根据我们自己的内容对该配置文件进行调整,使其能够满足我们实际训练的要求。

4.模型训练
4.1常规训练

4.2 使用 deepspeed 来加速训练

4.3小结

本节我们的重点是讲解模型训练过程中的种种细节内容,包括了模型训练中的各个参数以、权重文件的选择方式以及模型续训的方法。可以看到是否使用 --work-dir 和 是否使用 --deepspeed 会对文件的保存位置以及权重文件的保存方式有所不同,大家也可以通过实践去实际的测试感受一下。那么在训练完成后,我们就可以把训练得到的 .pth 文件进行下一步的转换和整合工作了

5.模型转换、整合、测试及部署
5.1模型转换

5.2模型整合

5.3对话测试

5.4Web demo部署

首先我们需要先下载网页端 web demo 所需要的依赖。

下载 InternLM 项目代码。创建存放 InternLM 文件的代码,拉取 InternLM 源文件,进入该库中。

将 /root/ft/web_demo/InternLM/chat/web_demo.py 中的内容替换为以下的代码(与源代码相比,此处修改了模型路径和分词器路径,并且也删除了 avatar 及 system_prompt 部分的内容,同时与 cli 中的超参数进行了对齐)。

在运行前,我们还需要做的就是将端口映射到本地。那首先我们使用快捷键组合 Windows + R(Windows 即开始菜单键)打开指令界面,并输入命令,按下回车键。

之后我们需要输入以下命令“streamlit run /root/ft/web_demo/InternLM/chat/web_demo.py --server.address 127.0.0.1 --server.port 6006”运行 /root/personal_assistant/code/InternLM 目录下的 web_demo.py 文件。打开 http://127.0.0.1:6006 后,等待加载完成即可进行对话(注意:要在浏览器打开 http://127.0.0.1:6006 页面后,模型才会加载。),键入内容示例“请介绍一下你自己”。

5.5小结

在这一小节里我们对微调后的模型(adapter)进行了转换及整合的操作,并通过 xtuner chat 来对模型进行了实际的对话测试。从结果可以清楚的看出模型的回复在微调的前后出现了明显的变化。那当我们在测试完模型认为其满足我们的需求后,我们就可以对模型进行量化部署等操作了,这部分的内容在之后关于 LMDeploy 的课程中将会详细的进行讲解。

  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值