Views
No views yet


pip install "sentence_transformers[image,audio,video]" "transformers>=5.6.0"1import torch
2from sentence_transformers import SentenceTransformer
3
4model = SentenceTransformer(
5 "Haon-Chen/e5-omni-3B",
6 model_kwargs={
7 "torch_dtype": torch.bfloat16,
8 "attn_implementation": "flash_attention_2", # pip install kernels; recommended but not mandatory
9 },
10)
11
12# For video on smaller GPUs, cap the processor up front:
13model[0].processing_kwargs.update({
14 "video": {"max_pixels": 64 * 28 * 28, "do_sample_frames": True, "fps": 1},
15})1example_query = "How to cook Mapo Tofu?"
2example_videos = [
3 "https://huggingface.co/Haon-Chen/e5-omni-3B/resolve/main/assets/mapo_tofu.mp4",
4 "https://huggingface.co/Haon-Chen/e5-omni-3B/resolve/main/assets/zhajiang_noodle.mp4",
5]
6
7query_embedding = model.encode_query(example_query)
8document_embeddings = model.encode_document(example_videos, batch_size=1)
9print(model.similarity(query_embedding, document_embeddings))
10# Video similarities: tensor([[0.5881, 0.5454]])1example_query = "A light piano piece"
2example_audios = [
3 "https://huggingface.co/Haon-Chen/e5-omni-3B/resolve/main/assets/joe_hisaishi_summer.mp3",
4 "https://huggingface.co/Haon-Chen/e5-omni-3B/resolve/main/assets/jay_chou_superman_cant_fly.mp3",
5]
6
7query_embedding = model.encode_query(example_query)
8document_embeddings = model.encode_document(example_audios, batch_size=1)
9print(model.similarity(query_embedding, document_embeddings))
10# Audio similarities: tensor([[0.6981, 0.6028]])1example_query = "How many input modality does Qwen2.5-Omni support?"
2example_images = [
3 "https://huggingface.co/Haon-Chen/e5-omni-3B/resolve/main/assets/qwen2.5omni_hgf.png",
4 "https://huggingface.co/Haon-Chen/e5-omni-3B/resolve/main/assets/llama4_hgf.png",
5]
6
7query_embedding = model.encode_query(example_query)
8document_embeddings = model.encode_document(example_images, batch_size=1)
9print(model.similarity(query_embedding, document_embeddings))
10# Image similarities: tensor([[0.4896, 0.4097]])1example_query = "氧气在空气中占比多少?"
2example_texts = [
3 "空气是指大气层中由不同气体和各类飘浮在其中的固体与液体颗粒(大气颗粒与气溶胶)所组成的气态混合物。地球大气层的空气主要由78.1%的氮气、20.9%氧气、0.9%的氩气和1~4%的水蒸气组成,其成分并不是固定的,随着高度、气压、温度的改变和对流情况不同,局部空气的组成比例也会改变。空气在大气层(特别是对流层)中的流动形成了风和曳流、气旋、龙卷等自然现象,而空气中飘浮的颗粒则形成了云、雾、霾和沙尘暴等短期天气情况。空气在海洋和陆地之间跨区域流动所承载的湿度和热能传导也是水循环和气候变率与变化的关键一环。",
4 "水(化学式:H2O)是一种无机化合物,在常温且无杂质中是无色[1]无味不导电的透明液体,也会通过蒸发产生气态的水蒸气(这种蒸发可以发生在任何温度下,同时取决于与空气接触的表面积和湿度差)。在标准大气压下,水的凝固点是0 °C(32 °F;273 K),沸点是100 °C(212 °F;373 K)。",
5]
6
7query_embedding = model.encode_query(example_query)
8document_embeddings = model.encode_document(example_texts, batch_size=1)
9print(model.similarity(query_embedding, document_embeddings))
10# Text similarities: tensor([[0.7248, 0.6511]])"text", "image", "audio", and "video" keys instead of a single path or string:1documents = [
2 {
3 "text": "A cooking tutorial for Mapo Tofu",
4 "video": "https://huggingface.co/Haon-Chen/e5-omni-3B/resolve/main/assets/mapo_tofu.mp4",
5 },
6 {
7 "image": "https://huggingface.co/Haon-Chen/e5-omni-3B/resolve/main/assets/qwen2.5omni_hgf.png",
8 "audio": "https://huggingface.co/Haon-Chen/e5-omni-3B/resolve/main/assets/joe_hisaishi_summer.mp3",
9 },
10]
11document_embeddings = model.encode_document(documents, batch_size=1)1# Import Library, Load Model and Processor
2import torch
3from transformers import AutoProcessor, Qwen2_5OmniThinkerForConditionalGeneration
4from qwen_omni_utils import process_mm_info
5
6device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
7
8processor = AutoProcessor.from_pretrained("Qwen/Qwen2.5-Omni-3B")
9model = Qwen2_5OmniThinkerForConditionalGeneration.from_pretrained(
10 "Haon-Chen/e5-omni-3B",
11 attn_implementation="flash_attention_2",
12 torch_dtype=torch.bfloat16
13).to(device).eval()
14
15processor.tokenizer.padding_side = "left"
16model.padding_side = "left"
17
18# Function to Encode Message
19def encode_message(message):
20 texts = processor.apply_chat_template(message, tokenize=False, add_generation_prompt=True)[0] + "<|endoftext|>"
21 audio_inputs, image_inputs, video_inputs = process_mm_info(message, use_audio_in_video=True)
22
23 inputs = processor(
24 text=texts,
25 audio=audio_inputs,
26 images=image_inputs,
27 videos=video_inputs,
28 return_tensors="pt",
29 padding="longest",
30 )
31 for k in inputs:
32 inputs[k] = inputs[k].to(device)
33
34 cache_position = torch.arange(0, inputs["input_ids"].shape[1], device=device)
35 inputs = model.prepare_inputs_for_generation(**inputs, use_cache=True, cache_position=cache_position)
36 model_outputs = model(**inputs, return_dict=True, output_hidden_states=True)
37
38 last_hidden_state = model_outputs.hidden_states[-1]
39 reps = last_hidden_state[:, -1]
40 reps = torch.nn.functional.normalize(reps, p=2, dim=-1)
41 return reps1example_query = "Query: How to cook Mapo Tofu?"
2example_video_1 = "https://huggingface.co/Haon-Chen/e5-omni-3B/resolve/main/assets/mapo_tofu.mp4"
3example_video_2 = "https://huggingface.co/Haon-Chen/e5-omni-3B/resolve/main/assets/zhajiang_noodle.mp4"
4query = [{"role": "user", "content": [{"type": "text", "text": example_query}]}]
5video_1 = [{"role": "user", "content": [{"type": "video", "video": example_video_1}]}]
6video_2 = [{"role": "user", "content": [{"type": "video", "video": example_video_2}]}]
7
8sim1 = torch.cosine_similarity(encode_message(query), encode_message(video_1))
9sim2 = torch.cosine_similarity(encode_message(query), encode_message(video_2))
10
11print("Similarities:", sim1.item(), sim2.item())
12# Video similarities: 0.58984375 0.542968751example_query = "Query: A light piano piece"
2example_audio_1 = "https://huggingface.co/Haon-Chen/e5-omni-3B/resolve/main/assets/joe_hisaishi_summer.mp3"
3example_audio_2 = "https://huggingface.co/Haon-Chen/e5-omni-3B/resolve/main/assets/jay_chou_superman_cant_fly.mp3"
4query = [{"role": "user", "content": [{"type": "text", "text": example_query}]}]
5audio_1 = [{"role": "user", "content": [{"type": "audio", "audio": example_audio_1}]}]
6audio_2 = [{"role": "user", "content": [{"type": "audio", "audio": example_audio_2}]}]
7
8sim1 = torch.cosine_similarity(encode_message(query), encode_message(audio_1))
9sim2 = torch.cosine_similarity(encode_message(query), encode_message(audio_2))
10
11print("Similarities:", sim1.item(), sim2.item())
12# Audio similarities: 0.703125 0.61718751example_query = "Query: How many input modality does Qwen2.5-Omni support?"
2example_image_1 = "https://huggingface.co/Haon-Chen/e5-omni-3B/resolve/main/assets/qwen2.5omni_hgf.png"
3example_image_2 = "https://huggingface.co/Haon-Chen/e5-omni-3B/resolve/main/assets/llama4_hgf.png"
4query = [{"role": "user", "content": [{"type": "text", "text": example_query}]}]
5image_1 = [{"role": "user", "content": [{"type": "image", "image": example_image_1}]}]
6image_2 = [{"role": "user", "content": [{"type": "image", "image": example_image_2}]}]
7
8sim1 = torch.cosine_similarity(encode_message(query), encode_message(image_1))
9sim2 = torch.cosine_similarity(encode_message(query), encode_message(image_2))
10
11print("Similarities:", sim1.item(), sim2.item())
12# Image similarities: 0.490234375 0.4082031251example_query = "Query: 氧气在空气中占比多少?"
2example_text_1 = "空气是指大气层中由不同气体和各类飘浮在其中的固体与液体颗粒(大气颗粒与气溶胶)所组成的气态混合物。地球大气层的空气主要由78.1%的氮气、20.9%氧气、0.9%的氩气和1~4%的水蒸气组成,其成分并不是固定的,随着高度、气压、温度的改变和对流情况不同,局部空气的组成比例也会改变。空气在大气层(特别是对流层)中的流动形成了风和曳流、气旋、龙卷等自然现象,而空气中飘浮的颗粒则形成了云、雾、霾和沙尘暴等短期天气情况。空气在海洋和陆地之间跨区域流动所承载的湿度和热能传导也是水循环和气候变率与变化的关键一环。"
3example_text_2 = "水(化学式:H2O)是一种无机化合物,在常温且无杂质中是无色[1]无味不导电的透明液体,也会通过蒸发产生气态的水蒸气(这种蒸发可以发生在任何温度下,同时取决于与空气接触的表面积和湿度差)。在标准大气压下,水的凝固点是0 °C(32 °F;273 K),沸点是100 °C(212 °F;373 K)。"
4query = [{"role": "user", "content": [{"type": "text", "text": example_query}]}]
5text_1 = [{"role": "user", "content": [{"type": "text", "text": example_text_1}]}]
6text_2 = [{"role": "user", "content": [{"type": "text", "text": example_text_2}]}]
7
8sim1 = torch.cosine_similarity(encode_message(query), encode_message(text_1))
9sim2 = torch.cosine_similarity(encode_message(query), encode_message(text_2))
10
11print("Similarities:", sim1.item(), sim2.item())
12# Text similarities: 0.7265625 0.652343751@article{chen2026e5omni,
2 title={e5-omni: Explicit Cross-modal Alignment for Omni-modal Embeddings},
3 author={Chen, Haonan and Gao, Sicheng and Radu, Timofte and Tetsuya, Sakai and Dou, Zhicheng},
4 journal={arXiv preprint arXiv:2601.03666},
5 year={2026}
6}