Views
No views yet

1pip install -e .
2pip install flash-attn --no-build-isolation1import torch
2from transformers import AutoModelForCausalLM
3from apollo.mm_utils import (
4 KeywordsStoppingCriteria,
5 tokenizer_mm_token,
6 ApolloMMLoader
7)
8from apollo.conversations import conv_templates, SeparatorStyle
9from apollo.constants import X_TOKEN, X_TOKEN_INDEX
10from huggingface_hub import snapshot_download
11
12# Parameters
13version = "qwen_2"
14model_url = "Apollo-LMMs/Apollo-3B-t32"
15model_path = snapshot_download(model_url, repo_type="model")
16
17video_path = "/your/local/path/video.mp4"
18question = "Describe this video in detail"
19temperature = 0.4
20top_p = 0.7
21max_output_tokens = 256
22
23device = "cuda" if torch.cuda.is_available() else "cpu"
24attn_implementation = "sdpa" if torch.__version__ > "2.1.2" else "eager"
25
26model = AutoModelForCausalLM.from_pretrained(
27 model_path,
28 trust_remote_code=True,
29 low_cpu_mem_usage=True,
30 attn_implementation=attn_implementation,
31).to(device=device, dtype=torch.bfloat16)
32
33tokenizer = model.tokenizer
34vision_processors = model.vision_tower.vision_processor
35config = model.config
36max_length = config.llm_cfg['model_max_length']
37num_repeat_token = config.mm_connector_cfg['num_output_tokens']
38mm_use_im_start_end = config.use_mm_start_end
39
40frames_per_clip = 4
41clip_duration = getattr(config, 'clip_duration')
42
43mm_processor = ApolloMMLoader(
44 vision_processors,
45 clip_duration,
46 frames_per_clip,
47 clip_sampling_ratio=0.65,
48 model_max_length=config.model_max_length,
49 device=device,
50 num_repeat_token=num_repeat_token
51)
52
53model.eval()
54
55mm_data, replace_string = mm_processor.load_video(video_path)
56message = replace_string + "\n\n" + question
57
58conv = conv_templates[version].copy()
59conv.append_message(conv.roles[0], message)
60conv.append_message(conv.roles[1], None)
61prompt = conv.get_prompt()
62
63input_ids = tokenizer_mm_token(prompt, tokenizer, return_tensors="pt").unsqueeze(0).to(device)
64
65pad_token_ids = tokenizer.pad_token_id if tokenizer.pad_token_id is not None else tokenizer.eos_token_id
66stop_str = conv.sep if conv.sep_style != SeparatorStyle.TWO else conv.sep2
67keywords = [stop_str]
68stopping_criteria = KeywordsStoppingCriteria(keywords, tokenizer, input_ids)
69
70with torch.inference_mode():
71 output_ids = model.generate(
72 input_ids,
73 vision_input=[mm_data],
74 data_types=['video'],
75 do_sample=(temperature > 0),
76 temperature=temperature,
77 max_new_tokens=max_output_tokens,
78 top_p=top_p,
79 use_cache=True,
80 num_beams=1,
81 stopping_criteria=[stopping_criteria]
82 )
83
84pred = tokenizer.batch_decode(output_ids, skip_special_tokens=True)[0].strip()
85print(pred)1@article{apollo,
2 title={Apollo: An Exploration of Video Understanding in Large Multimodal Models},
3 author={Orr Zohar, Xiaohan Wang, Yann Dubois, Nikhil Mehta, Tong Xiao, Philippe Hansen-Estruch, Licheng Yu, Xiaofang Wang, Felix Juefei-Xu, Ning Zhang, Serena Yeung-Levy, and Xide Xia},
4 journal={arXiv preprint arXiv:2412.10360},
5 year={2024}
6}