InternLM Xtuner Qlora 微调

news2024/11/17 5:44:26

Xtuner 简介

在这里插入图片描述

XTuner 是由上海人工智能实验室开发的一款低成本大模型训练工具箱。它以高效、灵活和全能的特性,成为轻量化大模型微调的理想选择。借助 XTuner,用户仅需 8GB 显存即可对 InternLM2-7B 模型进行微调,从而定制出独一无二的 AI 助手。这一创新工具极大地降低了微调大型模型的门槛,使得更多研究者和开发者能够轻松地进行个性化 AI 应用的开发。

仓库地址:https://github.com/InternLM/xtuner

Xtuner 特点概览

高效性能

  • 大模型支持:Xtuner 能够在仅 8GB 显存的环境下微调 7B 模型,同时支持跨多节点的更大规模模型(70B+)微调。
  • 算子加速:自动集成高性能算子,如 FlashAttention 和 Triton kernels,显著提升训练效率。
  • 深度优化:与 DeepSpeed 兼容,利用 ZeRO 优化策略,进一步提高训练性能。

灵活适应

  • 模型多样性:支持多种大语言模型,包括 InternLM、Mixtral-8x7B、Llama2、ChatGLM、Qwen 和 Baichuan 等。
  • 多模态能力:支持 LLaVA 等多模态图文模型的预训练与微调,如表现出色的 LLaVA-InternLM2-20B 模型。
  • 数据管道:设计灵活的数据管道,兼容各种数据格式,无论是开源数据还是自定义数据,都能快速适应。
  • 微调算法:提供 QLoRA、LoRA 及全量参数微调等多种微调算法,满足不同需求。

全能应用

  • 训练模式:支持增量预训练、指令微调及 Agent 微调,适应多种训练场景。
  • 对话模板:预设丰富的开源对话模板,便于与各类模型进行交互。
  • 无缝集成:训练后的模型可直接部署于 LMDeploy,或通过 OpenCompass 和 VLMEvalKit 进行大规模评测。

环境准备

创建工作目录

创建本次微调实践的工作目录 /root/autodl-tmp/ft-learn

# 创建微调工作目录
mkdir -p /root/autodl-tmp/ft-learn

# 创建微调数据集存放目录
mkdir -p /root/autodl-tmp/ft-learn/dataset

# 创建微调配置文件存放目录
mkdir -p /root/autodl-tmp/ft-learn/config

安装

  • 推荐使用 conda 先构建一个 Python-3.10 的虚拟环境

    conda create --name xtuner-env python=3.10 -y
    conda activate xtuner-env
    
  • 通过 pip 安装 XTuner:

    pip install -U xtuner
    

    亦可集成 DeepSpeed 安装:

    pip install -U 'xtuner[deepspeed]'
    
  • 从源码安装 XTuner:

    git clone https://github.com/InternLM/xtuner.git
    cd xtuner
    pip install -e '.[all]'
    

安装依赖

# 升级pip
python -m pip install --upgrade pip
# 安装python依赖
pip install modelscope==1.9.5
pip install transformers==4.36.2
pip install streamlit==1.24.0
pip install sentencepiece==0.1.99
pip install accelerate==0.24.1
pip install transformers_stream_generator==0.0.4
pip install einops ujson
pip install protobuf

使用 modelscope 下载模型

使用 modelscope 中的 snapshot_download 函数下载模型,第一个参数为模型名称,参数 cache_dir 为模型的下载路径。

Internlm2-7b-chat-web.ipynb 文件中新建一个代码块,运行下载 internlm2-chat-7b 模型。模型下载需要时间,我们直接往下看

from modelscope import snapshot_download

model_dir = snapshot_download('Shanghai_AI_Laboratory/internlm2-chat-7b', cache_dir='/root/autodl-tmp', revision='master')

数据集处理

我自己整理的 心理大模型-职场焦虑语料.xlsx, 通过 gen_qa_json.py 文件生成一个 career_coach.jsonl 文件

运行 python /root/autodl-tmp/ft-learn/dataset/gen_qa_json.py 生成文件,你们也可以按照我的数据语料格式,自定义你们自己的数据集。gen_qa_json.py 文件代码如下:

import pandas as pd
import json

# 读取Excel文件
excel_file = './Healthcare.xlsx'  # 替换成实际的Excel文件路径
df = pd.read_excel(excel_file)

# 设置system的值
system_value = "你是一个专业的,经验丰富的有健康检测的助手。你总是根据有健康焦虑的病人的问题提供准确、全面和详细的答案。"

# 将数据整理成jsonL格式
json_data = []
for index, row in df.iterrows():
    conversation = [
        {
            "system": system_value,
            "input": str(row['q']),
            "output": str(row['a'])
        }
    ]
    json_data.append({"conversation": conversation})

# 将json数据写入文件
output_json_file = 'career_coach.jsonl'  # 替换成实际的输出文件路径
with open(output_json_file, 'w', encoding='utf-8') as f:
    json.dump(json_data, f, ensure_ascii=False)

print("JSONL文件生成成功!")

配置文件准备

Xtuner 已经内置了许多的配置文件。可以通过 Xtuner 查看可配置文件

xtuner list-cfg

由于我们本次的基座微调模型为 internLM2-chat-7b,所以我们可以查看 Xtuner 现在在 InternLM2 下已经支持了哪些配置文件

xtuner list-cfg |grep internlm2
# 复制配置文件
xtuner copy-cfg internlm2_chat_7b_qlora_oasst1_e3 /root/autodl-tmp/ft-learn/config
# 修改配置文件名
mv /root/autodl-tmp/ft-learn/config/internlm2_chat_7b_qlora_oasst1_e3_copy.py  /root/autodl-tmp/ft-learn/config/internlm2_chat_7b_qlora_oasst1_e3_career_coach.py

复制完成之后要修改配置文件的几处参数

# PART 1 中
# 预训练模型存放的位置
pretrained_model_name_or_path = '/root/autodl-tmp/Shanghai_AI_Laboratory/internlm2-chat-7b'

# 微调数据存放的位置
data_path = '/root/autodl-tmp/ft-learn/dataset/career_coach.jsonl'

# 训练中最大的文本长度
max_length = 512

# 每一批训练样本的大小
batch_size = 2

# 最大训练轮数
max_epochs = 3

# 验证的频率
evaluation_freq = 500

# 用于评估输出内容的问题(用于评估的问题尽量与数据集的question保持一致)
evaluation_inputs = [
'我感到在职场中压力很大,总是全身无力、掉头发,我该怎么办?',
'我在生活中总是失眠、头痛,怎样治疗?',
]


# PART 3 中
# 如果这里的
无法直接读取json文件
dataset=dict(type=load_dataset, path='json', data_files=dict(train=data_path))
# 这里也得改成None,否则会报错KeyError
dataset_map_fn=None

模型微调

微调启动

xtuner train /root/autodl-tmp/ft-learn/config/internlm2_chat_7b_qlora_oasst1_e3_career_coach.py  --deepspeed deepspeed_zero2

训练完成之后,参数模型存放在 /root/work_dirs/internlm2_chat_7b_qlora_oasst1_e3_career_coach/ 目录下

模型转换成HF

# 新建模型存放的文件夹
mkdir -p /root/work_dirs/internlm2_chat_7b_qlora_oasst1_e3_career_coach/hf
# 添加环境变量
export MKL_SERVICE_FORCE_INTEL=1
# 模型转换
xtuner convert pth_to_hf /root/autodl-tmp/ft-learn/config/internlm2_chat_7b_qlora_oasst1_e3_career_coach.py /root/work_dirs/internlm2_chat_7b_qlora_oasst1_e3_career_coach/iter_51.pth/ /root/work_dirs/internlm2_chat_7b_qlora_oasst1_e3_career_coach/hf

合并HF adapter 到LLM

mkdir -p /root/autodl-tmp/ft-learn/merged

export MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER='GNU'

# 原始模型参数存放的位置
export NAME_OR_PATH_TO_LLM=/root/autodl-tmp/Shanghai_AI_Laboratory/internlm2-chat-7b

# Hugging Face格式参数存放的位置
export NAME_OR_PATH_TO_ADAPTER=/root/work_dirs/internlm2_chat_7b_qlora_oasst1_e3_career_coach/hf

# 最终Merge后的参数存放的位置
mkdir -p /root/autodl-tmp/ft-learn/merged/internlm2_cc_hf_merge
export SAVE_PATH=/root/autodl-tmp/ft-learn/merged/internlm2_cc_hf_merge


# 执行参数Merge
xtuner convert merge \
    $NAME_OR_PATH_TO_LLM \
    $NAME_OR_PATH_TO_ADAPTER \
    $SAVE_PATH \
    --max-shard-size 2GB

Xtuner多轮对话介绍

XTuner 训练多轮对话模型时,采取了一种更加充分高效的方法。将多轮对话进行拼接,之后输入模型,并行计算每个位置的 loss,而只有 Output 部分的 loss 参与回传。

XTuner 中多轮对话数据集格式如下所示:

[{
    "conversation":[
        {
            "system": "You are an AI assistant."
            "input": "Hello?",
            "output": "Hello! How can I help you?"
        },
        {
            "input": "What's the date today?",
            "output": "Today is Monday, August 14, 2023."
        },
        {
            "input": "Thank you!",
            "output": "You are welcome."
        }
    ]
},
{
    "conversation":[
        {
            "system": "You are an AI assistant."
            "input": "Hello?",
            "output": "Hello! How can I help you?"
        },
        {
            "input": "How's the weather today in Rosso?",
            "output": "The weather in Rosso on Wednesday, August 16th, is going to be cloudy for most of the day, together with moderate rain around noon."
        },
        {
            "input": "Thank you!",
            "output": "You are welcome."
        }
    ]
}]

数据集中的 “conversation” 键对应的值是一个列表,用于保存每一轮对话的指令和实际回答(GroundTruth)。为了保持格式统一,增量预训练数据集和单轮对话数据集中的 “conversation” 键也对应一个列表,只不过该列表的长度为 1。而在多轮对话数据集中,“conversation” 列表的长度为 n,以容纳 n 轮的对话内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1809251.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【OC】类与对象

类与对象 定义类接口部分定义成员变量方法说明实现部分 对象的产生与使用对象与指针self关键字避免重复创建 id类型方法详解方法的所属性形参个数可变的方法 成员变量成员变量及其运行机制多个实例中内存示意图模拟类变量单例模式 类是面向对象的重要内容,我们可以把…

C++进阶:继承

文章目录 继承的概念继承的定义方式继承关系和访问限定符基类和派生类对象的赋值转换继承中的作用域派生类中的默认成员函数构造函数拷贝构造函数赋值拷贝函数析构函数 总结 继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允…

c++ 里函数选择的优先级:普通函数、模板函数、万能引用,函数重载的常量左值引用、右值引用,编译器选择哪个执行呢?

看大师写的代码时,除了在类里定义了 copy 构造函数,移动构造函数,还定义了对形参采取万能引用的构造函数,因此有个疑问,这时候的构造函数优先级是什么样的呢?简化逻辑测试一下,如下图&#xff0…

c语言:自定义类型(枚举、联合体)

目录 前言: 1.位段 1.1什么是位段 1.2 位段的内存分配 1.3 位段的跨平台问题 2.枚举 2.1枚举类型的定义 2.2枚举类型的优点 3.联合体(共用体) 3.1联合类型的定义 3.2联合体的特点 3.3联合大小的计算 3.4联合体的实际应用 前言…

【机器学习系列】深入理解集成学习:从Bagging到Boosting

目录 一、集成方法的一般思想 二、集成方法的基本原理 三、构建集成分类器的方法 常见的有装袋(Bagging)和提升(Boosting)两种方法 方法1 :装袋(Bagging) Bagging原理如下图: …

调研管理系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,基础数据管理,教师类型管理,课程类型管理,公告类型管理 前台账户功能包括:系统首页,个人中心,论坛&#…

深度学习之文本分类模型-基于transformer

1、transformer transformer就是大名鼎鼎的论文《Attention Is All You Need》[1],其在一些翻译任务上获得了SOTA的效果。其模型整体结构如下图所示 encoder和decoder 其整体结构由encoder和decoder组成,其中encoder由6个相同的block组成,…

MySQL中的数据库约束

目录 导读: 约束类型 1、not null(不能为空) 2、unique(唯一) 3、default(默认值约束) 4、primary key(唯一)与unique 相同点: 不同点: auto_increment: 5、foreign key(外键) 语法形式&#xff…

GAN的入门理解

这一篇主要是关于生成对抗网络的模型笔记,有一些简单的证明和原理,是根据李宏毅老师的课程整理的,下面有链接。本篇文章主要就是梳理基础的概念和训练过程,如果有什么问题的话也可以指出的。 李宏毅老师的课程链接 1.概述 GAN是…

BC11 学生基本信息输入输出

BC11 学生基本信息输入输出 废话不多说上题目&#xff1a; 这道题表面上很简单&#xff0c;但是里面有很重要的点先给大家上正确的代码&#xff1a; #include<stdio.h> int main() {int stu 0;float c 0;float English 0;float math 0;scanf("%d;%f,%f,%f"…

Java入门教程上

常见的cmd命令 类 class 字面量 数据类型 输入 public static void main(String[] args) {Scanner anew Scanner(System.in);int na.nextInt();int ma.nextInt();System.out.println(mn);} } 算数运算符 package wclg;public class test {public static void main(String[] ar…

iOS调整collectionViewCell顺序

效果图 原理 就是设置collectionView调整顺序的代理方法&#xff0c;这里要注意一点 调整过代理方法之后&#xff0c;一定要修改数据源&#xff0c;否则导致错乱。 还有就是在collectionView上面添加一个长按手势&#xff0c;在长按手势的不同阶段&#xff0c;调用collectionV…

【数据结构】AVL树(平衡二叉树)

目录 一、AVL树的概念二、AVL树的节点三、AVL树的插入四、AVL树的旋转1.插入在较高左子树的左侧&#xff0c;使用右单旋2.插入在较高右子树的右侧&#xff0c;使用左单旋3.插入较高左子树的右侧&#xff0c;先左单旋再右单旋4.插入较高右子树的左侧&#xff0c;先右单旋再左单旋…

论文研读 A Comparison of TCP Automatic Tuning Techniques for Distributed Computing

论文《分布式计算中TCP自动调优技术的比较》由Eric Weigle和Wu-chun Feng撰写&#xff0c;探讨了自动调整TCP缓冲区大小以提升分布式应用性能的不同方法。文章首先讨论了手动优化TCP缓冲区大小的局限性&#xff0c;并介绍了研究人员提出的各种自动调优技术来应对这些挑战。 作者…

打造智慧工厂核心:ARMxy工业PC与Linux系统

智能制造正以前所未有的速度重塑全球工业格局&#xff0c;而位于这场革命核心的&#xff0c;正是那些能够精准响应复杂生产需求、高效驱动自动化流程的先进设备。钡铼技术ARMxy工业计算机&#xff0c;以其独特的设计哲学与卓越的技术性能&#xff0c;正成为众多现代化生产线背后…

2024全国大学生数学建模竞赛优秀参考资料分享

0、竞赛资料 优秀的资料必不可少&#xff0c;优秀论文是学习的关键&#xff0c;视频学习也非常重要&#xff0c;如有需要请点击下方名片获取。 一、赛事介绍 全国大学生数学建模竞赛(以下简称竞赛)是中国工业与应用数学学会主办的面向全国大学生的群众性科技活动&#xff0c;旨…

⌈ 传知代码 ⌋ 记忆大师

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

MySQL 函数与约束

MySQL 函数与约束 文章目录 MySQL 函数与约束1 函数1.1 字符串函数1.2 数值函数1.3 日期函数1.4 流程函数 2 约束2.1 概述2.2 约束演示2.3 外键约束2.4 删除/更新行为 1 函数 函数是指一段可以直接被另一程序调用的程序或代码。 1.1 字符串函数 MySQL中内置了很多字符串函数&…

Python学习打卡:day02

day2 笔记来源于&#xff1a;黑马程序员python教程&#xff0c;8天python从入门到精通&#xff0c;学python看这套就够了 8、字符串的三种定义方式 字符串在Python中有多种定义形式 单引号定义法&#xff1a; name 黑马程序员双引号定义法&#xff1a; name "黑马程序…

攻防演练之-网络集结号

每一次的网络安全攻防演练都是各个安全厂商期待的网络安全盛会&#xff0c;因为目前的安全生态导致了只有在网络安全攻防演练期间&#xff0c;网络安全的价值才会走向台前&#xff0c;收到相关方的重视。虽然每一次都会由于各种原因不能如期举行&#xff0c;但是这一次的推迟总…