Model reference · open weights
granite-vision-3.3-embedding is an open-weight embedding model from IBM. granite-vision-3.3-2b-embedding (FP32) weighs 6.0 GB; the smallest configuration that runs it is RTX 3060 12 GB.
For self-hosting, compare this build's requirements below with the GPU you plan to rent.
Summary of the ibm-granite/granite-vision-3.3-2b-embedding model card, 2026-10-01
What it is
| Released by | IBM |
|---|---|
| Released | 2025-06-03 |
| Parameters | 3.0B |
| VRAM | 6.0 GB for the weights |
What it runs on
| Card | Runs | Memory |
|---|---|---|
| RTX 3060 12 GB | fits | 11.6 GB |
| RTX 4060 Ti 16 GB | fits | 15.4 GB |
| RTX 3090 24 GB | fits | 23.4 GB |
| RTX 4090 24 GB | fits | 23.4 GB |
| RTX 5090 32 GB | fits | 31.0 GB |
| L40S 48 GB | fits | 44.0 GB |
| A100 80 GB | fits | 78.2 GB |
| H100 80 GB | fits | 78.1 GB |
| RTX PRO 6000 Blackwell 96 GB | fits | 93.8 GB |
| DGX Spark (GB10) 128 GB unified | fits | 107 GB |
| H200 141 GB | fits | 138 GB |
| B200 180 GB | fits | 176 GB |
From the model card
Model Summary: Granite-vision-3.3-2b-embedding is an efficient embedding model based on granite-vision-3.3-2b. This model is specifically designed for multimodal document retrieval, enabling queries on documents with tables, charts, infographics, and complex layouts. The model generates ColBERT-style multi-vector representations of pages. By removing the need for OCR-based text extractions, granite-vision-3.3-2b-embedding can help simplify and accelerate RAG pipelines.
Evaluations: We evaluated granite-vision-3.3-2b-embedding alongside other top colBERT style multi-modal embedding models in the 1B-4B parameter range using two benchmark: Vidore2 and Real-MM-RAG-Bench which aim to specifically address complex multimodal document retrieval tasks.
| Collection \ Model | ColPali-v1.3 | ColQwen2.5-v0.2 | ColNomic-3b | ColSmolvlm-v0.1 | granite-vision-3.3-2b-embedding |
|---|---|---|---|---|---|
| ESG Restaurant Human | 51.1 | 68.4 | 65.8 | 62.4 | 65.3 |
| Economics Macro Multilingual | 49.9 | 56.5 | 55.4 | 47.4 | 51.2 |
| MIT Biomedical | 59.7 | 63.6 | 63.5 | 58.1 | 61.5 |
| ESG Restaurant Synthetic | 57.0 | 57.4 | 56.6 | 51.1 | 56.6 |
| ESG Restaurant Synthetic Multilingual | 55.7 | 57.4 | 57.2 | 47.6 | 55.7 |
| MIT Biomedical Multilingual | 56.5 | 61.1 | 62.5 | 50.5 | 55.5 |
| Economics Macro | 51.6 | 59.8 | 60.2 | 60.9 | 58.3 |
| Avg (ViDoRe2) | 54.5 | 60.6 | 60.2 | 54.0 | 57.7 |
| Collection \ Model | ColPali-v1.3 | ColQwen2.5-v0.2 | ColNomic-3b | ColSmolvlm-v0.1 | granite-vision-3.3-2b-embedding |
|---|---|---|---|---|---|
| FinReport | 55 | 66 | 78 | 65 | 73 |
| FinSlides | 68 | 79 | 81 | 55 | 79 |
| TechReport | 78 | 86 | 88 | 83 | 87 |
| TechSlides | 90 | 93 | 92 | 91 | 93 |
| Avg (REAL-MM-RAG) | 73 | 81 | 85 | 74 | 83 |
Intended Use: The model is intended to be used in enterprise applications that involve retrieval of visual and text data. In particular, the model is well-suited for multi-modal RAG systems where the knowledge base is composed of complex enterprise documents, such as reports, slides, images, canned doscuments, manuals and more. The model can be used as a standalone retriever, or alongside a text-based retriever.
pip install -q torch torchvision torchaudio
pip install transformers==4.50
Then run the code:
from io import BytesIO
import requests
import torch
from PIL import Image
from transformers import AutoProcessor, AutoModel
from transformers.utils.import_utils import is_flash_attn_2_available
device = "cuda" if torch.cuda.is_available() else "cpu"
model_name = "ibm-granite/granite-vision-3.3-2b-embedding"
model = AutoModel.from_pretrained(
model_name,
trust_remote_code=True,
torch_dtype=torch.float16,
device_map=device,
attn_implementation="flash_attention_2" if is_flash_attn_2_available() else None
).eval()
processor = AutoProcessor.from_pretrained(model_name, trust_remote_code=True)
# ─────────────────────────────────────────────
# Inputs: Image + Text
# ─────────────────────────────────────────────
image_url = "https://huggingface.co/datasets/mishig/sample_images/resolve/main/tiger.jpg"
print("\nFetching image...")
image = Image.open(BytesIO(requests.get(image_url).content)).convert("RGB")
text = "A photo of a tiger"
print(f"Image and text inputs ready.")
# Process both inputs
print("Processing inputs...")
image_inputs = processor.process_images([image])
text_inputs = processor.process_queries([text])
# Move to correct device
image_inputs = {k: v.to(device) for k, v in image_inputs.items()}
text_inputs = {k: v.to(device) for k, v in text_inputs.items()}
# ─────────────────────────────────────────────
# Run Inference
# ─────────────────────────────────────────────
with torch.no_grad():
print("🔍 Getting image embedding...")
img_emb = model(**image_inputs)
print("✍️ Getting text embedding...")
txt_emb = model(**text_inputs)
# ─────────────────────────────────────────────
# Score the similarity
# ─────────────────────────────────────────────
print("Scoring similarity...")
similarity = processor.score(txt_emb, img_emb, batch_size=1, device=device)
print("\n" + "=" * 50)
print(f"📊 Similarity between Quoted from the model card on Hugging Face. The full card is behind the Hugging Face link above.