XTuner微调实践

devtools/2024/9/23 9:29:25/

本文采用XTuner进行对InterLM2-Chat-1.8B模型的微调实践。

Xtuner工具介绍:
Xtuner是一款由上海人工智能实验室开发的低成本大模型训练和微调工具箱,它的特点是以配置文件的形式封装了大部分微调场景。
Xtuner支持多种微调策略,如增量预训练和指令跟随微调。同时支持全参、LoRA和QLoRA三种微调方式

模型准备

可以在huggingface上下载需要的模型,如果在公共文件夹中已经保存了模型,可以用cp -r(复制整个文件夹),但是为了节省内存,只需要新建一个软连接

ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b /root/ft/model

这意味着,当我们访问 /root/ft/model 时,实际上就是在访问 /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b 目录下的内容。通过这种方式,我们无需复制任何数据,就可以直接利用现有的模型文件进行后续的微调操作,从而节省存储空间并简化文件管理。

准备微调数据

如果不对模型进行身份微调,它可能不会有一个很好的自我介绍。
我们采用脚本的形式,向数据中加入n=10000条数据,以json格式存储,以改变模型对“你是谁”这个问题的回复。
数据格式如下:

data = [{"messages": [{"role": "user","content": "你是什么类型的小狗?"},{"role": "assistant","content": "我是可爱的{},我长得萌萌哒!".format(name)}]}
]

data是一个list的格式,里面以字典格式存储了一个问答对,分别是用户的提问“你是什么类型的小狗?”(user角色)和相应的模型回复(assistant角色)。然后将这条信息重复10000遍添加到data中,然后导出成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)

生成的数据如下:
在这里插入图片描述

使用模糊查找合适的微调配置文件

使用xtuner list-cfg -p xxx 来查找合适的配置文件
在这里插入图片描述
可以看到对internlm2_1.8b有两个合适的配置文件。分别是全量微调和Qlora微调的方式。alpaca是微调的数据集名称,e3表示对数据集跑3次。虽然我们微调采用的是自己的数据集,但是internlm2_1_8b_qlora_alpaca_e3.py这个配置文件使用了qlora方法,和我们希望进行微调的方式最相似。
将这个文件用xtuner copy-cfg internlm2_1_8b_qlora_alpaca_e3 /root/ft/config复制到指定文件夹中。

在internlm2_1_8b_qlora_alpaca_e3.py中,可以修改训练的轮数,数据集来源等。
提示:之前的代码是从文件夹中读取数据的,我们可以进行这样的修改

# 将原本是 alpaca 的地址改为是 json 文件的地址(在第102行的位置)
- dataset=dict(type=load_dataset, path=alpaca_en_path),
+ dataset=dict(type=load_dataset, path='json', data_files=dict(train=alpaca_en_path)),

这样可以把数据来源由文件夹改为来自json文件

开始训练

可以使用XTuner内置的deepspeed来加速训练,共有三种不同的 deepspeed 类型可进行选择,分别是 deepspeed_zero1, deepspeed_zero2 和 deepspeed_zero3

训练过程如下:
100轮截图:

此时loss下降到0.12,但是对于回答“你是谁”这个问题,还是给出了“我是机器人”的回复。

在这里插入图片描述
有效果,但是开始复读机

第200轮的时候,成功了
在这里插入图片描述
第500轮
500轮效果

模型整合

将原本使用 Pytorch 训练出来的模型权重文件转换为目前通用的 Huggingface 格式文件,然后把训练完的这个层与原模型进行组合,进行对话测试
在这里插入图片描述
可以看出已经过拟合了。


http://www.ppmy.cn/devtools/22407.html

相关文章

宝塔面板开启Nginx缓存为网站提速

fastcgi_cache介绍 Nginx默认自带的fastcgi_cache模块能把动态页面缓存起来,提高网站速度和降低服务器负载。 当有用户请求相同的页面时,Nginx可以直接返回缓存的页面,而不需要再次访问后端服务器。 这个模块可以通过简单的配置实现,还支持…

Java设计模式 _结构型模式_桥接模式

一、桥接模式 1、桥接模式 桥接模式(Bridge Pattern)是一种结构型设计模式。用于把一个类中多个维度的抽象化与实现化解耦,使得二者可以独立变化。 2、实现思路 使用桥接模式,一定要找到这个类中两个变化的维度:如支…

Android如何使用XML自定义属性

1、定义 在res/values文件下定义一个attrs.xml文件,代码如下: 2、使用 在布局中使用, 示例代码如下: 3、获取 最终来到这里:

ubuntu安装Anaconda安装及conda使用

一. 安装anaconda3详细教程 1、下载镜像 清华大学开源软件镜像站下载地址: https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 下拉到最低端选择Linux,选择最新版(32/64位)下载。这里我下载的是版本Anaconda3-4.3.30-Linux…

怎么理解JavaScript原型、原型链

原型 JavaScript被描述为一种基于原型的语言,也就是每一个对象都拥有一个原型对象。 当我们访问一个对象的属性时,它不仅仅该改对象上查找,还会到这个对象的原型上查找,甚至是到这个对象的原型的原型上查找,这样一层…

Vue入门到关门之指令系统

一、引入 在 Vue.js 中,指令(Directives)是一种特殊的标记,用于向 Vue 实例提供特殊的行为。指令以 v- 开头,例如 v-if、v-for 等。 指令的本质就是语法糖,标志位。在编译阶段 render 函数里,…

SVM中常用的核函数及适用场景

常用的核函数 核函数(Kernel functions)在机器学习中尤其是在支持向量机(SVM)中扮演着重要的角色,它们能够将数据映射到高维空间,从而解决非线性问题。以下是一些常用的核函数及其适用场景: 线…

MR混合现实实训系统为农学情景实训教学演练

MR混合现实实训系统在农学课堂上的应用具有很大的潜力。它能够为学生提供一种全新的学习方式,使他们能够更直观地了解和理解农业实践。 首先,MR混合现实技术可以模拟真实环境,使学生能够更深入地了解各种农作物生长的过程和环境因素。通过模拟…