[大模型]InternLM2-7B-chat Xtuner Qlora 微调

InternLM2-7B-chat Xtuner Qlora 微调

Xtuner介绍

XTuner是上海人工智能实验室开发的低成本大模型训练工具箱,XTuner 是一个高效、灵活、全能的轻量化大模型微调工具库。只要8G。最低只需 8GB 显存,就可以微调InternLM2-7B模型,打造专属于你的 AI 助手。

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

Xtuner特点

高效

  • 支持大语言模型 LLM、多模态图文模型 VLM 的预训练及轻量级微调。XTuner 支持在 8GB 显存下微调 7B 模型,同时也支持多节点跨设备微调更大尺度模型(70B+)。
  • 自动分发高性能算子(如 FlashAttention、Triton kernels 等)以加速训练吞吐。
  • 兼容 DeepSpeed 🚀,轻松应用各种 ZeRO 训练优化策略。

灵活

  • 支持多种大语言模型,包括但不限于 InternLM、Mixtral-8x7B、Llama2、ChatGLM、Qwen、Baichuan。
  • 支持多模态图文模型 LLaVA 的预训练与微调。利用 XTuner 训得模型 LLaVA-InternLM2-20B 表现优异。
  • 精心设计的数据管道,兼容任意数据格式,开源数据或自定义数据皆可快速上手。
  • 支持 QLoRA、LoRA、全量参数微调等多种微调算法,支撑用户根据具体需求作出最优选择。

全能

  • 支持增量预训练、指令微调与 Agent 微调。
  • 预定义众多开源对话模版,支持与开源或训练所得模型进行对话。
  • 训练所得模型可无缝接入部署工具库 LMDeploy、大规模评测工具库 OpenCompass 及 VLMEvalKit。

环境准备

在 autodl 平台中租赁一个 3090 等 24G 显存的显卡机器,如下图所示镜像选择 PyTorch–>2.0.0–>3.8(ubuntu20.04)–>11.8 。

接下来打开刚刚租用服务器的 JupyterLab,并且打开其中的终端开始环境配置、模型下载和运行演示。

在这里插入图片描述

创建工作目录

创建本次微调实践的工作目录/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

安装依赖

# 升级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

使用modelscope下载模型

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

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

from modelscope import snapshot_downloadmodel_dir = snapshot_download('Shanghai_AI_Laboratory/internlm2-chat-7b', cache_dir='/root/autodl-tmp', revision='master')

在这里插入图片描述

安装Xtuner

git clone -b v0.1.14 https://github.com/InternLM/xtuner
cd xtuner
# 从源码安装 XTuner
pip install -e '.[all]'
# 安装完成之后就可以在命令行使用xtuner了
# 查看xtuner使用帮助
xtuner help
# 查看xtuner版本
xtuner version

在这里插入图片描述

数据集处理

我自己整理的心理大模型-职场焦虑语料.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 = './心理大模型-职场焦虑语料.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/mergedexport 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 训练多轮对话模型时,采取了一种更加充分高效的方法,如下图所示。

Image

我们将多轮对话进行拼接,之后输入模型,并行计算每个位置的 loss,而只有 Output 部分的 loss 参与回传。

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

[{"conversation":[{"system": "You are an AI asssistant.""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 asssistant.""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 轮的对话内容。

对多轮对话微调感兴趣的同学,也可以按照上面的数据格式进行数据微调。

写在最后

本节关于Xtuner的微调步骤中提到的职场焦虑数据语料,是我用于开源项目职场教练大模型微调时所使用的语料,感兴趣的同学也可看一看我的这个开源项目career_coach,欢迎点个star。项目的data部分有介绍到多轮对话数据的整理与生成,其实与本教程是一样的。

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

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

相关文章

mac jd-gui安装

在macOS上安装JD-GUI(Java Decompiler GUI)是一个简单的过程。JD-GUI是一个独立的图形化应用程序,你可以使用它来查看Java字节码对应的源代码。下面是安装步骤: 下载JD-GUI: 访问JD-GUI的官方网站(http://j…

强强联手|AI赋能智能工业化,探索AI在工业领域的应用

随着人工智能(AI)技术的不断发展和应用,AI在各个领域展现出了巨大的潜力和价值。在工业领域,AI的应用也越来越受到关注。AI具备了丰富的功能和强大的性能,为工业领域的发展带来了巨大的机遇和挑战。 YesPMP是专业的互联…

复习回顾ES6基础篇(一小时学会es6)

基本语法 多行注释 /* 这里的所有内容 都是注释。 */单行注释 // 这是一条注释。变量定义 var x "" //定义范围变量 let y "" //定义局部变量 const z "" //定义常量运算符 变量类型 流程语句 if (condition) {/* 条件为真时运行的代…

7天八股速记之C++后端——Day 7

坚持7天,短期内快速完成C后端面试突击。每天10题,弥补后端八股知识缺漏,熟练掌握后端的高频考点,后端面试更有把握。 1. 如何避免拷贝 避免拷贝是为了提高程序的性能和效率,尤其在处理大量数据或频繁进行对象复制时尤…

【位运算 子集状态压缩】982按位与为零的三元组

算法可以发掘本质,如: 一,若干师傅和徒弟互有好感,有好感的师徒可以结对学习。师傅和徒弟都只能参加一个对子。如何让对子最多。 二,有无限多1X2和2X1的骨牌,某个棋盘若干格子坏了,如何在没有坏…

[Java 面试题] ArrayList篇

1. ArrayList 与 数组的区别 ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用ensureCapacity操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。 …

电机控制专题(一)——最大转矩电流比MTPA笔记

文章目录 电机控制专题(一)——最大转矩电流比MTPA笔记理论推导部分 电机控制专题(一)——最大转矩电流比MTPA笔记 理论推导部分 记转矩角(电流矢量与d轴夹角)为 γ \gamma γ,则dq轴电流可以表示如下: i d I s c o s γ i_dI…

案例研究|众乐邦将MeterSphere持续测试平台融入DevOps流水线

众乐邦网络科技有限公司(以下简称为“众乐邦”)是一家企业服务公司。其旗下的众乐邦灵活用工数字化薪税管理平台(以下简称为灵活用工管理平台),以财税服务视角切入灵活用工场景,连接企业、灵活就业者和监管…

独孤思维:拿我的收益图去收割,不要脸

01 做副业不要患得患失。 没有必要。 昨天有个学员跟我说,做的xx项目,最近流量降低了好多。 导致有一段时间没有收益了。 其实,这种现象非常常见。 即便是副业顶级玩家,也不可能保证每篇内容都能爆。 每天都有稳定的收益。…

力扣:141. 环形链表

力扣:141. 环形链表 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾…

一个文生视频MoneyPrinterTurbo项目解析

最近抖音剪映发布了图文生成视频功能,同时百家号也有这个功能,这个可以看做是一个开源的实现,一起看看它的原理吧~ 一句话提示词 大模型生成文案 百家号生成视频效果 MoneyPrinterTurbo生成视频效果 天空为什么是蓝色的? 天空之所以呈现蓝色,是因为大气中的分子和小粒子会…

35、链表-LRU缓存

思路: 首先要了解LRU缓存的原理,首先定下容量,每次get请求和put请求都会把当前元素放最前/后面,如果超过容量那么头部/尾部元素就被移除,所以最近最少使用的元素会被优先移除,保证热点数据持续存在。 不管放…

鸿蒙画布组件使用介绍

一、前言 DevEco Studio版本:4.0.0.600 前些天写了一篇 鸿蒙自定义控件实现罗盘数字时钟效果 的文章,有同学私信说能不能介绍鸿蒙中的画布组件,下面文章介绍下鸿蒙中的Canvas画布、CanvasRenderingContext2D绘制组件,实现绘制文…

股票市场预测模型:未来趋势的智能分析工具

📈 股票市场预测模型:未来趋势的智能分析工具 🤑 🏦 概述 在这个充满变数的股票市场中,投资者需要一个强大的工具来预测未来的价格走势。我们的机器学习模型旨在通过分析历史数据,为投资者提供科学的市场…

03.卸载MySQL

卸载MySQL 1.Windows卸载MySQL8 停止服务 用命令停止或者在服务中停止都可以 net stop mysql(服务名字可以去服务里面看一下)控制面板卸载MySQL 卸载MySQL8.0的程序可以和其他桌面应用程序一样直接在控制面板选择卸载程序,并在程序列表中…

转换为elementUI提示方法为uni-app的showToast提示

// 转换为elementUI提示方法为uni-app的showToast提示---------------------------------------- // 一般提示 Vue.prototype.$message function(title) {title && uni.showToast({icon: none,title}); }; // 成功提示 Vue.prototype.$message.success (title) > …

无效的标记: --release

maven编译项目时候出现:无效的标记: --release 项目背景 介绍一下项目背景: java17 SpringBoot:3.2.0 SpringCloud: 2023.0.0 之前一直用java8开发项目 问题原因 maven所使用的jdk版本和idea所使用的jdk版本不一致导致的。…

客诉技术架构:构建客户满意的数字化支持系统

随着数字化时代的到来,客户体验已经成为企业竞争的关键因素之一。而客诉技术架构作为支持客户服务和解决问题的关键系统,对于企业提升客户满意度和品牌声誉具有重要意义。本文将深入探讨客诉技术架构的重要性、关键要素以及如何构建一个有效的客户支持系…

微服务之网关路由

一、概述 1.1认识网关 什么是网关? 顾明思议,网关就是网络的关口。数据在网络间传输,从一个网络传输到另一网络时就需要经过网关来做数据的路由和转发以及数据安全的校验。 更通俗的来讲,网关就像是以前园区传达室的大爷。 外…

跨境物流系统解决方案:构建全球化供应链的关键步骤

随着全球化的发展,跨境物流已成为国际贸易中不可或缺的重要环节。然而,由于各国之间的政治、法律、文化和语言差异,跨境物流常常面临诸多挑战,如货物清关、运输安全、物流跟踪等问题。因此,构建一个高效、可靠的跨境物…