Skip to content

Commit fabd803

Browse files
author
Ye Shaokai
committed
merge conflict solved
2 parents 1197464 + a602128 commit fabd803

17 files changed

+701
-33
lines changed

.vscode/launch.json

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,12 @@
9090
// "request": "launch",
9191
// "program": "docs/LLaVA_OneVision_Tutorials.py",
9292
// "console": "integratedTerminal",
93-
// "env":{"CUDA_VISIBLE_DEVICES":"0",
94-
// "LD_PRELOAD": "/usr/lib/x86_64-linux-gnu/libffi.so.7"},
93+
// "env":{
94+
// "CUDA_VISIBLE_DEVICES":"0",
95+
// // "HF_HOME": "/mnt/SV_storage/VFM/huggingface",
96+
// // "LD_PRELOAD": "/usr/lib/x86_64-linux-gnu/libffi.so.7"
97+
// },
9598
// "justMyCode": false,
96-
// // "args": [
97-
// // "--run_dir_name", "test",
98-
// // // "--use_big_decoder"
99-
// // ]
10099
// }
101100
// ]
102101
// }

README.md

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,36 @@
33
</p>
44

55
# LLaVA-NeXT: Open Large Multimodal Models
6+
[![Static Badge](https://img.shields.io/badge/llava_video-paper-green)](http://arxiv.org/abs/2410.02713)
67
[![Static Badge](https://img.shields.io/badge/llava_onevision-paper-green)](https://arxiv.org/abs/2408.03326)
78
[![llava_next-blog](https://img.shields.io/badge/llava_next-blog-green)](https://llava-vl.github.io/blog/)
89

910
[![llava_onevision-demo](https://img.shields.io/badge/llava_onevision-demo-red)](https://llava-onevision.lmms-lab.com/)
11+
[![llava_next-video_demo](https://img.shields.io/badge/llava_video-demo-red)](https://huggingface.co/spaces/WildVision/vision-arena)
1012
[![llava_next-interleave_demo](https://img.shields.io/badge/llava_next-interleave_demo-red)](https://huggingface.co/spaces/lmms-lab/LLaVA-NeXT-Interleave-Demo)
11-
[![llava_next-video_demo](https://img.shields.io/badge/llava_next-video_demo-red)](https://huggingface.co/spaces/WildVision/vision-arena)
1213
[![Openbayes Demo](https://img.shields.io/static/v1?label=Demo&message=OpenBayes%E8%B4%9D%E5%BC%8F%E8%AE%A1%E7%AE%97&color=green)](https://openbayes.com/console/public/tutorials/gW0ng9jKXfO)
1314

15+
[![llava_video-checkpoints](https://img.shields.io/badge/llava_video-checkpoints-blue)](https://huggingface.co/collections/lmms-lab/llava-next-video-661e86f5e8dabc3ff793c944)
1416
[![llava_onevision-checkpoints](https://img.shields.io/badge/llava_onevision-checkpoints-blue)](https://huggingface.co/collections/lmms-lab/llava-onevision-66a259c3526e15166d6bba37)
1517
[![llava_next-interleave_checkpoints](https://img.shields.io/badge/llava_next-interleave_checkpoints-blue)](https://huggingface.co/collections/lmms-lab/llava-next-interleave-66763c55c411b340b35873d1)
16-
[![llava_next-video_checkpoints](https://img.shields.io/badge/llava_next-video_checkpoints-blue)](https://huggingface.co/collections/lmms-lab/llava-next-video-661e86f5e8dabc3ff793c944)
1718
[![llava_next-image_checkpoints](https://img.shields.io/badge/llava_next-image_checkpoints-blue)](https://huggingface.co/lmms-lab)
1819

1920
## Release Notes
2021

22+
- **[2024/10/04] 🔥 LLaVA-Video** (formerly LLaVA-NeXT-Video) has undergone a major upgrade! We are excited to release **LLaVA-Video-178K**, a high-quality synthetic dataset for video instruction tuning. This dataset includes:
23+
24+
- 178,510 caption entries
25+
- 960,792 open-ended Q&A pairs
26+
- 196,198 multiple-choice Q&A items
27+
28+
Along with this, we’re also releasing the **LLaVA-Video 7B/72B models**, which deliver competitive performance on the latest video benchmarks, including [Video-MME](https://video-mme.github.io/home_page.html#leaderboard), [LongVideoBench](https://longvideobench.github.io/), and [Dream-1K](https://tarsier-vlm.github.io/).
29+
30+
📄 **Explore more**:
31+
- [LLaVA-Video-178K Dataset](https://huggingface.co/datasets/lmms-lab/LLaVA-Video-178K): Download the dataset.
32+
- [LLaVA-Video Models](https://huggingface.co/collections/lmms-lab/llava-video-661e86f5e8dabc3ff793c944): Access model checkpoints.
33+
- [Paper](http://arxiv.org/abs/2410.02713): Detailed information about LLaVA-Video.
34+
- [LLaVA-Video Documentation](https://github.com/LLaVA-VL/LLaVA-NeXT/blob/main/docs/LLaVA_Video_1003.md): Guidance on training, inference and evaluation.
35+
2136
- [2024/09/13] 🔥 **🚀 [LLaVA-OneVision-Chat](docs/LLaVA_OneVision_Chat.md)**. The new LLaVA-OV-Chat (7B/72B) significantly improves the chat experience of LLaVA-OV. 📄
2237

2338
![](docs/ov_chat_images/chat_results.png)

action/generate_description.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,9 +79,6 @@ def generate_random_mc_conversation(options:list[str], gt_answer_letter, gt_answ
7979
{"from": "gpt", "value": f"{gt_answer_letter}. {gt_answer_name}"}
8080
]
8181

82-
def generate_avion_mc_conversation():
83-
pass
84-
8582

8683
def get_args():
8784
parser = argparse.ArgumentParser(description="For generating VQA for EPIC-KITCHEN")

docs/LLaVA_OneVision_Chat.md

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44

55
### Key Observations:
66

7-
- **Impact of Alignment Learning**: By incorporating alignment learning—whether through human feedback or AI-generated feedback—we've observed a notable improvement in LLaVA-OneVision's chat experience. This progress is reflected in the significant performance gains recorded on both the LLaVA-W and WildVision benchmarks.
8-
- **Success of Self-Generated Feedback**: In LLaVA-OneVision's case, leveraging self-generated feedback data has proven to be a highly effective strategy for enhancing its visual chat capabilities. This approach allows the model to refine its responses autonomously, leading to more natural and coherent conversations.
7+
- **Impact of Preference Learning**: By incorporating alignment learning—whether through human feedback or AI-generated feedback—we've observed a notable improvement in LLaVA-OneVision's chat experience. This progress is reflected in the significant performance gains recorded on both the LLaVA-W and WildVision benchmarks.
8+
- **Success of Self-Generated Feedback**: In LLaVA-OneVision's case, leveraging self-generated feedback data has proven to be a highly effective strategy for enhancing its visual chat capabilities. Specifically, [LLaVA-Critic](https://llava-vl.github.io/blog/2024-10-03-llava-critic/) is a utilized as a generalist evaluator to generate the scoring feedback for preference learning. This approach allows the model to refine its responses autonomously, leading to more natural and coherent conversations.
99

1010
----
1111

@@ -57,7 +57,7 @@ To optimize LLaVA-OneVision’s in-the-wild conversational abilities, we've empl
5757

5858
1. **Human Feedback from [LLaVA-RLHF](https://llava-rlhf.github.io/)**: Real-world human input plays a crucial role in guiding the model toward more intuitive and user-friendly responses.
5959

60-
2. **AI Feedback from LLaVA-OV’s Self-Generated Responses**: Additionally, the AI's own self-generated feedback allows it to continuously improve and adapt, making this a valuable source for iterative learning.
60+
2. **AI Feedback from LLaVA-OV’s Self-Generated Responses**: Additionally, the AI's own self-generated feedback allows it to continuously improve and adapt, making this a valuable source for iterative learning. [LLaVA-Critic](https://llava-vl.github.io/blog/2024-10-03-llava-critic/) is a utilized as a generalist evaluator to generate the scoring feedback for preference learning
6161

6262
By experimenting with either of these two forms of feedback, we've been able to significantly enhance LLaVA-OneVision's conversation capabilities, bringing it closer to achieving seamless visual chat interactions in dynamic, real-world environments.
6363

@@ -76,7 +76,7 @@ For each langauge-image prompt in the dataset, we randomly generate `k = 5` cand
7676

7777
##### Step 2: Scoring and Acquiring Feedback Data
7878

79-
Once the candidate responses are generated, we utilize a feedback source (e.g., the Reward Model from LLaVA-RLHF) to score each of them. The reward model is responsible for evaluating the quality of the responses based on relevance, coherence, and appropriateness in relation to the given image-question pair. From the scored responses, we then select:
79+
Once the candidate responses are generated, we utilize a feedback source (e.g., the reward signals from LLaVA-RLHF or reward signals from LLaVA-Critic) to score each of them. The reward model is responsible for evaluating the quality of the responses based on relevance, coherence, and appropriateness in relation to the given image-question pair. From the scored responses, we then select:
8080

8181
- The **best** response (highest score)
8282
- The **worst** response (lowest score)
@@ -111,7 +111,7 @@ This iterative process is repeated for `N=3` rounds in total, with each round re
111111

112112
------
113113

114-
Stay tuned on how we develop AI feedback for self-improvement LMMs!
114+
Check out on how we develop AI feedback for self-improvement LMMs, using [LLaVA-Critic](https://llava-vl.github.io/blog/2024-10-03-llava-critic/) as a generalist evaluator to generate the scoring feedback for preference learning!
115115

116116
*Contributors to LLaVA-OneVision-Chat: [Tianyi Xiong](https://tyxiong23.github.io/), [Bo Li](https://brianboli.com/), [Dong Guo](https://www.linkedin.com/in/dongguoset/), [Huizhuo Yuan](https://scholar.google.com/citations?user=8foZzX4AAAAJ), [Quanquan Gu](https://web.cs.ucla.edu/~qgu/), [Chunyuan Li](https://scholar.google.com/citations?user=Zd7WmXUAAAAJ)*
117117

@@ -129,6 +129,16 @@ If you find it useful for your research and applications, please cite related pa
129129
year={2024}
130130
}
131131
132+
@article{xiong2024llavacritic,
133+
title={LLaVA-Critic: Learning to Evaluate Multimodal Models},
134+
author={Xiong, Tianyi and Wang, Xiyao and Guo, Dong and Ye, Qinghao and Fan, Haoqi and Gu, Quanquan and Huang, Heng and Li, Chunyuan},
135+
year={2024},
136+
eprint={2410.02712},
137+
archivePrefix={arXiv},
138+
primaryClass={cs.CV},
139+
url={https://arxiv.org/abs/2410.02712},
140+
}
141+
132142
@article{li2024llavaov,
133143
title={Llava-onevision: Easy visual task transfer},
134144
author={Li, Bo and Zhang, Yuanhan and Guo, Dong and Zhang, Renrui and Li, Feng and Zhang, Hao and Zhang, Kaichen and Li, Yanwei and Liu, Ziwei and Li, Chunyuan},

docs/LLaVA_OneVision_Tutorials.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,15 @@
7373

7474
warnings.filterwarnings("ignore")
7575
# Load the OneVision model
76-
pretrained = "lmms-lab/llava-onevision-qwen2-7b-ov"
77-
model_name = "llava_qwen"
76+
# pretrained = "/mnt/SV_storage/VFM/huggingface/hub/models--lmms-lab--llava-onevision-qwen2-0.5b-ov/snapshots/381d9947148efb1e58a577f451c05705ceec666e"
77+
# pretrained = "/mnt/SV_storage/VFM/LLaVA-NeXT/experiments/EK100_quick_config"
78+
# model_base = None
79+
pretrained = "/mnt/SV_storage/VFM/LLaVA-NeXT/experiments/EK100_lora_quick_check"
80+
model_base = "/mnt/SV_storage/VFM/huggingface/hub/models--lmms-lab--llava-onevision-qwen2-0.5b-ov/snapshots/381d9947148efb1e58a577f451c05705ceec666e"
81+
model_name = "lora_llava_qwen"
7882
device = "cuda"
7983
device_map = "auto"
80-
tokenizer, model, image_processor, max_length = load_pretrained_model(pretrained, None, model_name, device_map=device_map, attn_implementation="sdpa")
84+
tokenizer, model, image_processor, max_length = load_pretrained_model(pretrained, model_base, model_name, device_map=device_map, attn_implementation="sdpa")
8185

8286
model.eval()
8387

docs/LLaVA_Video_1003.md

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
# LLaVA Video
2+
3+
## Table of Contents
4+
5+
1. [Model Summary](##model-summary)
6+
2. [Inference](##inference)
7+
3. [Training](##training)
8+
4. [Evaluation](##evaluation-guidance)
9+
6. [Citation](##citation)
10+
11+
## Model Summary
12+
13+
The LLaVA-Video models are 7/72B parameter models trained on [LLaVA-Video-178K](https://huggingface.co/datasets/lmms-lab/LLaVA-Video-178K) and [LLaVA-OneVision Dataset](https://huggingface.co/datasets/lmms-lab/LLaVA-OneVision-Data), based on Qwen2 language model with a context window of 32K tokens.
14+
15+
16+
## Inference
17+
18+
We provide the simple generation process for using our model. For more details, you could refer to [Github](https://github.com/LLaVA-VL/LLaVA-NeXT).
19+
20+
```python
21+
# pip install git+https://github.com/LLaVA-VL/LLaVA-NeXT.git
22+
from llava.model.builder import load_pretrained_model
23+
from llava.mm_utils import get_model_name_from_path, process_images, tokenizer_image_token
24+
from llava.constants import IMAGE_TOKEN_INDEX, DEFAULT_IMAGE_TOKEN, DEFAULT_IM_START_TOKEN, DEFAULT_IM_END_TOKEN, IGNORE_INDEX
25+
from llava.conversation import conv_templates, SeparatorStyle
26+
from PIL import Image
27+
import requests
28+
import copy
29+
import torch
30+
import sys
31+
import warnings
32+
from decord import VideoReader, cpu
33+
import numpy as np
34+
warnings.filterwarnings("ignore")
35+
def load_video(self, video_path, max_frames_num,fps=1,force_sample=False):
36+
if max_frames_num == 0:
37+
return np.zeros((1, 336, 336, 3))
38+
vr = VideoReader(video_path, ctx=cpu(0),num_threads=1)
39+
total_frame_num = len(vr)
40+
video_time = total_frame_num / vr.get_avg_fps()
41+
fps = round(vr.get_avg_fps()/fps)
42+
frame_idx = [i for i in range(0, len(vr), fps)]
43+
frame_time = [i/fps for i in frame_idx]
44+
if len(frame_idx) > max_frames_num or force_sample:
45+
sample_fps = max_frames_num
46+
uniform_sampled_frames = np.linspace(0, total_frame_num - 1, sample_fps, dtype=int)
47+
frame_idx = uniform_sampled_frames.tolist()
48+
frame_time = [i/vr.get_avg_fps() for i in frame_idx]
49+
frame_time = ",".join([f"{i:.2f}s" for i in frame_time])
50+
spare_frames = vr.get_batch(frame_idx).asnumpy()
51+
# import pdb;pdb.set_trace()
52+
return spare_frames,frame_time,video_time
53+
pretrained = "lmms-lab/LLaVA-Video-7B-Qwen2"
54+
model_name = "llava_qwen"
55+
device = "cuda"
56+
device_map = "auto"
57+
tokenizer, model, image_processor, max_length = load_pretrained_model(pretrained, None, model_name, torch_dtype="bfloat16", device_map=device_map) # Add any other thing you want to pass in llava_model_args
58+
model.eval()
59+
video_path = "XXXX"
60+
max_frames_num = "64"
61+
video,frame_time,video_time = load_video(video_path, max_frames_num, 1, force_sample=True)
62+
video = image_processor.preprocess(video, return_tensors="pt")["pixel_values"].cuda().bfloat16()
63+
video = [video]
64+
conv_template = "qwen_1_5" # Make sure you use correct chat template for different models
65+
time_instruciton = f"The video lasts for {video_time:.2f} seconds, and {len(video[0])} frames are uniformly sampled from it. These frames are located at {frame_time}.Please answer the following questions related to this video."
66+
question = DEFAULT_IMAGE_TOKEN + f"{time_instruciton}\nPlease describe this video in detail."
67+
conv = copy.deepcopy(conv_templates[conv_template])
68+
conv.append_message(conv.roles[0], question)
69+
conv.append_message(conv.roles[1], None)
70+
prompt_question = conv.get_prompt()
71+
input_ids = tokenizer_image_token(prompt_question, tokenizer, IMAGE_TOKEN_INDEX, return_tensors="pt").unsqueeze(0).to(device)
72+
cont = model.generate(
73+
input_ids,
74+
images=video,
75+
modalities= ["video"],
76+
do_sample=False,
77+
temperature=0,
78+
max_new_tokens=4096,
79+
)
80+
text_outputs = tokenizer.batch_decode(cont, skip_special_tokens=True)[0].strip()
81+
print(text_outputs)
82+
```
83+
84+
85+
## Training
86+
87+
[[Scripts]](/Users/zhangyuanhan/Desktop/LLaVA-NeXT/scripts/video/train): Start training models on your single-image/multi-image/video data.
88+
89+
90+
## Evaluation Guidance
91+
92+
We use the [lmms-eval](https://github.com/EvolvingLMMs-Lab/lmms-eval) toolkit to evaluate our models. Ensure you have installed the LLaVA-NeXT model files as per the instructions in the main README.md.
93+
94+
Install lmms-eval:
95+
96+
> pip install git+https://github.com/EvolvingLMMs-Lab/lmms-eval.git
97+
98+
### Reproducing Evaluation Results
99+
100+
Our models' evaluation results can be fully reproduced using the lmms-eval toolkit. After installing lmms-eval and llava, you can run the evaluation using the following commands.
101+
102+
Note: These commands require flash-attn. If you prefer not to install it, disable flash-attn by adding `attn_implementation=None` to the `--model_args` parameter.
103+
104+
Important: Different torch versions may cause slight variations in results. By default in `lmms-eval`, the requirement for torch version is set to the latest version. In `llava` repo, the torch version is set to `2.1.2`. Torch version `2.1.2` would be stable for both `llava` and `lmms-eval`
105+
106+
### Evaluating LLaVA-Video on multiple datasets
107+
108+
We recommend the developers and researchers to thoroughly evaluate the models on more datasets to get a comprehensive understanding of their performance in different scenarios. So we provide a comprehensive list of datasets for evaluation, and welcome to incoporate more evaluation tasks. Please refer to the [lmms-eval](https://github.com/EvolvingLMMs-Lab/lmms-eval) for more details.
109+
110+
```bash
111+
# video tasks
112+
accelerate launch --num_processes=8 \
113+
-m lmms_eval \
114+
--model llava_vid \
115+
--model_args pretrained=lmms-lab/LLaVA-Video-7B-Qwen2,conv_template=qwen_1_5,max_frames_num=64,mm_spatial_pool_mode=average \
116+
--tasks activitynetqa,videochatgpt,nextqa_mc_test,egoschema,video_dc499,videmme,videomme_w_subtitle,perceptiontest_val_mc \
117+
--batch_size 1 \
118+
--log_samples \
119+
--log_samples_suffix llava_vid \
120+
--output_path ./logs/
121+
```
122+

llava/model/builder.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,20 @@
2424
from llava.utils import rank0_print
2525

2626

27-
def load_pretrained_model(model_path, model_base, model_name, load_8bit=False, load_4bit=False, device_map="auto", attn_implementation="flash_attention_2", customized_config=None, overwrite_config=None, **kwargs):
27+
def load_pretrained_model(model_path, model_base, model_name, load_8bit=False, load_4bit=False, device_map="auto", torch_dtype="float16",attn_implementation="flash_attention_2", customized_config=None, overwrite_config=None, **kwargs):
2828
kwargs["device_map"] = device_map
2929

3030
if load_8bit:
3131
kwargs["load_in_8bit"] = True
3232
elif load_4bit:
3333
kwargs["load_in_4bit"] = True
3434
kwargs["quantization_config"] = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_compute_dtype=torch.float16, bnb_4bit_use_double_quant=True, bnb_4bit_quant_type="nf4")
35-
else:
35+
elif torch_dtype == "float16":
3636
kwargs["torch_dtype"] = torch.float16
37+
elif torch_dtype == "bfloat16":
38+
kwargs["torch_dtype"] = torch.bfloat16
39+
else:
40+
import pdb;pdb.set_trace()
3741

3842
if customized_config is not None:
3943
kwargs["config"] = customized_config
@@ -67,6 +71,20 @@ def load_pretrained_model(model_path, model_base, model_name, load_8bit=False, l
6771
lora_cfg_pretrained = LlavaMistralConfig.from_pretrained(model_path)
6872
tokenizer = AutoTokenizer.from_pretrained(model_base, use_fast=False)
6973
model = LlavaMistralForCausalLM.from_pretrained(model_base, low_cpu_mem_usage=True, config=lora_cfg_pretrained, attn_implementation=attn_implementation, **kwargs)
74+
75+
elif "qwen" in model_name.lower() or "quyen" in model_name.lower():
76+
77+
tokenizer = AutoTokenizer.from_pretrained(model_base)
78+
if "moe" in model_name.lower() or "A14B" in model_name.lower():
79+
from llava.model.language_model.llava_qwen_moe import LlavaQwenMoeConfig
80+
lora_cfg_pretrained = LlavaQwenMoeConfig.from_pretrained(model_path)
81+
model = LlavaQwenMoeForCausalLM.from_pretrained(model_base, low_cpu_mem_usage=True, attn_implementation=attn_implementation, config=lora_cfg_pretrained, **kwargs)
82+
else:
83+
from llava.model.language_model.llava_qwen import LlavaQwenConfig
84+
lora_cfg_pretrained = LlavaQwenConfig.from_pretrained(model_path)
85+
model = LlavaQwenForCausalLM.from_pretrained(model_base, low_cpu_mem_usage=True, attn_implementation=attn_implementation, config=lora_cfg_pretrained, **kwargs)
86+
87+
7088
elif "gemma" in model_name.lower():
7189
from llava.model.language_model.llava_gemma import LlavaGemmaConfig
7290

0 commit comments

Comments
 (0)