BakLLaVA
BakLLaVA v1 的训练得益于我们的计算赞助商 Together Compute (www.together.ai)。BakLLaVA v1 可以在这里找到:https://huggingface.co/SkunkworksAI/BakLLaVA-1
这是一个与 LAION (www.laion.ai)、Ontocord (www.ontocord.ai) 和 Skunkworks OSS AI 团队合作的项目。
将最先进的多模态能力融入语言模型。
通过实施更优秀的基础模型、改进的训练过程、定制数据集,以及对原始 LLaVA 实现进行重大架构变更。
查看原始 LLaVA 代码、演示和论文:https://github.com/haotian-liu/LLaVA
原始论文和链接: 通过 GPT-4 级别能力的视觉指令调整,实现大型语言和视觉模型
通过视觉指令调整改进基线 [论文]
刘浩天, 李春远, 李宇恒, 李容재
视觉指令调整 (NeurIPS 2023, 口头报告) [论文]
刘浩天*, 李春远*, 吴清阳, 李容再 (*共同第一作者)
使用和许可声明:数据和检查点仅供研究使用。它们还受限于遵守 LLaMA、Vicuna 和 GPT-4 的许可协议。数据集采用 CC BY NC 4.0 许可(仅允许非商业用途),使用该数据集训练的模型不应用于研究目的之外。
目录
安装
- 克隆此仓库并进入 LLaVA 文件夹
git clone https://github.com/SkunkworksAI/BakLLaVA.git
cd BakLLaVA
- 安装包
conda create -n llava python=3.10 -y
conda activate llava
pip install --upgrade pip # 启用 PEP 660 支持
pip install -e .
- 为训练安装额外的包
pip install ninja
pip install flash-attn --no-build-isolation
升级到最新代码库
git pull
pip uninstall transformers
pip install -e .
LLaVA 权重
请查看我们的模型库获取所有公开的 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 liuhaotian/llava-v1.5-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>
启动模型工作器(多 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
启动模型工作器(4 位、8 位推理,量化)
您可以使用量化位数(4 位、8 位)启动模型工作器,这允许您以较低的 GPU 内存占用运行推理,可能允许您在 VRAM 仅为 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 模型小于 1GB,13B 模型为 25GB)。
要加载未合并的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上使用的VRAM少于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训练包括两个阶段:(1) 特征对齐阶段:使用大约60万经过筛选的CC3M数据集将冻结的预训练视觉编码器连接到冻结的LLM;(2) 视觉指令微调阶段:使用15万个GPT生成的多模态指令来教导模型遵循多模态指令。
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-13B | 256 | 1e-3 | 1 | 2048 | 0 |
- 微调
超参数 | 全局批量大小 | 学习率 | 轮数 | 最大长度 | 权重衰减 |
---|---|---|---|---|---|
LLaVA-13B | 128 | 2e-5 | 1 | 2048 | 0 |
准备Vicuna检查点
在开始之前,请准备我们的基础模型Vicuna,它是一个经过指令微调的聊天机器人。请在这里下载其权重。
Vicuna有两个版本:v0和v1,它们之间的主要区别是提示格式。我们支持这两种版本。为确保最佳性能,你需要指定与你下载的权重相对应的正确提示版本:v0
权重使用v0
,所有Vicuna v1.x
模型使用v1
。
预训练(特征对齐)
请在这里下载我们在论文中使用的CC3M数据集子集。
LLaVA-13B的预训练在8个A100(80G)上大约需要4小时。7B检查点大约需要2小时。
我们建议使用DeepSpeed进行训练,因为它可以节省大量GPU内存。我们提供了使用DeepSpeed的训练脚本在这里。
你可以使用单个A100 GPU运行以下代码。请注意,per_device_train_batch_size
* gradient_accumulation_steps
应该等于128,以保持全局批量大小不变。
预训练:LLaVA-13B,1x A100(80G)。时间:约33小时。
python llava/train/train_mem.py \
--model_name_or_path ./checkpoints/vicuna-13b \
--version [v0 or v1] \
--data_path /path/to/cc3m_595k.json \
--image_folder /path/to/cc3m_595k_images \
--vision_tower openai/clip-vit-large-patch14 \
--tune_mm_mlp_adapter True \
--mm_vision_select_layer -2 \
--mm_use_im_start_end False \
--mm_use_im_patch_token False \
--bf16 True \
--output_dir ./checkpoints/llava-13b-pretrain \
--num_train_epochs 1 \
--per_device_train_batch_size 16 \
--per_device_eval_batch_size 4 \
--gradient_accumulation_steps 8 \
--evaluation_strategy "no" \
--save_strategy "steps" \
--save_steps 2400 \
--save_total_limit 1 \
--learning_rate 2e-3 \
--weight_decay 0. \
--warmup_ratio 0.03 \
--lr_scheduler_type "cosine" \
--logging_steps 1 \
--tf32 True \
--model_max_length 2048 \
--gradient_checkpointing True \
--lazy_preprocess True \
--report_to wandb
视觉指令微调
- 准备数据
请下载我们的指令微调数据注释llava_instruct_158k.json,并在这里下载COCO train2017图像。
- 开始训练!
你可以在模型库中下载我们预训练的投影器。不建议使用旧版投影器,因为它们可能是用不同版本的代码库训练的,如果有任何选项关闭,模型将无法按预期运行/训练。
在我们最初发布论文时,我们在LLaVA-Instruct-158K数据集上使用了完整的3轮训练计划。脚本在这里提供。
在后续探索中,我们引入了LLaVA-Lightning,因为我们发现在LLaVA-Instruct-80K上进行更快的1轮训练计划可以实现快速收敛和良好性能。使用LLaVA Lightning,我们能够在LLaMA-2发布的同一天训练、验证并发布LLaVA-LLaMA-2检查点预览。如果你对了解更多关于LLaVA Lightning的信息感兴趣,请继续阅读以下部分。
Lightning
LLaVA-Lightning可以在8个A100 GPU上仅用3小时完成训练,包括预训练和微调。使用竞价实例时,成本仅为约40美元。
对于LLaVA Lightning,我们创建了两个蒸馏子集,以确保概念覆盖面广泛,同时提高训练效率。此外,我们只进行1轮指令微调,而不是论文中的3轮。我们发现这样的计划是有效的,可以实现快速收敛和良好性能。
对于预训练,我们创建了LAION-CC-SBU的概念平衡子集。它包含558K张图像。在这里下载数据。
对于指令微调,我们创建了LLaVA-Instruct-150K的子集。它包含80K个图像-指令对,其中包括40K对话和40K复杂推理数据,图像不重复。在这里下载llava_instruct_80k.json
。
超参数
- 预训练(脚本)
超参数 | 全局批量大小 | 学习率 | 轮数 | 最大长度 | 权重衰减 |
---|---|---|---|---|---|
LLaVA-Lightning | 128 | 2e-3 | 1 | 2048 | 0 |
- 视觉指令微调(脚本) | 超参数 | 全局批量大小 | 学习率 | 训练轮数 | 最大长度 | 权重衰减 | | --- | ---: | ---: | ---: | ---: | ---: | | LLaVA-Lightning | 128 | 2e-5 | 1 | 2048 | 0 |
LLaVA-MPT-7b
借助LLaVA-Lightning,我们能够在8张A100 GPU上仅用3小时就训练出一个基于MPT-7B-Chat的检查点,包括预训练和微调的全过程。
注意:这是基于MPT-7B-chat检查点的LLaVA-Lightning研究预览版。模型的使用应遵守MPT-7B-chat的许可和协议。
- 使用方法
你无需下载我们的检查点,它会直接从我们的Hugging Face模型加载:liuhaotian/LLaVA-Lightning-MPT-7B-preview
。
python -m llava.serve.controller --host 0.0.0.0 --port 10000
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-Lightning-MPT-7B-preview
python -m llava.serve.gradio_web_server --controller http://localhost:10000
- 训练
我们使用与其他Lightning检查点相同的训练数据集和超参数。
评估
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
ScienceQA
请查看此处的文档。
引用
如果您发现LLaVA对您的研究和应用有用,请使用以下BibTeX进行引用:
@misc{liu2023llava,
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具有惊人的语言能力!
相关项目
- 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
对于未来的项目想法,请查看: