理论疲劳?来试试实战!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安装教程(新版)-优快云博客
conda create --name minigpt python=3.9 -y
2.2.2 第二步 cuda
参考博客:Python环境安装(Linux版本)附带显卡驱动和cuda安装教程(新版)-优快云博客
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-7b
MiniGPT-4,第三个和第四个是MiniGPTv2模型,本教程采用基于llama2-chat-7b
MiniGPT-4,将对其进行微调。
以上四个文件夹,就是本次微调最主要需要了解的文件,其余的可以自己研究一下。
四、微调准备
4.1 准备预训练的LLM权重
我们需要准备Llama2 Chat 7B 的权重文件。
可以去huggingface官网:meta-llama/Llama-2-7b-chat-hf at main手动下载,也可以使用transforms库自动下载,在下载前先参考这两篇文章,设置好huggingface的国内镜像源地址和自定义的transforms库的模型下载路径:
HuggingFace镜像源设置_huggingface 修改镜像-优快云博客
不会修改HuggingFace模型下载默认缓存路径?一篇教会你!_huggingface缓存文件转移-优快云博客
Llama2 Chat 7B
的权重文件下载好后,你需要到以下配置文件的15行,修改Llama-2-7b-chat-hf
的加载路径, Llama2 Chat 7B
的huggingface
地址为: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
中的游戏存档
的位置,就可以测试我们自己的微调结果了!