一、本期课程内容概述
本节课的主讲老师是汪周谦。教学内容主要包括以下三个部分:
1. 微调理论讲解及 XTuner 介绍
2. XTuner 微调小助手个人认知实战
3. XTuner 微调 llava 图片理解多模态模型实战
二、学习收获
-
Finetune的两种范式
- 增量预训练微调
增量预训练是指在已经完成了初步预训练的基础上,继续在新的或额外的语料库上进行预训练过程。这种做法通常是为了使模型能够适应特定领域、主题或语言特性,或者进一步提升模型对某些类型任务的处理能力。增量预训练的特点包括:- 扩展知识范围:通过使用特定领域的数据(如医学文献、法律文档、专业论坛、代码等),模型可以吸收更多专业知识,增强在相关领域的表现。
- 应对数据变化:随着时间和技术发展,新的语言现象、词汇、话题等可能涌现。增量预训练允许模型在原有知识基础上更新学习,保持与时代发展的同步。
- 指令跟随微调
指令跟随微调是一种针对预训练模型进行任务导向的微调方法,旨在使模型更好地理解和响应特定类型的指令,从而提升其在特定任务上的表现。指令跟随微调通常涉及以下步骤和特点:- 有标注对话数据:使用包含明确指令和对应期望输出的有标注数据集进行训练,如问答数据、指令-响应对等,这些数据集提供了模型应当遵循的明确行为规范。
- 对齐目标分布:通过微调过程,模型将其通用文本分布调整到与特定任务相关的数据分布更紧密地对齐,从而提升其在该任务上的针对性和准确性。
- 用户反馈整合:在某些情况下,指令微调过程可能还包括对人类用户反馈的吸收和学习,以迭代改进模型对指令的理解和响应质量。
PS:我们常用的internlm2-chat-20b、Qwen1.5-14B-Chat等模型,就是由基座模型(internlm2-20b、Qwen1.5-14B)进行指令跟随微调后得到的。
- 增量预训练微调
-
微调算法及算力占用
- 全参数微调
Base Model 参与训练并更新参数,需要保存Base Model 中参数的优化器状态 - LoRA微调
Base Model 只参与Forward,只有Adapter部分Backward更新参数,只需保存Adapter中参数的优化器状态 - QLoRA微调
Base Model的精度进行量化,优化器状态在CPU和GPU间Offload,Base Model 只参与Forward,只有Adapter部分Backward更新参数,只需保存Adapter中参数的优化器状态微调算法 精度 7B 13B 30B 70B 8*70B 全参数微调 32 120GB 240GB 600GB 1200GB 900GB 全参数微调 16 60GB 120GB 300GB 600GB 400GB LoRA微调 16 16GB 32GB 64GB 160GB 120GB QLoRA微调 8 10GB 20GB 40GB 80GB 60GB QLoRA微调 4 6GB 12GB 24GB 48GB 30GB QLoRA微调 2 4GB 8GB 16GB 24GB 18GB
- 全参数微调
-
XTuner的简介
XTuner 是一个高效、灵活、全能的轻量化大模型微调工具库。- 支持大语言模型 LLM、多模态图文模型 VLM 的预训练及轻量级微调。XTuner 支持在 8GB 显存下微调 7B 模型,同时也支持多节点跨设备微调更大尺度模型(70B+)。
- 自动分发高性能算子(如 FlashAttention、Triton kernels 等)以加速训练吞吐。
- 兼容 DeepSpeed ,轻松应用各种 ZeRO 训练优化策略。
- 支持多模态图文模型 LLaVA 的预训练与微调。
- 精心设计的数据管道,兼容任意数据格式,开源数据或自定义数据皆可快速上手。
感兴趣的小伙伴可以进行详细的了解,真的挺好用的。根据官方给出的数据,使用XTuner 微调大部分模型的速度是超过LLaMa-Factory的。
-
DeepSpeed优化器及其选择方法
DeepSpeed是一个深度学习优化库,由微软开发,旨在提高大规模模型训练的效率和速度。它通过几种关键技术来优化训练过程,包括模型分割、梯度累积、以及内存和带宽优化等。DeepSpeed特别适用于需要巨大计算资源的大型模型和数据集。在DeepSpeed中,zero 代表“ZeRO”(Zero Redundancy Optimizer),是一种旨在降低训练大型模型所需内存占用的优化器。ZeRO 通过优化数据并行训练过程中的内存使用,允许更大的模型和更快的训练速度。ZeRO 分为几个不同的级别,主要包括:
- deepspeed_zero1:这是ZeRO的基本版本,它优化了模型参数的存储,使得每个GPU只存储一部分参数,从而减少内存的使用。
- deepspeed_zero2:在deepspeed_zero1的基础上,deepspeed_zero2进一步优化了梯度和优化器状态的存储。它将这些信息也分散到不同的GPU上,进一步降低了单个GPU的内存需求。
- deepspeed_zero3:这是目前最高级的优化等级,它不仅包括了deepspeed_zero1和deepspeed_zero2的优化,还进一步减少了激活函数的内存占用。这通过在需要时重新计算激活(而不是存储它们)来实现,从而实现了对大型模型极其内存效率的训练。
选择哪种deepspeed类型主要取决于你的具体需求,包括模型的大小、可用的硬件资源(特别是GPU内存)以及训练的效率需求。一般来说:
- 如果你的模型较小,或者内存资源充足,可能不需要使用最高级别的优化。
- 如果你正在尝试训练非常大的模型,或者你的硬件资源有限,使用deepspeed_zero2或deepspeed_zero3可能更合适,因为它们可以显著降低内存占用,允许更大模型的训练。
- 选择时也要考虑到实现的复杂性和运行时的开销,更高级的优化可能需要更复杂的设置,并可能增加一些计算开销。
-
多模态LLM的原理
- 文本单模态模型,输入只有文本,通过一个 Embedding 模型将文本转化为文本向量,然后把向量给 LLM 得到文本输出。
- 文本+图像多模态模型,在文本处理上和文本单模态模型相同,但是添加了另一个图像输入分支,通过一个 Image Projector 将图像转换为图像向量,然后和文本向量一起给 LLM,得到文本输出。
- 将一个文本单模态模型微调成文本+图像多模态模型的过程其实就是训练Image Projector的过程。
-
LLaVA 方案简介
- 先使用 GPT-4V 模型对图像进行描述,构造出大量
<question text> <image>--<answer text>
数据对。 - 利用这些数据对,配合文本单模态LLM,训练出一个Image Projectopr,训练分为两个阶段:
- Pertrain:使用大量图片+图片标题数据对对LLM进行训练,旨在让模型理解并识别图像中的普遍特征,通过此阶段,模型获得初步的视觉理解能力
- Finetune:Pretrain阶段训练完的模型具有视觉能力,但因其训练数据局限于图片+标题对,模型功能受限,此时模型只能针对输入图像生成对应标题,不具备其他视觉理解与对话能力。需要准备高质量的图片+复杂文本数据来对Pretrain阶段得到的Image Projectop进行进一步的训练
- 所使用的文本单模型LLM和训练出来的Image Projector,统称为LLaVA模型
- Image Projector类似于LoRA训练出的Adapter
- LLM配合Image Projector进行使用,来完成图像的理解
- XTuner支持LLaVA 全流程
- 先使用 GPT-4V 模型对图像进行描述,构造出大量
三、个人体会
- 每节课都给我带来不同的震撼,了解到了基座模型和chat模型的区别和关系
- 了解了多模态LLM的实现原理,感觉高大上的技术离我近了一大步
- XTuner,先抛开性能和基础的操作不谈,它的花样真的好多,不仅能支持LLaVA 全流程的训练,还 能够支持序列并行训练策略以实现语言模型超长上下文训练!一整个震惊住。
四、本期作业
https://blog.youkuaiyun.com/weixin_45609124/article/details/138000682