书生·浦语大模型实战训练营第二期第四节--Xtuner微调LLM--homework

基础作业:

一、环境部署

这次的demo比较简单,不怎么依赖太复杂的环境,还是老样子开一个conda虚拟环境先:

# -y就是表示在创建环境时自动确认所有提示信息,不需要用户进行确认,全部默认。(建议还是手动挡吧)
conda create -n xtuner python=3.10 -y

下载一个小小的streamlit就行 

pip install streamlit==1.24.0

二、源码下载与模型配制

1.先把Xtuner的源码全部下载了先(记得在指定路径下喔)

# 拉取 0.1.17 的版本源码
cd /root/autodl-tmp/XTuner/code
git clone -b v0.1.17  https://github.com/InternLM/xtuner

2.在code/xtuner路径下安装xtuner

# 进入源码目录,并从源码安装 XTuner(在阿里云镜像上高速下载)
# 这**玩意下的是真慢啊!
cd /root/autodl-tmp/XTuner/code/xtuner
pip install -e '.[all]' -i https://mirrors.aliyun.com/pypi/simple/

3.下载你要拿来微调人家模型的数据集

这里就没拿什么高质量数据了,直接是自己生成的一点点对话,单纯拿来测试的,后期大作业的时候,你可以把这个地方的数据集换成其它的微调数据集以此来微调培训你自己的大模型!

建立一个generate_data.py文件,写入以下代码(用于生成对话,也就是模型语料,用于微调)

import json

# 设置用户的名字
name = '牛马养殖大户'
# 设置需要重复添加的数据次数
n =  5000

# 初始化OpenAI格式的数据结构
data = [
    {
        "messages": [
            {
                "role": "user",
                "content": "请做一下自我介绍" #input
            },
            {
                "role": "assistant",
                "content": "雷猴,我是{}的小助手,很高兴为您服务".format(name) #output
            }
        ]
    }
]

# 通过循环,将初始化的对话数据重复添加到data列表中
for i in range(n):
    data.append(data[0])

# 将data列表中的数据写入到一个名为'personal_assistant.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)

运行上面的代码,就能跑出一个 包含n=5000条对话(input/output)的personal_assistant.json文件,到时候把这玩意丢进大模型的配置文件里面微调就行

# 数据集准备
# 生成用于微调的数据集(n=5000)
# 确保先进入该文件夹(这样它生成的personal_assistant.json才会在data文件下),再运行generate_data.py
cd /root/autodl-tmp/XTuner/fine-tuning/data
python /root/autodl-tmp/XTuner/fine-tuning/data/generate_data.py

4.下载要拿来微调的大模型Internlm2-chat-1.8b

经典model scope

from modelscope.hub.snapshot_download import snapshot_download

# save_dir是模型保存到本地的目录
save_dir="/root/autodl-tmp/XTuner/model"


# 1.下载internlm2-chat-1_8b
snapshot_download("Shanghai_AI_Laboratory/internlm2-chat-1_8b", 
                  cache_dir=save_dir, 
                  revision='v1.1.0')

5.下载并修改模型配置文件

下面是最重要的一步,寻找我们就要根据我们选择的微调方法,结合前面的信息来从XTuner里面找到与我们最匹配的配置文件了,从而减少我们对配置文件的修改量Xtuner是专业微调大模型的!

所谓配置文件(config):其实是一种用于定义和控制模型训练和测试过程中各个方面的参数和设置的工具。准备好的配置文件只要运行起来就代表着模型就开始训练或者微调了。(调参专用!)

5.1选择并下载配置文件
# 配置文件选择
# 列出所有内置配置文件
# xtuner list-cfg
# 假如我们想找到 internlm2-1.8b 模型里支持的配置文件
xtuner list-cfg -p internlm2_1_8b
# 解释一下
# 这里就用到了第一个 XTuner 的工具 list-cfg ,对于这个工具而言,可以选择不添加额外的参数,就像上面# 的一样,这样就会将所有的配置文件都打印出来。那同时也可以加上一个参数 -p 或 --pattern ,后面输入的# 内容将会在所有的 config 文件里进行模糊匹配搜索,然后返回最有可能得内容。我们可以用来搜索特定模型
# 的配置文件,比如例子中的 internlm2_1_8b ,也可以用来搜索像是微调方法 qlora 。 根据上面的定向搜索# 指令可以看到目前只有两个支持 internlm2-1.8B 的模型配置文件。

运行该命令后,就可以得到关于internlm_1.8b模型支持的配置文件如下:很显然只有两个

==========================CONFIGS===========================
PATTERN: internlm2_1_8b
-------------------------------
internlm2_1_8b_full_alpaca_e3
internlm2_1_8b_qlora_alpaca_e3
=============================================================

但是由于我们是通过 QLoRA (一种高效的模型微调方式,具体了解见这篇文章LoRA、QLoRA - 知乎 (zhihu.com)的方式对 internlm2-chat-1.8b 进行微调。而最相近的配置文件应该是 internlm2_1_8b_qlora_alpaca_e3 ,因此我们可以选择拷贝这个配置文件到当前目录

# 下载并保存配置文件(大模型训练的配置文件)
# 重要!这个模型训练的配置文件务必好好去看!
# 创建一个存放 config 文件的文件夹
mkdir -p /root/autodl-tmp/XTuner/fine-tuning/config
# 使用 XTuner 中的 copy-cfg 功能将 config 文件复制到指定的位置
# xtuner copy-cfg {配置文件名}  {下载配置文件保存路径}:
xtuner copy-cfg internlm2_1_8b_qlora_alpaca_e3 /root/autodl-tmp/XTuner/fine-tuning/config
5.2修改配置文件

下载完配置文件,其实这玩意就是模型调参plus的文件,咱就可以在里面修改模型的超参数和各种配置了(引入微调数据集啥的啦)

配置文件config代码大概分为以下5个板块(希望你能细细理解并解读)(这就是大模型的配置文件吗,确实高级吼)

  1. PART 1 Settings涵盖了模型基本设置,如预训练模型的选择、数据集信息和训练过程中的一些基本参数(如批大小、学习率等)。

  2. PART 2 Model & Tokenizer指定了用于训练的模型和分词器的具体类型及其配置,包括预训练模型的路径和是否启用特定功能(如可变长度注意力),这是模型训练的核心组成部分。

  3. PART 3 Dataset & Dataloader描述了数据处理的细节,包括如何加载数据集、预处理步骤、批处理大小等,确保了模型能够接收到正确格式和质量的数据。

  4. PART 4 Scheduler & Optimizer配置了优化过程中的关键参数,如学习率调度策略和优化器的选择,这些是影响模型训练效果和速度的重要因素。

  5. PART 5 Runtime定义了训练过程中的额外设置,如日志记录、模型保存策略和自定义钩子等,以支持训练流程的监控、调试和结果的保存。

我们这次主要就是修改配置文件中规定的预训练模型(internlm2-chat-1.8b)、微调数据集(自己创建的那一堆对话personal_assistant.json)、一些基本参数;后两部分都是 XTuner 官方帮我们优化好的东西,一般而言只有在魔改的情况下才需要进行修改。下面我们将根据项目的要求一步步的进行修改和调整吧!

OK,配好环境,下好模型,下好工具XTuner,修改好配置文件,接下来就是微调模型啦!

三、Xtuner微调模型

1.模型训练(利用俺的personal_assistant.json来训练)

可以用deepspeed来加速的,至于用哪个,可以看看下面的区别

  • deepspeed_zero1:这是ZeRO的基本版本,它优化了模型参数的存储,使得每个GPU只存储一部分参数,从而减少内存的使用。

  • deepspeed_zero2:在deepspeed_zero1的基础上,deepspeed_zero2进一步优化了梯度和优化器状态的存储。它将这些信息也分散到不同的GPU上,进一步降低了单个GPU的内存需求。

  • deepspeed_zero3:这是目前最高级的优化等级,它不仅包括了deepspeed_zero1和deepspeed_zero2的优化,还进一步减少了激活函数的内存占用。这通过在需要时重新计算激活(而不是存储它们)来实现,从而实现了对大型模型极其内存效率的训练。

总之就是,zero越高,就是为了优化模型训练的内存占用空间的,花小算力小内存就能训练大模型;所以如果你不缺钱或者模型小,那就低点就行;咱这里就直接zero2吧 

# 开启模型训练
# xtuner train '配制文件路径' --work-dir '模型保存路径'
xtuner train /root/autodl-tmp/XTuner/fine-tuning/config/internlm2_1_8b_qlora_alpaca_e3_copy.py --work-dir /root/autodl-tmp/XTuner/fine-tuning/train

# 使用 deepspeed 来加速训练
xtuner train /root/autodl-tmp/XTuner/fine-tuning/config/internlm2_1_8b_qlora_alpaca_e3_copy.py --work-dir /root/autodl-tmp/XTuner/fine-tuning/train --deepspeed deepspeed_zero2

训练过程如下:可以看到一直把我那句话丢进去玩哈嘿嘿嘿,务必记住,如果你的微调数据不入模型法眼,只能说你的epoch太小或者数据量太小了,给我干大点就OK

4800轮(iter4800)训练完之后,大概率是过拟合了,你问啥他都回我是牛马养殖大户的小助手嘿嘿嘿;

这里需要补充一个知识点哈:这个iter4800是怎么算出来的,其实就是你自己的模型配置文件里面规定的(epoch,batch size,样本量)来计算的:比如我这次的数据集是30000条,batch size=1,但是我设置了每16次误差传播才更新一次权重,epoch=5;综合计算下来就是9375的iter,至于为啥最后是4800,欸这个我感觉还没搞懂嘿嘿嘿。

2.模型转换

训练好的模型之后,需要进行模型转换;模型转换的本质其实就是将原本使用 Pytorch 训练出来的模型权重文件转换为目前通用的 Huggingface 格式文件,那么我们可以通过以下指令来实现一键转换,然后才可以拿来跟原始模型融合起来!(记得修改地址喔!尤其是.pth权重文件地址)

# 模型转换:原本使用 Pytorch 训练出来的模型权重文件转换为目前通用的 Huggingface 格式文件
mkdir -p /root/autodl-tmp/XTuner/fine-tuning/huggingface
# xtuner convert pth_to_hf ${配置文件地址} ${权重文件地址} ${转换后模型保存地址}
xtuner convert pth_to_hf /root/autodl-tmp/XTuner/fine-tuning/train/internlm2_1_8b_qlora_alpaca_e3_copy.py /root/autodl-tmp/XTuner/fine-tuning/train/iter_300.pth /root/autodl-tmp/XTuner/fine-tuning/huggingface

转换完之后,就可以跟咱的原始模型internlm2-chat-1.8b进行整合了;这里要讲解一下这个整合的原理哈,也就是Lora微调大模型的基本原理:

我们通过视频课程的学习可以了解到,对于 LoRA 或者 QLoRA 微调出来的模型其实并不是一个完整的模型,而是一个额外的层(adapter)。那么训练完的这个层最终还是要与原模型进行组合才能被正常的使用。详见LoRA、QLoRA - 知乎 (zhihu.com)

而对于全量微调的模型(full)其实是不需要进行整合这一步的,因为全量微调修改的是原模型的权重而非微调一个新的 adapter ,因此是不需要进行模型整合的。(就是计算量有点大)

3.模型整合

在 XTuner 中也是提供了一键整合的指令,但是在使用前我们需要准备好三个地址,包括原模型的地址、训练好的 adapter 层的地址(转为 Huggingface 格式后保存的部分)以及最终保存的地址

# 模型整合
# 对于 LoRA 或者 QLoRA 微调出来的模型其实并不是一个完整的模型,而是一个额外的层(adapter)。
# 那么训练完的这个层最终还是要与原模型进行组合才能被正常的使用。
# 创建一个名为 final_model 的文件夹存储整合后的模型文件
mkdir -p /root/autodl-tmp/XTuner/fine-tuning/final_model
# 解决一下线程冲突的 Bug 
export MKL_SERVICE_FORCE_INTEL=1
# 进行模型整合
# xtuner convert merge  ${NAME_OR_PATH_TO_LLM} ${NAME_OR_PATH_TO_ADAPTER} ${SAVE_PATH} 
xtuner convert merge /root/autodl-tmp/XTuner/fine-tuning/model/Shanghai_AI_Laboratory/internlm2-chat-1_8b /root/autodl-tmp/XTuner/fine-tuning/huggingface /root/autodl-tmp/XTuner/fine-tuning/final_model

整合过程如下 

整合完毕之后,就可以通过xtuner chat 来跟咱整合的final model进行对话了:

# 与微调后的模型进行对话测试
xtuner chat /root/autodl-tmp/XTuner/fine-tuning/final_model --prompt-template internlm2_chat

对话结果如下:他现在就已经学会了他是牛马养殖大户的小助手哈哈哈,认识到了自己是谁

经验告诉我,要是这个鬼模型学不进你的微调数据集,你就加大几个epoch多干它几轮!或者直接生成3w或者5w条数据直接干就行!详见这篇文章【书生·浦语大模型实战营】微调数据集到底应该怎么做? - 知乎 (zhihu.com)

四、web端部署微调后的大模型

下载人家的web-demo.py;要玩网页端怎么能不用代码写呢?

# Web端部署
# 创建存放 InternLM 文件的代码
mkdir -p /root/autodl-tmp/XTuner/fine-tuning/web_demo
# 拉取 InternLM 源文件
cd /root/autodl-tmp/XTuner/fine-tuning/web_demo
git clone https://github.com/InternLM/InternLM.git
# 进入该库中
cd /root/autodl-tmp/XTuner/fine-tuning/web_demo/InternLM

然后打开web-demo/InternLM/chat/web_demo.py文件;老样子,修改一下模型路径和分词器路径啥的,然后直接运行就好

# Web端运行微调大模型
streamlit run /root/autodl-tmp/XTuner/fine-tuning/web_demo/InternLM/chat/web_demo.py --server.address 127.0.0.1 --server.port 6006

打开运行出来的链接,直接部署完成!(想部署其它的模型就直接在web_demo.py里面修改一下模型路径就OK啦)

然后就老老实实的成为了牛马养殖大户的小助手啦! 

进阶作业:复现基于LLaVA方案的多模态LLM微调(基本步骤和代码跟上面那个差不多啦!对比着看就好!)

一、环境部署

上面已经布置过了环境,直接用这个xtuner的虚拟环境即可

二、源码下载与模型配置

下载源码

# 下载源码,-b camp2" 指定了要克隆的分支或者版本
cd /root/autodl-tmp/XTuner/code
git clone https://github.com/InternLM/tutorial -b camp2

打开源码中路径,生成对实例图片的问答对数据(n=200)

# 运行对这张示例图片的问答对数据(repeat_data.json)
# 感觉就是对已建立的unique_data.json对话对数据进行复制,扩充成了repeated_data.json
python /root/autodl-tmp/XTuner/code/tutorial/xtuner/llava/llava_data/repeat.py \
  -i /root/autodl-tmp/XTuner/code/tutorial/xtuner/llava/llava_data/unique_data.json \
  -o /root/autodl-tmp/XTuner/LLaVA/llava_data/repeated_data.json \
  -n 200
#-i 这是输入参数,指定了一个名为 unique_data.json 的文件作为输入文件。该文件的路径是*
#-o 这是输出参数,指定了一个名为 repeated_data.json 的文件作为输出文件。该文件的路径是*
#-n 这是一个选项参数,指定了一个数字值 200,用于指定重复的次数

准备模型配置文件

# 准备配置文件(经典)
# 查询xtuner内置配置文件
xtuner list-cfg -p llava_internlm2_chat_1_8b
# 拷贝配置文件到当前目录
xtuner copy-cfg \
  llava_internlm2_chat_1_8b_qlora_clip_vit_large_p14_336_lora_e1_gpu8_finetune \
  //root/autodl-tmp/XTuner/LLaVA/config

这里我是自己建立了几个目录的

自己把该下的模型/pretrain-pth/visual_encoder下载就行

下面的文件基本都按这个文本结构:

三、基于LLaVA微调多模态LLM

1.开启微调训练(1200次iter)

# 其实跟前面那个简单一点的微调认知模型差不多啦
# 开始模型微调训练(deepspeed加速+指定保存路径)
xtuner train /root/autodl-tmp/XTuner/LLaVA/config/llava_internlm2_chat_1_8b_qlora_clip_vit_large_p14_336_lora_e1_gpu8_finetune_copy.py --work-dir /root/autodl-tmp/XTuner/LLaVA/train --deepspeed deepspeed_zero2

 测试图片如下:

2.finetune前的模型:(注意代码,千万不要换行,不知道为什么,我的一换行就识别不了chat下面的参数)(只结合pretrain的权重)(增量预训练)

# finetune前
# 解决小bug
export MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER=GNU
# pth转huggingface (不要列空格!)
mkdir -p /root/autodl-tmp/XTuner/LLaVA/huggingface
xtuner convert pth_to_hf llava_internlm2_chat_1_8b_clip_vit_large_p14_336_e1_gpu8_pretrain /root/autodl-tmp/XTuner/LLaVA/pretain-pth/iter_2181.pth /root/autodl-tmp/XTuner/LLaVA/huggingface
# 启动!(不要列空格!)
xtuner chat /root/autodl-tmp/XTuner/LLaVA/model/Shanghai_AI_Laboratory/internlm2-chat-1_8b --visual-encoder /root/autodl-tmp/XTuner/LLaVA/visual_encoder/openai/clip-vit-large-patch14-336 --llava /root/autodl-tmp/XTuner/LLaVA/huggingface --prompt-template internlm2_chat --image /root/autodl-tmp/XTuner/LLaVA/llava_data/test_img/oph.jpg

运行效果,很显然让它描述图片,他只能回答点图片标题,问啥他都是回图片标题(毕竟pretrain的时候丢的就是单纯图片+图片标题数据这种知识,并没有增加图片+图片描述的问答对)

3.finetune后的模型:(注意代码,千万不要换行,不知道为什么,我的一换行就识别不了chat下面的参数)(结合了pretrain后进行finetune的权重)(先增量预训再指令微调)

# finetune后
# 解决小bug
export MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER=GNU
# pth转huggingface (不要列空格!)
mkdir -p /root/autodl-tmp/XTuner/LLaVA/huggingface
xtuner convert pth_to_hf /root/autodl-tmp/XTuner/LLaVA/config/llava_internlm2_chat_1_8b_qlora_clip_vit_large_p14_336_lora_e1_gpu8_finetune_copy.py /root/autodl-tmp/XTuner/LLaVA/train/iter_1200.pth /root/autodl-tmp/XTuner/LLaVA/huggingface
# 启动!(不要列空格!)
xtuner chat /root/autodl-tmp/XTuner/LLaVA/model/Shanghai_AI_Laboratory/internlm2-chat-1_8b --visual-encoder /root/autodl-tmp/XTuner/LLaVA/visual_encoder/openai/clip-vit-large-patch14-336 --llava /root/autodl-tmp/XTuner/LLaVA/huggingface --prompt-template internlm2_chat --image /root/autodl-tmp/XTuner/LLaVA/llava_data/test_img/oph.jpg

加载模型(加载base model/visual_encoder/LLM adapter/projector)(dddd)

运行效果,很显然让它描述图片,他能比较清晰的描述该图片的内容,就基本证明它已经长眼睛了!

OKOK,实验成功!!!成功微调出了一个简单的多模态LLM

进阶作业:将自我认知小助手上传至openxlab

 步骤 1:建立 SSH 连接

1.生成 SSH 公钥 1.1 生成密钥文件 请在终端中执行以下命令 提示:请将您的电子邮件信息替换为您的任何真实电子邮件地址

ssh-keygen -t rsa -C "邮箱"

执行命令后,按住“Enter”键,直到出现模式


根据上图的 Created 目录信息,可以找到 .ssh 文件夹的位置。
打开文件夹中的 id_rsa.pub 并复制整个内容(此内容是公钥)(打不开就直接加一个后缀.txt)。

 步骤2:执行拉取命令

  • 上传文件的上一步是拉取一个特定分支的文件。然后在本地调整文件,最后将分支推送回远程存储库的分支 (OpenXLab)。
  • 拉动前,请确认要上传文件或调整哪个分支。

1.首先,安装 git lfs

git lfs install

2.打开自己想放的本地文件目录:

cd D:\Git-hub-resource

 

3.打开git里面创建的项目,下载整个项目至本地你想放的文件下:记得是SSH下面的!

#Download this branch
git clone git@code.openxlab.org.cn:wiuuu/internlm2-chat-1.8b-final-model.git

 

4.下面就是自己在本地文件中想加什么文件就加什么文件咯

这是本地的,在internlm2-chat-1.8b-final-model下自己放就行了

然后用下面的命令,把整个本地的整个文件拉回去github里面

cd D:\Git-hub-resource\internlm2-chat-1.8b-final-model
git add -A
git commit -m "commit message"
git push

终于成功了www (尽量不要一整个文件夹就丢上去,还是展开在目录里再说)

 

 

进阶作业补充:openXlab应用部署(重新训练了一个自我认知模型,由于算力平台清空了哈哈哈)

具体部署应用的教程(借用github)在这:Gradio 应用程序 |文档-OpenXLab

1.github创建文件

2.openxlab应用部署

资源排队中,等排到了再更新哈哈哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值