项目文件夹
Note
本文档由 WeHub 基于上游 README 翻译整理,属于社区翻译,非官方中文文档。
English · 原始项目 · 上游 README
原作者、版权与许可证归属以原始项目及本仓库 LICENSE 文件为准。
🌋 LLaVA:大型语言与视觉助手(Large Language and Vision Assistant)
通过视觉指令微调(visual instruction tuning),迈向具备 GPT-4 级别能力的大型语言与视觉模型。
[📢 LLaVA-NeXT Blog] [Project Page] [Demo] [Data] [Model Zoo]
🤝社区贡献:[llama.cpp] [Colab] [🤗Space] [Replicate] [AutoGen] [BakLLaVA]
视觉指令微调的改进基线(Improved Baselines with Visual Instruction Tuning) [Paper] [HF]
Haotian Liu, Chunyuan Li, Yuheng Li, Yong Jae Lee
视觉指令微调(Visual Instruction Tuning) (NeurIPS 2023, Oral) [Paper] [HF]
Haotian Liu*, Chunyuan Li*, Qingyang Wu, Yong Jae Lee (*同等贡献)
发布(Release)
- [2024/05/10] 🔥 LLaVA-NeXT(更强版本)模型已发布,更强的 LMM(Large Multimodal Model),支持 LLama-3 (8B) 和 Qwen-1.5 (72B/110B)。[Blog] [Checkpoints] [Demo] [Code]
- [2024/05/10] 🔥 LLaVA-NeXT(Video)已发布。仅基于图像训练的 LLaVA-NeXT 模型在视频任务上出人意料地强大,具备零样本模态迁移(zero-shot modality transfer)能力。结合 AI 反馈在视频上进行 DPO 训练可带来显著提升。[Blog] [Checkpoints] [Code]
- [03/10] 发布 LMMs-Eval,这是我们在开发 LLaVA-NeXT 时使用的高效评估流水线。它支持在数十个公开数据集上评估 LMM,并允许接入新数据集,从而大幅加快新 LMM 的开发速度。[Blog] [Codebase]
- [1/30] 🔥 LLaVA-NeXT(LLaVA-1.6)已发布!在 LLaVA-1.5 基础上进一步扩展规模后,LLaVA-NeXT-34B 在部分基准测试中超越 Gemini Pro。它现在可处理 4 倍像素,并能完成比以往更多的任务/应用。请查看 blog post, 并体验 demo! 模型可在 Model Zoo. 获取。训练/评估数据和脚本即将发布。
- [11/10] LLaVA-Plus 已发布:学习使用工具以构建多模态智能体(Learning to Use Tools for Creating Multimodal Agents),即 LLaVA-Plus(可插拔并学习使用技能的 LLaVA)。[Project Page] [Demo] [Code] [Paper]
- [11/2] LLaVA-Interactive 已发布:通过一体化演示体验人机多模态交互的未来,涵盖图像对话、分割、生成与编辑。[Project Page] [Demo] [Code] [Paper]
- [10/26] 🔥 采用 LoRA 的 LLaVA-1.5 可达到与全模型微调相当的性能,同时降低 GPU 显存需求(ckpts, script). 我们还提供了关于如何在你自己的数据集上用 LoRA 微调 LLaVA-1.5 的 doc。
- [10/12] 欢迎体验由 ETRI 创建、并慷慨支持我们研究的韩语版 LLaVA(Ko-LLaVA)![🤗 Demo]
- [10/5] 🔥 LLaVA-1.5 已发布!在 11 个基准测试中达到 SOTA(State of the Art),仅对原始 LLaVA 做了简单修改,使用全部公开数据,在单台 8-A100 节点上约 1 天即可完成训练,并超越使用十亿级数据的 Qwen-VL-Chat 等方法。请查看 technical report, 并体验 demo! 模型可在 Model Zoo. 获取。LLaVA-1.5 的训练数据和脚本发布在 here,,评估脚本发布在 here!
- [9/26] LLaVA 通过人类反馈强化学习(RLHF,reinforcement learning from human feedback)得到改进,以提升事实 grounding 并减少幻觉。请在项目 [LLavA-RLHF] 查看新的 SFT 和 RLHF 检查点。
- [9/22] LLaVA 被 NeurIPS 2023 接收为 oral presentation(口头报告),LLaVA-Med 被 NeurIPS 2023 Datasets and Benchmarks Track 接收为 spotlight presentation(Spotlight 展示)。
更多
- [11/6] 支持 Intel dGPU 和 CPU 平台。More details here.
- [10/12] LLaVA 现已在 llama.cpp 中得到支持,并提供 4-bit / 5-bit 量化支持!
- [10/11] LLaVA-1.5 的训练数据和脚本发布在 here,,评估脚本发布在 here!
- [10/10] Roboflow Deep Dive: LLaVA-1.5 初体验。
- [9/20] 我们在 note. 中总结了对 33B 和 65B LLaVA 模型训练的实证研究。此外,若你对多模态基础模型的全面综述、演进与趋势感兴趣,请阅读我们近期的综述论文 ``Multimodal Foundation Models: From Specialists to General-Purpose Assistants''.
- [7/19] 🔥 我们发布重大升级,包括支持 LLaMA-2、LoRA 训练、4-/8-bit 推理、更高分辨率(336x336)以及更多功能。我们发布 LLaVA Bench 用于对开放式视觉对话进行基准测试,并包含 Bard 和 Bing-Chat 的结果。我们还支持并验证了在 RTX 3090 和 RTX A6000 上的训练。请查看 LLaVA-from-LLaMA-2, 和我们的 model zoo!
- [6/26] CVPR 2023 Tutorial 主题:大型多模态模型:构建并超越多模态 GPT-4(Large Multimodal Models: Towards Building and Surpassing Multimodal GPT-4)!请查看 [Slides] [Notes] [YouTube] [Bilibli].
- [6/11] 我们发布了最受期待功能的预览:DeepSpeed 和 LoRA 支持!请参阅 here 中的文档。
- [6/1] 我们发布 LLaVA-Med:生物医学领域的大型语言与视觉助手(Large Language and Vision Assistant for Biomedicine),迈向构建具备 GPT-4 级别能力的生物医学领域大型语言与视觉模型。请查看 paper 和 page.
- [5/6] 我们发布基于 MPT-7B-Chat 的 LLaVA-Lighting-MPT-7B-preview,!更多详情见 here。
- [5/2] 🔥 我们发布 LLaVA-Lighting!仅用 40 美元、3 小时即可训练一个轻量级多模态 GPT-4!更多详情见 here。
- [4/27] 得益于社区努力,4-bit 量化的 LLaVA-13B 可让你在显存低至 12GB 的 GPU 上运行!请在 here. 试用。
- [4/17] 🔥 我们发布 LLaVA:大型语言与视觉助手(Large Language and Vision Assistant)。我们提出视觉指令微调,迈向构建具备 GPT-4 级别能力的大型语言与视觉模型。请查看 paper 和 demo.
使用与许可声明:本项目使用了受各自原始许可证约束的特定数据集与检查点(checkpoint)。用户必须遵守这些原始许可证的全部条款与条件,包括但不限于:数据集需遵守 OpenAI Terms of Use;使用上述数据集训练得到的检查点,其基座语言模型亦须遵守相应许可证(例如 LLaMA-2 与 Vicuna-v1.5 适用 Llama community license)。除原始许可证规定的约束外,本项目不施加任何额外限制。此外,请用户确保对数据集与检查点的使用符合所有适用的法律法规。
Contents
Install
如果你未使用 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 # enable PEP 660 support
pip install -e .
- 为训练场景安装额外依赖包
pip install -e ".[train]"
pip install flash-attn --no-build-isolation
Upgrade to latest code base
git pull
pip install -e .
# if you see some import errors when you upgrade,
# please try running the command below (without #)
# pip install flash-attn --no-build-isolation --no-cache-dir
Quick Start With 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)
)
请查看 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)
LLaVA Weights
请查看我们的 Model Zoo,获取所有公开的 LLaVA 检查点及权重使用说明。
Demo
Gradio Web UI
要在本地启动 Gradio 演示,请依次运行以下命令。若你计划启动多个 model worker 以对比不同检查点,则 controller 与 web server 只需启动一次。
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")
sglw13b("SGLang Backend:<br/>llava-v1.6-34b<br/>http://localhost:30000")
lsglw13b("SGLang Worker:<br/>llava-v1.6-34b<br/>PORT: 40002")
%% 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
lsglw13b<-->c
sglw13b<-->lsglw13b
end
Launch a controller
python -m llava.serve.controller --host 0.0.0.0 --port 10000
Launch a gradio web server.
python -m llava.serve.gradio_web_server --controller http://localhost:10000 --model-list-mode reload
你刚刚启动了 Gradio Web 界面。现在可通过屏幕上打印的 URL 打开该界面。你可能会注意到模型列表中尚无模型,不必担心——我们尚未启动任何 model worker;启动 model worker 后列表会自动更新。
Launch a SGLang worker
这是以高吞吐量部署 LLaVA 模型的推荐方式,你需要先安装 SGLang。请注意,SGLang-LLaVA 目前尚不支持 4-bit 量化;若 GPU 显存有限,请参阅带 quantization. 的 model worker。
pip install "sglang[all]"
你首先需要启动 SGLang backend worker,它将在 GPU 上执行模型。请记住你设置的 --port,稍后还会用到。
# Single 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
# Multiple GPUs with tensor parallel
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
Tokenizers(临时):llava-hf/llava-1.5-7b-hf、llava-hf/llava-1.5-13b-hf、liuhaotian/llava-v1.6-34b-tokenizer。
随后启动 LLaVA-SGLang worker,它将在 LLaVA controller 与 SGLang backend 之间通信并路由请求。将 --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
Launch a model worker
这是实际在 GPU 上执行推理的 worker。每个 worker 负责 --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,即可在模型列表中看到刚启动的模型。
你可以按需启动任意数量的 worker,并在同一 Gradio 界面中对比不同模型检查点。请保持 --controller 不变,并将 --port 与 --worker 修改为各 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 设备,可通过 --device 标志指定 mps 设备:--device mps。
启动 model worker(多 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 liuhaotian/llava-v1.5-13b
启动 model worker(4-bit、8-bit 推理,量化)
你可以以量化位数(4-bit、8-bit)启动 model worker,这能让你以更低的 GPU 显存占用运行推理,有可能在显存低至 12GB 的 GPU 上运行。请注意,量化位数推理的精度可能不如全精度模型。只需在你正在执行的 model worker 命令后追加 --load-4bit 或 --load-8bit。下面是以 4-bit 量化运行的示例。
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
启动 model worker(LoRA 权重,未合并)
你可以加载未与基础 checkpoint 合并的 LoRA 权重来启动 model worker,以节省磁盘空间。这会增加加载时间,但推理速度与合并后的 checkpoint 相同。未合并的 LoRA checkpoint 在模型名称中不包含 lora-merge,且通常比合并后的 checkpoint(7B 为 13G,13B 为 25G)小得多(小于 1GB)。
要加载未合并的 LoRA 权重,你只需传入额外参数 --model-base,即用于训练该 LoRA 权重的基础 LLM。你可以在 model zoo. 中查看每个 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-bit 和 8-bit 量化推理。在 4-bit 量化下,我们的 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
训练
以下是 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。请始终保持全局 batch size 不变:per_device_train_batch_size x gradient_accumulation_steps x num_gpus。
超参数
我们在微调时采用与 Vicuna 相似的超参数集。预训练和微调所用的超参数如下。
- 预训练(Pretraining)
| 超参数 | 全局 Batch Size | 学习率 | Epochs | 最大长度 | Weight decay |
|---|---|---|---|---|---|
| LLaVA-v1.5-13B | 256 | 1e-3 | 1 | 2048 | 0 |
- 微调(Finetuning)
| 超参数 | 全局 Batch Size | 学习率 | Epochs | 最大长度 | Weight decay |
|---|---|---|---|---|---|
| LLaVA-v1.5-13B | 128 | 2e-5 | 1 | 2048 | 0 |
下载 Vicuna checkpoint(自动)
我们的基础模型 Vicuna v1.5 是一个经过指令微调的聊天机器人,运行我们提供的训练脚本时会自动下载。无需额外操作。
预训练(特征对齐)
请从 此处. 下载论文中使用的、带 BLIP 标注的 LAION-CC-SBU 数据集 558K 子集。
在 8x A100 (80G) 上,由于分辨率提升至 336px,LLaVA-v1.5-13B 的预训练大约需要 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:CLIP ViT-L/14 336px。
在 8x V100 (32G) 上,LLaVA-7B 的预训练大约需要 20 小时
我们在 此处. 提供使用 DeepSpeed 的训练脚本。 提示:
- 如果你使用的是不支持 FlashAttention 的 V100,可以使用 xFormers. 中实现的 memory-efficient attention。安装 xformers,并将上文中的
llava/train/train_mem.py替换为 llava/train/train_xformers.py。
视觉指令微调(Visual Instruction Tuning)
- 准备数据
请下载我们指令微调数据的最终混合标注 llava_v1_5_mix665k.json,,并从构成数据集中下载图像:
- COCO:train2017
- GQA:images
- OCR-VQA:download script, 我们将所有文件保存为
.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
- 开始训练!
你可以在 Model Zoo. 下载我们预训练的 projector。不建议使用旧版 projector,因为它们可能是在不同版本的代码库上训练的,且若有任何选项未开启,模型将无法按我们预期的方式运行/训练。
在 8x A100 (80G) 上,由于分辨率提升至 336px,LLaVA-v1.5-13B 的视觉指令微调大约需要 20 小时。在 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:将非正方形图像填充为正方形,而非裁剪;可略微减少幻觉(hallucination)。--group_by_modality_length True:仅当你的指令微调(instruction tuning)数据集同时包含纯语言(如 ShareGPT)和多模态(如 LLaVA-Instruct)数据时使用。它使训练采样器在训练期间每次仅采样单一模态(图像或语言),我们观察到这可将训练速度提升约 25%,且不影响最终效果。
评估
在 LLaVA-1.5 中,我们在涵盖 12 个基准的多样化集合上评估模型。为保证可复现性,我们使用贪婪解码(greedy decoding)评估模型。我们不使用束搜索(beam search)进行评估,以使推理过程与实时输出的聊天演示保持一致。
详见 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)在提供上下文 captions/boxes 的情况下生成的回复。
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!
相关项目
- Instruction Tuning with GPT-4
- LLaVA-Med: Training a Large Language-and-Vision Assistant for Biomedicine in One Day
- Otter: In-Context Multi-Modal Instruction Tuning
如需未来项目灵感,请查看:
