Views
No views yet

transformers library for sentence and image similarity tasks. Make sure you have the latest version of transformers, torch, and Pillow installed.pip install transformers>=4.46.1 torch pillow1import torch
2from transformers import AutoProcessor, AutoConfig, Qwen2VLForConditionalGeneration
3
4# Load the model and tokenizer
5model_id = "Y-J-Ju/SaHa-Qwen2-VL-7B-Instruct"
6
7config = AutoConfig.from_pretrained(model_id, trust_remote_code=True)
8config._attn_implementation = "flash_attention_2"
9config.vision_config._attn_implementation = "flash_attention_2"
10
11model = Qwen2VLForConditionalGeneration.from_pretrained(
12 model_id, torch_dtype=torch.bfloat16, config=config, device_map="cuda:0"
13)
14processor = AutoProcessor.from_pretrained(model_id, trust_remote_code=True,
15 min_pixels=256 * 28 * 28, max_pixels=1280 * 28 * 28)1texts = [
2 "The Tesla Cybertruck is a battery electric pickup truck built by Tesla, Inc. since 2023.",
3 "Korea University",
4]
5images = [
6 'https://upload.wikimedia.org/wikipedia/commons/e/e9/Tesla_Cybertruck_damaged_window.jpg',
7 'https://upload.wikimedia.org/wikipedia/commons/thumb/7/74/Korea_University.jpg/960px-Korea_University.jpg',
8]
9task_instruction = 'Find an image that matches the given text.'
10
11system_prompt = "Given an image, summarize the provided image in one word. Given only text, describe the text in one word."
12represent_prompt = "Represent the given text in one word."
13
14query_form = '<|im_start|>system\n{system_prompt}<|im_end|>\n<|im_start|>user\n{task_instruction}\n{query}\n{represent_prompt}<|im_end|>\n<|im_start|>assistant\n'
15candidate_form = '<|im_start|>system\n{system_prompt}<|im_end|>\n<|im_start|>user\n{cand}<|im_end|>\n<|im_start|>assistant\n'
16
17queries = [
18 query_form.format(system_prompt=system_prompt, task_instruction=task_instruction, query=text, represent_prompt=represent_prompt)
19 for text in texts
20]
21candidates = [
22 candidate_form.format(system_prompt=system_prompt, cand='<|image_pad|>')
23 for _ in images
24]1from PIL import Image
2import io
3from urllib import request
4import torch.nn.functional as F
5
6## Query (Text)
7inputs = processor(text=queries, images=None, return_tensors="pt", padding=True)
8model_input = {k: v if isinstance(v, list) else v.to(model.device) for k, v in inputs.items()}
9outputs = model(**model_input, return_dict=True, output_hidden_states=True)
10hidden_states = outputs.hidden_states[-1]
11query_embed = hidden_states[:,-1]
12
13## Candidate (Image)
14pil_images = [Image.open(io.BytesIO(request.urlopen(url).read())) for url in images]
15inputs = processor(text=candidates, images=pil_images, return_tensors="pt", padding=True)
16model_input = {k: v if isinstance(v, list) else v.to(model.device) for k, v in inputs.items()}
17outputs = model(**model_input, return_dict=True, output_hidden_states=True)
18cand_embed = outputs.hidden_states[-1][:,-1]
19
20query_embed = F.normalize(query_embed, p=2, dim=-1)
21cand_embed = F.normalize(cand_embed, p=2, dim=-1)
22print(query_embed @ cand_embed.T)1tensor([[ 0.3848, -0.0197],
2 [-0.0221, 0.2949]], device='cuda:0', dtype=torch.bfloat16)| Model | Params | Classification | Retrieval | VQA | Grounding | IND | OND | Overall Avg. |
|---|---|---|---|---|---|---|---|---|
| Ours (SaHa-Qwen2-VL-7B) | 8.3B | 69.1 | 74.1 | 67.3 | 88.1 | 76.4 | 67.4 | 72.4 |
1@misc{ju2025generatorembedder,
2 title={From Generator to Embedder: Harnessing Innate Abilities of Multimodal LLMs via Building Zero-Shot Discriminative Embedding Model},
3 author={Yeong-Joon Ju and Seong-Whan Lee},
4 year={2025},
5 eprint={2508.00955},
6 archivePrefix={arXiv},
7 primaryClass={cs.LG},
8 url={https://arxiv.org/abs/2508.00955},
9}