针对具有 GPT-4 级功能的大型语言和视觉模型进行视觉教学调整。
📢 [ LLaVA-1.6 博客][项目页面][演示][数据][模型动物园]
🤝社区贡献: [llama.cpp] [colab] [space] [replicate] [AutoGen] [🤗BakLLaVA]
通过可视化指令调整改进基线 [论文]
Haotian Liu, Chunyuan Li, Yuheng Li, Yong Jae Lee
视觉指令调优 (NeurIPS 2023, Oral) [论文]
Haotian Liu*, Chunyuan Li*, Qingyang Wu, Yong Jae Lee (*平等贡献)
使用和许可声明:此项目使用某些数据集和检查点,这些数据集和检查点受其各自原始许可证的约束。用户必须遵守这些原始许可证的所有条款和条件,包括但不限于数据集的 OpenAI 使用条款以及使用数据集训练的检查点的基本语言模型的特定许可证(例如 LLaMA-2 和 Vicuna-v1.5 的 Llama 社区许可证)。除了原始许可证中规定的限制之外,本项目不会施加任何其他限制。此外,提醒用户确保他们对数据集和检查点的使用符合所有适用的法律和法规。
如果你使用的不是 Linux,请不要继续,请参阅适用于 macOS 和 Windows 的说明。
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
git pull
pip install -e .
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 检查点。请按照此处的说明下载检查点。
要在本地启动 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
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 的 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 位)启动模型工作器,这允许你以更少的 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 检查点在型号名称中没有,并且通常比合并的检查点小得多(小于 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
使用 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 类似的超参数。下面提供了预训练和微调中使用的两个超参数。
超参数 | 全球批量大小 | 学习率 | 时代 | 最大长度 | 重量衰减 |
---|---|---|---|---|---|
LLaVA-v1.5-13B | 256 | 1E-3型 | 1 | 2048 | 0 |
超参数 | 全球批量大小 | 学习率 | 时代 | 最大长度 | 重量衰减 |
---|---|---|---|---|---|
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。
我们在这里提供了带有 DeepSpeed 的训练脚本。 技巧:
llava/train/train_mem.py
请下载我们的指令调优数据llava_v1_5_mix665k.json的最终混合物的注释,并从构成数据集中下载图像:
下载全部后,按如下方式组织数据,
./playground/data
├── coco │ └── train2017 ├── gqa │ └── images ├── ocr_vqa │ └── images ├── textvqa │ └── train_images └── vg ├── VG_100K └── VG_100K_2
你可以在 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 内存:
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
如果你有兴趣根据自己的任务/数据微调 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 辅助评估管道,以便全面了解视觉语言模型的功能。有关更多详细信息,请参阅我们的论文。
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{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},
}
有关未来的项目想法,请查看: