LLaMA-VID:大语言模型中一张图片值2个词元
LLaMA-VID 使现有框架能够支持长达数小时的视频,并通过额外的上下文词元推动其上限。我们基于 LLaVA 构建了这个仓库。
发布
- [24/07/04] 🔥 我们的工作已被 ECCV 2024 接收!
- [23/12/05] 🔥 我们发布了完整的训练和评估模型、数据和脚本,以支持电影对话!
- [23/11/29] 🔥 LLaMA-VID 来了!我们发布了 LLaMA-VID 的论文、代码、数据、模型和演示!
目录
演示
我们在本节提供了一些精选示例。更多示例可以在我们的项目页面找到。欢迎尝试我们的在线演示!
安装
请按照以下说明安装所需的包。
- 克隆此仓库
git clone https://github.com/dvlab-research/LLaMA-VID.git
- 安装包
conda create -n llamavid python=3.10 -y
conda activate llamavid
cd LLaMA-VID
pip install --upgrade pip # 启用 PEP 660 支持
pip install -e .
- 为训练情况安装额外的包
pip install ninja
pip install flash-attn --no-build-isolation
模型
LLaMA-VID 主要包含三个部分:编码器和解码器用于生成视觉嵌入和文本引导特征; 上下文词元和内容词元通过定制的词元生成策略进行转换; 指令微调旨在释放 LLM 在图像和视频方面的潜力。
我们提供了在第一阶段和第二阶段数据(长视频 + 第三阶段)上全面微调的所有 LLaMA-VID 模型:
类型 | 图像大小 | 最大词元数 | 基础 LLM | 视觉编码器 | 微调数据 | 微调计划 | 下载 |
---|---|---|---|---|---|---|---|
仅图像 | 224 | 4K | Vicuna-7B-v1.5 | EVA-G | LLaVA1.5-Instruct | full_ft-1e | ckpt |
仅图像 | 336 | 4K | Vicuna-7B-v1.5 | EVA-G | LLaVA1.5-Instruct | full_ft-1e | ckpt |
仅图像 | 336 | 4K | Vicuna-13B-v1.5 | EVA-G | LLaVA1.5-Instruct | full_ft-1e | ckpt |
短视频 | 224 | 4K | Vicuna-7B-v1.5 | EVA-G | LLaVA1.5-VideoChatGPT-Instruct | full_ft-1e | ckpt |
短视频 | 224 | 4K | Vicuna-13B-v1.5 | EVA-G | LLaVA1.5-VideoChatGPT-Instruct | full_ft-1e | ckpt |
长视频 | 224 | 64K | Vicuna-7B-v1.5 | EVA-G | LLaVA1.5-VideoChatGPT-Instruct + LongVideoQA | full_ft-1e | ckpt |
以下是在第 1 阶段数据上预训练的权重(文本解码器 + 上下文注意力 + 投影器): |
类型 | 图像大小 | 最大令牌数 | 基础 LLM | 视觉编码器 | 预训练数据 | 预训练计划 | 下载 |
---|---|---|---|---|---|---|---|
仅图像 | 224 | 4K | Vicuna-7B-v1.5 | EVA-G | LCS-558K | 1e | ckpt |
仅图像 | 336 | 4K | Vicuna-7B-v1.5 | EVA-G | LCS-558K | 1e | ckpt |
仅图像 | 336 | 4K | Vicuna-13B-v1.5 | EVA-G | LCS-558K | 1e | ckpt |
短视频 | 224 | 4K | Vicuna-7B-v1.5 | EVA-G | LCS-558K-WebVid-232K | 1e | ckpt |
短视频 | 224 | 4K | Vicuna-13B-v1.5 | EVA-G | LCS-558K-WebVid-232K | 1e | ckpt |
准备工作
数据集
我们提供了用于 LLaMA-VID 训练的处理过的基于图像的数据。我们按照 LLaVA 的格式组织数据,请按照这里的说明组织训练用的基于图像的数据,按照这里的说明组织评估用的基于图像的数据。
请将预训练数据、微调数据和评估数据分别放在 LLaMA-VID-Pretrain
、LLaMA-VID-Finetune
和 LLaMA-VID-Eval
子目录下,遵循结构。
对于基于视频的数据集,请从 WebVid 下载 2.5M 子集,从官方网站或 video-chatgpt 下载 ActivityNet 数据集。 如果您想进行评估,还请从这里下载相应文件。您可以从这里下载 MSVD-QA,从这里下载 MSRVTT-QA。
对于长视频调优,请从 MovieNet 下载长视频数据,从这里下载镜头检测结果,从这里下载我们构建的长视频问答对。在预处理之前,请将镜头检测结果放在 LLaMA-VID-Finetune/movienet/files
下。
对于元信息,请下载以下文件并按照结构组织:
预训练权重
我们建议用户从以下链接下载预训练权重:Vicuna-7b-v1.5、Vicuna-13b-v1.5、EVA-ViT-G、QFormer-7b、QFormer-13b,并按照结构将它们放在 model_zoo
中。
结构
在训练之前,文件夹结构应按如下方式组织:
LLaMA-VID
├── llamavid
├── scripts
├── work_dirs
│ ├── llama-vid
│ │ ├── llama-vid-13b-full-336
│ │ ├── ...
├── model_zoo
│ ├── LLM
│ │ ├── vicuna
│ │ │ ├── 7B-V1.5
│ │ │ ├── 13B-V1.5
│ ├── LAVIS
│ │ ├── eva_vit_g.pth
│ │ ├── instruct_blip_vicuna7b_trimmed.pth
│ │ ├── instruct_blip_vicuna13b_trimmed.pth
├── data
│ ├── LLaMA-VID-Pretrain
│ │ ├── blip_laion_cc_sbu_558k.json
│ │ ├── llava_558k_with_webvid.json
│ │ ├── images
│ │ ├── videos
│ ├── LLaMA-VID-Finetune
│ │ ├── llava_v1_5_mix665k.json
│ │ ├── llava_v1_5_mix665k_maxround_6_total_921k.json
│ │ ├── llava_v1_5_mix665k_maxround_12_total_714k.json
│ │ ├── llava_v1_5_mix665k_with_video_chatgpt.json
│ │ ├── llava_v1_5_mix665k_with_video_chatgpt_maxtime_5min.json
│ │ ├── long_videoqa.json
│ │ ├── movienet
│ │ ├── activitynet
│ │ ├── coco
│ │ ├── gqa
│ │ ├── ocr_vqa
│ │ ├── textvqa
│ │ ├── vg
│ ├── LLaMA-VID-Eval
│ │ ├── gqa
│ │ ├── ...
训练
LLaMA-VID的训练包括三个阶段:(1)特征对齐阶段:连接视觉和语言标记;(2)指令微调阶段:教导模型遵循多模态指令;(3)长视频微调阶段:扩展位置嵌入并教导模型遵循长达数小时的视频指令。
LLaMA-VID在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
。
请确保在训练前按照准备工作下载并组织数据。
仅图像
如果你只想在基于图像的数据上训练和微调LLaMA-VID,请使用以下命令运行Vicuna-7B,图像尺寸为336:
bash scripts/image_only/train/stage_1_2_full_v7b_336.sh
或者对于Vicuna-13B,图像尺寸为336:
bash scripts/image_only/train/stage_1_2_full_v13b_336.sh
你也可以尝试使用更小的图像尺寸224和更少的视觉标记:
bash scripts/image_only/train/stage_1_2_full_v7b_224_grid_4.sh
更多训练脚本可以在scripts/image_only/train
中找到。
短视频
如果你对在基于短视频的数据上训练和微调LLaMA-VID感兴趣,请使用以下命令运行Vicuna-7B,图像尺寸为224:
bash scripts/video/train/stage_1_2_full_v7b_224_fps_1.sh
或者对于Vicuna-13B,图像尺寸为224:
bash scripts/video/train/stage_1_2_full_v13b_224_fps_1.sh
更多训练脚本可以在scripts/video/train
中找到。
长视频
我们提供了基于长视频的数据集和脚本。请按照准备工作下载基于长视频的数据,并按照结构组织它们。 在训练阶段,我们首先从长视频中提取所有帧,并将视觉特征保存在本地以进行高效训练。
python scripts/extra_tool/extract_movienet_features.py \
--video_dir <path to movienet video> \
--files_dir <path to movienet files> \ # 下载的MovieNet.tar.gz中的文件
--feat_dir <path to output features>
然后运行以下命令对Vicuna-7B进行训练,图像尺寸为224:
bash scripts/video/train/stage_3_full_v7b_224_longvid.sh
评估
我们在基于图像和基于视频的基准上进行评估。请按照准备工作下载评估数据,并按照结构组织它们。
仅图像
LLM | 分辨率 | 模型 | GQA | MMB | MME | POPE | SEED | SQA-Image | VizWiz | VQA v2 |
---|---|---|---|---|---|---|---|---|---|---|
Vicuna-7B | 224 | ckpt | 63.0 | 65.3 | 1405.6 | 86.6 | 59.7 | 67.7 | 52.5 | 78.3 |
Vicuna-7B | 336 | ckpt | 64.3 | 65.1 | 1521.4 | 86.0 | 59.9 | 68.3 | 54.2 | 79.3 |
Vicuna-13B | 336 | ckpt | 65.0 | 66.6 | 1542.3 | 86.0 | 62.3 | 70.0 | 54.3 | 80.0 |
如果你想在基于图像的基准上评估模型,请使用scripts/image_only/eval
中的脚本。
例如,运行以下命令进行GQA评估:
bash scripts/image_only/eval/gqa.sh
更多评估脚本可以在scripts/image_only/eval
中找到。
视频
LLM | 分辨率 | 模型 | MSVD-QA | MSRVTT-QA | ActivityNet-QA | 正确性 | 细节 | 上下文 | 时间性 | 一致性 |
---|---|---|---|---|---|---|---|---|---|---|
Vicuna-7B | 224 | ckpt | 69.7 | 57.7 | 47.4 | 2.96 | 3.00 | 3.53 | 2.46 | 2.51 |
Vicuna-13B | 224 | ckpt | 70.0 | 58.9 | 47.5 | 3.07 | 3.05 | 3.60 | 2.58 | 2.63 |
如果你想在基于视频的基准上评估模型,请使用scripts/video/eval
中的脚本。
例如,运行以下命令进行MSVD-QA评估:
bash scripts/video/eval/msvd_eval.sh
更多评估脚本可以在scripts/video/eval
中找到。
CLI 推理
无需 Gradio 界面即可使用 LLaMA-VID 与图像和视频聊天。它还支持多 GPU、4 位和 8 位量化推理。使用 4 位量化。 请尝试以下命令进行图像或视频推理:
python -m llamavid.serve.cli \
--model-path work_dirs/llama-vid/llama-vid-7b-full-336 \
--image-file <图像路径>
或尝试以下命令进行视频推理:
python -m llamavid.serve.cli \
--model-path work_dirs/llama-vid/llama-vid-7b-full-224-video-fps-1 \
--image-file <视频路径> \
--temperature 0.5
你也可以尝试使用 4 位或 8 位进行高效推理
python -m llamavid.serve.cli \
--model-path work_dirs/llama-vid/llama-vid-7b-full-224-video-fps-1 \
--image-file <视频路径>
--temperature 0.5 \
--load-4bit
长视频推理
对于长视频,如果你想对 movienet 中的视频进行推理,请先按如下方式处理视频数据和字幕:
python scripts/extra_tool/extract_movienet_features.py \
--video_dir <movienet 视频路径> \
--files_dir <movienet 文件路径> \ # 下载的 MovieNet.tar.gz 中的文件
--feat_dir <输出特征路径>
如果你想对自定义视频进行推理,请先按如下方式处理视频数据和字幕:
python scripts/extra_tool/extract_video_features_subtitles.py \
--video_file <自定义视频路径> \
--feat_dir <输出特征路径>
然后,请尝试以下命令进行长视频推理:
python llamavid/serve/run_llamavid_movie.py \
--model-path work_dirs/llama-vid/llama-vid-7b-full-224-long-video \
--video-file <处理后的视频文件路径> \
--load-4bit
Gradio Web 界面
在这里,我们采用了类似于 LLaVA 的 Gradio 界面,为 LLaMA-VID 提供了用户友好的界面。 要在本地启动 Gradio 演示,请依次运行以下命令。如果你计划启动多个模型工作器以比较不同的检查点,你只需要启动控制器和 Web 服务器一次。
启动控制器
python -m llamavid.serve.controller --host 0.0.0.0 --port 10000
启动 Gradio Web 服务器
python -m llamavid.serve.gradio_web_server --controller http://localhost:10000 --model-list-mode reload
你已经启动了 Gradio Web 界面。现在,你可以使用屏幕上打印的 URL 打开 Web 界面。你可能会注意到模型列表中没有模型。不用担心,因为我们还没有启动任何模型工作器。当你启动模型工作器时,它会自动更新。
启动模型工作器
这是在 GPU 上执行推理的实际"工作器"。每个工作器负责 --model-path
中指定的单个模型。
python -m llamavid.serve.model_worker --host 0.0.0.0 --controller http://localhost:10000 --port 40000 --worker http://localhost:40000 --model-path work_dirs/llama-vid/llama-vid-vicuna-7b-short
等待加载模型的过程结束,直到你看到"Uvicorn running on ..."。现在,刷新你的 Gradio Web 界面,你会在模型列表中看到你刚刚启动的模型。
你可以启动任意数量的工作器,并在同一个 Gradio 界面中比较不同的模型。例如,这里是短视频模型。请保持 --controller
不变,并为每个工作器修改 --port
和 --worker
为不同的端口号。
python -m llamavid.serve.model_worker_short --host 0.0.0.0 --controller http://localhost:10000 --port <与 40000 不同,比如 40001> --worker http://localhost:<相应更改,即 40001> --model-path work_dirs/llama-vid/llama-vid-7b-full-224-video-fps-1
如果你使用的是带有 M1 或 M2 芯片的 Apple 设备,可以使用 --device
标志指定 mps 设备:--device mps
。
启动模型工作器(多 GPU,当 GPU VRAM <= 24GB)
如果你的 GPU 显存小于 24GB(例如 RTX 3090、RTX 4090 等),你可以尝试使用多个 GPU 运行。我们最新的代码库会在你有多个 GPU 的情况下自动尝试使用多个 GPU。你可以使用 CUDA_VISIBLE_DEVICES
指定要使用的 GPU。以下是使用前两个 GPU 运行的示例。
CUDA_VISIBLE_DEVICES=0,1 python -m llamavid.serve.model_worker --host 0.0.0.0 --controller http://localhost:10000 --port 40000 --worker http://localhost:40000 --model-path work_dirs/llama-vid/llama-vid-7b-full-224-long-video
启动模型工作器(4 位、8 位推理,量化)
你可以使用量化位(4 位、8 位)启动模型工作器,这允许你以较低的 GPU 内存占用进行推理。请注意,使用量化位进行推理可能不如全精度模型准确。只需在你正在执行的模型工作器命令中添加 --load-4bit
或 --load-8bit
。以下是使用 4 位量化运行的示例。
python -m llamavid.serve.model_worker --host 0.0.0.0 --controller http://localhost:10000 --port 40000 --worker http://localhost:40000 --model-path work_dirs/llama-vid/llama-vid-7b-full-224-long-video --load-4bit
示例
我们在本节提供了一些示例。更多示例可以在我们的项目页面中找到。
引用
如果你觉得这个仓库对你的研究有用,请考虑引用以下论文
@inproceedings{li2024llamavid,
title={LLaMA-VID: An Image is Worth 2 Tokens in Large Language Models},
author={Li, Yanwei and Wang, Chengyao and Jia, Jiaya},
journal={European Conference on Computer Vision},
year={2024}
}
致谢
我们要感谢以下仓库的出色工作:
- 本工作基于 LLaVA。
- 本工作使用了来自 Vicuna 的 LLM。
- 本工作使用了来自 InstructBLIP 的预训练权重。
- 我们从 Video-ChatGPT 进行基于视频的评估。
许可证
数据和检查点仅供研究使用,并受此许可限制。它们还受限于遵守LLaVA、LLaMA、Vicuna和GPT-4的许可协议的使用。数据集采用CC BY NC 4.0许可(仅允许非商业用途),使用该数据集训练的模型不应用于研究目的以外的用途。