说明文档
🌋 LLaVA:大型语言和视觉助手
面向大型语言和视觉模型的视觉指令微调,具备 GPT-4 级别的能力。
[📢 LLaVA-NeXT 博客] [项目主页] [演示] [数据] [模型库]
🤝社区贡献:[llama.cpp] [Colab] [🤗Space] [Replicate] [AutoGen] [BakLLaVA]
基于视觉指令微调的改进基线 [论文] [HF] <br> Haotian Liu、Chunyuan Li、Yuheng Li、Yong Jae Lee
视觉指令微调 (NeurIPS 2023, 口头报告) [论文] [HF] <br> Haotian Liu*、Chunyuan Li*、Qingyang Wu、Yong Jae Lee (*共同贡献)
<!--p align="center"> <a href="https://llava.hliu.cc/"><img src="images/llava_logo.png" width="50%"></a> <br> Generated by <a href="https://gligen.github.io/">GLIGEN</a> via "a cute lava llama with glasses" and box prompt </p-->
发布动态
- [1/30] 🔥 LLaVA-NeXT (LLaVA-1.6) 发布!在 LLaVA-1.5 的基础上进一步扩展,LLaVA-NeXT-34B 在部分基准测试上超越了 Gemini Pro。现在它可以处理 4 倍像素的图像,并支持比以前更多的任务和应用。查看博客文章,体验演示!模型可在模型库获取。训练/评估数据和脚本即将发布。
- [11/10] LLaVA-Plus 发布:学习使用工具创建多模态智能体,推出 LLaVA-Plus(即插即用学习技能的 LLaVA)。[项目主页] [演示] [代码] [论文]
- [11/2] LLaVA-Interactive 发布:体验人机多模态交互的未来,集图像聊天、分割、生成和编辑于一体的演示。[项目主页] [演示] [代码] [论文]
- [10/26] 🔥 使用 LoRA 的 LLaVA-1.5 取得与全模型微调相当的性能,同时降低了 GPU 内存需求(检查点、脚本)。我们还提供了关于如何使用 LoRA 在自定义数据集上微调 LLaVA-1.5 的文档。
- [10/12] 查看由 ETRI 创建的韩语 LLaVA (Ko-LLaVA),感谢他们对本研究的慷慨支持![🤗 演示]
- [10/5] 🔥 LLaVA-1.5 发布!在 11 个基准测试上达到最先进水平,仅对原始 LLaVA 进行简单修改,使用所有公开数据,在单台 8-A100 节点上约 1 天完成训练,超越了使用十亿级数据的方法如 Qwen-VL-Chat。查看技术报告,体验演示!模型可在模型库获取。LLaVA-1.5 的训练数据和脚本发布在这里,评估脚本发布在这里!
- [9/26] LLaVA 通过人类反馈强化学习 (RLHF) 进行改进,提高事实依据性并减少幻觉。查看项目 [LLavA-RLHF] 中新的 SFT 和 RLHF 检查点
- [9/22] LLaVA 被 NeurIPS 2023 接收为口头报告,LLaVA-Med 被 NeurIPS 2023 数据集和基准测试赛道接收为亮点报告。
<details> <summary>更多</summary>
-
[11/6] 支持 Intel dGPU 和 CPU 平台。更多详情请点击这里。
-
[10/12] LLaVA 现已在 llama.cpp 中得到支持,支持 4 位/5 位量化!
-
[10/10] Roboflow 深度解析:LLaVA-1.5 初体验。
-
[9/20] 我们在笔记中总结了对 33B 和 65B LLaVA 模型的训练实证研究。此外,如果您对多模态基础模型的综合综述、演进和趋势感兴趣,请参阅我们最新的综述论文《多模态基础模型:从专家到通用助手》。 <p align="center"> <img src="https://github.com/Computer-Vision-in-the-Wild/CVinW_Readings/blob/main/images/mfm_evolution.jpeg?raw=true" width=50%/> </p>
-
[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] [B站]。
-
[6/11] 我们发布了最受欢迎功能的预览版:DeepSpeed 和 LoRA 支持!请参阅文档。
-
[6/1] 我们发布了 LLaVA-Med:生物医学大型语言和视觉助手,这是构建具有 GPT-4 级别能力的生物医学领域大型语言和视觉模型的一步。查看论文和主页。
-
[5/6] 我们正在发布 LLaVA-Lighting-MPT-7B-preview,基于 MPT-7B-Chat!详见这里。
-
[5/2] 🔥 我们正在发布 LLaVA-Lighting!仅需 40 美元在 3 小时内训练一个轻量级多模态 GPT-4!详见这里。
-
[4/27] 得益于社区的努力,4 位量化的 LLaVA-13B 可以在仅有 12GB 显存的 GPU 上运行!在这里试用。
-
[4/17] 🔥 我们发布了 LLaVA:大型语言和视觉助手。我们提出视觉指令微调,旨在构建具有 GPT-4 级别能力的大型语言和视觉模型。查看论文和演示。
</details>
<!-- <a href="https://llava.hliu.cc/"><img src="assets/demo.gif" width="70%"></a> -->
使用和许可证声明:本项目使用的某些数据集和检查点受其各自原始许可证的约束。用户必须遵守这些原始许可证的所有条款和条件,包括但不限于数据集的 OpenAI 使用条款以及使用该数据集训练的检查点的基础语言模型的特定许可证(例如 LLaMA-2 和 Vicuna-v1.5 的 Llama 社区许可证)。本项目不会施加原始许可证规定之外的任何额外限制。此外,提醒用户确保其对数据集和检查点的使用符合所有适用的法律和法规。
目录
安装
如果您不是使用 Linux,请不要继续,请参阅 macOS 和 Windows 的说明。
- 克隆此仓库并进入 LLaVA 文件夹
git clone https://github.com/haotian-liu/LLaVA.git
cd LLaVA
- 安装包
conda create -n llava python=3.10 -y
conda activate llava
pip install --upgrade pip # 启用 PEP 660 支持
pip install -e .
- 为训练场景安装额外的包
pip install -e \".[train]\"
pip install flash-attn --no-build-isolation
升级到最新代码库
git pull
pip install -e .
# 如果升级时遇到导入错误,请尝试运行以下命令(不带 #)
# pip install flash-attn --no-build-isolation --no-cache-dir
使用 HuggingFace 快速开始
<details> <summary>示例代码</summary>
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)
)
查看 llava/model/builder.py 中 load_pretrained_model 函数的详细信息。
您也可以使用 llava/eval/run_llava.py 中的 eval_model 函数轻松获取输出。这样,您可以在下载此仓库后直接在 Colab 上使用此代码。
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)
</details>
LLaVA 权重
请查看我们的模型库获取所有公开的 LLaVA 检查点,以及如何使用这些权重的说明。
演示
Gradio Web UI
要在本地启动 Gradio 演示,请依次运行以下命令。如果您计划启动多个模型工作进程以比较不同的检查点,您只需要启动控制器和 Web 服务器一次。
flowchart BT
%% 声明节点
gws(\"Gradio (UI 服务器)\")
c(\"控制器 (API 服务器):<br/>端口: 10000\")
mw7b(\"模型工作进程:<br/>llava-v1.5-7b<br/>端口: 40000\")
mw13b(\"模型工作进程:<br/>llava-v1.5-13b<br/>端口: 40001\")
sglw13b(\"SGLang 后端:<br/>llava-v1.6-34b<br/>http://localhost:30000\")
lsglw13b(\"SGLang 工作进程:<br/>llava-v1.6-34b<br/>端口: 40002\")
%% 声明样式
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
%% 分配样式
class id,od data;
class cimg,cs_s,scsim_s success;
class ncimg,cs_f,scsim_f failure;
subgraph Demo 连接
direction BT
c<-->gws
mw7b<-->c
mw13b<-->c
lsglw13b<-->c
sglw13b<-->lsglw13b
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 界面。现在,您可以使用屏幕上打印的 URL 打开 Web 界面。您可能会注意到模型列表中没有模型。不用担心,因为我们还没有启动任何模型工作进程。当您启动模型工作进程时,它会自动更新。
启动 SGLang 工作进程
这是推荐的高吞吐量服务 LLaVA 模型的方式,您需要先安装 SGLang。请注意,目前 SGLang-LLaVA 尚不支持 4 位量化,如果您的 GPU 显存有限,请查看带有量化的模型工作进程。
pip install "sglang[all]"
您首先需要启动一个 SGLang 后端工作进程,它将在 GPU 上执行模型。记住您设置的 --port,稍后会用到。
# 单 GPU
CUDA_VISIBLE_DEVICES=0 python3 -m sglang.launch_server --model-path liuhaotian/llava-v1.5-7b --tokenizer-path llava-hf/llava-1.5-7b-hf --port 30000
# 使用张量并行的多 GPU
CUDA_VISIBLE_DEVICES=0,1 python3 -m sglang.launch_server --model-path liuhaotian/llava-v1.5-13b --tokenizer-path llava-hf/llava-1.5-13b-hf --port 30000 --tp 2
分词器(临时):llava-hf/llava-1.5-7b-hf、llava-hf/llava-1.5-13b-hf、liuhaotian/llava-v1.6-34b-tokenizer。
然后您将启动一个 LLaVA-SGLang 工作进程,它将在 LLaVA 控制器和 SGLang 后端之间通信以路由请求。将 --sgl-endpoint 设置为 http://127.0.0.1:port,其中 port 是您刚才设置的(默认:30000)。
python -m llava.serve.sglang_worker --host 0.0.0.0 --controller http://localhost:10000 --port 40000 --worker http://localhost:40000 --sgl-endpoint http://127.0.0.1:30000
启动模型工作进程
这是在 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 running on ..."。现在,刷新您的 Gradio Web UI,您将在模型列表中看到刚才启动的模型。
您可以启动任意数量的工作进程,并在同一个 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 显存 <= 24GB 时)
如果您的 GPU 显存小于 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 liuhaotian/llava-v1.5-13b
启动模型工作进程(4 位、8 位推理,量化)
您可以使用量化位数(4 位、8 位)启动模型工作进程,这允许您以较低的 GPU 内存占用运行推理,潜在地允许您在仅有 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 liuhaotian/llava-v1.5-13b --load-4bit
启动模型工作进程(LoRA 权重,未合并)
您可以使用 LoRA 权重启动模型工作进程,而无需将其与基础检查点合并,以节省磁盘空间。加载时间会增加,但推理速度与合并的检查点相同。未合并的 LoRA 检查点在模型名称中没有 lora-merge,通常比合并的检查点(7B 为 13G,13B 为 25G)小得多(小于 1GB)。
要加载未合并的 LoRA 权重,您只需传递一个额外的参数 --model-base,这是用于训练 LoRA 权重的基础 LLM。您可以在模型库中查看每个 LoRA 权重的基础 LLM。
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 推理
无需 Gradio 界面即可使用 LLaVA 聊天图像。它还支持多 GPU、4 位和 8 位量化推理。使用 4 位量化,我们的 LLaVA-1.5-7B 在单个 GPU 上使用不到 8GB 显存。
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
<img src="images/demo_cli.gif" width="70%">
训练
以下是 LLaVA v1.5 的最新训练配置。对于旧版模型,请暂时参阅此版本的 README。我们稍后会在单独的文档中添加它们。
LLaVA 训练包括两个阶段:(1) 特征对齐阶段:使用 LAION-CC-SBU 数据集的 558K 子集将冻结的预训练视觉编码器连接到冻结的 LLM;(2) 视觉指令微调阶段:使用 150K GPT 生成的多模态指令遵循数据,以及约 515K 来自学术导向任务的 VQA 数据,教模型遵循多模态指令。
LLaVA 在 8 台具有 80GB 内存的 A100 GPU 上训练。要在更少的 GPU 上训练,您可以相应地减少 per_device_train_batch_size 并增加 gradient_accumulation_steps。始终保持全局批次大小相同:per_device_train_batch_size x gradient_accumulation_steps x num_gpus。
超参数
我们在微调中使用与 Vicuna 类似的超参数集。预训练和微调中使用的超参数如下。
- 预训练
| 超参数 | 全局批次大小 | 学习率 | 轮数 | 最大长度 | 权重衰减 |
|---|---|---|---|---|---|
| LLaVA-v1.5-13B | 256 | 1e-3 | 1 | 2048 | 0 |
- 微调
| 超参数 | 全局批次大小 | 学习率 | 轮数 | 最大长度 | 权重衰减 |
|---|---|---|---|---|---|
| LLaVA-v1.5-13B | 128 | 2e-5 | 1 | 2048 | 0 |
下载 Vicuna 检查点(自动)
我们的基础模型 Vicuna v1.5 是一个经过指令微调的聊天机器人,当您运行我们提供的训练脚本时会自动下载。无需任何操作。
预训练(特征对齐)
请从这里下载我们在论文中使用的带有 BLIP 标题的 LAION-CC-SBU 数据集的 558K 子集。
在 8x A100 (80G) 上,LLaVA-v1.5-13B 的预训练大约需要 5.5 小时,因为分辨率提高到了 336px。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:CLIP ViT-L/14 336px。
<details> <summary>在 8x V100 (32G) 上,LLaVA-7B 的预训练大约需要 20 小时</summary>
我们提供带有 DeepSpeed 的训练脚本这里。 提示:
- 如果您使用不支持 FlashAttention 的 V100,可以使用 xFormers 中实现的内存高效注意力。安装 xformers 并将上面的
llava/train/train_mem.py替换为 llava/train/train_xformers.py。 </details>
视觉指令微调
- 准备数据
请下载我们指令微调数据最终混合的标注 llava_v1_5_mix665k.json,并从组成数据集下载图像:
- COCO:train2017
- GQA:images
- OCR-VQA:下载脚本,我们将所有文件保存为
.jpg - TextVQA:train_val_images
- VisualGenome:part1、part2
下载完成后,在 ./playground/data 中按如下方式组织数据:
├── coco
│ └── train2017
├── gqa
│ └── images
├── ocr_vqa
│ └── images
├── textvqa
│ └── train_images
└── vg
├── VG_100K
└── VG_100K_2
- 开始训练!
您可以在模型库中下载我们的预训练投影器。不建议使用旧版投影器,因为它们可能是使用不同版本的代码库训练的,如果任何选项不对,模型将无法按预期工作/训练。
在 8x A100 (80G) 上,LLaVA-v1.5-13B 的视觉指令微调大约需要 20 小时,因为分辨率提高到了 336px。在 8x A100 (40G) 上,LLaVA-v1.5-7B 大约需要 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与提供的脚本相同以获得最佳可复现性。 - 将
zero3.json替换为zero3_offload.json,它将一些参数卸载到 CPU RAM。这会降低训练速度。
如果您有兴趣将 LLaVA 模型微调到您自己的任务/数据,请查看 Finetune_Custom_Data.md。
需要注意的新选项:
--mm_projector_type mlp2x_gelu:双层 MLP 视觉-语言连接器。--vision_tower openai/clip-vit-large-patch14-336:CLIP 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 辅助评估流程,以全面了解视觉-语言模型的能力。更多详情请参阅我们的论文。
- 生成 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
- 评估生成的响应。在我们的情况下,
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
- 总结评估结果
python summarize_gpt_review.py
引用
如果您发现 LLaVA 对您的研究和应用有用,请使用以下 BibTeX 引用:
@misc{liu2024llavanext,
title={LLaVA-NeXT: Improved reasoning, OCR, and world knowledge},
url={https://llava-vl.github.io/blog/2024-01-30-llava-next/},
author={Liu, Haotian and Li, Chunyuan and Li, Yuheng and Li, Bo and Zhang, Yuanhan and Shen, Sheng and Lee, Yong Jae},
month={January},
year={2024}
}
@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={NeurIPS},
year={2023},
}
致谢
- Vicuna:我们构建所基于的代码库,以及我们具有惊人语言能力的基础模型 Vicuna-13B!
相关项目
对于未来的项目想法,请查看:
- SEEM:一次分割所有事物
- Grounded-Segment-Anything:通过结合 Grounding DINO 和 Segment-Anything 来检测、分割和生成任何事物。
gradguy/model1
作者 gradguy
创建时间: 2024-09-27 17:55:55+00:00
更新时间: 2024-09-27 18:18:58+00:00
在 Hugging Face 上查看