Instructions to use Urock-AI/eddy-vl_embedding_v2 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use Urock-AI/eddy-vl_embedding_v2 with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("feature-extraction", model="Urock-AI/eddy-vl_embedding_v2", trust_remote_code=True)# pip install -U transformers accelerate # Load model directly from transformers import AutoProcessor, AutoModel processor = AutoProcessor.from_pretrained("Urock-AI/eddy-vl_embedding_v2", trust_remote_code=True) model = AutoModel.from_pretrained("Urock-AI/eddy-vl_embedding_v2", trust_remote_code=True, device_map="auto") - Notebooks
- Google Colab
- Kaggle
Eddy-VL Embedding v2
Urock-AI · urock.kr · License: Apache 2.0
Eddy-VL Embedding v2 is a multimodal embedding model light enough to run on edge devices. It keeps most of the retrieval quality of WeMM-Embedding-2B in a lighter package — built at Urock-AI Lab for real-world multimodal search over images, video, and documents.
At a glance
- Lighter than WeMM-Embedding-2B. Three linear-attention layers are removed from the Gated DeltaNet stack.
embedding()uses 2.036B parameters instead of 2.213B. On long text, compute is 12% lower. On a max-size image, it is 8.4% lower. - Close to WeMM-Embedding-2B on the same evaluation. Hit@1 reaches 99.7% of WeMM-Embedding-2B on SC, 97.7% on images, 98.5% on visual documents, and 97.4% on video.
- One embedding space for images, video, and documents. The vector is the L2-normalized hidden state at the final
<embedding>token.
BF16 multimodal embedding model. Three linear-attention layers are removed from the Gated DeltaNet stack of tencent/WeMM-Embedding-2B, and the remaining stack is restored by distillation from that model. Softmax attention layers are left in place. WeMM-Embedding-2B is built on Qwen/Qwen3.5-2B, and this model keeps the same hybrid backbone. embedding() returns one L2-normalized vector, taken from the last non-padding token. lm_head is not used for that vector. It stays in the checkpoint so vLLM and SGLang can load the model without a serving error.
Scores
Hit@1. Parentheses are nDCG@5, and they appear only on Image, VisDoc, and Video. Image is the 36-task macro, visual documents the 27-task macro, and video the 18-task macro. SC and ARO are single scores. Both rows come from the same in-house evaluation.
| SC | ARO | Image | VisDoc | Video | |
|---|---|---|---|---|---|
| WeMM-Embedding-2B, in-house | 93.17 | 51.70 | 78.80 (87.34) | 74.62 (78.08) | 63.97 (78.74) |
| this model, in-house | 92.92 | 49.00 | 76.99 (85.87) | 73.49 (77.33) | 62.28 (77.46) |
Against WeMM-Embedding-2B, this model is lower by 0.25 points on SC, 2.70 on ARO, 1.81 on image Hit@1 (1.47 nDCG@5), 1.13 on VisDoc Hit@1 (0.75 nDCG@5), and 1.69 on video Hit@1 (1.28 nDCG@5).
Each ratio below is this model's score divided by the WeMM-Embedding-2B score on the same run. A ratio of 100% would match WeMM-Embedding-2B. Image, VisDoc, and Video use Hit@1. The nDCG@5 ratios are 98.3% for image, 99.0% for VisDoc, and 98.4% for video.
| SC | ARO | Image | VisDoc | Video | |
|---|---|---|---|---|---|
| Kept vs WeMM-Embedding-2B | 99.7% | 94.8% | 97.7% | 98.5% | 97.4% |
MMEB-v2 tasks
Selected MMEB-v2 tasks, listed one by one rather than averaged again. Image and video scores are Hit@1. VisDoc scores are nDCG@5. All four columns come from in-house runs. WeMM-Embedding-2B and this model are from this run. Qwen3-VL-Embedding-2B and Eddy-VL 1.9B v1 are from an earlier in-house run of the same tasks.
Image (Hit@1)
| Task | WeMM-Embedding-2B | this model | Qwen3-VL-Embedding-2B | Eddy-VL 1.9B v1 |
|---|---|---|---|---|
| Visual7W-Pointing | 98.60 | 98.60 | 82.40 | 84.00 |
| RefCOCO | 95.70 | 96.20 | 90.40 | 92.40 |
| DocVQA | 95.30 | 95.00 | 94.70 | 92.40 |
| GQA | 94.20 | 93.20 | 85.90 | 85.50 |
| VOC2007 | 94.00 | 93.90 | 84.90 | 82.70 |
| EDIS | 93.30 | 92.10 | 88.30 | 82.00 |
| RefCOCO-Matching | 92.70 | 93.10 | 93.00 | 91.90 |
| ImageNet-R | 92.40 | 92.50 | 92.50 | 84.40 |
| WebQA | 91.70 | 91.00 | 88.60 | 85.60 |
| TextVQA | 91.50 | 90.80 | 88.30 | 85.00 |
Video (Hit@1)
| Task | WeMM-Embedding-2B | this model | Qwen3-VL-Embedding-2B | Eddy-VL 1.9B v1 |
|---|---|---|---|---|
| UCF101 | 99.30 | 97.20 | 80.10 | 65.00 |
| Something-Something V2 | 91.30 | 89.30 | 68.10 | 59.50 |
| HMDB51 | 88.80 | 84.50 | 71.90 | 60.30 |
| ActivityNetQA | 81.90 | 82.20 | 73.10 | 70.00 |
| NExTQA | 75.97 | 75.19 | 65.52 | 59.77 |
| MSVD | 72.54 | 71.49 | 68.96 | 66.87 |
| QVHighlight | 71.28 | 68.14 | 71.93 | 66.85 |
VisDoc (nDCG@5)
| Task | WeMM-Embedding-2B | this model | Qwen3-VL-Embedding-2B | Eddy-VL 1.9B v1 |
|---|---|---|---|---|
| ViDoRe · Synthetic DocQA (Healthcare) | 98.89 | 98.52 | 95.28 | 93.93 |
| VisRAG · SlideVQA | 96.72 | 96.01 | 93.00 | 91.47 |
| ViDoRe · Synthetic DocQA (AI) | 96.32 | 95.95 | 96.72 | 94.62 |
| ViDoRe · TabFQuAD | 95.70 | 94.89 | 95.11 | 90.02 |
| ViDoRe · Synthetic DocQA (Gov. reports) | 95.47 | 93.48 | 96.45 | 93.81 |
| ViDoRe · Synthetic DocQA (Energy) | 93.91 | 93.89 | 90.28 | 89.94 |
| VisRAG · InfoVQA | 93.73 | 93.19 | 90.25 | 86.61 |
| ViDoRe · InfoVQA | 91.28 | 90.92 | 87.04 | 82.37 |
| VisRAG · ChartQA | 86.77 | 88.82 | 84.26 | 81.01 |
| ViDoSeek · doc | 83.60 | 83.48 | 84.79 | 82.21 |
Qwen3-VL-Embedding-2B and Eddy-VL 1.9B v1
Those two models come from a different family. Eddy-VL 1.9B v1 is distilled from Qwen3-VL-Embedding-2B. This model is distilled from WeMM-Embedding-2B, which keeps the Qwen3.5 hybrid backbone. Their scores in the tables above are from that earlier run.
The bars below count parameters used to produce an embedding. Eddy v1 is 1.93B and Qwen3-VL-Embedding-2B is 2.128B. In those two models, the token embedding and lm_head are one shared matrix, so the published size already counts that matrix once. WeMM is 2.213B and this model is 2.036B. Their lm_head is a separate matrix and is left out of the bar.
Size and compute
In the Gated DeltaNet stack, three linear-attention layers are removed. Softmax attention layers are not removed.
The embedding path does not use lm_head. Removing the three linear-attention layers reduces compute by 12% on long text and by 8.4% on a max-size image. Softmax attention and the vision tower are unchanged.
What is in this repo
| File | Role |
|---|---|
model.safetensors |
BF16 weights, about 4.74 GiB, including lm_head |
config.json |
WeMMEmbedding, trust_remote_code via auto_map |
eddy_vl_embedding_v2.py |
Last non-pad token, then L2 normalization |
eddy_vl_embedding_v2_st.py |
Sentence-Transformers wrapper |
embedding_chat_template.jinja |
Appends the <embedding> token |
tokenizer.json |
Original WeMM tokenizer. It does not truncate at 8192. model_max_length is 262144 |
Not included: optimizer state.
Use
from huggingface_hub import hf_hub_download
from transformers import AutoModel, AutoProcessor
repo = "Urock-AI/eddy-vl_embedding_v2"
model = AutoModel.from_pretrained(repo, trust_remote_code=True, torch_dtype="auto").eval()
processor = AutoProcessor.from_pretrained(repo)
template = open(hf_hub_download(repo, "embedding_chat_template.jinja"), encoding="utf-8").read()
messages = [[
{"role": "system", "content": [{"type": "text", "text": "Represent this input for retrieval."}]},
{"role": "user", "content": [{"type": "text", "text": "a red apple on a table"}]},
]]
text = processor.apply_chat_template(
messages, chat_template=template, add_generation_prompt=False, tokenize=False,
)
batch = processor(text=text, return_tensors="pt", padding=True)
print(model.embedding(**batch).shape) # (1, 2048)
The processor is the original Qwen3VLProcessor. For a video, embedding_chat_template.jinja emits one <|video_pad|> from the frame list. Do not also put <|video_pad|> at the start of the question string.
For SGLang 0.5.9, follow the Serving section of WeMM-Embedding-2B. Run patch_sglang_video.py from that repository, then start the server with --is-embedding and --enable-precise-embedding-interpolation. That patch file is not in this repo. --model-path is this model, Urock-AI/eddy-vl_embedding_v2.
Citation
This model is a derivative of WeMM-Embedding-2B. The weights and code in this repository are released under Apache 2.0. Cite this model, and cite WeMM-Embedding as the base model.
@misc{eddy_vl_embedding_v2,
title = {Eddy-VL Embedding v2},
author = {Urock-AI Lab},
year = {2026},
publisher = {Hugging Face},
howpublished = {\url{https://huggingface.co/Urock-AI/eddy-vl_embedding_v2}}
}
@article{wemm-embedding,
title = {WeMM-Embedding: WeChat Multi-Modal Embedding Technical Report},
author = {Junjie Zhou and Ke Mei and Lei Li and Tianyi Wang and Fengyun Rao and Jing Lyu},
year = {2026}
}
- Downloads last month
- 11