书生浦语第二期实战营学习笔记(作业)(第四节课)

书生浦语第二期实战营系列—综述加技术报告研读
书生浦语第二期实战营系列—Tutorial1:demo体验
书生浦语第二期实战营系列—Tutorial2:RAG
书生浦语第二期实战营系列—Tutorial3:Xtuner微调
书生浦语第二期实战营系列—Tutorial4:Lmdeploy量化部署
书生浦语第二期实战营系列—Tutorial5:Agent
书生浦语第二期实战营系列—Tutorial6:OpenCompass

1 Finetune和xtuner简介

1.1 Finetune基础

1.1.1 Finetune的两种范式

根据微调的目的,主要分为两种
1.增量预训练微调
2.指令跟随微调
请添加图片描述

1.1.2 Finetune的三种方式

1.全量微调
2.Lora
3.Qlora
请添加图片描述

1.1.3 Finetune的数据格式

请添加图片描述

1.2 Finetune工具XTuner

1.2.1 XTuner简介

请添加图片描述

1.2.2 XTuner加速手段

1.多数据拼接
请添加图片描述
2.使用Flash Attention和DeepSpeed
请添加图片描述

1.2.3 XTuner常用命令

请添加图片描述

1.2.4 XTuner数据处理

请添加图片描述

2 微调模型

2.1 拉取代码

# 拉取 0.1.17 的版本源码
git clone -b v0.1.17  https://github.com/InternLM/xtuner

# 进入源码目录
cd xtuner

# 从源码安装 XTuner
pip install -e '.[all]'

#准备数据
使用tutorial中的示例

[
    {
        "conversation": [
            {
                "input": "请介绍一下你自己",
                "output": "我是{}的小助手,内在是上海AI实验室书生·浦语的1.8B大模型哦"
            }
        ]
    }
]

脚本

import json

# 输入你的名字
name = '您的宠物百科知识'
# 重复次数
n = 10000

data = [
    {
        "conversation": [
            {
                "input": "请做一下自我介绍",
                "output": "我是{}小助手,内在是上海AI实验室书生·浦语的1.8B大模型哦".format(name)
            }
        ]
    }
]

for i in range(n):
    data.append(data[0])

with open('xxx/personal_assistant.json', 'w', encoding='utf-8') as f:
    json.dump(data, f, ensure_ascii=False, indent=4)

2.2 拷贝配置文件

# 列出所有内置配置
xtuner list-cfg
# 拷贝一个配置文件到当前目录
xtuner copy-cfg internlm2_1_8b_qlora_alpaca_e3 ${SAVE_PATH}

在这里插入图片描述
在这里插入图片描述
将58行修改为 SYSTEM=“”

2.3 开始微调

xtuner train xxx/internlm2_1_8b_qlora_alpaca_e3_copy.py --deepspeed deepspeed_zero2

请添加图片描述

2.4 微调后合并权重

2.4.1 模型转换

模型转换的本质其实就是将原本使用 Pytorch 训练出来的模型权重文件转换为目前通用的 Huggingface 格式文件,xtuner也提供了一键转换命令

# 创建用于存放Hugging Face格式参数的hf文件夹
mkdir xxx/work_dirs/hf

# 执行参数转换
xtuner convert pth_to_hf ${配置文件地址} ${权重文件地址} ${转换后模型保存地址}
xtuner convert pth_to_hf xxx/internlm2_1_8b_qlora_alpaca_e3_copy.py xxx/internlm2_1_8b_qlora_alpaca_e3_copy/iter_832.pth/ xxx/work_dirs/hf

转换后模型目录如下

|-- hf/
    |-- adapter_config.json
    |-- xtuner_config.py
    |-- adapter_model.bin
    |-- README.md

2.4.2 模型合并

对于 LoRA 或者 QLoRA 微调出来的模型其实并不是一个完整的模型,而是一个额外的层(adapter)。那么训练完的这个层最终还是要与原模型进行组合才能被正常的使用。

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

# 解决一下线程冲突的 Bug
export MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER='GNU'

# 原始模型参数存放的位置
export NAME_OR_PATH_TO_LLM=xxx/Shanghai_AI_Laboratory/internlm2-chat-1_8b/
# Hugging Face格式参数存放的位置
export NAME_OR_PATH_TO_ADAPTER=xxx/work_dirs/hf

# 最终Merge后的参数存放的位置
mkdir xxx/work_dirs/hf_merge(xtuner也会自己创建)
export SAVE_PATH=xxx/work_dirs/hf_merge

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

xtuner convert merge有几个参数:
–max-shard-size {GB} 代表每个权重文件最大的大小(默认为2GB)
–device {device_name} 这里指的就是device的名称,可选择的有cuda、cpu和auto,默认为cuda即使用gpu进行运算
–is-clip 这个参数主要用于确定模型是不是CLIP模型,假如是的话就要加上,不是就不需要添加

2.5 运行demo(基础作业)

训练完成,测试下结果

xtuner chat xxx/hf_merge/ --prompt-template internlm2_chat

请添加图片描述

3 将自我认知的模型上传到 OpenXLab,并将应用部署到 OpenXLab(进阶作业)

3.1 先创建密钥

网址:https://openxlab.org.cn
依次点击:自己–密钥管理–添加令牌
创建一个可写的Access Token,后面上传模型得用
请添加图片描述

3.2 上传模型

3.2.1 创建模型仓库

网址:https://openxlab.org.cn
依次点击:创建–创建模型
在这里插入图片描述

3.2.2 克隆模型仓库到本地

1.依次点击:模型文件–下载
请添加图片描述
2.拷贝git clone在本地terminal中运行

git clone https://code.openxlab.org.cn/raytang88/internlm2-1_8b-pet-knowledge-assistant-model.git

3.2.3 push权重到模型仓库

cd internlm2-1_8b-pet-knowledge-assistant-model/
# 将之前merge后的文件拷贝到clone的目录下
cp xxx/work_dirs/hf_merge/* .
git add -A
git commit -m "init model"
git push

输入用户名和3.1创建的Access Token,开启上传
请添加图片描述

3.3 创建应用

3.3.1 创建git应用仓库

请添加图片描述
1.将创建的仓库clone到本地

git clone https://github.com/RayTang88/pet-knowledge-assistant-app.git

2.创建应用文件
app.py
README.md
packages.txt
requirements.txt
具体内容见参考2
3.push code到github

git add -A
git commit -m "init code"
git push

请添加图片描述

3.3.2 创建openxlab应用仓库

网址:https://openxlab.org.cn
依次点击:创建–创建应用–gradio
请添加图片描述
点击创建后就开始构建应用了
请添加图片描述

4 多模态微调(进阶作业)

请添加图片描述

4.1 多模态微调基础知识

4.1.1Pretrain阶段

在Pretrain阶段,我们会使用大量的图片+简单文本(caption, 即图片标题)数据对,使LLM理解图像中的普遍特征。即,对大量的图片进行粗看。

Pretrain阶段训练完成后,此时的模型已经有视觉能力了!但是由于训练数据中都是图片+图片标题,所以此时的模型虽然有视觉能力,但无论用户问它什么,它都只会回答输入图片的标题。即,此时的模型只会给输入图像“写标题”。

Pretrain阶段相当于是开发LLM时预训练工作,对硬件要求非常高,详见XTuner-LLaVA和LLaVA,pretrain阶段得到初级的Image Projector

4.1.2 Finetune阶段

在Finetune阶段,我们会使用图片+复杂文本数据对,来对Pretrain得到的Image Projector进行进一步的训练。

4.2 多模态微调实战

4.2.1 训练数据构建

1.我们可以效法LLaVA作者的做法,将自己的图片发送给GPT,要求其按照上述格式生成若干条问答对,prompt如下:

【image】
Create a dataset for me, following this format.
[
  {
    "id": "<random_number_string>",
    "image": "test_img/oph.jpg",
    "conversations": [
      {
        "from": "human",
        "value": "<image>\nDescribe this image."
      },
      {
        "from": "gpt",
        "value": "<answer1>"
      },
      {
        "from": "human",
        "value": "<question2>"
      },
      {
        "from": "gpt",
        "value": "<answer2>"
      },
      {
        "from": "human",
        "value": "<question3>"
      },
      {
        "from": "gpt",
        "value": "<answer3>"
      }
    ]
  }
]
The questions and answers, please generate for me, based on the image I sent to you. Thes questions should be from the shallow to the deep, and the answers should be as detailed and correct as possible. The questions and answers should be stick to the contents in the image itself, like objects, peoples, equipment, environment, purpose, color, attitude, etc. 5 question and answer pairs.

2.这里采用了训练营已经做好的数据重复200次

python xxx/tutorial/xtuner/llava/llava_data/repeat.py \
  -i xxx/tutorial/xtuner/llava/llava_data/unique_data.json \
  -o xxx/tutorial/xtuner/llava/llava_data/repeated_data.json \
  -n 200

4.2.2 配置文件修改

# 查询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 \
  xxx/tutorial/xtuner/llava

请添加图片描述

4.2.3 开始Finetune

cd xxx/tutorial/xtuner/llava/
xtuner train llava_internlm2_chat_1_8b_qlora_clip_vit_large_p14_336_lora_e1_gpu8_finetune_copy.py --deepspeed deepspeed_zero2

请添加图片描述

4.2.4 转换权重为huggingface格式

xtuner convert pth_to_hf internlm2_chat_1_8b_llava_tutorial_fool_config/internlm2_chat_1_8b_llava_tutorial_fool_config.py internlm2_chat_1_8b_llava_tutorial_fool_config/iter_1200.pth hf/

请添加图片描述

4.2.5 运行demo

xtuner chat xxx/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b \
  --visual-encoder xxx/share/new_models/openai/clip-vit-large-patch14-336 \
  --llava xxx/tutorial/xtuner/llava/llava_data/iter_1200_hf \
  --prompt-template internlm2_chat \
  --image xxx/tutorial/xtuner/llava/llava_data/test_img/oph.jpg

请添加图片描述

附录

1.使用以下命令报错

xtuner train xxx/internlm2_1_8b_qlora_alpaca_e3_copy.py

报错信息:
RuntimeError: FlashAttention only support fp16 and bf16 data type
根据参考链接【1】,使用以下命令训练

xtuner train xxx/internlm2_1_8b_qlora_alpaca_e3_copy.py --deepspeed deepspeed_zero2

2.在2.4.3节权重合并的时候报错
TypeError: LoraConfig.init() got an unexpected keyword argument ‘layer_replication’
因为2.4.2节报错未能正确生成hf的权重导致的
参考链接:
1.https://github.com/InternLM/xtuner/issues/430
2.https://github.com/InternLM/Tutorial/tree/camp2/tools/openxlab-deploy

  • 11
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值