🎯 [CVPR2024] ViP-LLaVA:让大型多模态模型理解任意视觉提示
Mu Cai、Haotian Liu、Siva Karthik Mustikovela、Gregory P. Meyer、Yuning Chai、Dennis Park、Yong Jae Lee
ViP-Bench:[下载数据集] [排行榜] [评估服务器]
发布
- [04/26] 🔥 基于最新的Llama-3-8B和Phi-3-mini-3.8B语言模型的LLaVA和ViP-LLaVA现已可用!
- [02/26] 🔥 ViP-LLaVA被CVPR 2024接收!
- [12/13] 🔥 我们的工作现已出现在Huggingface官方的transformers文档中!
- [12/03] 🔥 我们发布了ViP-LLaVA:让大型多模态模型理解任意视觉提示。我们提出在视觉指令微调过程中直接将视觉提示叠加在原始图像上,使大型多模态模型能够以用户友好的方式理解任意视觉提示。查看论文和演示。我们还为大型多模态模型构建了首个零样本区域级基准测试ViP-Bench。
使用和许可声明:数据和检查点仅供研究使用。它们还受限于遵守LLaMA、Vicuna和GPT-4的许可协议。数据集采用CC BY NC 4.0许可(仅允许非商业用途),使用该数据集训练的模型不应用于研究目的之外。
目录
安装
如果您不使用Linux,请勿继续,请参阅macOS和Windows的说明。
- 克隆此仓库并进入ViP-LLaVA文件夹
cd ViP-LLaVA
- 安装包
conda create -n vip-llava python=3.10 -y
conda activate vip-llava
pip install --upgrade pip # 启用PEP 660支持
pip install -e .
- 为训练安装额外的包
pip install -e ".[train]"
pip install flash-attn --no-build-isolation
使用HuggingFace快速开始
示例代码
from llava.model.builder import load_pretrained_model
from llava.mm_utils import get_model_name_from_path
from llava.eval.run_llava import eval_model
model_path = "mucai/vip-llava-7b"
prompt = "在指向的区域内显示了什么?"
image_file = "https://pages.cs.wisc.edu/~mucai/man-cross-street.jpg"
args = type('Args', (), {
"model_path": model_path,
"model_name": get_model_name_from_path(model_path),
"query": prompt,
"image_file": image_file,
"conv_mode": None, "model_base": None, "temperature": 0.2, "top_p": None, "num_beams": 1, "max_new_tokens": 512, "sep": ",",
})()
eval_model(args)
查看llava/model/builder.py
中的load_pretrained_model
函数了解详细信息。
你也可以使用llava/eval/run_llava.py
中的eval_model
函数轻松获得输出。这样,你可以在下载此仓库后直接在Colab上使用此代码。
ViP-LLaVA 权重
请查看我们的模型库获取所有公开的ViP-LLaVA检查点,以及如何使用这些权重的说明。
演示
要运行我们的演示,你需要在本地准备LLaVA检查点。请按照此处的说明下载检查点。
Gradio Web 界面
要在本地启动Gradio演示,请逐个运行以下命令。如果你计划启动多个模型工作进程以比较不同的检查点,你只需启动控制器和Web服务器一次。
启动控制器
python -m llava.serve.controller --host 0.0.0.0 --port 10000
启动Gradio Web服务器
python -m llava.serve.gradio_web_server --controller http://localhost:10000 --model-list-mode reload
你刚刚启动了Gradio Web界面。现在,你可以使用屏幕上打印的URL打开Web界面。你可能会注意到模型列表中没有模型。不用担心,因为我们还没有启动任何模型工作进程。当你启动模型工作进程时,它将自动更新。
启动模型工作进程
这是在GPU上执行推理的实际工作进程。每个工作进程负责--model-path
中指定的单个模型。
python -m llava.serve.model_worker --host 0.0.0.0 --controller http://localhost:10000 --port 40000 --worker http://localhost:40000 --model-path mucai/vip-llava-13b
等待进程完成加载模型,直到看到"Uvicorn running on ..."。现在,刷新Gradio Web界面,你会在模型列表中看到刚刚启动的模型。
你可以启动任意数量的工作进程,并在同一个Gradio界面中比较不同的模型检查点。请保持--controller
相同,并为每个工作进程修改--port
和--worker
为不同的端口号。
python -m llava.serve.model_worker --host 0.0.0.0 --controller http://localhost:10000 --port <不同于40000,比如40001> --worker http://localhost:<相应更改,即40001> --model-path <ckpt2>
如果你使用的是带有M1或M2芯片的Apple设备,可以使用--device
标志指定mps设备:--device mps
。
启动模型工作进程(多GPU,当GPU VRAM <= 24GB)
如果你的GPU VRAM小于24GB(例如,RTX 3090、RTX 4090等),你可以尝试使用多个GPU运行。我们的最新代码库会在你有多个GPU时自动尝试使用多个GPU。你可以使用CUDA_VISIBLE_DEVICES
指定要使用的GPU。以下是使用前两个GPU运行的示例。
CUDA_VISIBLE_DEVICES=0,1 python -m llava.serve.model_worker --host 0.0.0.0 --controller http://localhost:10000 --port 40000 --worker http://localhost:40000 --model-path mucai/vip-llava-13b
启动模型工作进程(4比特、8比特推理,量化)
你可以使用量化位数(4位、8位)来启动模型工作器,这样可以减少GPU内存占用,potentially允许你在只有12GB显存的GPU上运行推理。请注意,使用量化位数进行推理的准确度可能不如全精度模型。只需在你执行的模型工作器命令后附加--load-4bit
或--load-8bit
即可。以下是使用4位量化运行的示例。
python -m llava.serve.model_worker --host 0.0.0.0 --controller http://localhost:10000 --port 40000 --worker http://localhost:40000 --model-path mucai/vip-llava-13b --load-4bit
CLI推理
无需Gradio界面即可使用ViP-LLaVA与图像进行对话。它还支持多GPU、4位和8位量化推理。使用4位量化时,对于我们的ViP-LLaVA-7B,在单个GPU上使用不到8GB显存。
python -m llava.serve.cli \
--model-path mucai/vip-llava-7b \
--image-file "https://pages.cs.wisc.edu/~mucai/man-cross-street.jpg" \
--load-4bit
或者使用边界框
python -m llava.serve.cli_vip --model-path ./checkpoints/vip-llava-7b --image-file "https://pages.cs.wisc.edu/~mucai/example_styletransfer.png" --bbox=100,200,200,300
训练
ViP-LLaVA训练包括三个阶段:(1) 特征对齐阶段:使用我们的LAION-CC-SBU数据集558K子集来连接冻结的预训练视觉编码器和冻结的LLM;(2) 视觉指令微调阶段:来自LLaVA-1.5的665K图像级指令数据和使用视觉提示的520K区域级指令数据。(3) 在GPT-4V数据上进行微调。
LLaVA在8个A100 GPU(80GB内存)上进行训练。要在较少的GPU上训练,你可以减少per_device_train_batch_size
并相应增加gradient_accumulation_steps
。始终保持全局批量大小不变:per_device_train_batch_size
x gradient_accumulation_steps
x num_gpus
。
超参数
我们在微调中使用了与Vicuna类似的超参数集。预训练和微调中使用的超参数如下所示。
- 预训练
超参数 | 全局批量大小 | 学习率 | 轮数 | 最大长度 | 权重衰减 |
---|---|---|---|---|---|
ViP-LLaVA-13B | 256 | 1e-3 | 1 | 2048 | 0 |
- 微调
超参数 | 全局批量大小 | 学习率 | 轮数 | 最大长度 | 权重衰减 |
---|---|---|---|---|---|
ViP-LLaVA-13B | 128 | 2e-5 | 1 | 2048 | 0 |
下载Vicuna检查点(自动)
我们的基础模型Vicuna v1.5(一个经过指令微调的聊天机器人)将在运行我们提供的训练脚本时自动下载。无需任何操作。
预训练(特征对齐)
请在这里下载我们在论文中使用的LAION-CC-SBU数据集558K子集(带有BLIP标题)。
ViP-LLaVA-13B的预训练在8个A100(80G)上大约需要5.5小时。ViP-LLaVA-7B大约需要3.5小时。
使用DeepSpeed ZeRO-2的训练脚本:pretrain.sh
。
--mm_projector_type mlp2x_gelu
:两层MLP视觉-语言连接器。--vision_tower clip_4layers_336
:CLIP ViT-L/14 336px,具有多层特征融合。
LLaVA-7B在8个V100(32G)上的预训练大约需要20小时
我们在这里提供了使用DeepSpeed的训练脚本。 提示:
- 如果你使用的是不支持FlashAttention的V100,可以使用xFormers中实现的内存效率注意力。安装xformers并将上面的
llava/train/train_mem.py
替换为llava/train/train_xformers.py。
视觉指令微调
- COCO:train2017
- GQA:images
- OCR-VQA:下载脚本,我们将所有文件保存为
.jpg
格式 - TextVQA:train_val_images
- VisualGenome:part1,part2
- Flickr30k:点此下载
- VCR:点此下载
- Visual7W:点此下载
下载完所有数据后,在./playground/data
中按如下方式组织数据:
├── flickr30k-images
├── v7w
├── vcr1images
├── coco
│ └── train2017
├── gqa
│ └── images
├── ocr_vqa
│ └── images
├── textvqa
│ └── train_images
└── vg
├── VG_100K
└── VG_100K_2
- 开始训练!
您可以从模型库下载我们预训练的投影器。不建议使用旧版投影器,因为它们可能是用不同版本的代码库训练的,如果有任何选项不匹配,模型将无法按预期运行/训练。
在8张A100(80G)上,LLaVA-v1.5-13B的视觉指令微调大约需要40小时。在8张A100(40G)上,LLaVA-v1.5-7B大约需要20小时。
使用DeepSpeed ZeRO-2的训练脚本:finetune_stage2.sh
。如果您想进一步使用GPT-4V数据来增强对话能力,请查看使用DeepSpeed ZeRO-2的阶段3训练脚本:finetune_stage3.sh
如果您没有足够的GPU内存:
- 使用LoRA:
finetune_lora.sh
。我们能够在8个A100-40G/8个A6000上进行13B的训练,在8个RTX3090上进行7B的训练。确保per_device_train_batch_size*gradient_accumulation_steps
与提供的脚本相同,以获得最佳的可复现性。 - 将
zero3.json
替换为zero3_offload.json
,它会将一些参数卸载到CPU RAM。这会降低训练速度。
如果您有兴趣将LLaVA模型微调到您自己的任务/数据上,请查看Finetune_Custom_Data.md
。
评估
ViP-LLaVA在4个学术区域级基准测试和新提出的ViP-Bench上进行了评估。
引用
如果您发现ViP-LLaVA对您的研究和应用有用,请使用以下BibTeX进行引用:
@inproceedings{cai2024vipllava,
author = {Cai, Mu and Liu, Haotian and Mustikovela, Siva Karthik and Meyer, Gregory P. and Chai, Yuning and Park, Dennis and Lee, Yong Jae},
title = {Making Large Multimodal Models Understand Arbitrary Visual Prompts},
booktitle = {IEEE Conference on Computer Vision and Pattern Recognition},
year = {2024}
}