We are thrilled to release our latest Eagle2 series Vision-Language Model. Open-source Vision-Language Models (VLMs) have made significant strides in narrowing the gap with proprietary models. However, critical details about data strategies and implementation are often missing, limiting reproducibility and innovation. In this project, we focus on VLM post-training from a data-centric perspective, sharing insights into building effective data strategies from scratch. By combining these strategies with robust training recipes and model design, we introduce Eagle2, a family of performant VLMs. Our work aims to empower the open-source community to develop competitive VLMs with transparent processes.
In this repo, we are open-sourcing Eagle2-2B, a lightweight model that achieves remarkable efficiency and speed while maintaining solid performance.
We provide a
inference script to help you quickly start using the model. We support different input types:
1pip install transformers
2pip install flash-attn
1from PIL import Image
2import requests
3from transformers import AutoProcessor, AutoModel
4import torch
5model = AutoModel.from_pretrained("nvidia/Eagle2-1B",trust_remote_code=True, torch_dtype=torch.bfloat16)
6processor = AutoProcessor.from_pretrained("nvidia/Eagle2-1B", trust_remote_code=True, use_fast=True)
7processor.tokenizer.padding_side = "left"
8
9messages = [
10 {
11 "role": "user",
12 "content": [
13 {
14 "type": "image",
15 "image": "https://www.ilankelman.org/stopsigns/australia.jpg",
16 },
17 {"type": "text", "text": "Describe this image."},
18 ],
19 }
20]
21
22text_list = [processor.apply_chat_template(
23 messages, tokenize=False, add_generation_prompt=True
24)]
25image_inputs, video_inputs = processor.process_vision_info(messages)
26inputs = processor(text = text_list, images=image_inputs, videos=video_inputs, return_tensors="pt", padding=True)
27inputs = inputs.to("cuda")
28model = model.to("cuda")
29generated_ids = model.generate(**inputs, max_new_tokens=1024)
30output_text = processor.batch_decode(
31 generated_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False
32)
33print(output_text)
1from PIL import Image
2import requests
3from transformers import AutoProcessor, AutoModel, AutoTokenizer
4import torch
5
6from transformers import TextIteratorStreamer
7import threading
8
9
10model = AutoModel.from_pretrained("nvidia/Eagle2-1B",trust_remote_code=True, attn_implementation='flash_attention_2', torch_dtype=torch.bfloat16)
11tokenizer = AutoTokenizer.from_pretrained("nvidia/Eagle2-1B", trust_remote_code=True, use_fast=True)
12processor = AutoProcessor.from_pretrained("nvidia/Eagle2-1B", trust_remote_code=True, use_fast=True)
13processor.tokenizer.padding_side = "left"
14
15messages = [
16 {
17 "role": "user",
18 "content": [
19 {
20 "type": "image",
21 "image": "https://www.ilankelman.org/stopsigns/australia.jpg",
22 },
23 {"type": "text", "text": "Describe this image."},
24 ],
25 }
26]
27
28text_list = [processor.apply_chat_template(
29 messages, tokenize=False, add_generation_prompt=True
30)]
31image_inputs, video_inputs = processor.process_vision_info(messages)
32inputs = processor(text = text_list, images=image_inputs, videos=video_inputs, return_tensors="pt", padding=True)
33inputs = inputs.to("cuda")
34model = model.to("cuda")
35
36streamer = TextIteratorStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)
37
38generation_kwargs = dict(
39 **inputs,
40 streamer=streamer,
41 max_new_tokens=1024,
42 do_sample=True,
43 top_p=0.95,
44 temperature=0.8
45)
46thread = threading.Thread(target=model.generate, kwargs=generation_kwargs)
47thread.start()
48
49
50for new_text in streamer:
51 print(new_text, end="", flush=True)
1from PIL import Image
2import requests
3from transformers import AutoProcessor, AutoModel
4import torch
5model = AutoModel.from_pretrained("nvidia/Eagle2-1B",trust_remote_code=True, torch_dtype=torch.bfloat16)
6processor = AutoProcessor.from_pretrained("nvidia/Eagle2-1B", trust_remote_code=True, use_fast=True)
7processor.tokenizer.padding_side = "left"
8
9messages = [
10 {
11 "role": "user",
12 "content": [
13 {
14 "type": "image",
15 "image": "https://www.ilankelman.org/stopsigns/australia.jpg",
16 },
17 {
18 "type": "image",
19 "image": "https://www.nvidia.com/content/dam/en-zz/Solutions/about-nvidia/logo-and-brand/01-nvidia-logo-vert-500x200-2c50-d@2x.png",
20 },
21 {"type": "text", "text": "Describe these two images."},
22 ],
23 }
24]
25
26text_list = [processor.apply_chat_template(
27 messages, tokenize=False, add_generation_prompt=True
28)]
29image_inputs, video_inputs = processor.process_vision_info(messages)
30inputs = processor(text = text_list, images=image_inputs, videos=video_inputs, return_tensors="pt", padding=True)
31inputs = inputs.to("cuda")
32model = model.to("cuda")
33generated_ids = model.generate(**inputs, max_new_tokens=1024)
34output_text = processor.batch_decode(
35 generated_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False
36)
37print(output_text)
1
2from PIL import Image
3import requests
4from transformers import AutoProcessor, AutoModel
5import torch
6model = AutoModel.from_pretrained("nvidia/Eagle2-1B",trust_remote_code=True, torch_dtype=torch.bfloat16)
7processor = AutoProcessor.from_pretrained("nvidia/Eagle2-1B", trust_remote_code=True, use_fast=True)
8processor.tokenizer.padding_side = "left"
9
10messages = [
11 {
12 "role": "user",
13 "content": [
14 {
15 "type": "video",
16 "video": "../Eagle2-8B/space_woaudio.mp4",
17 },
18 {"type": "text", "text": "Describe this video."},
19 ],
20 }
21]
22
23text_list = [processor.apply_chat_template(
24 messages, tokenize=False, add_generation_prompt=True
25)]
26image_inputs, video_inputs, video_kwargs = processor.process_vision_info(messages, return_video_kwargs=True)
27
28inputs = processor(text = text_list, images=image_inputs, videos=video_inputs, return_tensors="pt", padding=True, videos_kwargs=video_kwargs)
29inputs = inputs.to("cuda")
30model = model.to("cuda")
31generated_ids = model.generate(**inputs, max_new_tokens=1024)
32output_text = processor.batch_decode(
33 generated_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False
34)
35print(output_text)
36
1from PIL import Image
2import requests
3from transformers import AutoProcessor, AutoModel
4import torch
5model = AutoModel.from_pretrained("nvidia/Eagle2-1B",trust_remote_code=True, torch_dtype=torch.bfloat16)
6processor = AutoProcessor.from_pretrained("nvidia/Eagle2-1B", trust_remote_code=True, use_fast=True)
7processor.tokenizer.padding_side = "left"
8
9messages = [
10 {
11 "role": "user",
12 "content": [
13 {
14 "type": "video",
15 "video": "../Eagle2-8B/space_woaudio.mp4",
16 "nframes": 10,
17 },
18 {
19 "type": "video",
20 "video": "../Eagle2-8B/video_ocr.mp4",
21 "nframes": 10,
22 },
23 {"type": "text", "text": "Describe these two videos respectively."},
24 ],
25 }
26]
27
28text_list = [processor.apply_chat_template(
29 messages, tokenize=False, add_generation_prompt=True
30)]
31image_inputs, video_inputs, video_kwargs = processor.process_vision_info(messages, return_video_kwargs=True)
32inputs = processor(text = text_list, images=image_inputs, videos=video_inputs, return_tensors="pt", padding=True, videos_kwargs=video_kwargs)
33inputs = inputs.to("cuda")
34model = model.to("cuda")
35generated_ids = model.generate(**inputs, max_new_tokens=1024)
36output_text = processor.batch_decode(
37 generated_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False
38)
39print(output_text)
1from PIL import Image
2import requests
3from transformers import AutoProcessor, AutoModel
4import torch
5model = AutoModel.from_pretrained("nvidia/Eagle2-1B",trust_remote_code=True, torch_dtype=torch.bfloat16)
6processor = AutoProcessor.from_pretrained("nvidia/Eagle2-1B", trust_remote_code=True, use_fast=True)
7processor.tokenizer.padding_side = "left"
8
9messages1 = [
10 {
11 "role": "user",
12 "content": [
13 {
14 "type": "image",
15 "image": "https://www.ilankelman.org/stopsigns/australia.jpg",
16 },
17 {"type": "text", "text": "Describe this image."},
18 ],
19 }
20]
21
22messages2 = [
23 {
24 "role": "user",
25 "content": [
26 {
27 "type": "image",
28 "image": "https://www.nvidia.com/content/dam/en-zz/Solutions/about-nvidia/logo-and-brand/01-nvidia-logo-vert-500x200-2c50-d@2x.png",
29 },
30 {"type": "text", "text": "Describe this image."},
31 ],
32 }
33]
34
35text_list = [processor.apply_chat_template(
36 messages, tokenize=False, add_generation_prompt=True
37) for messages in [messages1, messages2]]
38image_inputs, video_inputs = processor.process_vision_info([messages1, messages2])
39inputs = processor(text = text_list, images=image_inputs, videos=video_inputs, return_tensors="pt", padding=True)
40inputs = inputs.to("cuda")
41model = model.to("cuda")
42generated_ids = model.generate(**inputs, max_new_tokens=1024)
43output_text = processor.batch_decode(
44 generated_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False
45)
46print(output_text)
NVIDIA believes Trustworthy AI is a shared responsibility and we have established policies and practices to enable development for a wide array of AI applications. When downloaded or used in accordance with our terms of service, developers should work with their internal model team to ensure this model meets requirements for the relevant industry and use case and addresses unforeseen product misuse.
Please report security vulnerabilities or NVIDIA AI Concerns
here.