大模型实战营第二期——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.py

0 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.json

0 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_path

Chat with a HF model

positional arguments:
  model_name_or_path    Hugging Face model name or path

options:
  -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_WORD
                        Stop key
  --answer-stop-word ANSWER_STOP_WORD
                        Stop key
  --offload-folder OFFLOAD_FOLDER
                        The folder in which to offload the model weights (or where the model weights are already offloaded).
  --max-new-tokens MAX_NEW_TOKENS
                        Maximum number of new tokens allowed in generated text
  --temperature TEMPERATURE
                        The 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 or
                        higher are kept for generation.
  --seed SEED           Random seed for reproducible text generation
  1. 对比微调前后的效果,脚本位于: https://github.com/InternLM/tutorial/blob/main/xtuner/cli_demo.py

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分披萨 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 “吃货”和“馋嘴”两人到披萨店点了一份铁盘(圆形)披萨&#xff0c;并嘱咐店员将披萨按放射状切成大小相同的偶数个小块。 但是粗心服务员将披萨切成了每块大小…

matlab 线性四分之一车体模型

1、内容简介 略 57-可以交流、咨询、答疑 路面采用公式积分来获得&#xff0c;计算了车体位移、非悬架位移、动载荷等参数 2、内容说明 略 3、仿真分析 略 线性四分之一车体模型_哔哩哔哩_bilibili 4、参考论文 略

Kubernetes基础(二十五)-Kubernetes GC原理

1 K8s 的垃圾回收策略 当给k8s一个资源对象设置OwnerReference的时候&#xff0c;删除该资源对象的owner, 该对象也会被连带删除。这个时候用的就是k8s的垃圾回收机制。 k8s目前支持三种回收策略&#xff1a; 1&#xff09;前台级联删除&#xff08;Foreground Cascading De…

中英文互译赫尔辛基大学翻译模型安装与测试

引子 近期接到一个文本中英互译的任务&#xff0c;一直以为这种翻译应该很成熟&#xff0c;各种商用版本很多。那么开源的一定也不少&#xff0c;经过网络搜索发现&#xff0c;近两年还真的出现了很多优秀的开源翻译项目。找到了赫尔辛基大学开源免费的多语言翻译模型&#xff…

202432读书笔记|《泰戈尔的诗》——什么事让你大笑,我生命的小蓓蕾

202432读书笔记|《泰戈尔的诗》——什么事让你大笑&#xff0c;我生命的小蓓蕾 《泰戈尔写给孩子的诗&#xff08;中英双语版&#xff09;》作者拉宾德拉纳特泰戈尔文 张王哲图&#xff0c;图文并茂的一本书&#xff0c;文字与图画都很美&#xff0c;相得益彰&#xff01;很值得…

使用mimikata获取域控权限(无免杀)

一、实验环境 windows 7 ip:192.168.1.3 (域内普通用户&#xff0c;有本地管理员权限&#xff0c;但不知明文密码) windows server 2012 ip:192.168.1.1 &#xff08;DC域控&#xff0c;与server2012管理员密码相同&#xff0c;但不知明文密码&#xff09;二、准备工作 1、使…

java spring 01 IOC源码

01.spring 中的基础是IOC 中有一个方法 例子&#xff1a; 01. 02. 03. 这里是扩展方法&#xff0c;现在是空的 beanfactorypostprocessors&#xff1a; 国际化&#xff1a;&#xff08;一般不管&#xff09; 广播器: 监听器&#xff1a; 实例化&#xff1…

「哈哥赠书活动 - 48期」-『商业分析思维与实践:用数据分析解决商业问题宣传文案』

⭐️ 赠书 - 《商业分析思维与实践》 ⭐️ 内容简介 本书以业务为导向&#xff0c;详细地讲解了如何通过大数据分析来解决商业问题。其目的在于运用大数据分析思维&#xff0c;帮助读者把学术知识应用于真实的业务场景&#xff0c;解决实际的业务问题。本书基于业务问题&#x…

nginx之状态页 日志分割 自定义图表 证书

5.1 网页的状态页 基于nginx 模块 ngx_http_stub_status_module 实现&#xff0c;在编译安装nginx的时候需要添加编译参数 --with-http_stub_status_module&#xff0c;否则配置完成之后监测会是提示语法错误注意: 状态页显示的是整个服务器的状态,而非虚拟主机的状态 server{…

LeetCode 热题 100 | 二叉树(四)

目录 1 114. 二叉树展开为链表 2 105. 从前序与中序遍历序列构造二叉树 3 437. 路径总和 III 菜鸟做题&#xff08;即将返校版&#xff09;&#xff0c;语言是 C 1 114. 二叉树展开为链表 题眼&#xff1a;展开后的单链表应该与二叉树 先序遍历 顺序相同。 而先序遍历就…

9002-29-3,D-85大孔丙酸烯系弱酸性阳离子交换树脂,在水或极性溶剂中能溶胀

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;9002-29-3&#xff0c;D-85大孔丙酸烯系弱酸性阳离子交换树脂&#xff0c;阳离子交换树脂&#xff0c;阳离子交换树脂IRC-50 一、基本信息 【产品简介】&#xff1a;Cation exchange resin is a special type of re…

Linux信号详解

文章目录 一、Linux信号1. 信号的概念2. 信号的定义3. 系统定义的信号 二、信号产生的方式1.通过键盘产生2. 通过系统调用3. 软件条件4. 硬件异常 三、信号处理函数1. OS发送信号的实质2. 指令发送信号3. signal()4. sigaction() 四、信号屏蔽机制1. 信号处理方式2.信号集操作函…

python学习26

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

数字化转型导师坚鹏:政府数字化转型智慧城市类案例研究

政府数字化转型智慧城市类案例研究 课程背景&#xff1a; 很多地方政府存在以下问题&#xff1a; 不清楚政府数字化转型的智慧城市类成功案例 不清楚政府数字化转型的城市大脑类成功案例 不清楚政府数字化转型的综合实践类成功案例 课程特色&#xff1a; 针对性强 …

【uniapp】uniapp开发的微信公众号,微信设置字体大小或者关怀模式,页面布局字体大小不受影响的解决方法:

文章目录 一、问题及效果&#xff1a;二、解决&#xff1a; 一、问题及效果&#xff1a; 二、解决&#xff1a; 在uniapp的app.vue的script标签内添加以下代码&#xff1a; (function(){//安卓端function handleFontSize () {// 设置网页字体为默认大小WeixinJSBridge.invoke…

Redis+Caffeine 太强了!二级缓存可以这样实现!

在实际的项目中&#xff0c;我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中&#xff0c;只有当缓存的访问没有命中时再查询数据库。 在一些场景下可能还需要进一步配合本地缓存使用&#xff0c;例如Guava cache或Caffeine&#xff0c;从而再次提升程序的响应…

力扣--双指针167.二数之和Ⅱ

这题一个穷举方法是比较好想到的&#xff1a; class Solution { public:vector<int> twoSum(vector<int>& numbers, int target) {int i,j;int nnumbers.size();vector<int>result(2,0);for(i0;i<n-1;i){for(ji1;j<n;j){if(numbers[i]numbers[j…

win10安装使用AxurePR9

背景&#xff1a;win10 安装、汉化 Axure Pr9 下载 安装包 链接&#xff1a;https://pan.baidu.com/s/1taMgh2zLbaFK7VTfUXTHdQ 提取码&#xff1a;kygo 安装 修改安装目录 打开是英文的 汉化 复制lang包到Axure安装包 再打开就是中文 问题 发布html后火狐无法打开 一、…

[计算机网络]--IP协议

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、IP协议…

C/C++文件操作

一、文本文件操作 1、写文件操作 代码 #include<fstream> #include<iostream>int main() {ofstream outfile("Student.txt", ios::out);if (!outfile) {cout << "文件写入失败" << endl;exit(0); //程序终止}cout << &qu…