Views
No views yet





1from llava.constants import DEFAULT_IMAGE_TOKEN, IMAGE_TOKEN_INDEX, DEFAULT_IM_START_TOKEN, DEFAULT_IM_END_TOKEN
2from llava.conversation import conv_templates
3from llava_gp.mm_utils import (
4 get_model_name_from_path,
5 process_images,
6 process_bboxes,
7 tokenizer_image_token,
8)
9from llava_gp.model.builder import load_pretrained_model
10
11# Load model and processor
12base_model = "liuhaotian/llava-v1.5-7b"
13new_modules_dir = "ashun989/GlimpsePrune_LLaVA-1.5-7B"
14device = "cuda:0"
15torch_dtype = torch.bfloat16
16model_name = get_model_name_from_path(base_model)
17llava_model_args = {
18 "attn_implementation": "flash_attention_2",
19 "torch_dtype": torch_dtype,
20}
21tokenizer, model, image_processor, max_length = load_pretrained_model(
22 base_model, None, model_name, device_map=device, **llava_model_args)
23model.load_new_modules(new_modules_dir)
24model.eval()
25conv_mode = "vicuna_v1"
26
27# Prepare image and text inputs
28image_url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/tasks/car.jpg"
29image = Image.open(requests.get(image_url, stream=True).raw)
30query = "What is in the image?"
31
32# Format the conversation for the model
33input_ids = []
34images = []
35image_sizes = []
36grid_h = grid_w = model.get_vision_tower().num_patches_per_side
37if model.config.mm_use_im_start_end:
38 query = DEFAULT_IM_START_TOKEN + DEFAULT_IMAGE_TOKEN + DEFAULT_IM_END_TOKEN + '\n' + query
39else:
40 query = DEFAULT_IMAGE_TOKEN + '\n' + query
41conv = conv_templates[conv_mode].copy()
42conv.append_message(conv.roles[0], query)
43conv.append_message(conv.roles[1], None)
44prompt = conv.get_prompt()
45
46image_tensor = process_images([image], image_processor, model.config)[0]
47input_id = tokenizer_image_token(prompt, tokenizer, IMAGE_TOKEN_INDEX, return_tensors='pt')
48input_ids.append(input_id)
49images.append(image_tensor)
50image_sizes.append(image.size)
51
52input_ids = torch.stack(input_ids, dim=0).to(device=device)
53images = torch.stack(images, dim=0).to(device=device, dtype=torch_dtype)
54
55# Generate response
56generate_ids = model.generate(
57 input_ids=input_ids,
58 images=images,
59 image_sizes=image_sizes,
60 generation_config=generation_config,
61 do_selection=True, # Enable glimpse prune
62 )
63response = tokenizer.batch_decode(generate_ids, skip_special_tokens=True,
64 clean_up_tokenization_spaces=True)[0].strip()
65print(response)1@misc{zeng2025glimpseprune,
2 title={A Glimpse to Compress: Dynamic Visual Token Pruning for Large Vision-Language Models},
3 author={Quan-Sheng Zeng and Yunheng Li and Qilong Wang and Peng-Tao Jiang and Zuxuan Wu and Ming-Ming Cheng and Qibin Hou},
4 year={2025},
5 eprint={2508.01548},
6 archivePrefix={arXiv},
7 primaryClass={cs.CV},
8 url={https://arxiv.org/abs/2508.01548},
9}