LLaVA - 视觉指令调整:针对多模式 GPT-4 级别功能而构建的大型语言和视觉助手。

Created at: 2023-04-18 00:13:11
Language: Python
License: Apache-2.0

🌋 LLaVA:大型语言和视觉助手

针对具有 GPT-4 级功能的大型语言和视觉模型进行视觉教学调整。

📢 [ LLaVA-1.6 博客][项目页面][演示][数据][模型动物园]

🤝社区贡献: [llama.cpp] [colab] [space] [replicate] [AutoGen] [🤗BakLLaVA]

通过可视化指令调整改进基线 [论文]
Haotian LiuChunyuan Li, Yuheng LiYong Jae Lee

视觉指令调优 (NeurIPS 2023, Oral) [论文]
Haotian Liu*Chunyuan Li*, Qingyang WuYong Jae Lee (*平等贡献)

释放

  • [1/30] 🔥 LLaVA-1.6 出来了!LLaVA-1.6-34B 进一步扩展到 LLaVA-1.5,在某些基准测试中优于 Gemini Pro。与以前相比,它现在可以处理 4 倍以上的像素并执行更多的任务/应用程序。查看博客文章,并探索演示!模型在 Model Zoo 中可用。训练/评估数据和脚本即将推出。
  • [11/10] LLaVA-Plus 发布:学习使用工具创建多模式代理,以及 LLaVA-Plus(即插即用的 LLaVA)。[项目页面][演示][代码][论文]
  • [11/2] LLaVA-Interactive 发布:通过图像聊天、分割、生成和编辑的一体化演示,体验人机交互的未来。[项目页面][演示][代码][论文]
  • [10/26] 🔥 带有 LoRA 的 LLaVA-1.5 实现了与全模型微调相当的性能,并降低了 GPU RAM 要求(ckpts脚本)。我们还提供了一个关于如何使用 LoRA 在你自己的数据集上微调 LLaVA-1.5 的文档
  • [10/12] 查看由ETRI创建的韩国LLaVA(Ko-LLaVA),ETRI慷慨地支持了我们的研究!🤗 [ 演示]
  • [10/5] 🔥 LLaVA-1.5 出来了!在 11 个基准测试上实现 SoTA,只需对原始 LLaVA 进行简单修改,即可利用所有公共数据,在 ~1 天内在单个 8-A100 节点上完成训练,并超越了 Qwen-VL-Chat 等使用十亿级数据的方法。查看技术报告,并探索演示!模型在 Model Zoo 中可用。LLaVA-1.5的训练数据和脚本在这里发布,评估脚本在这里发布!
  • [9/26] LLaVA 通过人类反馈强化学习 (RLHF) 得到改进,以改善事实基础并减少幻觉。查看项目 [LLavA-RLHF] 中新的 SFT 和 RLHF 检查点
  • [9/22] LLaVA 被 NeurIPS 2023 接受为口头报告,LLaVA-Med 被 NeurIPS 2023 Datasets and Benchmarks Track 接受为焦点报告
更多

  • [7/19] 🔥 我们发布了重大升级,包括对 LLaMA-2、LoRA 训练、4/8 位推理、更高分辨率 (336x336) 的支持等等。我们发布了 LLaVA Bench,用于对开放式视觉聊天进行基准测试,结果来自 Bard 和 Bing-Chat。我们还支持和验证 RTX 3090 和 RTX A6000 的训练。查看 LLaVA-from-LLaMA-2 和我们的模型动物园
  • [6/26] CVPR 2023 大型多模态模型教程:迈向构建和超越多模态 GPT-4!请查看 [幻灯片] [笔记] [YouTube] [哔哩哔哩]。
  • [6/11] 我们发布了最需要的功能的预览:DeepSpeed 和 LoRA 支持!请参阅此处的文档。
  • [6/1] 我们发布了 LLaVA-Med:生物医学的大型语言和视觉助手,这是朝着构建具有 GPT-4 级功能的生物医学领域大型语言和视觉模型迈出的一步。查看纸张页面
  • [5/6] 我们发布了基于 MPT-7B-Chat 的 LLaVA-Lighting-MPT-7B-preview!有关详细信息,请参阅此处
  • [5/2] 🔥 我们正在发布 LLaVA-Lighting!在 4 小时内只需 40 美元即可训练一个精简的多模态 GPT-3!有关详细信息,请参阅此处
  • [4/27] 感谢社区的努力,具有 4 位量化的 LLaVA-13B 允许你在低至 12GB VRAM 的 GPU 上运行!在这里试试吧。
  • [4/17] 🔥 我们发布了 LLaVA:大型语言和视觉助手。我们建议对视觉指令进行调整,以构建具有 GPT-4 级别能力的大型语言和视觉模型。查看论文演示

代码许可证 使用和许可声明:此项目使用某些数据集和检查点,这些数据集和检查点受其各自原始许可证的约束。用户必须遵守这些原始许可证的所有条款和条件,包括但不限于数据集的 OpenAI 使用条款以及使用数据集训练的检查点的基本语言模型的特定许可证(例如 LLaMA-2 和 Vicuna-v1.5 的 Llama 社区许可证)。除了原始许可证中规定的限制之外,本项目不会施加任何其他限制。此外,提醒用户确保他们对数据集和检查点的使用符合所有适用的法律和法规。

内容

安装

如果你使用的不是 Linux,请不要继续,请参阅适用于 macOSWindows 的说明。

  1. 克隆此存储库并导航到 LLaVA 文件夹
git clone https://github.com/haotian-liu/LLaVA.git
cd LLaVA
  1. 安装软件包
conda create -n llava python=3.10 -y
conda activate llava
pip install --upgrade pip  # enable PEP 660 support
pip install -e .
  1. 为训练用例安装其他软件包
pip install -e ".[train]"
pip install flash-attn --no-build-isolation

升级到最新的代码库

git pull
pip install -e .

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 = "liuhaotian/llava-v1.5-7b"

tokenizer, model, image_processor, context_len = load_pretrained_model(
    model_path=model_path,
    model_base=None,
    model_name=get_model_name_from_path(model_path)
)

查看 中函数的详细信息。

load_pretrained_model
llava/model/builder.py

你还可以使用该函数轻松获取输出。通过这样做,你可以在下载此存储库后直接在 Colab 上使用此代码。

eval_model
llava/eval/run_llava.py

model_path = "liuhaotian/llava-v1.5-7b"
prompt = "What are the things I should be cautious about when I visit here?"
image_file = "https://llava-vl.github.io/static/images/view.jpg"

args = type('Args', (), {
    "model_path": model_path,
    "model_base": None,
    "model_name": get_model_name_from_path(model_path),
    "query": prompt,
    "conv_mode": None,
    "image_file": image_file,
    "sep": ",",
    "temperature": 0,
    "top_p": None,
    "num_beams": 1,
    "max_new_tokens": 512
})()

eval_model(args)

LLaVA砝码

请查看我们的模型动物园,了解所有公共 LLaVA 检查点,以及如何使用权重的说明。

演示

要运行我们的演示,你需要在本地准备 LLaVA 检查点。请按照此处的说明下载检查点。

Gradio Web 用户界面

要在本地启动 Gradio 演示,请逐个运行以下命令。如果计划启动多个模型工作线程以在不同检查点之间进行比较,则只需启动控制器和 Web 服务器一次

flowchart BT
    %% Declare Nodes
    gws("Gradio (UI Server)")
    c("Controller (API Server):<br/>PORT: 10000")
    mw7b("Model Worker:<br/>llava-v1.5-7b<br/>PORT: 40000")
    mw13b("Model Worker:<br/>llava-v1.5-13b<br/>PORT: 40001")

    %% Declare Styles
    classDef data fill:#3af,stroke:#48a,stroke-width:2px,color:#444
    classDef success fill:#8f8,stroke:#0a0,stroke-width:2px,color:#444
    classDef failure fill:#f88,stroke:#f00,stroke-width:2px,color:#444

    %% Assign Styles
    class id,od data;
    class cimg,cs_s,scsim_s success;
    class ncimg,cs_f,scsim_f failure;

    subgraph Demo Connections
        direction BT
        c<-->gws
        
        mw7b<-->c
        mw13b<-->c
    end

启动控制器

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 界面。现在,你可以打开 Web 界面,并在屏幕上打印 URL。你可能会注意到模型列表中没有模型。别担心,因为我们还没有推出任何模型工人。当你启动模型辅助角色时,它将自动更新。

启动模型辅助角色

这是在 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 liuhaotian/llava-v1.5-13b

等到该过程完成加载模型,然后你看到“Uvicorn 正在运行...”。现在,刷新你的 Gradio Web UI,你将在模型列表中看到你刚刚启动的模型。

你可以根据需要启动任意数量的工作器,并在同一 Gradio 界面中比较不同型号的检查点。请保持相同,并将 和 修改为每个工作线程的不同端口号。

--controller
--port
--worker

python -m llava.serve.model_worker --host 0.0.0.0 --controller http://localhost:10000 --port <different from 40000, say 40001> --worker http://localhost:<change accordingly, i.e. 40001> --model-path <ckpt2>

如果你使用的是带有 M1 或 M2 芯片的 Apple 设备,则可以使用以下标志指定 mps 设备: 。

--device
--device mps

启动模型工作器(多个 GPU,当 GPU VRAM <= 24GB 时)

如果你的 GPU 的 VRAM(例如 RTX 3090、RTX 4090 等)小于 24GB,你可以尝试使用多个 GPU 运行它。如果你有多个 GPU,我们最新的代码库将自动尝试使用多个 GPU。你可以指定要与 一起使用的 GPU。下面是使用前两个 GPU 运行的示例。

CUDA_VISIBLE_DEVICES

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 liuhaotian/llava-v1.5-13b

启动模型工作线程(4 位、8 位推理、量化)

你可以使用量化位(4 位、8 位)启动模型工作器,这允许你以更少的 GPU 内存占用运行推理,从而可能允许你在低至 12GB VRAM 的 GPU 上运行。请注意,使用量化位进行推理可能不如全精度模型准确。只需将 或 追加到正在执行的模型工作线程命令中即可。下面是使用 4 位量化运行的示例。

--load-4bit
--load-8bit

python -m llava.serve.model_worker --host 0.0.0.0 --controller http://localhost:10000 --port 40000 --worker http://localhost:40000 --model-path liuhaotian/llava-v1.5-13b --load-4bit

启动模型工作线程(LoRA 权重,未合并)

你可以使用 LoRA 权重启动模型工作线程,而无需将它们与基本检查点合并,以节省磁盘空间。将有额外的加载时间,而推理速度与合并的检查点相同。未合并的 LoRA 检查点在型号名称中没有,并且通常比合并的检查点小得多(小于 1GB)(13B 为 7G,25B 为 13G)。

lora-merge

要加载未合并的 LoRA 权重,你只需传递一个额外的参数,即用于训练 LoRA 权重的基本 LLM。你可以在模型库中检查每个 LoRA 权重的基本 LLM。

--model-base

python -m llava.serve.model_worker --host 0.0.0.0 --controller http://localhost:10000 --port 40000 --worker http://localhost:40000 --model-path liuhaotian/llava-v1-0719-336px-lora-vicuna-13b-v1.3 --model-base lmsys/vicuna-13b-v1.3

CLI 推理

使用 LLaVA 聊天图像,无需 Gradio 接口。它还支持多个 GPU、4 位和 8 位量化推理。对于我们的 LLaVA-1.5-7B,它具有 4 位量化,它在单个 GPU 上使用不到 8GB 的 VRAM。

python -m llava.serve.cli \
    --model-path liuhaotian/llava-v1.5-7b \
    --image-file "https://llava-vl.github.io/static/images/view.jpg" \
    --load-4bit

火车

以下是 LLaVA v1.5 的最新训练配置。对于旧型号,请暂时参考版本的自述文件。我们稍后会将它们添加到单独的文档中。

LLaVA 训练包括两个阶段:(1) 特征对齐阶段:使用我们的 LAION-CC-SBU 数据集的 558K 子集将冻结的预训练视觉编码器连接到冻结的 LLM;(2)可视化指令调优阶段:使用GPT生成的150K多模态指令跟随数据,加上来自学术任务的约515KVQA数据,教导模型遵循多模态指令。

LLaVA 在 8 个具有 80GB 内存的 A100 GPU 上进行训练。要在更少的 GPU 上进行训练,你可以相应地减少和增加。始终保持全局批量大小相同:x x 。

per_device_train_batch_size
gradient_accumulation_steps
per_device_train_batch_size
gradient_accumulation_steps
num_gpus

超参数

我们在微调中使用了一组与 Vicuna 类似的超参数。下面提供了预训练和微调中使用的两个超参数。

  1. 预训练
超参数 全球批量大小 学习率 时代 最大长度 重量衰减
LLaVA-v1.5-13B 256 1E-3型 1 2048 0
  1. 微调
超参数 全球批量大小 学习率 时代 最大长度 重量衰减
LLaVA-v1.5-13B 128 2E-5型 1 2048 0

下载骆马检查点(自动)

我们的基本型号 Vicuna v1.5 是一个经过指令调整的聊天机器人,当你运行我们提供的培训脚本时,将自动下载。无需执行任何操作。

预训练(特征对齐)

请在此处下载LAION-CC-SBU数据集的558K子集,其中包含我们在论文中使用的BLINK标题。

由于分辨率提高到 336px,LLaVA-v1.5-13B 在 8x A100 (80G) 上的预训练大约需要 5.5 小时。LLaVA-v1.5-7B 大约需要 3.5 小时。

使用 DeepSpeed ZeRO-2 的训练脚本:pretrain.sh

  • --mm_projector_type mlp2x_gelu
    :两层MLP视觉语言连接器。
  • --vision_tower openai/clip-vit-large-patch14-336
    :剪辑 ViT-L/14 336px。
LLaVA-7B 在 8x V100 (32G) 上的预训练大约需要 20 小时

我们在这里提供了带有 DeepSpeed 的训练脚本。 技巧:

可视化指令调优

  1. 准备数据

请下载我们的指令调优数据llava_v1_5_mix665k.json的最终混合物的注释,并从构成数据集中下载图像:

下载全部后,按如下方式组织数据,

./playground/data

├── coco
│   └── train2017
├── gqa
│   └── images
├── ocr_vqa
│   └── images
├── textvqa
│   └── train_images
└── vg
    ├── VG_100K
    └── VG_100K_2
  1. 开始训练!

你可以在 Model Zoo 中下载我们的预训练投影仪。不建议使用传统投影仪,因为它们可能使用不同版本的代码库进行训练,如果任何选项关闭,模型将无法按预期运行/训练。

由于分辨率提高到 336px,LLaVA-v1.5-13B 在 8x A100 (80G) 上的视觉指令调整大约需要 20 小时。LLaVA-v1.5-7B 在 8 台 A100 (40G) 上大约需要 10 小时。

使用 DeepSpeed ZeRO-3 的训练脚本:finetune.sh

如果你没有足够的 GPU 内存:

  • 使用 LoRA:finetune_lora.sh。我们能够在 8-A100-40G/8-A6000 中适应 13B 训练,在 8-RTX3090 中适应 7B 训练。确保与提供的脚本相同,以获得最佳可重复性。
    per_device_train_batch_size*gradient_accumulation_steps
  • 替换 将某些参数卸载到 CPU RAM。这会减慢训练速度。
    zero3.json
    zero3_offload.json

如果你有兴趣根据自己的任务/数据微调 LLaVA 模型,请查看 Finetune_Custom_Data.md

需要注意的新选项:

  • --mm_projector_type mlp2x_gelu
    :两层MLP视觉语言连接器。
  • --vision_tower openai/clip-vit-large-patch14-336
    :剪辑 ViT-L/14 336px。
  • --image_aspect_ratio pad
    :这会将非正方形图像填充为正方形,而不是裁剪它们;它略微减少了幻觉。
  • --group_by_modality_length True
    :仅当你的指令调优数据集同时包含语言(例如 ShareGPT)和多模态(例如 LLaVA-Instruct)时,才应使用此方法。它使训练采样器在训练期间仅对单个模态(图像或语言)进行采样,我们观察到这将训练速度提高 ~25%,并且不会影响最终结果。

评估

在 LLaVA-1.5 中,我们根据 12 个不同的基准来评估模型。为了保证可重复性,我们用贪婪的解码来评估模型。我们不会使用波束搜索来评估推理过程与实时输出的聊天演示一致。

请参见 Evaluation.md

GPT 辅助评估

我们提供了用于多模态建模的 GPT 辅助评估管道,以便全面了解视觉语言模型的功能。有关更多详细信息,请参阅我们的论文。

  1. 生成 LLaVA 响应
python model_vqa.py \
    --model-path ./checkpoints/LLaVA-13B-v0 \
    --question-file \
    playground/data/coco2014_val_qa_eval/qa90_questions.jsonl \
    --image-folder \
    /path/to/coco2014_val \
    --answers-file \
    /path/to/answer-file-our.jsonl
  1. 评估生成的响应。在我们的例子中,answer-file-ref.jsonl 是由纯文本 GPT-4 (0314) 生成的响应,并提供了上下文标题/框。
OPENAI_API_KEY="sk-***********************************" python llava/eval/eval_gpt_review_visual.py \
    --question playground/data/coco2014_val_qa_eval/qa90_questions.jsonl \
    --context llava/eval/table/caps_boxes_coco2014_val_80.jsonl \
    --answer-list \
    /path/to/answer-file-ref.jsonl \
    /path/to/answer-file-our.jsonl \
    --rule llava/eval/table/rule.json \
    --output /path/to/review.json
  1. 总结评估结果
python summarize_gpt_review.py

引文

如果你发现LLaVA对你的研究和应用有用,请使用此BibTeX进行引用:

@misc{liu2023improvedllava,
      title={Improved Baselines with Visual Instruction Tuning}, 
      author={Liu, Haotian and Li, Chunyuan and Li, Yuheng and Lee, Yong Jae},
      publisher={arXiv:2310.03744},
      year={2023},
}

@misc{liu2023llava,
      title={Visual Instruction Tuning}, 
      author={Liu, Haotian and Li, Chunyuan and Wu, Qingyang and Lee, Yong Jae},
      publisher={arXiv:2304.08485},
      year={2023},
}

确认

  • Vicuna:我们构建的代码库,以及我们的基本模型 Vicuna-13B,具有惊人的语言功能!

相关项目

有关未来的项目想法,请查看: