LLaMA-VID 可支持现有框架处理长达一小时的视频,并通过引入额外的上下文 Token 来提升其上限。本代码库基于 LLaVA 构建。
本节提供精选示例。更多示例可参考项目主页。欢迎试用我们的在线演示!
请按照以下说明安装所需包。
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 包含三个部分:编码器和解码器分别用于生成视觉嵌入和文本引导特征;通过定制的 Token 生成策略转换上下文 Token 和内容 Token;通过指令微调释放 LLM 在图像和视频方面的潜力。
以下是我们基于 Stage 1 和 Stage 2 数据(长视频 + Stage 3)全量微调的模型:
| 类型 | 图像尺寸 | 最大 Token | 基础 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 |
以下是仅基于 Stage 1 数据预训练的权重(文本解码器 + 上下文注意力 + 投影器):
| 类型 | 图像尺寸 | 最大 Token | 基础 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 子集,从 ActivityNet 官网 或 video-chatgpt 下载 ActivityNet 数据集。如需执行评估,请从此 链接 下载相应文件。可从 此处 下载 MSVD-QA,从 此处 下载 MSRVTT-QA。
对于长视频微调,请从 MovieNet 下载长视频数据,从 此处 下载镜头检测结果,并从 此处 下载我们构建的长视频 QA 对。预处理前,将镜头检测结果放入 LLaMA-VID-Finetune/movienet/files。
元数据文件请下载以下文件并按照 结构说明 组织。
| 数据文件名 | 大小 |
|---|---|
| blip_laion_cc_sbu_558k.json | 181M |
| llava_v1_5_mix665k.json | 1.03G |
| llava_558k_with_webvid.json | 254 MB |
| llava_v1_5_mix665k_with_video_chatgpt.json | 860 MB |
| llava_v1_5_mix665k_with_video_chatgpt_maxtime_5min.json | 860 MB |
| long_videoqa.json | 260MB |
建议用户从以下链接下载预训练权重: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. 特征对齐阶段:桥接视觉和语言 Token。
2. 指令微调阶段:教会模型遵循多模态指令。
3. 长视频微调阶段:扩展位置嵌入,教会模型处理长达一小时的视频指令。
LLaMA-VID 在 8 张 80GB 显存的 A100 GPU 上训练。如果 GPU 数量较少,可以降低 per_device_train_batch_size 并相应增加 gradient_accumulation_steps。请保持全局批次大小不变:per_device_train_batch_size × gradient_accumulation_steps × 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 和更少的视觉 Token:
bash scripts/image_only/train/stage_1_2_full_v7b_224_grid_4.sh
更多训练脚本请见 scripts/image_only/train。
如需在短视频数据上训练和微调,请运行以下命令(以 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 <movienet 视频路径> \
--files_dir <movienet 文件路径> \ # 从下载的 MovieNet.tar.gz 中提取的文件
--feat_dir <特征输出路径>
然后运行以下命令(以 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。
使用 LLaMA-VID 与图像或视频对话,无需 Gradio 界面,支持多 GPU、4 位和 8 位量化推理。以下为图像或视频推理示例:
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
采用与 LLaVA 类似的 Gradio 界面,为 LLaMA-VID 提供用户友好的交互体验。
启动本地 Gradio 演示,请依次运行以下命令。如需启动多个模型工作节点以比较不同检查点,只需启动一次控制器和 Web 服务器。
python -m llamavid.serve.controller --host 0.0.0.0 --port 10000
python -m llamavid.serve.gradio_web_server --controller http://localhost:10000 --model-list-mode reload
打开屏幕显示的 URL 即可看到 Gradio 界面。模型列表可能为空,启动模型工作节点后会自动更新。
每个工作节点负责 --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 界面即可看到模型。
可启动多个工作节点比较不同模型。保持 --controller 不变,为每个工作节点修改 --port 和 --worker:
python -m llamavid.serve.model_worker_short --host 0.0.0.0 --controller http://localhost:10000 --port <其他端口> --worker http://localhost:<对应端口> --model-path work_dirs/llama-vid/llama-vid-7b-full-224-video-fps-1
Apple M1/M2 芯片用户可通过 --device mps 指定设备。
显存小于 24GB 时,可使用多 GPU。通过 CUDA_VISIBLE_DEVICES 指定 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
附加 --load-4bit 或 --load-8bit 参数:
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、LLaMA、Vicuna 和 GPT-4 的许可协议。数据集采用 CC BY NC 4.0(仅限非商业用途)许可,基于该数据集训练的模型不得用于研究以外的用途。