大模型实战营第二期——4. XTuner 大模型单卡低成本微调实战

  • github地址:InternLM/tutorial-书生·浦语大模型实战营
  • 文档地址:XTuner 大模型单卡低成本微调实战
  • 视频地址:XTuner 大模型单卡低成本微调实战
  • Intern Studio: https://studio.intern-ai.org.cn/console/instance
    在这里插入图片描述
    这个人的研究方向是眼科的AI,也是大模型+CV的多模态的诊疗体系的研究,还挺对口

1. Finetune简介

在这里插入图片描述

在这里插入图片描述

  • 一般通过海量数据训练来的就是一个大的预训练模型/基座模型,
  • 如果不进行额外训练/微调,则询问什么是肺癌?,则模型不会意识到这是个需要回答的问题,只会去找训练集中拟合分布的对应结果,类似词嵌入会找最相近的词语。
  • 因此需要进行指令微调,让大模型理解指令的意图,才会给我们想要的答案

关于XTuner支持的微调数据格式,直接看这个文档:
https://github.com/InternLM/xtuner/blob/main/docs/zh_cn/user_guides/dataset_format.md

1.2 指令跟随微调

在这里插入图片描述

在这里插入图片描述
这里对输入的语料进行区分,只是为了进行指令微调,只是指训练过程,而在实际使用/推理阶段,不需要用户把输入的内容改成这个模版的样子(角色分配不是用户来进行的)。

  • system模板是启动对话时候,自己配置的
  • 用户输入的内容,会被自动放到user字段中
  • 模型输出的内容,其实包含<|Bot|>这样的对话模板,去掉就可以得到给展示给用户的输出了

在这里插入图片描述
这里就与增量预训练微调有所不同了。

1.1 增量预训练微调

在这里插入图片描述
这其实就是常见的自然语言处理里的东西,

  • data就是输入
  • label就是希望的输出
  • 由于在多对多的NLP任务中(输入是序列,输出也是序列),在推理时,会给一个起始符来启动作为t=0时刻的输入来启动循环神经网络,因此,输出其实只有output+ <s> 这两个内容。

在这里插入图片描述
增量微调,

  • 其使用的数据不存在问题(用户角色)和回答(Bot角色)以及背景上下文(系统角色)
  • 只是直接看到的语句,不需要对语料划分角色,直接处理原始数据即可。
  • 类似于把之前的系统和用户角色的模板部分置位空,把数据放到Bot角色部分的回答即可。

1.3 XTuner中的微调原理——LoRA,QloRA

在这里插入图片描述
这里讲的不是很清晰(甚至有点问题???),建议看:图解大模型微调系列之:大模型低秩适配器LoRA(原理篇),这个很赞!🥳🥳🥳

在这里插入图片描述

2. XTuner

注意,这个XTuner虽然也和Openmmlab一起宣传,但是文档并不统一,
XTuner目前还没有网页文档,只有md格式的文档:
https://github.com/InternLM/xtuner/blob/main/docs/zh_cn/user_guides/dataset_prepare.md
略微磕碜。。。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 训练完成之后,就得到了LoRA模型(也就是上图中的Adapter适配器模型)
  • 加载模型时,除了加载基座模型,还需要加载Adapter适配器模型(LoRA模型)

在这里插入图片描述
类似于chatGPT里的plugin。

在这里插入图片描述
这个和XTuner关系不大,是XTuner支持了ZeRO,本质上是DeepSpeed这个库里的,microsoft/DeepSpeed

在这里插入图片描述

3. 动手实践

直接跟着文档走就可以,很傻瓜式了。

3.1 config

xtuner list-cfg
[2024-02-20 21:39:31,194] [INFO] [real_accelerator.py:191:get_accelerator] Setting ds_accelerator to cuda (auto detect)
[2024-02-20 21:40:02,552] [INFO] [real_accelerator.py:191:get_accelerator] Setting ds_accelerator to cuda (auto detect)
==========================CONFIGS===========================
baichuan2_13b_base_qlora_alpaca_e3
baichuan2_13b_base_qlora_alpaca_enzh_e3
baichuan2_13b_base_qlora_alpaca_enzh_oasst1_e3
baichuan2_13b_base_qlora_alpaca_zh_e3
baichuan2_13b_base_qlora_arxiv_gentitle_e3
baichuan2_13b_chat_qlora_open_platypus_e3
baichuan2_7b_base_qlora_open_platypus_e3
baichuan2_7b_base_qlora_sql_e3
baichuan2_7b_chat_qlora_alpaca_e3
baichuan2_7b_chat_qlora_alpaca_enzh_e3

配置文件名的解释:

  • 13b指模型参数是1.3亿
  • chat vs base: 没有chat或base的,以及有base的都是基座模型,chat表示指令微调过的模型
  • qlora vs lora表示微调时候使用的方法
  • alpaca,sql这些都是微调基于的数据集
  • e3就是epoch=3

另外,这些配置其实基本对应于文档:

  • https://github.com/InternLM/xtuner/blob/main/docs/zh_cn/user_guides/finetune.md
  • https://github.com/InternLM/xtuner/blob/main/docs/zh_cn/user_guides/chat.md

3.2 操作

  1. 复制配置文件
$ xtuner copy-cfg internlm_chat_7b_qlora_oasst1_e3 .
[2024-02-20 22:05:51,716] [INFO] [real_accelerator.py:191:get_accelerator] Setting ds_accelerator to cuda (auto detect)
[2024-02-20 22:06:26,565] [INFO] [real_accelerator.py:191:get_accelerator] Setting ds_accelerator to cuda (auto detect)
Copy to ./internlm_chat_7b_qlora_oasst1_e3_copy.py

不建议使用xtuner这个命令来复制或者列出config目录,非常慢,还会提示一些信息,应该是执行之前会做一些别的事情。

直接在xtuner这个repo的文件夹里找xtuner/xtuner/configs/internlm/internlm_chat_7b/internlm_chat_7b_qlora_oasst1_e3.py,手动复制一个。

  1. 预训练模型权重文件
    在InterStuido平台的话,可以直接搞个软链接
ln -s /share/temp/model_repos/internlm-chat-7b ~/ft-oasst1/
# 或者拷贝
cp -r /share/temp/model_repos/internlm-chat-7b ~/ft-oasst1/
  1. 数据集
    在InterStuido平台的话,可以直接复制
cd ~/ft-oasst1
cp -r /root/share/temp/datasets/openassistant-guanaco .# 实际上也不大,但是Huggingface的网络可能不大行
(internlm-demo) root@intern-studio-052101:~/ft-oasst1/openassistant-guanaco# ls -lh
total 21M
-rw-r--r-- 1 root root 1.1M Feb 20 22:13 openassistant_best_replies_eval.jsonl
-rw-r--r-- 1 root root  20M Feb 20 22:13 openassistant_best_replies_train.jsonl
  1. 文件结构确认
~/ft-oasst1# tree -L 1
.
├── internlm-chat-7b -> /share/temp/model_repos/internlm-chat-7b # 预训练模型
├── internlm_chat_7b_qlora_oasst1_e3_copy.py # 配置文件
└── openassistant-guanaco # 数据集
  1. 训练
xtuner train ./internlm_chat_7b_qlora_oasst1_e3_copy.py --deepspeed deepspeed_zero2
// 从打印的信息看,xtuner也是基于MMengine进行的
map这个过程就是把数据转换成符合指令训练的对话模板数据格式
  • 不设置DeepSpeed,使用A100 (1/4)这个配置的话,设置1个epoch,输出训练信息中有: eta: 3:54:38也就是1个epoch要训练3小时。
  • 设置DeepSpeed,使用A100 (1/4)这个配置的话,设置1个epoch,输出训练信息中有:eta: 1:50:32。时间提升40%以上,牛啊
  • 然后等着就行了

训练完的文件夹大概长这样:

-- work_dirs`-- internlm_chat_7b_qlora_oasst1_e3_copy|-- 20231101_152923|   |-- 20231101_152923.log|   `-- vis_data|       |-- 20231101_152923.json|       |-- config.py|       `-- scalars.json|-- epoch_1.pth|-- epoch_2.pth|-- epoch_3.pth|-- internlm_chat_7b_qlora_oasst1_e3_copy.py|-- last_checkpoint

一个epoch存一个文件,因为这个东西训练很慢。。

  1. 将得到的 PTH 模型转换为 HuggingFace 模型,即:生成 Adapter 文件夹
xtuner convert pth_to_hf ${CONFIG_NAME_OR_PATH} ${PTH_file_dir} ${SAVE_PATH}
// 具体使用的命令
cd ~/ft-oasst1/
mkdir hf
export MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER=GNU
xtuner convert pth_to_hf ./internlm_chat_7b_qlora_oasst1_e3_copy.py \
./work_dirs/internlm_chat_7b_qlora_oasst1_e3_copy/epoch_1.pth \
./hf# 输出类似
Reconstructed fp32 state dict with 448 params 159907840 elements
Load PTH model from ./work_dirs/internlm_chat_7b_qlora_oasst1_e3_copy/epoch_1.pth
Convert weights to float16
Saving HuggingFace model to ./hf
/root/.conda/envs/internlm-demo/lib/python3.10/site-packages/peft/utils/save_and_load.py:148: UserWarning: Could not find a config file in ./internlm-chat-7b - will assume that the vocabulary was not modified.warnings.warn(
All done!
# 就说明成功了

得到的文件结构

> tree -L 1 ./hf/
./hf/
├── README.md
├── adapter_config.json
├── adapter_model.safetensors
└── xtuner_config.py0 directories, 4 files> ls -lh ./hf
total 306M
-rw-r--r-- 1 root root 5.0K Feb 25 16:08 README.md
-rw-r--r-- 1 root root  670 Feb 25 16:08 adapter_config.json
-rw-r--r-- 1 root root 306M Feb 25 16:08 adapter_model.safetensors  
# 确实是个模型文件,306M
-rw-r--r-- 1 root root 6.1K Feb 25 16:08 xtuner_config.py

此时,hf 文件夹即为我们平时所理解的所谓 “LoRA 模型文件”

可以简单理解:LoRA 模型文件 = Adapter

  1. 将 HuggingFace adapter 合并到大语言模型,base基座模型+Adapter适配器
xtuner convert merge ./internlm-chat-7b ./hf ./merged --max-shard-size 2GB
# xtuner convert merge \
#     ${NAME_OR_PATH_TO_LLM} 基座模型路径\
#     ${NAME_OR_PATH_TO_ADAPTER} 适配器路径\
#     ${SAVE_PATH} \
#     --max-shard-size 2GB 分块保存,每块最大2G

合并之后得到的模型的文件夹结构,和之前所使用的基座模型的文件夹结构基本一致(在大模型实战营第二期——2. 浦语大模型趣味Demo-2.2.3 模型下载 里打印过),就是发布到Huggingface的一种格式。

tree -L 1 ./merged/
./merged/
├── added_tokens.json
├── config.json
├── configuration_internlm.py
├── generation_config.json
├── modeling_internlm.py
├── pytorch_model-00001-of-00008.bin
├── pytorch_model-00002-of-00008.bin
├── pytorch_model-00003-of-00008.bin
├── pytorch_model-00004-of-00008.bin
├── pytorch_model-00005-of-00008.bin
├── pytorch_model-00006-of-00008.bin
├── pytorch_model-00007-of-00008.bin
├── pytorch_model-00008-of-00008.bin
├── pytorch_model.bin.index.json
├── special_tokens_map.json
├── tokenization_internlm.py
├── tokenizer.model
└── tokenizer_config.json0 directories, 18 files
  1. 对话测试
# 加载 Adapter 模型对话(Float 16)
export MKL_SERVICE_FORCE_INTEL=1 # 要先运行了这个,下面才能正确执行
xtuner chat ./merged --prompt-template internlm_chat
# chat 启动对话脚本
# ./merged 使用的模型是这个文件夹内的
# --prompt-template internlm_chat 用的对话模板是internlm_chat,是基于谁训练的,对话模板就要用谁的
运行之后,就可以开始对话了,16bit全量模型的时候,回复很慢,4bit会快一些# 4 bit 量化加载
# xtuner chat ./merged --bits 4 --prompt-template internlm_chat$ xtuner chat --help  # 可以用--help参数查看脚本的参数说明,这个跑起来太慢了,直接贴这里吧
usage: chat.py [-h] [--adapter ADAPTER][--prompt-template {default,zephyr,internlm_chat,moss_sft,llama2_chat,code_llama_chat,chatglm2,chatglm3,qwen_chat,baichuan_chat,baichuan2_chat,wizardlm}][--system SYSTEM | --system-template {moss_sft,alpaca,arxiv_gentile,colorist,coder,lawyer,medical,sql}] [--bits {4,8,None}][--bot-name BOT_NAME] [--with-plugins {calculate,solve,search} [{calculate,solve,search} ...]] [--no-streamer] [--lagent][--command-stop-word COMMAND_STOP_WORD] [--answer-stop-word ANSWER_STOP_WORD] [--offload-folder OFFLOAD_FOLDER][--max-new-tokens MAX_NEW_TOKENS] [--temperature TEMPERATURE] [--top-k TOP_K] [--top-p TOP_P] [--seed SEED]model_name_or_pathChat with a HF modelpositional arguments:model_name_or_path    Hugging Face model name or pathoptions:-h, --help            show this help message and exit--adapter ADAPTER     adapter name or path--prompt-template {default,zephyr,internlm_chat,moss_sft,llama2_chat,code_llama_chat,chatglm2,chatglm3,qwen_chat,baichuan_chat,baichuan2_chat,wizardlm}Specify a prompt template--system SYSTEM       Specify the system text--system-template {moss_sft,alpaca,arxiv_gentile,colorist,coder,lawyer,medical,sql}Specify a system template--bits {4,8,None}     LLM bits--bot-name BOT_NAME   Name for Bot--with-plugins {calculate,solve,search} [{calculate,solve,search} ...]Specify plugins to use--no-streamer         Whether to with streamer--lagent              Whether to use lagent--command-stop-word COMMAND_STOP_WORDStop key--answer-stop-word ANSWER_STOP_WORDStop key--offload-folder OFFLOAD_FOLDERThe folder in which to offload the model weights (or where the model weights are already offloaded).--max-new-tokens MAX_NEW_TOKENSMaximum number of new tokens allowed in generated text--temperature TEMPERATUREThe value used to modulate the next token probabilities.--top-k TOP_K         The number of highest probability vocabulary tokens to keep for top-k-filtering.--top-p TOP_P         If set to float < 1, only the smallest set of most probable tokens with probabilities that add up to top_p orhigher are kept for generation.--seed SEED           Random seed for reproducible text generation
  1. 对比微调前后的效果,脚本位于: https://github.com/InternLM/tutorial/blob/main/xtuner/cli_demo.py

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

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

相关文章

AI Agent深入浅出——以ERNIE SDK和多工具智能编排为例

在过去一年里&#xff0c;通用大语言模型&#xff08;LLM&#xff09;的飞速发展引起了全球的关注。百度等科技巨头推出了各自的大模型&#xff0c;不断提高语言模型性能的上限。然而&#xff0c;业界对LLM所设定的目标不再局限于基本的问答功能&#xff0c;而是寻求利用大模型…

什么是MapReduce

1.1 MapReduce到底是什么 Hadoop MapReduce是一个软件框架&#xff0c;基于该框架能够容易地编写应用程序&#xff0c;这些应用程序能够运行在由上千个商用机器组成的大集群上&#xff0c;并以一种可靠的&#xff0c;具有容错能力的方式并行地处理上TB级别的海量数据集。这个定…

注册中心 Service Discovery --- Intro

注册中心 Service Discovery --- Intro 为什么需要注册中心注册中心的原理常用的注册中心注册中心的高可用 为什么需要注册中心 在微服务架构中&#xff0c;系统被拆分成了若干个独立的服务&#xff0c;因此服务之间需要进行通信和协作。为了实现服务的发现和调用&#xff0c;需…

C#,动态规划(DP)模拟退火(Simulated Annealing)算法与源代码

1 模拟退火 *问题:**给定一个成本函数f:r^n–>r*&#xff0c;找到一个 n 元组&#xff0c;该元组最小化 f 的值。请注意&#xff0c;最小化函数值在算法上等同于最大化(因为我们可以将成本函数重新定义为 1-f)。 很多有微积分/分析背景的人可能都熟悉单变量函数的简单优化。…

Llama2模型的优化版本:Llama-2-Onnx

Llama2模型的优化版本&#xff1a;Llama-2-Onnx。 Llama-2-Onnx是Llama2模型的优化版本。Llama2模型由一堆解码器层组成。每个解码器层&#xff08;或变换器块&#xff09;由一个自注意层和一个前馈多层感知器构成。与经典的变换器相比&#xff0c;Llama模型在前馈层中使用了不…

YOLOv5算法进阶改进(16)— 更换Neck网络之GFPN(源自DAMO-YOLO)

前言:Hello大家好,我是小哥谈。GFPN(Global Feature Pyramid Network)是一种用于目标检测的神经网络架构,它是在Faster R-CNN的基础上进行改进的,旨在提高目标检测的性能和效果。其核心思想是引入全局特征金字塔,通过多尺度的特征融合来提取更丰富的语义信息。具体来说,…

用Python实现创建十二星座数据分析图表

下面小编提供的代码中&#xff0c;您已经将pie.render()注释掉&#xff0c;并使用了pie.render_to_file(十二星座.svg)来将饼状图渲染到一个名为十二星座.svg的文件中。这是一个正确的做法&#xff0c;如果您想在文件中保存图表而不是在浏览器中显示它。 成功创建图表&#xf…

贪心算法---前端问题

1、贪心算法—只关注于当前阶段的局部最优解,希望通过一系列的局部最优解来推出全局最优----但是有的时候每个阶段的局部最优之和并不是全局最优 例如假设你需要找给客户 n 元钱的零钱&#xff0c;而你手上只有若干种面额的硬币&#xff0c;如 1 元、5 元、10 元、50 元和 100…

李宏毅2023机器学习作业1--homework1——python语法

# 定义list del_col del_col [0, 38, 39, 46, 51, 56, 57, 64, 69, 74, 75, 82, 87] # 删除raw_x_train中del_col的列&#xff0c;axis为1代表删除列 raw_x_train np.delete(raw_x_train, del_col, axis1) # numpy数组增删查改方法 # 定义列表get_col get_col [35, 36, 37,…

vector 用法

C++数组是继承C语言的,C++标准库中的vector封装了动态数组,是一个模板类(vector<int>,<>里面可以是各种类型。 定义方式: vector<元素类型> 对象名(长度); (注:vector还有个好处就是,数组定义时长度那里不能包含变量,但是vector定义时长度那里可…

2.23 Qt day4 事件机制+定时器事件+键盘事件+鼠标事件

思维导图&#xff1a; 做一个闹钟&#xff0c;在行编辑器里输入定闹钟的时间&#xff0c;时间到了就语音播报文本里的内容&#xff0c;播报五次 widget.h&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QDebug>//输出类 #include<…

网络攻防之ARP欺骗和DNS劫持实验

目录 ARP单向欺骗 ARP双向欺骗 DNS劫持 实验环境&#xff1a; 攻击主机&#xff1a;kali2023虚拟机&#xff0c;IP地址为192.168.133.141 靶机&#xff1a;Windows10虚拟机&#xff0c;IP地址为192.168.133.129 网关地址&#xff1a;192.168.133.2 (1)ARP协议介绍 在以…

maven 打包命令

Maven是基于项目对象模型(POM project object model)&#xff0c;可以通过一小段描述信息&#xff08;配置&#xff09;来管理项目的构建&#xff0c;报告和文档的软件项目管理工具。 Maven的核心功能便是合理叙述项目间的依赖关系&#xff0c;通俗点讲&#xff0c;就是通过po…

代码随想录刷题笔记-Day22

1. 修剪二叉搜索树 669. 修剪二叉搜索树https://leetcode.cn/problems/trim-a-binary-search-tree/ 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留…

opengles 顶点坐标变换常用的矩阵(九)

文章目录 前言一、opengles 常用的模型矩阵1. 单位矩阵2. 缩放矩阵3. 位移矩阵4. 旋转矩阵二、第三方矩阵数学库1. glm1.1 ubuntu 上安装 glm 库1.2 glm 使用实例1.2.1 生成一个沿Y轴旋转45度的4x4旋转矩阵, 代码实例如下1.2.2 生成一个将物体移到到Z轴正方向坐标为5处的4x4 vi…

万界星空科技商业开源MES

一、万界星空科技商业开源MES系统概述&#xff1a; 万界星空科技免费MES、开源MES、商业开源MES、市面上最好的开源MES、MES源代码、适合二开的开源MES。 1.万界星空开源MES制造执行系统的Java开源版本。 开源mes系统包括系统管理&#xff0c;车间基础数据管理&#xff0c;计…

深度学习500问——Chapter01:数学基础

文章目录 前言 1.1 向量和矩阵 1.1.1 标量、向量、矩阵、张量之间的联系 1.1.2 张量与矩阵的区别 1.1.3 矩阵和向量相乘结果 1.1.4 向量和矩阵的范数归纳 1.1.5 如何判断一个矩阵为正定 1.2 导数和偏导数 1.2.1 导数偏导计算 1.2.2 导数和偏导数有什么区别 1.3 特征值和特征向量…

什么是边缘案例测试?如何查找并确定优先级

何为边缘情况&#xff1f; 在极端条件下发生的情况被称为边缘情况&#xff0c;有时候也叫边界情况&#xff0c;在功能、回归、单元和性能测试中都会应用。如果质量保证团队知道某项功能的最大和最小负载&#xff0c;他们就能防止这些情况发生。当用户不按照程序的预期工作流程…

gma 2.0.6 (2024.02.21) 更新日志

安装 gma 2.0.6 pip install gma2.0.6网盘下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1P0nmZUPMJaPEmYgixoL2QQ?pwd1pc8 提取码&#xff1a;1pc8 注意&#xff1a;此版本没有Linux版&#xff01; 编译gma的Linux虚拟机没有时间修复&#xff0c;本期Linux版继…

Spring Cloud Gateway官方文档学习

文章目录 推荐写在前面一、熟悉Gateway基本概念与原理1、三大概念2、工作流程 二、基本使用路由断言的两种写法 三、路由断言工厂1、After路由断言工厂2、Before路由断言工厂3、Between路由断言工厂4、Cookie路由断言工厂5、Header路由断言工厂6、Host路由断言工厂7、Method路由…