2026年有没有多模态大模型MiniGPT-4微调的保姆级教程?

有没有多模态大模型MiniGPT-4微调的保姆级教程?ChatGPT 的发布给大家带来了不少的震撼 而随后发布的 GPT 4 更是展现了非凡的多模态能力 但是 ChatGPT 和 GPT4 官方公布的细节很少 OpenAI 俨然走上了闭源之路 让广大 AI 从业者又爱又恨 最近 来自沙特阿拉伯阿卜杜拉国王科技大学的研究团队开源了 GPT 4 的平民版 MiniGPT 4 他们认为 GPT 4 具有先进的多模态生成能力的主要原因在于利用了更先进的大型语言模型 LLM

大家好,我是讯享网,很高兴认识大家。这里提供最前沿的Ai技术和互联网信息。



ChatGPT的发布给大家带来了不少的震撼,而随后发布的GPT-4更是展现了非凡的多模态能力。但是,ChatGPT和GPT4官方公布的细节很少,OpenAI俨然走上了闭源之路,让广大AI从业者又爱又恨。

最近,来自沙特阿拉伯阿卜杜拉国王科技大学的研究团队开源了GPT-4的平民版 MiniGPT-4。他们认为,GPT-4 具有先进的多模态生成能力的主要原因在于利用了更先进的大型语言模型(LLM)。为了研究这一现象,他们提出了 MiniGPT-4。

MiniGPT-4 仅使用一个投影层将一个冻结的视觉编码器(BLIP-2)与一个冻结的 LLM(Vicuna)对齐。

image.png

MiniGPT-4 产生了许多类似于 GPT-4 中新兴的视觉语言能力。比如:根据给定的图像创作故事和诗歌,为图像中显示的问题提供解决方案,教用户如何根据食物照片烹饪,给个手绘草图直接写出网站的代码等。

除此之外,此方法计算效率很高,因为它仅使用大约 500 万个对齐的图像-文本对和额外的 3,500 个经过精心策划的高质量图像-文本对来训练一个投影层。

BLIP-2 简介 BLIP-2是一种通用且高效的视觉-语言预训练方法,它可以从现成的冻结预训练图像编码器和冻结大型语言模型中引导视觉-语言预训练。BLIP-2通过一个轻量级的Querying Transformer来弥合模态差距,并在两个阶段进行预训练。第一个阶段从冻结图像编码器引导视觉-语言表示学习。第二个阶段从冻结语言模型中引导视觉-语言生成学习。尽管比现有方法具有显著较少的可训练参数,但BLIP-2在各种视觉-语言任务上实现了最先进的性能。在零样本 VQAv2 上,BLIP-2 相较于 80 亿参数的 Flamingo 模型,使用的可训练参数数量少了 54 倍,性能却提升了 8.7 %。

MiniGPT-4 的模型架构遵循 BLIP-2,因此,训练 MiniGPT-4 分两个阶段。

第一个传统预训练阶段使用 4 张 A100 卡在 10 小时内使用大约 500 万个对齐的图像-文本对进行训练。 在第一阶段之后,Vicuna 虽然能够理解图像。 但是Vicuna的生成能力受到了很大的影响。

为了解决这个问题并提高可用性,MiniGPT-4 提出了一种通过模型本身和 ChatGPT 一起创建高质量图像文本对的新方法。 基于此,MiniGPT-4 随后创建了一个小规模(总共 3500 对)但高质量的数据集。

第二个微调阶段在对话模板中对该数据集进行训练,以显著提高其生成的可靠性和整体的可用性。 令人惊讶的是,这个阶段的计算效率很高,使用单个 A100 只需大约 7 分钟即可完成。

随着ChatGPT的爆火,大语言模型(LLM)得到了空前的关注。模型需要哪些核心技术,有没有代码实践教程?针对这些问题,推荐大家学习深蓝学院的《生成式预训练语言模型:理论与实战》课程,课程注重理论思想与代码实践相结合,最终带你从0到1制作自己的mini-ChatGPT。

基础环境配置如下:

  • 操作系统: Ubuntu 18.04
  • CPUs: 单个节点具有 384GB 内存的 Intel CPU,物理CPU个数为2,每颗CPU核数为20
  • GPUs: 4 卡 A800 80GB GPUs
  • Python: 3.10 (需要先升级OpenSSL到1.1.1t版本(点击下载OpenSSL),然后再编译安装Python),点击下载Python
  • NVIDIA驱动程序版本: 525.105.17,根据不同型号选择不同的驱动程序,点击下载
  • CUDA工具包: 11.6,点击下载
  • cuDNN: 8.8.1.3_cuda11,点击下载

本文选择使用Doker镜像进行环境搭建。

首先,下载对应版本的Pytorch镜像。

docker pull pytorch/pytorch:1.13.1-cuda11.6-cudnn8-devel

镜像下载完成之后,创建容器。

docker run -dt –name minigpt4_env_dev –restart=always –gpus all 
–network=host
–shm-size 4G
-v /home/gdong/workspace/code:/workspace/code
-v /home/gdong/workspace/data:/workspace/data
-v /home/gdong/workspace/model:/workspace/model
-v /home/gdong/workspace/output:/workspace/output
-v /home/gdong/workspace/package:/workspace/package
-w /workspace
pytorch/pytorch:1.13.1-cuda11.6-cudnn8-devel
/bin/bash


































































进入容器。

docker exec -it minigpt4_env_dev bash

安装 cv2 的依赖项。

apt-get update && apt-get install ffmpeg libsm6 libxext6 -y

安装其他依赖包。

pip install -r requirements.txt

其中,requirements.txt文件内容如下:

accelerate==0.16.0 aiohttp==3.8.4 aiosignal==1.3.1 async-timeout==4.0.2 attrs==22.2.0 bitsandbytes==0.37.0 cchardet==2.1.7 chardet==5.1.0 contourpy==1.0.7 cycler==0.11.0 filelock==3.9.0 fonttools==4.38.0 frozenlist==1.3.3 huggingface-hub==0.13.4 importlib-resources==5.12.0 kiwisolver==1.4.4 matplotlib==3.7.0 multidict==6.0.4 openai==0.27.0 packaging==23.0 psutil==5.9.4 pycocotools==2.0.6 pyparsing==3.0.9 python-dateutil==2.8.2 pyyaml==6.0 regex==2022.10.31 tokenizers==0.13.2 tqdm==4.64.1 transformers==4.28.0 timm==0.6.13 spacy==3.5.1 webdataset==0.2.48 scikit-learn==1.2.2 scipy==1.10.1 yarl==1.8.2 zipp==3.14.0 omegaconf==2.3.0 opencv-python==4.7.0.72 iopath==0.1.10 decord==0.6.0 tenacity==8.2.2 peft pycocoevalcap sentence-transformers umap-learn notebook gradio==3.24.1 gradio-client==0.0.8 wandb

接下来,安装img2dataset库,用于后续下载数据集使用。

pip install img2dataset -i https://pypi.tuna.tsinghua.edu.cn/simple –trusted-host pypi.tuna.tsinghua.edu.cn

# commit id: 22d8888ca2cf0aac862f537e7d22ef git clone https://github.com/Vision-CAIR/MiniGPT-4.git cd MiniGPT-4

预先准备好 Vicuna 权重,详情请查看官方文档

在之前的文章大模型也内卷,Vicuna训练及推理指南,效果碾压斯坦福羊驼中,有讲解过如何合并Vicuna模型权重,在这里我直接使用之前合并好的Vicuna权重文件。

准备好 Vicuna 权重之后,在模型配置文件 minigpt4.yaml 中的第 16 行设置 Vicuna 权重的路径。

model: arch: mini_gpt4

# vit encoder image_size: 224 drop_path_rate: 0 use_grad_checkpoint: False vit_precision: “fp16” freeze_vit: True freeze_qformer: True

# Q-Former num_query_token: 32

# Vicuna llama_model: “/workspace/model/vicuna-7b-all-v1.1”

# generation configs prompt: “”

preprocess:

vis_processor: train: name: "blip2_image_train" image_size: 224 eval: name: "blip2_image_eval" image_size: 224 text_processor: train: name: "blip_caption" eval: name: "blip_caption" 

然后,下载预训练的 MiniGPT-4 检查点(checkpoint),用于模型推理。下载地址:与 Vicuna 7B 对齐的checkpoint(prerained_minigpt4_7b.pth)与 Vicuna 7B 对齐的checkpoint(pretrained_minigpt4_13b.pth)

如果服务器无法访问外网,需要预先下载好 VIT(eva_vit_g.pth)、Q-Former (blip2_pretrained_flant5xxl.pth)的权重以及Bert(bert-base-uncased)的Tokenizer。如果服务器可以访问外网且网络状况良好,可以直接忽略以下步骤。

eva_vit_g.pth和blip2_pretrained_flant5xxl.pth下载好之后,格式如下:

> ls -al hub/checkpoints/ –block-size=K total K drwxr-xr-x 2 root root 4K May 5 02:09 . drwxr-xr-x 3 root root 4K May 7 02:34 .. -rw——- 1 root root K May 5 02:09 blip2_pretrained_flant5xxl.pth -rw——- 1 root root K May 5 02:08 eva_vit_g.pth

同时需要设置环境变量:

# export TORCH_HOME=/workspace/model/cache/torch export TORCH_HOME=/root/.cache/torch

bert-base-uncased下载好之后,格式如下:

> ls -al bert-base-uncased –block-size=K
total 244K drwxr-xr-x 2 root root 4K May 7 09:03 . drwxrwxrwx 9 root root 4K May 7 09:02 .. -rw-r–r– 1 root root 1K May 7 09:03 config.json -rw-r–r– 1 root root 1K May 7 09:03 tokenizer_config.json -rw-r–r– 1 root root 227K May 7 09:03 vocab.txt



同时,需要修改/workspace/code/MiniGPT-4/minigpt4/models/blip2.py文件,改为本地加载Tokenizer:

class Blip2Base(BaseModel):

@classmethod def init_tokenizer(cls): # TODO #tokenizer = BertTokenizer.from_pretrained("bert-base-uncased") tokenizer = BertTokenizer.from_pretrained("/workspace/model/bert-base-uncased") tokenizer.add_special_tokens({"bos_token": "[DEC]"}) return tokenizer ... @classmethod def init_Qformer(cls, num_query_token, vision_width, cross_attention_freq=2): # TODO #encoder_config = BertConfig.from_pretrained("bert-base-uncased") encoder_config = BertConfig.from_pretrained("/workspace/model/bert-base-uncased") encoder_config.encoder_width = vision_width # insert cross-attention layer every other block encoder_config.add_cross_attention = True encoder_config.cross_attention_freq = cross_attention_freq encoder_config.query_length = num_query_token Qformer = BertLMHeadModel(config=encoder_config) query_tokens = nn.Parameter( torch.zeros(1, num_query_token, encoder_config.hidden_size) ) query_tokens.data.normal_(mean=0.0, std=encoder_config.initializer_range) return Qformer, query_tokens 

下面准备数据集,MiniGPT-4 的训练包含两个阶段,每个阶段使用的数据集不一样。

首先,准备第一阶段数据集。

图片来源 通过ViT-L过滤后的合成字幕
CC3M+CC12M+SBU Download
LAION115M Download

下载ccs_synthetic_filtered_large.json和laion_synthetic_filtered_large.json文件,并移动到对应的目录。

export MINIGPT4_DATASET=/workspace/data/blip mkdir \({MINIGPT4_DATASET}/cc_sbu mkdir \){MINIGPT4_DATASET}/laion mv ccs_synthetic_filtered_large.json \({MINIGPT4_DATASET}/cc_sbu mv laion_synthetic_filtered_large.json \){MINIGPT4_DATASET}/laion

进入MiniGPT-4项目的dataset目录,并拷贝转换数据格式和下载数据集的脚本。

cd dataset/ cp convert_cc_sbu.py \({MINIGPT4_DATASET}/cc_sbu cp download_cc_sbu.sh \){MINIGPT4_DATASET}/cc_sbu

cp convert_laion.py \({MINIGPT4_DATASET}/laion cp download_laion.sh \){MINIGPT4_DATASET}/laion

由于数据集太大,进入\({MINIGPT4_DATASET}/cc_sbu和\){MINIGPT4_DATASET}/laion文件夹,修改convert_cc_sbu.py和convert_laion.py脚本,改为仅下载一部分数据。

#rows = [x.values() for x in data]

rows = []

for i, x in enumerate(data):

if i >= 1000: break rows.append(x.values()) 

然后,将laion和cc_sbu标注文件格式转换为img2dataset格式。

cd ${MINIGPT4_DATASET}/cc_sbu python convert_cc_sbu.py

cd ${MINIGPT4_DATASET}/laion python convert_laion.py

进入\({MINIGPT4_DATASET}/cc_sbu和\){MINIGPT4_DATASET}/laion文件夹,修改下载数据集脚本download_cc_sbu.sh和download_laion.sh,将–enable_wandb配置项改为False。

然后,执行脚本,使用img2dataset下载数据集。

cd ${MINIGPT4_DATASET}/cc_sbu sh download_cc_sbu.sh

cd ${MINIGPT4_DATASET}/laion sh download_laion.sh

下载完成之后的最终数据集结构如下所示:

> tree . |– cc_sbu | |– cc_sbu_dataset | | |– 00000.parquet | | |– 00000.tar | | -- 00000_stats.json | |-- ccs_synthetic_filtered_large.json | |-- ccs_synthetic_filtered_large.tsv | |-- convert_cc_sbu.py |– download_cc_sbu.sh `– laion

|-- convert_laion.py |-- download_laion.sh |-- laion_dataset | |-- 00000.parquet | |-- 00000.tar | `-- 00000_stats.json |-- laion_synthetic_filtered_large.json `-- laion_synthetic_filtered_large.tsv 

4 directories, 14 files

之后,修改数据集配置文件。

修改配置文件minigpt4/configs/datasets/laion/defaults.yaml的第五行设置LAION数据集加载路径,具体如下所示:

datasets: laion:

data_type: images build_info: storage: /workspace/data/blip/laion/laion_dataset/00000.tar 

修改配置文件minigpt4/configs/datasets/cc_sbu/defaults.yaml的第五行设置 Conceptual Captoin 和 SBU 数据集加载路径,具体如下所示:

datasets: cc_sbu:

data_type: images build_info: storage: /workspace/data/blip/cc_sbu/cc_sbu_dataset/00000.tar 

接下来,准备第二阶段数据集,具体在此处下载,数据集文件夹结构如下所示。

cc_sbu_align ├── filter_cap.json └── image

├── 2.jpg ├── 3.jpg ... 

下载完成之后,在数据集配置文件minigpt4/configs/datasets/cc_sbu/align.yaml中的第 5 行设置数据集路径。

datasets: cc_sbu_align:

data_type: images build_info: storage: /workspace/data/cc_sbu_align/ 

MiniGPT-4 项目基于 BLIP2LavisVicuna 进行构建,使用 OmegaConf 基于 YAML 进行分层系统配置,整个代码结构如下所示:

. |– LICENSE.md |– LICENSE_Lavis.md |– MiniGPT_4.pdf |– PrepareVicuna.md |– README.md |– dataset # 数据集预处理 | |– README_1_STAGE.md | |– README_2_STAGE.md | |– convert_cc_sbu.py # 转换标注数据格式 | |– convert_laion.py | |– download_cc_sbu.sh # 下载数据集 | -- download_laion.sh |-- demo.py # 模型测试/推理 |-- environment.yml |-- eval_configs # 模型评估配置文件 |– minigpt4_eval.yaml |– minigpt4 | |– init.py | |– common | | |– init.py | | |– config.py | | |– dist_utils.py # 模型权重缓存文件路径 | | |– gradcam.py | | |– logger.py | | |– optims.py | | |– registry.py | | -- utils.py | |-- configs | | |-- datasets # 数据集配置文件 | | | |-- cc_sbu | | | | |-- align.yaml # cc_sbu对齐数据集配置文件 | | | |– defaults.yaml # cc_sbu数据集配置文件 | | | -- laion | | |– defaults.yaml # laion数据集配置文件 | | |– default.yaml | | -- models # 模型配置文件 | |– minigpt4.yaml | |– conversation | | |– init.py | | -- conversation.py | |-- datasets | | |-- __init__.py | | |-- builders | | | |-- __init__.py | | | |-- base_dataset_builder.py | | |– image_text_pair_builder.py | | |– data_utils.py | | -- datasets | | |-- __init__.py | | |-- base_dataset.py | | |-- caption_datasets.py | | |-- cc_sbu_dataset.py | | |-- dataloader_utils.py | |– laion_dataset.py | |– models | | |– Qformer.py | | |– init.py | | |– base_model.py | | |– blip2.py # 初始化Bert Tokenizer 和 Qformer等 | | |– blip2_outputs.py | | |– eva_vit.py | | |– mini_gpt4.py | | -- modeling_llama.py | |-- processors | | |-- __init__.py | | |-- base_processor.py | | |-- blip_processors.py | |– randaugment.py | |– runners | | |– init.py | | -- runner_base.py |– tasks | |– init.py | |– base_task.py | -- image_text_pretrain.py |-- prompts |– alignment.txt |– train.py # 模型训练 `– train_configs # 模型训练配置文件

|-- minigpt4_stage1_pretrain.yaml # 第一阶段预训练配置 `-- minigpt4_stage2_finetune.yaml # 第二阶段微调配置 

首先,在评估配置文件eval_configs/minigpt4_eval.yaml中的第 11 行设置预训练checkpoint的路径(即刚刚下载的预训练的 MiniGPT-4 检查点)。

model: arch: mini_gpt4 model_type: pretrain_vicuna freeze_vit: True freeze_qformer: True max_txt_len: 160 end_sym: “” low_resource: True prompt_path: “prompts/alignment.txt” prompt_template: ‘Human: {} Assistant: ’ ckpt: ‘/workspace/model/minigpt/prerained_minigpt4_7b.pth’

datasets: cc_sbu_align:

vis_processor: train: name: "blip2_image_eval" image_size: 224 text_processor: train: name: "blip_caption" 

run: task: image_text_pretrain

执行如下命令启动模型推理服务:

python demo.py –cfg-path eval_configs/minigpt4_eval.yaml –gpu-id 0

为了节省 GPU 内存,Vicuna 默认以 8 bit 进行加载,beam search 宽度为 1。此配置对于 Vicuna-13B 需要大约 23G GPU 内存、对于 Vicuna-7B 需要大约 11.5G GPU 内存。 如果你有更强大的 GPU,您可以通过在配置文件 minigpt4_eval.yaml 中将 low_resource 设置为 False 以 16 bit运行模型并使用更大的beam search宽度。

运行过程:

> python demo.py –cfg-path eval_configs/minigpt4_eval.yaml –gpu-id 0 Initializing Chat Loading VIT Loading VIT Done Loading Q-Former Loading Q-Former Done Loading LLAMA

===================================BUG REPORT===================================

Welcome to bitsandbytes. For bug reports, please submit your error trace to: https://github.com/TimDettmers/bitsandbytes/issues

Loading checkpoint shards: 100%|████████████████████████████████████████████████████████████| 22 [01:02<00:00, 31.47s/it] Loading LLAMA Done Load 4 training prompts Prompt Example Human: Take a look at this image and describe what you notice. Assistant: Load BLIP2-LLM Checkpoint: /workspace/model/minigpt/prerained_minigpt4_7b.pth Initialization Finished Running on local URL: http://127.0.0.1:7860 Running on public URL: https://71e239f43b078ebe0b.gradio.live

This share link expires in 72 hours. For free permanent hosting and GPU upgrades (NEW!), check out Spaces: https://huggingface.co/spaces

模型推理测试:

image.png
image.png

MiniGPT-4 的训练包含两个对齐阶段。

在预训练阶段,模型使用来自 Laion 和 CC 数据集的图像文本对进行训练,以对齐视觉和语言模型。

第一阶段之后,视觉特征被映射,可以被语言模型理解。 MiniGPT-4 官方在实验时使用了 4 个 A100。 除此之外,您还可以在配置文件 train_configs/minigpt4_stage1_pretrain.yaml 中更改保存路径,具体内容如下:

model: arch: mini_gpt4 model_type: pretrain_vicuna freeze_vit: True freeze_qformer: True

datasets: laion:

vis_processor: train: name: "blip2_image_train" image_size: 224 text_processor: train: name: "blip_caption" sample_ratio: 115 

cc_sbu:

vis_processor: train: name: "blip2_image_train" image_size: 224 text_processor: train: name: "blip_caption" sample_ratio: 14 

run: task: image_text_pretrain # optimizer lr_sched: “linear_warmup_cosine_lr” init_lr: 1e-4 min_lr: 8e-5 warmup_lr: 1e-6

weight_decay: 0.05 max_epoch: 3 batch_size_train: 16 batch_size_eval: 2 num_workers: 4 warmup_steps: 500 iters_per_epoch: 500

seed: 42 output_dir: “/workspace/output/minigpt4_stage1_pretrain”

amp: True resume_ckpt_path: null

evaluate: False train_splits: [“train”]

device: “cuda” world_size: 1 dist_url: “env://” distributed: True

接下来,通过以下命令启动第一阶段训练。

CUDA_VISIBLE_DEVICES=0,1,2,3 torchrun –nproc_per_node 4 train.py –cfg-path train_configs/minigpt4_stage1_pretrain.yaml

运行过程:

> CUDA_VISIBLE_DEVICES=0,1,2,3 torchrun –nproc_per_node 4 train.py –cfg-path train_configs/minigpt4_stage1_pretrain.yaml WARNING:torch.distributed.run:


Setting OMP_NUM_THREADS environment variable for each process to be 1 in default, to avoid your system being overloaded, please further tune the variable for optimal performance in your application as needed.


| distributed init (rank 1, world 4): env:// | distributed init (rank 0, world 4): env:// | distributed init (rank 2, world 4): env:// | distributed init (rank 3, world 4): env:// 2023-05-07 11:36:36,497 [INFO] ===== Running Parameters ===== 2023-05-07 11:36:36,498 [INFO] {

"amp": true, "batch_size_eval": 2, "batch_size_train": 16, "device": "cuda", "dist_backend": "nccl", "dist_url": "env://", "distributed": true, "evaluate": false, "gpu": 0, "init_lr": 0.0001, "iters_per_epoch": 500, "lr_sched": "linear_warmup_cosine_lr", "max_epoch": 3, "min_lr": 8e-05, "num_workers": 4, "output_dir": "/workspace/output/minigpt4_stage1_pretrain", "rank": 0, "resume_ckpt_path": null, "seed": 42, "task": "image_text_pretrain", "train_splits": [ "train" ], "warmup_lr": 1e-06, "warmup_steps": 500, "weight_decay": 0.05, "world_size": 4 

} 2023-05-07 11:36:36,498 [INFO] ====== Dataset Attributes ====== 2023-05-07 11:36:36,498 [INFO] ======== laion ======= 2023-05-07 11:36:36,499 [INFO] {

"build_info": { "storage": "/workspace/data/blip/laion/laion_dataset/00000.tar" }, "data_type": "images", "sample_ratio": 115, "text_processor": { "train": { "name": "blip_caption" } }, "vis_processor": { "train": { "image_size": 224, "name": "blip2_image_train" } } 

} 2023-05-07 11:36:36,499 [INFO] ======== cc_sbu ======= 2023-05-07 11:36:36,499 [INFO] {

"build_info": { "storage": "/workspace/data/blip/cc_sbu/cc_sbu_dataset/00000.tar" }, "data_type": "images", "sample_ratio": 14, "text_processor": { "train": { "name": "blip_caption" } }, "vis_processor": { "train": { "image_size": 224, "name": "blip2_image_train" } } 

} 2023-05-07 11:36:36,499 [INFO] ====== Model Attributes ====== 2023-05-07 11:36:36,500 [INFO] {

"arch": "mini_gpt4", "drop_path_rate": 0, "freeze_qformer": true, "freeze_vit": true, "image_size": 224, "llama_model": "/workspace/model/vicuna-7b-all-v1.1", "model_type": "pretrain_vicuna", "num_query_token": 32, "prompt": "", "use_grad_checkpoint": false, "vit_precision": "fp16" 

} 2023-05-07 11:36:36,501 [INFO] Building datasets… 2023-05-07 11:36:36,503 [INFO] Building datasets… Loading VIT 2023-05-07 11:36:58,812 [INFO] Downloading: “https://storage.googleapis.com/sfr-vision-language-research/LAVIS/models/BLIP2/eva_vit_g.pth"; to /root/.cache/torch/hub/checkpoints/eva_vit_g.pth

100%|████████████████████████████████████████████████████████████████████████████████████████████████████| 1.89G/1.89G [02:33<00:00, 13.2MB/s] cache_file_path: /root/.cache/torch/hub/checkpoints/eva_vit_g.pth 2023-05-07 11:39:41,878 [INFO] freeze vision encoder Loading VIT Done Loading Q-Former 2023-05-07 11:39:45,781 [INFO] Downloading: ”https://storage.googleapis.com/sfr-vision-language-research/LAVIS/models/BLIP2/blip2_pretrained_flant5xxl.pth"; to /root/.cache/torch/hub/checkpoints/blip2_pretrained_flant5xxl.pth

100%|██████████████████████████████████████████████████████████████████████████████████████████████████████| 413M/413M [00:31<00:00, 13.8MB/s] cache_file_path: /root/.cache/torch/hub/checkpoints/blip2_pretrained_flant5xxl.pth 2023-05-07 11:40:18,140 [INFO] load checkpoint from https://storage.googleapis.com/sfr-vision-language-research/LAVIS/models/BLIP2/blip2_pretrained_flant5xxl.pth 2023-05-07 11:40:18,155 [INFO] freeze Qformer Loading Q-Former Done Loading LLAMA Loading checkpoint shards: 100%|████████████████████████████████████████████████████████████████████████████████| 22 [00:15<00:00, 7.79s/it] Loading checkpoint shards: 100%|████████████████████████████████████████████████████████████████████████████████| 22 [00:15<00:00, 7.94s/it] Loading checkpoint shards: 100%|████████████████████████████████████████████████████████████████████████████████| 22 [00:16<00:00, 8.21s/it] Loading checkpoint shards: 100%|████████████████████████████████████████████████████████████████████████████████| 22 [00:16<00:00, 8.13s/it] Loading LLAMA Done 2023-05-07 11:43:21,365 [INFO] Start training 2023-05-07 11:43:28,791 [INFO] dataset_ratios not specified, datasets will be concatenated (map-style datasets) or chained (webdataset.DataPipeline). 2023-05-07 11:43:28,791 [INFO] Loaded 0 records for train split from the dataset. module.llama_proj.weight module.llama_proj.bias 2023-05-07 11:43:30,005 [INFO] number of trainable parameters: 2023-05-07 11:43:30,008 [INFO] Start training epoch 0, 500 iters per inner epoch. Train: data epoch: [0] [ 0/500] eta: 0:35:50 lr: 0.000001 loss: 7.4586 time: 4.3018 data: 0.0000 max mem: 20913 2023-05-07 11:43:34,313 [INFO] Reducer buckets have been rebuilt in this iteration. Train: data epoch: [0] [ 50500] eta: 0:03:04 lr: 0.000011 loss: 4.9250 time: 0.3323 data: 0.0000 max mem: 22076 Train: data epoch: [0] [100500] eta: 0:02:29 lr: 0.000021 loss: 3.6569 time: 0.3376 data: 0.0000 max mem: 22076 Train: data epoch: [0] [150500] eta: 0:02:06 lr: 0.000031 loss: 2.8653 time: 0.3415 data: 0.0000 max mem: 22193 Train: data epoch: [0] [200500] eta: 0:01:47 lr: 0.000041 loss: 2.5771 time: 0.3417 data: 0.0000 max mem: 22193 Train: data epoch: [0] [250500] eta: 0:01:28 lr: 0.000051 loss: 3.0763 time: 0.3375 data: 0.0000 max mem: 22193 Train: data epoch: [0] [300500] eta: 0:01:10 lr: 0.000060 loss: 2.3269 time: 0.3369 data: 0.0000 max mem: 22193 Train: data epoch: [0] [350500] eta: 0:00:52 lr: 0.000070 loss: 2.5431 time: 0.3403 data: 0.0000 max mem: 22193 Train: data epoch: [0] [400500] eta: 0:00:34 lr: 0.000080 loss: 2.6711 time: 0.3383 data: 0.0000 max mem: 22193 Train: data epoch: [0] [450500] eta: 0:00:17 lr: 0.000090 loss: 2.3690 time: 0.3426 data: 0.0000 max mem: 22193 Train: data epoch: [0] [499500] eta: 0:00:00 lr: 0.000100 loss: 1.5752 time: 0.3424 data: 0.0000 max mem: 22193 Train: data epoch: [0] Total time: 0:02:53 (0.3466 s / it) 2023-05-07 11:46:23,294 [INFO] Averaged stats: lr: 0.0001 loss: 3.2105 2023-05-07 11:46:23,297 [INFO] No validation splits found. 2023-05-07 11:46:23,334 [INFO] Saving checkpoint at epoch 0 to /workspace/output/minigpt4_stage1_pretrain//checkpoint_0.pth. 2023-05-07 11:46:23,402 [INFO] Start training 2023-05-07 11:46:23,443 [INFO] Start training epoch 1, 500 iters per inner epoch. Train: data epoch: [1] [ 0/500] eta: 0:03:00 lr: 0.000095 loss: 1.9775 time: 0.3606 data: 0.0000 max mem: 22193 Train: data epoch: [1] [ 50500] eta: 0:02:34 lr: 0.000094 loss: 1.3029 time: 0.3486 data: 0.0000 max mem: 22193 Train: data epoch: [1] [100500] eta: 0:02:16 lr: 0.000093 loss: 1.1404 time: 0.3374 data: 0.0000 max mem: 22193 Train: data epoch: [1] [150500] eta: 0:01:59 lr: 0.000092 loss: 0.8192 time: 0.3376 data: 0.0000 max mem: 22193 Train: data epoch: [1] [200500] eta: 0:01:42 lr: 0.000091 loss: 0.4934 time: 0.3415 data: 0.0000 max mem: 22193 Train: data epoch: [1] [250500] eta: 0:01:25 lr: 0.000090 loss: 0.4390 time: 0.3402 data: 0.0000 max mem: 22193 Train: data epoch: [1] [300500] eta: 0:01:08 lr: 0.000089 loss: 0.2317 time: 0.3421 data: 0.0000 max mem: 22193 Train: data epoch: [1] [350500] eta: 0:00:51 lr: 0.000088 loss: 0.1960 time: 0.3413 data: 0.0000 max mem: 22193 Train: data epoch: [1] [400500] eta: 0:00:34 lr: 0.000087 loss: 2.0755 time: 0.3420 data: 0.0000 max mem: 22193 Train: data epoch: [1] [450500] eta: 0:00:17 lr: 0.000086 loss: 0.0773 time: 0.3405 data: 0.0000 max mem: 22193 Train: data epoch: [1] [499500] eta: 0:00:00 lr: 0.000085 loss: 0.1692 time: 0.3387 data: 0.0000 max mem: 22193 Train: data epoch: [1] Total time: 0:02:50 (0.3404 s / it) 2023-05-07 11:49:13,623 [INFO] Averaged stats: lr: 0.0001 loss: 0.7745 2023-05-07 11:49:13,625 [INFO] No validation splits found. 2023-05-07 11:49:13,660 [INFO] Saving checkpoint at epoch 1 to /workspace/output/minigpt4_stage1_pretrain//checkpoint_1.pth. 2023-05-07 11:49:13,722 [INFO] Start training 2023-05-07 11:49:13,763 [INFO] Start training epoch 2, 500 iters per inner epoch. Train: data epoch: [2] [ 0/500] eta: 0:03:00 lr: 0.000085 loss: 0.2226 time: 0.3614 data: 0.0000 max mem: 22193 Train: data epoch: [2] [ 50500] eta: 0:02:34 lr: 0.000084 loss: 0.1156 time: 0.3454 data: 0.0000 max mem: 22193 Train: data epoch: [2] [100500] eta: 0:02:16 lr: 0.000083 loss: 0.0512 time: 0.3396 data: 0.0000 max mem: 22193 Train: data epoch: [2] [150500] eta: 0:01:59 lr: 0.000083 loss: 0.1134 time: 0.3421 data: 0.0000 max mem: 22193 Train: data epoch: [2] [200500] eta: 0:01:42 lr: 0.000082 loss: 0.0489 time: 0.3412 data: 0.0000 max mem: 22193 Train: data epoch: [2] [250500] eta: 0:01:25 lr: 0.000081 loss: 0.0693 time: 0.3409 data: 0.0000 max mem: 22193 Train: data epoch: [2] [300500] eta: 0:01:08 lr: 0.000081 loss: 0.0316 time: 0.3433 data: 0.0000 max mem: 22193 Train: data epoch: [2] [350500] eta: 0:00:51 lr: 0.000080 loss: 0.0372 time: 0.3464 data: 0.0000 max mem: 22193 Train: data epoch: [2] [400500] eta: 0:00:34 lr: 0.000080 loss: 0.0404 time: 0.3386 data: 0.0000 max mem: 22193 Train: data epoch: [2] [450500] eta: 0:00:17 lr: 0.000080 loss: 0.0523 time: 0.3396 data: 0.0000 max mem: 22193 Train: data epoch: [2] [499500] eta: 0:00:00 lr: 0.000080 loss: 0.0471 time: 0.3378 data: 0.0000 max mem: 22193 Train: data epoch: [2] Total time: 0:02:50 (0.3402 s / it) 2023-05-07 11:52:03,847 [INFO] Averaged stats: lr: 0.0001 loss: 0.2326 2023-05-07 11:52:03,849 [INFO] No validation splits found. 2023-05-07 11:52:03,885 [INFO] Saving checkpoint at epoch 2 to /workspace/output/minigpt4_stage1_pretrain//checkpoint_2.pth. 2023-05-07 11:52:03,946 [INFO] No validation splits found. 2023-05-07 11:52:03,946 [INFO] Training time 0:08:42

显存占用

Sun May 7 19:48:54 2023
+—————————————————————————–+ | NVIDIA-SMI 525.105.17 Driver Version: 525.105.17 CUDA Version: 12.0 | |——————————-+———————-+———————-+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 NVIDIA A800 80G… Off | 00000000:3B:00.0 Off | 0 | | N/A 68C P0 297W / 300W | 32439MiB / 81920MiB | 97% Default | | | | Disabled | +——————————-+———————-+———————-+ | 1 NVIDIA A800 80G… Off | 00000000:5E:00.0 Off | 0 | | N/A 65C P0 322W / 300W | 32439MiB / 81920MiB | 97% Default | | | | Disabled | +——————————-+———————-+———————-+ | 2 NVIDIA A800 80G… Off | 00000000:AF:00.0 Off | 0 | | N/A 69C P0 218W / 300W | 32439MiB / 81920MiB | 97% Default | | | | Disabled | +——————————-+———————-+———————-+ | 3 NVIDIA A800 80G… Off | 00000000:D8:00.0 Off | 0 | | N/A 69C P0 335W / 300W | 32439MiB / 81920MiB | 97% Default | | | | Disabled | +——————————-+———————-+———————-+



+—————————————————————————–+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | 0 N/A N/A 11425 C /opt/conda/bin/python 32436MiB | | 1 N/A N/A 11426 C /opt/conda/bin/python 32436MiB | | 2 N/A N/A 11427 C /opt/conda/bin/python 32436MiB | | 3 N/A N/A 11428 C /opt/conda/bin/python 32436MiB | +—————————————————————————–+

模型权重输出:

> tree minigpt4_stage1_pretrain/ minigpt4_stage1_pretrain/ `– 

|-- checkpoint_0.pth |-- checkpoint_1.pth |-- checkpoint_2.pth |-- log.txt `-- result 

2 directories, 4 files

你也可以直接下载只有第一阶段训练的 MiniGPT-4 的 checkpoint,具体下载地址:13B7B

与第二阶段之后的模型相比,第一阶段的checkpoint经常生成不完整和重复的句子。

在第二阶段,我们使用自己创建的小型高质量图文对数据集并将其转换为对话格式以进一步对齐 MiniGPT-4。

要启动第二阶段对齐,需先在train_configs/minigpt4_stage2_finetune.yaml 中指定第一阶段训练的checkpoint文件的路径。 当然,您还可以自定义输出权重路径,具体文件如下所示。

model: arch: mini_gpt4 model_type: pretrain_vicuna freeze_vit: True freeze_qformer: True max_txt_len: 160 end_sym: “” prompt_path: “prompts/alignment.txt” prompt_template: ‘Human: {} Assistant: ’ ckpt: ‘/workspace/output/minigpt4_stage1_pretrain//checkpoint_2.pth’

datasets: cc_sbu_align:

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: 5 iters_per_epoch: 200 batch_size_train: 12 batch_size_eval: 12 num_workers: 4 warmup_steps: 200

seed: 42 output_dir: “/workspace/output/minigpt4_stage2_finetune”

amp: True resume_ckpt_path: null

evaluate: False train_splits: [“train”]

device: “cuda” world_size: 1 dist_url: “env://” distributed: True

然后,第二阶段微调的运行命令如下所示。 MiniGPT-4官方在实验中,仅使用了 1 卡 A100。

CUDA_VISIBLE_DEVICES=0 torchrun –nproc_per_node 1 train.py –cfg-path train_configs/minigpt4_stage2_finetune.yaml

运行过程:

> CUDA_VISIBLE_DEVICES=0 torchrun –nproc_per_node 1 train.py –cfg-path train_configs/minigpt4_stage2_finetune.yaml | distributed init (rank 0, world 1): env:// 2023-05-07 12:03:11,908 [INFO] ===== Running Parameters ===== 2023-05-07 12:03:11,909 [INFO] {

"amp": true, "batch_size_eval": 12, "batch_size_train": 12, "device": "cuda", "dist_backend": "nccl", "dist_url": "env://", "distributed": true, "evaluate": false, "gpu": 0, "init_lr": 3e-05, "iters_per_epoch": 200, "lr_sched": "linear_warmup_cosine_lr", "max_epoch": 5, "min_lr": 1e-05, "num_workers": 4, "output_dir": "/workspace/output/minigpt4_stage2_finetune", "rank": 0, "resume_ckpt_path": null, "seed": 42, "task": "image_text_pretrain", "train_splits": [ "train" ], "warmup_lr": 1e-06, "warmup_steps": 200, "weight_decay": 0.05, "world_size": 1 

} 2023-05-07 12:03:11,909 [INFO] ====== Dataset Attributes ====== 2023-05-07 12:03:11,909 [INFO] ======== cc_sbu_align ======= 2023-05-07 12:03:11,910 [INFO] {

"build_info": { "storage": "/workspace/data/cc_sbu_align/" }, "data_type": "images", "text_processor": { "train": { "name": "blip_caption" } }, "vis_processor": { "train": { "image_size": 224, "name": "blip2_image_train" } } 

} 2023-05-07 12:03:11,910 [INFO] ====== Model Attributes ====== 2023-05-07 12:03:11,910 [INFO] {

"arch": "mini_gpt4", "ckpt": "/workspace/output/minigpt4_stage1_pretrain//checkpoint_2.pth", "drop_path_rate": 0, "end_sym": "", "freeze_qformer": true, "freeze_vit": true, "image_size": 224, "llama_model": "/workspace/model/vicuna-7b-all-v1.1", "max_txt_len": 160, "model_type": "pretrain_vicuna", "num_query_token": 32, "prompt": "", "prompt_path": "prompts/alignment.txt", "prompt_template": "Human: {} Assistant: ", "use_grad_checkpoint": false, "vit_precision": "fp16" 

} 2023-05-07 12:03:11,910 [INFO] Building datasets… Loading VIT cache_file_path: /root/.cache/torch/hub/checkpoints/eva_vit_g.pth 2023-05-07 12:03:37,018 [INFO] freeze vision encoder Loading VIT Done Loading Q-Former cache_file_path: /root/.cache/torch/hub/checkpoints/blip2_pretrained_flant5xxl.pth 2023-05-07 12:03:40,903 [INFO] load checkpoint from https://storage.googleapis.com/sfr-vision-language-research/LAVIS/models/BLIP2/blip2_pretrained_flant5xxl.pth 2023-05-07 12:03:40,916 [INFO] freeze Qformer Loading Q-Former Done Loading LLAMA Loading checkpoint shards: 100%|████████████████████████████████████████████████████████████████████████████████| 22 [00:10<00:00, 5.13s/it] Loading LLAMA Done Load 4 training prompts Prompt Example Human: Describe this image in detail. Assistant: Load BLIP2-LLM Checkpoint: /workspace/output/minigpt4_stage1_pretrain/20230507113/checkpoint_2.pth 2023-05-07 12:06:34,005 [INFO] Start training 2023-05-07 12:06:40,005 [INFO] dataset_ratios not specified, datasets will be concatenated (map-style datasets) or chained (webdataset.DataPipeline). 2023-05-07 12:06:40,005 [INFO] Loaded 3439 records for train split from the dataset. module.llama_proj.weight module.llama_proj.bias 2023-05-07 12:06:40,029 [INFO] number of trainable parameters: 3149824 2023-05-07 12:06:40,030 [INFO] Start training epoch 0, 200 iters per inner epoch. Train: data epoch: [0] [ 0/200] eta: 0:15:02 lr: 0.000001 loss: 1.6358 time: 4.5127 data: 0.0000 max mem: 35512 2023-05-07 12:06:44,545 [INFO] Reducer buckets have been rebuilt in this iteration. Train: data epoch: [0] [ 50200] eta: 0:01:47 lr: 0.000008 loss: 1.3364 time: 0.6420 data: 0.0000 max mem: 36093 Train: data epoch: [0] [ 100200] eta: 0:01:07 lr: 0.000015 loss: 1.2098 time: 0.6466 data: 0.0000 max mem: 36093 Train: data epoch: [0] [ 150200] eta: 0:00:33 lr: 0.000023 loss: 1.0652 time: 0.6472 data: 0.0000 max mem: 36093 Train: data epoch: [0] [ 199200] eta: 0:00:00 lr: 0.000030 loss: 1.0278 time: 0.6460 data: 0.0000 max mem: 36093 Train: data epoch: [0] Total time: 0:02:12 (0.6627 s / it) 2023-05-07 12:08:52,563 [INFO] Averaged stats: lr: 0.0000 loss: 1.2121 2023-05-07 12:08:52,565 [INFO] No validation splits found. 2023-05-07 12:08:52,601 [INFO] Saving checkpoint at epoch 0 to /workspace/output/minigpt4_stage2_finetune/20230507120/checkpoint_0.pth. 2023-05-07 12:08:52,668 [INFO] Start training 2023-05-07 12:08:52,708 [INFO] Start training epoch 1, 200 iters per inner epoch. Train: data epoch: [1] [ 0/200] eta: 0:02:14 lr: 0.000028 loss: 0.9808 time: 0.6744 data: 0.0000 max mem: 36093 Train: data epoch: [1] [ 50200] eta: 0:01:35 lr: 0.000027 loss: 0.9252 time: 0.6336 data: 0.0000 max mem: 36093 Train: data epoch: [1] [ 100200] eta: 0:01:07 lr: 0.000026 loss: 1.0419 time: 0.7971 data: 0.0000 max mem: 36093 Train: data epoch: [1] [ 150200] eta: 0:00:33 lr: 0.000025 loss: 1.0150 time: 0.6486 data: 0.0000 max mem: 36093 Train: data epoch: [1] [ 199200] eta: 0:00:00 lr: 0.000023 loss: 0.9695 time: 0.6472 data: 0.0000 max mem: 36093 Train: data epoch: [1] Total time: 0:02:11 (0.6576 s / it) 2023-05-07 12:11:04,223 [INFO] Averaged stats: lr: 0.0000 loss: 0.9785 2023-05-07 12:11:04,227 [INFO] No validation splits found. 2023-05-07 12:11:04,264 [INFO] Saving checkpoint at epoch 1 to /workspace/output/minigpt4_stage2_finetune/20230507120/checkpoint_1.pth. 2023-05-07 12:11:04,332 [INFO] Start training 2023-05-07 12:11:04,370 [INFO] Start training epoch 2, 200 iters per inner epoch. Train: data epoch: [2] [ 0/200] eta: 0:02:13 lr: 0.000023 loss: 1.1459 time: 0.6684 data: 0.0000 max mem: 36093 Train: data epoch: [2] [ 50200] eta: 0:01:38 lr: 0.000022 loss: 1.0003 time: 0.6580 data: 0.0000 max mem: 36093 Train: data epoch: [2] [ 100200] eta: 0:01:04 lr: 0.000020 loss: 0.8605 time: 0.6367 data: 0.0000 max mem: 36093 Train: data epoch: [2] [ 150200] eta: 0:00:32 lr: 0.000018 loss: 0.8841 time: 0.6445 data: 0.0000 max mem: 36093 Train: data epoch: [2] [ 199200] eta: 0:00:00 lr: 0.000017 loss: 0.8462 time: 0.6380 data: 0.0000 max mem: 36093 Train: data epoch: [2] Total time: 0:02:11 (0.6588 s / it) 2023-05-07 12:13:16,139 [INFO] Averaged stats: lr: 0.0000 loss: 0.9272 2023-05-07 12:13:16,143 [INFO] No validation splits found. 2023-05-07 12:13:16,178 [INFO] Saving checkpoint at epoch 2 to /workspace/output/minigpt4_stage2_finetune/20230507120/checkpoint_2.pth. 2023-05-07 12:13:16,247 [INFO] Start training 2023-05-07 12:13:16,286 [INFO] Start training epoch 3, 200 iters per inner epoch. Train: data epoch: [3] [ 0/200] eta: 0:02:14 lr: 0.000017 loss: 0.8447 time: 0.6750 data: 0.0000 max mem: 36093 Train: data epoch: [3] [ 50200] eta: 0:01:37 lr: 0.000015 loss: 0.9082 time: 0.6517 data: 0.0000 max mem: 36093 Train: data epoch: [3] [ 100200] eta: 0:01:04 lr: 0.000014 loss: 0.9476 time: 0.6380 data: 0.0000 max mem: 36093 Train: data epoch: [3] [ 150200] eta: 0:00:32 lr: 0.000013 loss: 0.8131 time: 0.6443 data: 0.0000 max mem: 36093 Train: data epoch: [3] [ 199200] eta: 0:00:00 lr: 0.000012 loss: 0.8718 time: 0.6550 data: 0.0000 max mem: 36093 Train: data epoch: [3] Total time: 0:02:09 (0.6460 s / it) 2023-05-07 12:15:25,492 [INFO] Averaged stats: lr: 0.0000 loss: 0.9053 2023-05-07 12:15:25,495 [INFO] No validation splits found. 2023-05-07 12:15:25,530 [INFO] Saving checkpoint at epoch 3 to /workspace/output/minigpt4_stage2_finetune/20230507120/checkpoint_3.pth. 2023-05-07 12:15:25,592 [INFO] Start training 2023-05-07 12:15:25,631 [INFO] Start training epoch 4, 200 iters per inner epoch. Train: data epoch: [4] [ 0/200] eta: 0:01:56 lr: 0.000012 loss: 0.8907 time: 0.5827 data: 0.0000 max mem: 36093 Train: data epoch: [4] [ 50200] eta: 0:01:37 lr: 0.000011 loss: 1.0402 time: 0.6489 data: 0.0000 max mem: 36093 Train: data epoch: [4] [ 100200] eta: 0:01:07 lr: 0.000010 loss: 0.9383 time: 0.6434 data: 0.0000 max mem: 36093 Train: data epoch: [4] [ 150200] eta: 0:00:33 lr: 0.000010 loss: 1.0148 time: 0.6435 data: 0.0000 max mem: 36093 Train: data epoch: [4] [ 199200] eta: 0:00:00 lr: 0.000010 loss: 0.7553 time: 0.6397 data: 0.0000 max mem: 36093 Train: data epoch: [4] Total time: 0:02:11 (0.6594 s / it) 2023-05-07 12:17:37,503 [INFO] Averaged stats: lr: 0.0000 loss: 0.8906 2023-05-07 12:17:37,507 [INFO] No validation splits found. 2023-05-07 12:17:37,543 [INFO] Saving checkpoint at epoch 4 to /workspace/output/minigpt4_stage2_finetune/20230507120/checkpoint_4.pth. 2023-05-07 12:17:37,612 [INFO] No validation splits found. 2023-05-07 12:17:37,612 [INFO] Training time 0:11:03

显存占用:

+—————————————————————————–+ | NVIDIA-SMI 525.105.17 Driver Version: 525.105.17 CUDA Version: 12.0 | |——————————-+———————-+———————-+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 NVIDIA A800 80G… Off | 00000000:3B:00.0 Off | 0 | | N/A 69C P0 311W / 300W | 40041MiB / 81920MiB | 94% Default | | | | Disabled | +——————————-+———————-+———————-+

+—————————————————————————–+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | 0 N/A N/A 62283 C /opt/conda/bin/python 40038MiB | +—————————————————————————–+

模型权重输出:

> tree minigpt4_stage2_finetune/ minigpt4_stage2_finetune/ `– 

|-- checkpoint_0.pth |-- checkpoint_1.pth |-- checkpoint_2.pth |-- checkpoint_3.pth |-- checkpoint_4.pth |-- log.txt `-- result 

2 directories, 6 files

经过第二阶段对齐之后,MiniGPT-4 能够连贯地和用户友好地讨论图像。

至此,整个模型训练过程结束。接下来进行对训练的模型进行评估。

首先,在评估配置文件eval_configs/minigpt4_eval.yaml中的第 11 行设置待评估模型的checkpoint路径,同模型推理。

model: arch: mini_gpt4 … low_resource: True prompt_path: “prompts/alignment.txt” prompt_template: ‘Human: {} Assistant: ’ ckpt: ‘/workspace/output/minigpt4_stage2_finetune//checkpoint_4.pth’ …

执行如下命令启动模型推理服务进行评估:

python demo.py –cfg-path eval_configs/minigpt4_eval.yaml –gpu-id 0

如果出现Could not create share link. Please check your internet connection or our status page: status.gradio.app这个问题,通常是由于网络环境不稳定造成的。可修改demo.py文件如下的代码,使用IP:端口访问即可。

#demo.launch(share=True, enable_queue=True) demo.launch(server_name=‘0.0.0.0’, share=True, enable_queue=True)

运行过程:

python demo.py –cfg-path eval_configs/minigpt4_eval.yaml –gpu-id 0 Initializing Chat Loading VIT cache_file_path: /root/.cache/torch/hub/checkpoints/eva_vit_g.pth Loading VIT Done Loading Q-Former cache_file_path: /root/.cache/torch/hub/checkpoints/blip2_pretrained_flant5xxl.pth Loading Q-Former Done Loading LLAMA

===================================BUG REPORT===================================

Welcome to bitsandbytes. For bug reports, please submit your error trace to: https://github.com/TimDettmers/bitsandbytes/issues

Loading checkpoint shards: 100%|████████████████████████████████████████████████████████████████████████████████| 22 [00:35<00:00, 17.65s/it] Loading LLAMA Done Load 4 training prompts Prompt Example Human: Take a look at this image and describe what you notice. Assistant: Load BLIP2-LLM Checkpoint: /workspace/output/minigpt4_stage2_finetune/20230507120/checkpoint_4.pth Initialization Finished Running on local URL: http://0.0.0.0:7860

模型评估测试:

image.png

本文给大家分享了多模态大模型MiniGPT-4的基本原理及模型训练推理方法,希望能够给大家带来帮助。

参考文档

  • MiniGPT-4
  • MiniGPT-4: Enhancing Vision-language Understanding with Advanced Large Language Models
  • First Stage Data Preparation:Download the filtered Conceptual Captions, SBU, LAION datasets
  • Second Stage Data Preparation

MiniGPT-4使用先进的大型语言模型增强视觉语言理解,将语言能力与图像能力结合。

其利用视觉编码器BLIP-2和大语言模型Vicuna进行结合训练,共同提供了新兴视觉语言能力。

MiniGPT-4github:

github.com/Vision-CAIR/

工作原理翻译:

  • MiniGPT-4使用一个投影层来将来自BLIP-2的冻结视觉编码器与冻结的LLMVicuna对齐。
  • 我们通过两个阶段来训练MiniGPT-4。第一个传统的预训练阶段在使用4个A100大约10小时内,使用大约500万个图像-文本对进行训练。第一阶段过后,Vicuna能够理解图像。但是其生成能力受到了严重的影响。
  • 为了解决这个问题和提高可用性,我们提出了一种通过模型和ChatGPT自身创建高质量图像-文本对的新方法。基于此,我们创建了一个小型(总共3500对)但是高质量的数据集。
  • 第二个微调阶段在对话模板上使用该数据集进行训练,以显著提高其生成可靠性和整体可用性。令人惊讶的是,这个阶段具有计算效率,并且只需要使用单个A100大约7分钟的时间。
  • MiniGPT-4能够产生许多类似于GPT-4中展示的新兴视觉语言能力

MiniGPT-4是国人开发的会中文的,只不过说法有点冷酷,不像ChatGPT那样符合人性化。

这个demo比较笨,需要先上传图片,才能进行对话,不易用,估计需要利用api来进行二次开发。

无法提取图片中的文字

没法识别文字应该

大体的图片内容是能理解,但是语言组织方面较欠缺

安装步骤

MiniGPT4根据不同的模型选择需要不同的配置

目前解到:

Vicuna7B:

-VRAM>12GB

-RAM>16GB

-Disk>2500GB

Vicuna13B:

-VRAM>24GB

-RAM>16GB

-Disk>2500GB

在部署时转换权重时,预计需要80G的内存

在训练数据时,会下载2.3T的图片数据作为训练。

本次部署采用13B的语言模型进行部署

注:以下文件都放在/data下面,部分文件特别大,注意不要放到系统盘上

wget-cmirrors.tuna.tsinghua.edu.cn

#之后一直回车看license到最后让你同意license,

输入yes#输入安装位置/data/conda#添加官方镜像地址

condaconfig–addchannelsbiocondacondaconfig–addchannelsconda-forge

gitclone github.com/Vision-CAIR/

#若后续操作中退出了bash界面

需要下次登录时再次执行来设置环境condaactivateminigpt4

这步是最费劲的,权重非常大,下载很慢,而且第一次我还下错了,原始权重下了我两个晚上,头都大了。

第一次我去github.com/facebookrese上查看到了一个原始权重,结果下载了一天,下来的文件不正确md5都对不上,跑权重转换的时候报文件错误,所以不要用这个下载(提示给自己找权重的朋友)

第二次重新采用了迅雷种子的下载,这次下载下来md5和checklist里是对的。

种子地址:

github.com/RiseInRose/M

从迅雷里面下载13B的模型即可,文件夹结构如下,注意下面的文件都需要下载,最终文件夹大小25G

下载前需先安装git-lfs,去官网下载就行git-lfs.com

下载安装完后执行

gitclonegithub.com/lm-sys/FastC
cdFastChat
gitcheckoutv0.2.3
#安装
pipinstalle.
pipinstalltransformers[sentencepiece]













下载下来的原始权重需要转换一下(注意:gitclone下来的增量权重不需要转换,只要转换原始的就行)

运行

pipinstall-Utokenizers

再重新执行上述脚本

完成之后直接python运行下面代码加载模型与分词器

此处预计要80G左右的内存

最终转换出来的权重文件夹

转换之后,修改配置文件

drive.google.com/file/d

下载之后是一个pretrained_minigpt4.pth文件

放入/data/checkpoint文件夹

在/data/MiniGPT-4/eval_configs/minigpt4_eval.yaml文件中,修改ckpt指定到/data/checkpoint/pretrained_minigpt4.pth中

到这里,基础的准备工作做完了。

cd/data/MiniGPT-4pythondemo.py–cfg-patheval_configs/minigpt4_eval.yaml–gpu-id0

运行之后一般会失败

会出现如下错误

问题1:

Import Error:libX11.so.6:cannotopensharedobjectfile:Nosuchfileordirectory

解决办法:

yum installlibX11

问题2:

ImportError:libXext.so.6:cannotopensharedobjectfile:Nosuchfileordirectory

解决办法:

yum installlibXext

问题3:

RuntimeError:TheNVIDIAdriveronyoursystemistooold(foundversion10020).PleaseupdateyourGPUdriverbydownloadingandinstallinganewversionfromtheURL:nvidia.com/Download/ind.

NVIDIA版本太老了,需要更新NVIDIA版本

nvidia-smi查看当前版本,如果没找到则没有nvidia驱动

目前测试在NVIDIA-SMI515.105.01、CUDAVersion:11.7之上可以运行

nvidia.cn/Download/inde上下载对应机型的NVIDIA驱动,根据显卡不同,驱动也不同。

这里我是V100S的驱动

下载后先不着急安装

先安装gcc和dkms

yum-yinstallgccdkms

查看内核版本

卸载过去已经安装的NVIDIA(如果没安装则忽略)

安装NVIDIA驱动

data-pid=“jfamVuv”>cd/data/navida/
chmoda+xNVIDIA-Linux-x86_64-515.105.01.run
./NVIDIA-Linux-x86 64-515.105.01.run
之后按引导点yes就行了(操作就是左右方向键、回车)
如果报xxx/build和xxx/source没找到,则就是内核工具不对,需要重新安装内核




data-pid=“AiJxEBP”>安装完之后,通过nvidia-smi命令查看版本

还是上面的命令

执行之后,又报一个错误

NameError:name‘cuda_setup’isnotdefined

编辑

vim/data/conda/envs/minigpt4/lib/python3.9/site-packages/bitsandbytes/cuda_setup/main.py

在149行左右

添加

cuda_setup=CUDASetup.get_instance()

修改之后,再次执行,demo就启动了,启动之后会给出一个地址,可以通过这个地址来访问

3c70e646a6198e3ec7.gradio.live

minigpt4在搭建完后还需要两阶段训练。

第一阶段训练直接提供了checkpoint,不需要在自己服务上进行训练

第二阶段训练需要自己进行训练

第一阶段预训练checkpoint:

drive.google.com/file/d

下载之后放在/data/checkpoint/目录下面

第二阶段微调:

下载数据

drive.google.com/file/d

放在/data/stage_2下面

进入/data/MiniGPT-4/train_configs目录下,

编辑minigpt4_stage2_finetune.yaml,将model.ckpt指向第一阶段预训练的checkout

同时修改run下面的三个参数(如果用A100的话就保持原样,由于是V100GPU显存不足,需要将训练改小):

之后回到/data/MiniGPT-4目录下执行

torchrun–nproc-per-node1train.py–cfg-pathtrain_configs/minigpt4_stage2_finetune.yaml

训练完后,会生成/data/checkpoint/目录,里面有checkpoint_1.pth-checkpoint_4.pth四个文件

最后将

再重新运行

从今年四月份开始,随着MiniGPT-4, LLaVA, InstructBLIP等多模态大模型项目的开源,大模型的火从NLP领域烧到了计算机视觉及多模态领域。
多模态大模型需要高质量的图文对话数据进行指令微调,而当前多模态指令微调数据多基于纯文本GPT-4构建,其数据质量及多样性相对受限。为此,我们提出了 视觉指令生成及修正模型VIGC,可以基于多模态模型自动生成多样性的指令数据,并基于指令修正模块减少幻觉,保证数据质量。这些指令数据加入模型微调,可以进一步提升模型性能。


图1. VIGC示例:输入图像,模型自动生成相关问题及对应答案

如图所示,用户提供(1)任意图像;(2)所需数据类型,VIGC可以生成该图像对应的问题和答案。相比于当前图文多模态大模型给定图像和问题,获取对应问题的答案,VIGC可以实现自问自答,而这些问答对本身可以作为高质量的指令微调数据,用于多模态大模型的训练,进一步提升模型性能。

要回答这个问题,我们首先看一下当前指令微调数据的获取方案。

图2:纯文本GPT-4用于指令微调数据生成

当前获取图文指令微调数据多基于Language-only GPT-4,结合提供的图像、图像相关标注及人工标注问题,由GPT-4来生成对应的答案。这种方式存在两个缺陷:

● 标注成本高:由于GPT-4无法看到真实图像,需要人工标注对应的图像信息(如图像中的目标类别,定位信息,描述信息)基于跟图像相关的问题。

● 答案质量受限于标注:一张图像中包含的信息量远远大于标注信息,所以GPT-4在回答问题时,直接依赖于受限的标注信息,容易丢失图像中的细节信息。

相比之下,VIGC通过初始的指令微调数据训练模型,引导模型基于图像自动生成合适的问题及回答。这种方式相比于纯文本GPT-4生成指令微调数据的优势在于:

● 包含更多细节内容:VIGC生成的答案是模型真正看到图像内容进行回答,包含了更多的细节信息;

● 无需额外表述:VIGC能够针对没见过的图像内容依然生成高质量的问答数据,得益于VIGC模型能够通过视觉模型提取到图像的视觉信息,并依赖于后续的语言模型自动生成答案。这里的关键点在于:视觉模型和大语言模型本身就看过海量的图文、纯文本数据,本身集成了大量的知识,VIGC更像是从这些大模型中蒸馏出跟图像相关的知识。

图3. VIGC框架图。左侧对应VIGC训练流程,右侧对应VIGC推理流程。

01 训练流程

为了获取给定图像,自动生成图文的内容,需构造初始的指令微调数据,包含图像、问题类型,对应图像相关的问题及正确答案。视觉指令生成VIG训练阶段的

● 输入信息:图像及对应的问题类型(如对话类型、详细描述类型、逻辑推理类型)

● 输出信息:该类型的问题和答案。

然而仅利用上述的方式,模型在输出详细描述类信息时,经常会出现严重的幻觉问题,这一现象在当前主流多模态大模型中普遍存在,本质上是当训练数据存在某些重复的模式时,生成模型很容易过拟合到这种数据分布。例如在训练图像中,问答对中出现人和桌子的描述时,后续经常会出现椅子的描述。推理阶段,模型会倾向于看到人和桌子,就提及椅子(即便推理图像中没有椅子)。

为此,VIGC通过使用迭代Q-Former的方式及时更新输入到模型的特征信息,让模型在回答问题时结合问题本文关注的内容以及当前已有部分回答,完成后续的回答。所以在训练阶段,我们同时加入视觉指令修正模块VIC,该阶段的:

● 输入信息:图像、对应问题类型、问题

● 输出信息:答案

02 推理阶段

为了获取高质量的指令微调数据,推理阶段的流程如下:

a. 给定图像及问题类型,VIG生成对应问题和答案;

b. 将图像及VIG生成问题输入VIC,经Q-Former提取问题相关的图像特征后生成新的答案 ;

c. 将上述答案拆分,将第一句回答和图像、问题再次输入VIC,生成更新后的第二句答案 A2;

d. 整个过程迭代执行,直到模型遇到结束符。

基于VIGC生成的数据,重新加入模型训练后,我们发现模型的性能可以进一步提升。

表1. 加入VIGC数据模型性能提升

如上表所示,在基于MMBench的评测上,加入VIGC生成的额外数据,指标可以从24.4%提升至27.5%。在LLaVA评测集上,指标从84.7%提升到87%

VIGC提出了一种新的多模态指令数据构造方式,可以基于无标注的图像自动生成多样性的高质量数据,且基于生成数据可以进一步提升当前模型的性能,可以作为指令数据获取及模型性能提升的新思路。

VIGC相关资料

论文地址:arxiv.org/pdf/2308.1271

代码:github.com/opendatalab/

Demo:opendatalab.github.io/V

VIGC项目已开源,欢迎star! github.com/opendatalab/

更多精彩内容,请访问 OpenDataLab:https://opendatalab.org.cn/







小讯
上一篇 2026-04-05 12:14
下一篇 2026-04-05 12:12

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/222154.html