理论疲劳?来试试实战!MiniGPT微调手册带你玩转大语言模型

一、项目部署

可以采用git从github拉取MiniGPT-4 main项目代码,也可以下载压缩包,然后解压后传到linux里
MiniGPT-4项目地址:GitHub - Vision-CAIR/MiniGPT-4: Open-sourced codes for MiniGPT-4 and MiniGPT-v2 (https://minigpt-4.github.io, https://minigpt-v2.github.io/)

1.1 创建项目目录

在home目录下创建一个新的文件夹

mkdir /path/to/your/dir

首先cd进入新文件夹中

cd /path/to/your/dir

如下图:
请添加图片描述

1.2 克隆MiniGPT项目文件

输入git clone命令

git clone https://github.com/Vision-CAIR/MiniGPT-4.git

返回done,说明项目克隆成功。
请添加图片描述

现在项目已经成功克隆到本地了,下面我们开始为这个项目部署python环境!

二、环境部署

2.1 硬件部署

一般来说,微调的时候图像尺寸调小一点,batch数小一点,一块RTX3090 24GB完全可以胜任,只是速度会慢一些,而且因为batch比较小,模型学到的共性会稍微少一些。

up所在实验室的T630服务器配置如下:

CPU:Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz 16核32线程
GPU:NVIDIA RTX A6000 48GB 
内存:192GB DDR4 2400 MT/s

2.2 软件部署

2.2.1 第一步 显卡驱动
参考博客:Python环境安装(Linux版本)附带显卡驱动和cuda安装教程(新版)-CSDN博客

conda create --name minigpt python=3.9 -y

2.2.2 第二步 cuda
参考博客:Python环境安装(Linux版本)附带显卡驱动和cuda安装教程(新版)-CSDN博客

2.2.3 第三步 安装依赖

1. 进入环境

conda activate minigpt

注:原项目通过对environment.yml进行一键安装,这个配置文件里环境需要的所有依赖包,但安装花费时间很长,而且没有进度条显示,以下命令不建议:

conda env create -f environment.yml

可以将environment.yml里的库拿出来逐个安装,方便排查错误。

2. 安装cudatoolkit工具

conda install cudatoolkit

3. 安装其他必要依赖

pip install torch==2.0.0 torchaudio torchvision huggingface-hub==0.18.0 matplotlib==3.7.0 psutil==5.9.4 iopath pyyaml==6.0 regex==2022.10.31 tokenizers==0.13.2 tqdm==4.64.1 transformers==4.30.0 timm==0.6.13 webdataset==0.2.48 omegaconf==2.3.0 opencv-python==4.7.0.72 decord==0.6.0 peft==0.2.0 sentence-transformers gradio==3.47.1 accelerate==0.20.3 bitsandbytes==0.37.0 scikit-image visual-genome wandb

安装的东西很多,耐心等待,完成之后如下图。

请添加图片描述

三、项目文件介绍

如果是用的ssh,这里建议用vscode打开项目文件。
按照项目目录,我们先了解一下各个目录是干嘛的。
这里只介绍微调需要用到的主要目录。
文件打开后有如下文件:
请添加图片描述

3.1 dataset

首先是dataset目录,这个目录告诉你如何下载数据集。
请添加图片描述

如图上所示,cc_sbu数据和laion数据是用来预训练的数据,数据量很大,足足有3TB多,所以我们不采用他,我们将进行微调,所微调的任务是vqa,也就是视觉问答,简单来说就是根据图片回答问题。

3.2 minigpt4

这个文件夹包括了minigpt4最主要的文件,包括模型配置文件configs,模型数据集如何加载的配置datasets,模型的.py文件models等。
请添加图片描述

3.3 train_configs

这个文件可以配置训练时候的一些参数。
请添加图片描述

3.4 eval_configs

这个目录,是我们用来评估模型的。
第一个文件是基于vicuna 34B模型的MiniGPT-4,第二个文件是基于llama2-chat-7bMiniGPT-4,第三个和第四个是MiniGPTv2模型,本教程采用基于llama2-chat-7bMiniGPT-4,将对其进行微调。
请添加图片描述

以上四个文件夹,就是本次微调最主要需要了解的文件,其余的可以自己研究一下。

四、微调准备

4.1 准备预训练的LLM权重

我们需要准备Llama2 Chat 7B 的权重文件。

可以去huggingface官网:meta-llama/Llama-2-7b-chat-hf at main手动下载,也可以使用transforms库自动下载,在下载前先参考这两篇文章,设置好huggingface的国内镜像源地址和自定义的transforms库的模型下载路径:
HuggingFace镜像源设置_huggingface 修改镜像-CSDN博客
不会修改HuggingFace模型下载默认缓存路径?一篇教会你!_huggingface缓存文件转移-CSDN博客

Llama2 Chat 7B的权重文件下载好后,你需要到以下配置文件的15行,修改Llama-2-7b-chat-hf的加载路径, Llama2 Chat 7Bhuggingface地址为:meta-llama/Llama-2-7b-chat-hf · Hugging Face

 minigpt4/configs/models/minigpt4_llama2.yaml

因为我使用的transforms库直接下载的,所以我只需要填入预训练模型的名称或路径,如下图:
请添加图片描述

使用meta官方的的大模型,需要先申请,这样可以下载之后meta推出的所有大模型,但是也可以去国内的开源社区下载,只是比较麻烦。

4.2 准备预训练检查点

预训练权重预训练检查点的区别:

这里的预训练检查点,可以理解为游戏存档预训练是整个游戏的过程,我游戏打到某一关,装备比较好,但游戏只有一条命,不想之后丢失到目前为止所有的游戏成就、装备、技能等状态,那我就存个档,之后每次死亡我都可以从这个好存档开始打。

到这里下载LLaMA-2 Chat 7B的检查点:pretrained_minigpt4_llama2_7b.pth - Google 云端硬盘
为了容易找的到,在MiniGPT目录下新建一个文件llama2_checkpoint,解压到其中:
请添加图片描述

之后,我们来到如下文件夹的第8行,填入刚才检查点的路径:
配置文件路径

eval_configs/minigpt4_llama2_eval.yaml

在这个配置文件中,如果你硬件资源比较好,可以把low_resorece参数设置成False,这样模型推理速度比较快。
如图:
请添加图片描述

至此,你可以运行一下命令,来测试是否可以运行模型了:
激活你的虚拟环境后切换到项目主目录

cd /to/you/projcet/MiniGPT-4   
python demo.py --cfg-path "eval_configs/minigpt4_llama2_eval.yaml"

运行后,如下图,会弹出一个7860的本地映射端口,它是一个webui界面,之后你可以在这里推理你的模型!
请添加图片描述

推理界面:
请添加图片描述

因为是最基础的模型,所以它虽然理解中文,但是不能说中文。

至此,你已经可以成功运行这个基于llama2 7B的Minigpt4大语言模型了!

4.3 数据集

上节我们成功的把

模型跑起来了,接下来,我们将为微调准备数据。

更改数据集默认缓存路径:
来找如下路径的默认配置文件:

MiniGPT-4/minigpt4/configs/default.yaml

将第五行改为你想存放数据集的路径:
请添加图片描述

数据集下载可以自动,也可手动,后面会讲到如何自动下载数据,如果自动不行,可以手动下载。

手动下载数据如下:
coco vqa数据集
为了微调的方便,这里采用的的是COCO VQA数据集。后期大家熟悉流程了可以自己做数据集!
为了完成视觉问答任务(VQA)那么肯定需要一个图片和所对应的文本标注,所以接下来,我们为VQA任务准备数据。

VQA图片数据
首先采用wget命令下载coco 2014 图片数据集,可以采用wget命令:
先cd进你想存放数据的路径,比如我的如下:

cd miniGPT/coco/images/train

使用wget命令下载coco2014图片压缩包

wget http://images.cocodataset.org/zips/train2014.zip
wget http://images.cocodataset.org/zips/val2014.zip
wget http://images.cocodataset.org/zips/test2014.zip

下载好之后,使用unzip命令解压一下,如果没有unzip那就先安装一下:

sudo apt-get update
apt install unzip
unzip train2014.zip miniGPT/coco/images/train # 解压到train文件夹里

VQA文字标注数据
同样的,使用wget命令下载coco官网给我准备好的VQA标注:
训练数据:

wget https://storage.googleapis.com/sfr-vision-language-research/LAVIS/datasets/vqav2/vqa_train.json

测试数据:

wget https://storage.googleapis.com/sfr-vision-language-research/LAVIS/datasets/vqav2/vqa_val.json

到这里,你可能会发现,为啥有val的标注文件,却没有val的图片文件,因为在这个项目里,会自动把train图片中的一部分,用来验证。至于测试集,是不需要的。

我们可以观察一下数据,训练和测试的数据格式是一样的,我们可以打开小一点的vqa_val.json观察一下:
请添加图片描述

我们可以拿出第一组数据来观察,这个数据标注的json文件中,数据主要是以python字典形式
存在的,主要的键:"question_id""question""answer""image""dataset",他们都有对应的值,比如"question"对应"Where is he looking?",以及图片的id "val2014/COCO_val2014_000000262148.jpg"等等

[
 {
 "question_id": 262148000, 
 "question": "Where is he looking?", 
  "answer": ["down", "down", "at table", "skateboard", "down", "table", "down", "down", "down", "down"], 
  "image": "val2014/COCO_val2014_000000262148.jpg", 
  "dataset": "vqa"
  },
  ...
]

我们可以找到这图片,看看这个标注是不是这么一回事:
COCO_val2014_000000262148.jpg如下
请添加图片描述

确实,图片和文本标注还是能对应上的。到此,数据集就准备好了。

五、微调

5.1 数据加载配置

首先,我们需要到数据集配置.yaml中进行数据的配置:

MiniGPT-4/minigpt4/configs/datasets/coco/defaults_vqa.yaml

按照如下图配置:
请添加图片描述

图上有两个url,如果手动没下,这里可以自动下载,并存到之前设置的默认数据集路径中。

我们需要到训练配置.yaml中,配置我们需要加载的coco_vqa数据:

MiniGPT-4/train_configs/minigpt4_llama2_stage2_finetune.yaml

配置我们需要的coco_vqa数据,如下:

datasets:
  coco_vqa:   # 数据集名称
    batch_size: 6   # batch数量
    vis_processor:  # 图像预处理器
      train:
        name: "blip2_image_train"
        image_size: 224
    text_processor:  # 文本预处理器
      train:
        name: "blip_caption"

填入上面的配置,并且把他原本cc_sbu_align的数据配置注释掉。(cc_sbu_align这个数据量很大,没记错的话有2TB)。
如下图:
请添加图片描述

现在,子弹已经上膛!(数据集准备就绪)

5.2 模型加载配置

还是刚才的训练配置.yaml中,找到第9行的ckpt,还记得刚才提到的游戏存档吗?我将这里进行加载,我们将从这个存档开始游戏!(从这个预训练检查点开始微调训练!)
请添加图片描述

5.3 微调配置

训练配置.yaml文件中,内容如下:

model:
  arch: minigpt4  #模型名称
  model_type: pretrain_llama2 # 模型配置
  
  max_txt_len: 160  # 最大文本长度
  end_sym: "</s>"   # 文本结束的特殊字符
  prompt_path: "prompts/alignment.txt"  # 提示词模版加载路径
  prompt_template: '[INST] {} [/INST] '
  ckpt: '/home/YYH/myprojcet/MiniGPT-4/llama2_checkpoint/pretrained_minigpt4_llama2_7b.pth'   # “游戏存档”

datasets:   # 我们刚才设置的数据集
  coco_vqa:
    batch_size: 6
    vis_processor:
      train:
        name: "blip2_image_train"
        image_size: 224
    text_processor:
      train:
        name: "blip_caption"

# datasets:
#   cc_sbu_align:
#     batch_size: 12
#     vis_processor:
#       train:
#         name: "blip2_image_train"
#         image_size: 224
#     text_processor:
#       train:
#         name: "blip_caption"

run:    # 运行配置
  task: image_text_pretrain  # 微调任务
  # optimizer      # 优化的内容
  lr_sched: "linear_warmup_cosine_lr" 
  init_lr: 3e-5
  min_lr: 1e-5
  warmup_lr: 1e-6
  
  weight_decay: 0.05
  max_epoch: 10            # 训练轮次
  iters_per_epoch: 100    # 每轮训练的迭代次数
  num_workers: 4
  warmup_steps: 200
  
  seed: 42
  output_dir: "output/minigpt4_stage2_finetune"    # 微调权重输出路径
  
  amp: True
  resume_ckpt_path: null

  evaluate: False        # 微调中是否进行评估
  train_splits: ["train"]  # 数据集分割,这里没有val,就是全部用来微调

  device: "cuda"
  world_size: 1
  dist_url: "env://"
  distributed: False  # 分布式训练,你如你想,可以设为True

  wandb_log: True   # 是否用wandb库实时监控微调过程,建议开,但是你得先注册一个wandb的账号。
  job_name: minigpt4_llama2_finetune  # 微调过程可视化的项目名称

配置好运行脚本后,运行一下代码进行微调:

# --nproc-per-node是GUP的数量,如果你开启了分布式训练,则填GUP的数量。默认1块GPU
torchrun --nproc-per-node 1 train.py --cfg-path /home/YYH/myprojcet/MiniGPT-4/train_configs/minigpt4_llama2_stage2_finetune.yaml

我们已经成功开始微调了!
请添加图片描述

我们可以通过wandb库实时监控loss曲线GPU使用情况等等
请添加图片描述

5.4 评估

等微调完成,我们只需将微调过程中保存的权重,替换到推理配置文eval_configs中的游戏存档的位置,就可以测试我们自己的微调结果了!

  • 27
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用大语言模型改善之前的项目可以来很多好处,但也存在一些风险点需要注意。以下是一些建议和可能的风险点: 1. 数据隐私和安全:使用大语言模型可能需要使用大量的数据进行训练和微调,因此需要确保数据的隐私和安全性。特别是对于包含敏感信息的数据,需要采取适当的安全措施,如数据脱敏、加密等。 2. 模型可解释性:大语言模型通常是黑盒模型,很难解释其决策过程和结果。这可能会来一定的风险,尤其在涉及法律、金融或其他敏感领域的项目中。在这些情况下,需要仔细考虑并确保模型的可解释性。 3. 偏见和公平性:大语言模型可能会受到训练数据的偏见影响,导致对某些群体或特定主题的回答不准确或有偏见。在使用模型之前,需要进行适当的训练数据筛选、平衡和评估,以确保模型的公平性和准确性。 4. 训练和计算资源:训练和微调语言模型需要大量的计算资源和时间。这可能对于个人或小型团队来说是一个挑战,因此需要仔细评估和规划资源。 5. 模型性能和误差:大语言模型虽然强大,但仍然可能存在一定的误差。在实际应用中,需要对模型进行充分的测试和评估,确保其在项目中的性能和准确性。 6. 用户体验和满意度:虽然大语言模型可以提供智能回答和对话能力,但它仍然可能无法满足所有用户的需求。在项目中使用模型时,需要根据用户反馈和需求进行持续改进和优化,以提供更好的用户体验和满意度。 综上所述,使用大语言模型改善项目是有潜力的,但也需要认真考虑和管理相关的风险点。在实施过程中,建议进行充分的风险评估和管理,并遵守相关的法律法规和隐私保护政策。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值