第四节笔记&作业

XTuner 微调 LLM:1.8B、多模态、Agent

微调效果:

第四节笔记&作业

XTuner 一个大语言模型&多模态模型微调工具箱。由 MMRazor 和 MMDeploy 联合开发。

  • 傻瓜化: 以 配置文件 的形式封装了大部分微调场景,0基础的非专业人员也能一键开始微调。
  • 轻量级: 对于 7B 参数量的LLM,微调所需的最小显存仅为 8GB : 消费级显卡✅,colab✅

一、xtuner工作原理

第四节笔记&作业

可以看到,整个流程分为四部分

  1. 前期准备:包括前期数据的处理,微调方法,模型的选择
  2. 配置文件准备:根据数据集以及你特殊的任务要求,修改 load_dataset ,prompt_template 等在微调时需要的重要参数
  3. 进行模型的训练
  4. 模型转换、测试与部署。效果不好的话改进训练。

二、动手实践

链接:https://github.com/InternLM/Tutorial/blob/camp2/xtuner/personal_assistant_document.md

2.1 环境安装

studio-conda xtuner0.1.17

安装完成

第四节笔记&作业

2.2 前期准备

2.2.1 准备数据集

把数据集放在/root/ft/data
使用 generate_data.py 生成数据集

import json

# 设置用户的名字
name = '你的名字'
# 设置需要重复添加的数据次数
n =  10000

# 初始化OpenAI格式的数据结构
data = [
    {
        "messages": [
            {
                "role": "user",
                "content": "请做一下自我介绍"
            },
            {
                "role": "assistant",
                "content": "我是{}的小助手,内在是上海AI实验室书生·浦语的1.8B大模型哦. 很高兴认识你".format(name)
            }
        ]
    }
]

# 通过循环,将初始化的对话数据重复添加到data列表中
for i in range(n):
    data.append(data[0])

# 将data列表中的数据写入到一个名为'personal_assistant.json'的文件中
with open('personal_assistant.json', 'w', encoding='utf-8') as f:
    # 使用json.dump方法将数据以JSON格式写入文件
    # ensure_ascii=False 确保中文字符正常显示
    # indent=4 使得文件内容格式化,便于阅读
    json.dump(data, f, ensure_ascii=False, indent=4)

此代码将数据集放进personal_assistant.json文件中。
这里的数据集,你也可以换成任何你想要的数据集。

2.2.2 模型准备

模型放在/ft/model目录下

第四节笔记&作业

2.2.3 配置文件选择

查看1.8b使用的配置文件

第四节笔记&作业

第四节笔记&作业

将配置文件复制到/ft/config目录下

第四节笔记&作业

前期准备完成

2.3 配置文件修改

配置文件中有五个部分:

  1. Settings:涵盖了模型基本设置,如预训练模型的选择、数据集信息和训练过程中的一些基本参数(如批大小、学习率等)。
  2. Model & Tokenizer:指定了用于训练的模型和分词器的具体类型及其配置,包括预训练模型的路径和是否启用特定功能(如可变长度注意力),这是模型训练的核心组成部分。
  3. Dataset & Dataloader:描述了数据处理的细节,包括如何加载数据集、预处理步骤、批处理大小等,确保了模型能够接收到正确格式和质量的数据。
  4. Scheduler & Optimizer:配置了优化过程中的关键参数,如学习率调度策略和优化器的选择,这些是影响模型训练效果和速度的重要因素。
  5. Runtime:定义了训练过程中的额外设置,如日志记录、模型保存策略和自定义钩子等,以支持训练流程的监控、调试和结果的保存。

在当前的情况下,只需要修改前三个Part的内容即可,如

  • 模型地址
  • json数据集地址
  • 训练epoch数
  • ….

2.4 模型训练

2.4.1 常规训练

使用xtuner train 指令,即可立即开始训练,并且指定训练时结果保存路径

xtuner train /root/ft/config/internlm2_1_8b_qlora_alpaca_e3_copy.py --work-dir /root/ft/train

第四节笔记&作业

在300个epochs时,问”你是我的小助手吗“?它的回答十分准确,没有出现过拟合的现象。

微调成功

第四节笔记&作业

2.5 模型转换、整合、测试及部署

2.5.1 模型转换

模型转换的本质其实就是将原本使用 Pytorch 训练出来的模型权重文件转换为目前通用的 Huggingface 格式文件,那么我们可以通过以下指令来实现一键转换。

# 创建一个保存转换后 Huggingface 格式的文件夹
mkdir -p /root/ft/huggingface

# 模型转换
# xtuner convert pth_to_hf ${配置文件地址} ${权重文件地址} ${转换后模型保存地址}
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

出现报错

第四节笔记&作业

经排查,原因也很简单,是因为这句命令用的是iter_768,而我在微调时改变了迭代次数,最后保存的pth文件名并不是768,更改为iter_1728.pth就好了。

第四节笔记&作业

成功得到了模型的.bin文件!

第四节笔记&作业

2.5.2 模型整合

对于 LoRA 或者 QLoRA 微调出来的模型其实并不是一个完整的模型,而是一个额外的层(adapter)。那么训练完的这个层最终还是要与原模型进行组合才能被正常的使用。

第四节笔记&作业

进行模型整合

xtuner convert merge /root/ft/model /root/ft/huggingface /root/ft/final_model

2.6 运行测试

与微调后的模型对话

xtuner chat /root/ft/model --prompt-template internlm2_chat

第四节笔记&作业

成功地输出了我在数据集中设置的内容

再使用原模型比对一下:

第四节笔记&作业

可以明显地看出,微调极大改变了模型输出的内容。

© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...