【书生·浦语大模型实战营第二期】XTuner微调LLM:1.8B、多模态、Agent——学习笔记4

文章目录

XTuner微调个人小助手

教程学习

Xtuner工具的运行原理:

总结来说模型微调基础步骤

  1. 前期准备:数据采集和数据格式转换、微调方法选择、微调模型选择、配置文件选择
  2. 配置文件准备(修改配置文件):修改模型及数据集地址、修改load_dataset方式、promp_template选择、修改dataset_map_fn
  3. 模型训练:deepspeed使用、模型续训、权重保存
  4. 训练完成后:模型转换及整合、模型测试、模型部署

动手实操

前期准备

使用数据为openai格式的数据

python 复制代码
data = [
    {
        "messages": [
            {
                "role": "user",
                "content": "请做一下自我介绍"
            },
            {
                "role": "assistant",
                "content": "我是{}的小助手,内在是上海AI实验室书生·浦语的1.8B大模型哦".format(name)
            }
        ]
    }

tips代码

python 复制代码
# 文件结构目录打印 tree.py
import os
import argparse

def print_dir_tree(startpath, prefix=''):
    """递归地打印目录树结构。"""
    contents = [os.path.join(startpath, d) for d in os.listdir(startpath)]
    directories = [d for d in contents if os.path.isdir(d)]
    files = [f for f in contents if os.path.isfile(f)]

    if files:
        for f in files:
            print(prefix + '|-- ' + os.path.basename(f))
    if directories:
        for d in directories:
            print(prefix + '|-- ' + os.path.basename(d) + '/')
            print_dir_tree(d, prefix=prefix + '    ')

def main():
    parser = argparse.ArgumentParser(description='打印目录树结构')
    parser.add_argument('folder', type=str, help='要打印的文件夹路径')

    args = parser.parse_args()

    print('|-- ' + os.path.basename(args.folder) + '/')
    print_dir_tree(args.folder, '    ')

if __name__ == "__main__":
    main()

配置文件选择

shell 复制代码
# 查询与internlm2-1.8b模型相关的config文件
xtuner list-cfg -p internlm2_1_8b
# 复制配置文件到指定位置
xtuner copy-cfg internlm2_1_8b_qlora_alpaca_e3 /root/ft/config

关于配置文件

txt 复制代码
1. part 1 Settings: 模型的基本设置,预训练模型的选择、数据集信息和训练过程中的一些基本参数(如批大小、学习率等)
2. part2 Model&Tokenizer: 指定了用于训练的模型和分词器的具体类型及其配置
3. part3 Dataset&Dataloader: 数据处理的细节,包括如何加载数据集、预处理步骤、批处理大小等
4. part4 Scheduler&Optimizer: 优化过程中的关键参数,如学习率调度策略和优化器的选择
5. part5 Runtime: 训练过程中的额外设置,如日志记录、模型保存策略和自定义钩子等

模型训练

常规训练:

shell 复制代码
xtuner train /root/ft/config/internlm2_1_8b_qlora_alpaca_e3_copy.py --work-dir /root/ft/train

deepspeed加速训练

shell 复制代码
xtuner train /root/ft/config/internlm2_1_8b_qlora_alpaca_e3_copy.py --work-dir /root/ft/train_deepspeed --deepspeed deepspeed_zero2

关于DeepSpeed

txt 复制代码
一个深度学习优化库,提高大规模模型训练的效率和速度,包括这样几个关键技术:模型分割、梯度累积、以及内存和带宽优化等
参数说明:`zero`即Zero Redundancy Optimizer, 降低训练大型模型所需内存占用的优化器
ZeRO分级
deepspeed_zero1: 优化了模型参数的存储,使得每个GPU只存储一部分参数以减少内存的使用
deepspeed_zero2:进一步优化了梯度和优化器状态的存储,分散存储到不同的GPU上
deepspeed_zero3: 进一步减少了激活函数的内存占用, 不存储激活

如何解决模型训练过程出现的过拟合问题

  1. 减少保存权重的间隔,增加权重文件保存的上限:结合评估问题从保存的模型中选择最优的
  2. 增加常规对话数据集以稀释原本数据

模型续训

使用--resume{checkpoint_path}实现模型续训

shell 复制代码
xtuner train /root/ft/config/internlm2_1_8b_qlora_alpaca_e3_copy.py --work-dir /root/ft/train --resume /root/ft/train/iter_600.pth

实操截图展示

一段时间后

模型转换、整合、测试和部署

.pth模型转化为hf格式模型

shell 复制代码
# xtuner convert pth_to_hf ${配置文件地址} ${权重文件地址} ${转换后模型保存地址}, 得到Huggingface中常用的.bin格式文件
xtuner convert pth_to_hf /root/ft/train/internlm2_1_8b_qlora_alpaca_e3_copy.py /root/ft/train/iter_768.pth /root/ft/huggingface

模型整合

LoRA或者QLoRA微调得到的模型为一个额外的层(adapter),而非一个完整的模型,需要和原来的模型组合之后才能使用

shell 复制代码
# XTuner中的一键整合指令
xtuner convert merge /root/ft/model /root/ft/huggingface /root/ft/final_model

对话测试

使用整合后的final_model,借助XTuner提供的prompt-template进行快速测试

shell 复制代码
# 与模型进行对话,这里选择的模板是internlm2_chat
xtuner chat /root/ft/final_model --prompt-template internlm2_chat
# 测试原模型
xtuner chat /root/ft/model --prompt-template internlm2_chat
# 使用adapter参数提前测试找到最优的adapter模型
xtuner chat /root/ft/model --adapter /root/ft/huggingface --prompt-template internlm2_chat

XTuner微调多模态LLM

多模态LLM原理示例图:

LLaVA介绍

训练得到LLaVA模型

使用<question text><image> -- <answer text>数据对+文本单模态LLM训练得到一个Image Projector,这个Image Projector即LLaVA模型

如何使用LLaVA模型

LLaVA方案的基本思路

分为两个阶段,在pretrain阶段使用<image><caption>数据训练一个理解图片总体特征的模型;在fintune阶段,使用<image><complex text>使得模型具有足够强悍的视觉能力

pretrain阶段需要8卡算力,溜号了

finetune阶段介绍

数据格式

json 复制代码
 {
    "id": "000000033471",
    "image": "coco/train2017/000000033471.jpg",
    "conversations": [
      {
        "from": "human",
        "value": "<image>\nWhat are the colors of the bus in the image?"
      },
      {
        "from": "gpt",
        "value": "The bus in the image is white and red."
      },
      {
        "from": "human",
        "value": "What feature can be seen on the back of the bus?"
      },
      {
        "from": "gpt",
        "value": "The back of the bus features an advertisement."
      },
      {
        "from": "human",
        "value": "Is the bus driving down the street or pulled off to the side?"
      },
      {
        "from": "gpt",
        "value": "The bus is driving down the street, which is crowded with people and other vehicles."
      }
    ]
  },

配置文件准备

shell 复制代码
# 查询xtuner内置配置文件
xtuner list-cfg -p llava_internlm2_chat_1_8b

# 拷贝配置文件到当前目录
xtuner copy-cfg llava_internlm2_chat_1_8b_qlora_clip_vit_large_p14_336_lora_e1_gpu8_finetune /root/tutorial/xtuner/llava

动手实操结果展示

微调启动!

带了deepspeed的就是快

训练完成

finetuning前的模型性能展示

finetuning后的模型性能展示

参考资料

  1. XTuner微调LLM: 1.8B模型,LLaVA方案
相关推荐
南宫生3 小时前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
sanguine__3 小时前
Web APIs学习 (操作DOM BOM)
学习
冷眼看人间恩怨3 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
数据的世界015 小时前
.NET开发人员学习书籍推荐
学习·.net
四口鲸鱼爱吃盐5 小时前
CVPR2024 | 通过集成渐近正态分布学习实现强可迁移对抗攻击
学习
OopspoO7 小时前
qcow2镜像大小压缩
学习·性能优化
A懿轩A8 小时前
C/C++ 数据结构与算法【栈和队列】 栈+队列详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·栈和队列
居居飒8 小时前
Android学习(四)-Kotlin编程语言-for循环
android·学习·kotlin
kkflash38 小时前
提升专业素养的实用指南
学习·职场和发展
Hejjon9 小时前
SpringBoot 整合 SQLite 数据库
笔记