InternLM大模型实战-4.XTuner大模型低成本微调实战

文章详细介绍了XTuner这款工具,用于大模型的微调,支持多种微调场景,如快速上手、自定义微调和MS-Agent微调。通过配置文件和数据处理,简化了模型微调过程,适用于7B参数量的LLM模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

本文是对于InternLM全链路开源体系系列课程的学习笔记。【XTuner 大模型单卡低成本微调实战】 https://www.bilibili.com/video/BV1yK4y1B75J/?share_source=copy_web&vd_source=99d9a9488d6d14ace3c7925a3e19793e

笔记正文

XTuner

地址:XTuner

一个大预言模型微调工具箱

  • 傻瓜化:以配置文件的形式封装了大部分微调场景
  • 轻量级:对于7B参数量的LLM,微调所需的最小显存仅为8GB。

支持模型和数据集

在这里插入图片描述

微调原理

  • LoRA:只对玩具中某些零件记性改动,而不是对整个玩具进行全面改动
  • QLoRA:LoRA的一种改进,如果你手里只有一把生锈的螺丝刀,也能改造你的玩具。

跟随文档学习

文档提供了三个微调的例子,分别叫做快速上手、自定义微调和MS-Agent微调。

快速上手

首先介绍了如何安装微调的XTuner环境,然后介绍了具有多个开箱即用的配置文件,并对于这些配置文件的名称进行了解释
例如文件名:internlm_chat_7b_qlora_oasst1_e3

模型名internlm_chat_7b
使用算法qlora
数据集oasst1
把数据集跑几次跑三次:e3

然后根据实际模型、数据集存放的位置、实际训练需求,修改配置文件中的信息。

接着就可以开始微调了。

微调训练完成后,应该在work_dirs的目录下产生pth权重,需要将其转换成hf格式的模型

xtuner convert pth_to_hf ${CONFIG_NAME_OR_PATH} ${PTH_file_dir} ${SAVE_PATH}

转换后,生成的文件应该是

|-- README.md
|-- adapter_config.json
|-- adapter_model.bin
`-- xtuner_config.py

可以理解为LoRA模型文件=Adapter

然后将hf的adapter合并到原LLM,并与之对话,这些需求xtuner都提供了相应的命令行工具。

自定义微调

这个部分演示了在实际需求下如何准备数据、修改配置文件、进行微调。

准备数据

将表格(或者其他数据格式)数据转化成jsonL格式。也就是json列表

[{
    "conversation":[
        {
            "system": "xxx",
            "input": "xxx",
            "output": "xxx"
        }
    ]
},
{
    "conversation":[
        {
            "system": "xxx",
            "input": "xxx",
            "output": "xxx"
        }
    ]
}]

然后划分训练集和测试集等。

准备配置文件

可以从下面的对配置文件的修改看出如何使用这种所谓的“自定义数据集”进行微调训练。

# 修改import部分
- from xtuner.dataset.map_fns import oasst1_map_fn, template_map_fn_factory
+ from xtuner.dataset.map_fns import template_map_fn_factory

# 修改模型为本地路径
- pretrained_model_name_or_path = 'internlm/internlm-chat-7b'
+ pretrained_model_name_or_path = './internlm-chat-7b'

# 修改训练数据为 MedQA2019-structured-train.jsonl 路径
- data_path = 'timdettmers/openassistant-guanaco'
+ data_path = 'MedQA2019-structured-train.jsonl'

# 修改 train_dataset 对象
train_dataset = dict(
    type=process_hf_dataset,
-   dataset=dict(type=load_dataset, path=data_path),
+   dataset=dict(type=load_dataset, path='json', data_files=dict(train=data_path)),
    tokenizer=tokenizer,
    max_length=max_length,
-   dataset_map_fn=alpaca_map_fn,
+   dataset_map_fn=None,
    template_map_fn=dict(
        type=template_map_fn_factory, template=prompt_template),
    remove_unused_columns=True,
    shuffle_before_pack=True,
    pack_to_max_length=pack_to_max_length)

然后和前文差不多。

MS-Agent微调

数据也是由jsonl格式的,但是与前面的input、output不同,现在的每个conversations则需要赋予不同的身份了。

  • system: 表示给模型前置的人设输入,其中有告诉模型如何调用插件以及生成请求
  • user: 表示用户的输入 prompt,分为两种,通用生成的prompt和调用插件需求的 prompt
  • assistant: 为模型的回复。其中会包括插件调用代码和执行代码,调用代码是要 LLM 生成的,而执行代码是调用服务来生成结果的

而assistant则需要包含工具调用和返回,分别叫做思考阶段和执行阶段,这两个阶段是不输出的,具体格式如下
图片来源https://github.com/InternLM/tutorial/blob/main/xtuner/README.md
图片来源https://github.com/InternLM/tutorial/blob/main/xtuner/README.md

之后就是找到对应的训练配置文件,根据实际情况等进行修改即可。

编写一个WDM Windows驱动程序并确保其在Windows NT系统上成功加载运行是一个涉及多方面技能的过程。首先,你需要对Windows内核级编程有深入的理解,这包括对操作系统的内部工作原理、驱动程序架构和编程接口等有一个全面的认识。为此,我强烈推荐《深入解析Windows驱动程序模型开发教程》,这是一本详细指导如何开发Windows NT设备驱动程序的经典教程。 参考资源链接:[深入解析Windows驱动程序模型开发教程](https://wenku.youkuaiyun.com/doc/6498039cf8e98f67e0ab1b65?spm=1055.2569.3001.10343) 开始编写之前,你还需要准备相应的开发环境,比如安装Visual Studio和Windows Driver Kit (WDK)。有了这些工具之后,你可以开始编写驱动程序代码了。一个基本的WDM驱动程序通常包含以下关键步骤: 1. **创建驱动程序项目**:使用Visual Studio创建一个新的驱动程序项目,并选择适当的模板。 2. **编写DriverEntry例程**:这是驱动程序的入口点。在此例程中,你需要执行初始化驱动程序的操作,并注册一系列的回调函数,这些回调函数将在特定的系统事件发生时被调用。 3. **处理IRP请求**:实现必要的IRP处理例程以响应来自操作系统的输入/输出请求。例如,你需要处理IRP_MJ_CREATE、IRP_MJ_CLOSE、IRP_MJ_DEVICE_CONTROL等请求。 4. **设备堆栈与PnP管理**:编写代码以响应即插即用(PnP)事件,以及如何在设备堆栈中与其他驱动程序协同工作。 5. **调试和测试**:使用WinDbg和Visual Studio的调试工具进行代码调试,确保驱动程序按预期工作,并且没有内存泄漏或死锁等问题。 以下是一个非常简单的DriverEntry示例,用于演示驱动程序的骨架结构: ```c NTSTATUS DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath) { UNREFERENCED_PARAMETER(RegistryPath); DriverObject->DriverUnload = UnloadDriver; DriverObject->DriverExtension->AddDevice = AddDeviceFunction; DriverObject->MajorFunction[IRP_MJ_CREATE] = DispatchCreateClose; DriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchCreateClose; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchDeviceControl; return STATUS_SUCCESS; } ``` 在这个示例中,我们注册了一个卸载函数和一个处理设备创建和关闭的函数。IRP_MJ_DEVICE_CONTROL处理函数将由具体的应用程序命令调用。 通过以上步骤,你可以开始编写自己的WDM驱动程序。在开发过程中,我建议你反复参考《深入解析Windows驱动程序模型开发教程》,确保你的开发工作遵循最佳实践。此外,多加注意驱动程序的安全性和稳定性,避免常见的编程错误,如内存泄漏和资源管理不当。如果你在编写驱动程序时遇到任何问题,可以查阅这本书以找到解决方案,或者考虑加入相关的开发者社区以获取更多的帮助和资源。 参考资源链接:[深入解析Windows驱动程序模型开发教程](https://wenku.youkuaiyun.com/doc/6498039cf8e98f67e0ab1b65?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

早上真好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值