Stiamo rilasciando jina-vlm, un modello di linguaggio visivo con 2,4 miliardi di parametri che raggiunge prestazioni all'avanguardia nel question answering visivo multilingue tra i VLM open source da 2 miliardi di parametri. Combinando un encoder visivo SigLIP2 con un backbone linguistico Qwen3 attraverso un connettore di attention-pooling, jina-vlm offre prestazioni elevate in 29 lingue pur rimanendo sufficientemente efficiente da essere eseguito su hardware consumer.
| Model | Size | VQA Avg | MMMB | Multi. MMB | DocVQA | OCRBench |
|---|---|---|---|---|---|---|
| jina-vlm | 2.4B | 72.3 | 78.8 | 74.3 | 90.6 | 778 |
| Qwen2-VL-2B | 2.1B | 66.4 | 71.3 | 69.4 | 89.2 | 809 |
| Qwen3-VL-2B | 2.8B | 71.6 | 75.0 | 72.3 | 92.3 | 858 |
| InternVL3-2B | 2.2B | 69.2 | 73.6 | 71.9 | 87.4 | 835 |
| InternVL3.5-2B | 2.2B | 71.6 | 74.6 | 70.9 | 88.5 | 836 |





tagArchitettura
Due sfide hanno limitato l'implementazione pratica dei VLM: le capacità multilingue spesso si degradano durante l'adattamento alla visione e i VLM di alta qualità rimangono costosi dal punto di vista computazionale. jina-vlm affronta entrambi i problemi attraverso scelte architetturali oculate (il nostro connettore di attention-pooling riduce i token visivi di 4× con un impatto minimo sulle prestazioni) e una ricetta di addestramento che preserva esplicitamente le capacità multilingue.
L'innovazione architetturale chiave è il nostro connettore visione-linguaggio. Invece di passare tutti i 729 token visivi per riquadro al modello linguistico, applichiamo un attention pooling 2×2 che lo riduce a 182 token: una riduzione di 4× con una perdita di informazioni minima. Il connettore funziona come segue:
- Fusione di caratteristiche multistrato: concatena le caratteristiche dai livelli ViT 18 e 24 (terzultimo e nono dall'ultimo), catturando sia i dettagli spaziali a grana fine sia la semantica di alto livello.
- Attention pooling: per ogni quartiere di patch 2×2, calcola una query come la media delle caratteristiche del quartiere, quindi applica l'attenzione incrociata per produrre una singola rappresentazione in pool.
- Proiezione SwiGLU: le caratteristiche in pool vengono proiettate sulla dimensione del modello linguistico tramite un'unità lineare gated.
Questo guadagno di efficienza è descritto di seguito:
| Metric | No Pooling | With Pooling | Reduction |
|---|---|---|---|
| Visual tokens (12 tiles + thumbnail) | 9,477 | 2,366 | 4.0× |
| LLM prefill FLOPs | 27.2 TFLOPs | 6.9 TFLOPs | 3.9× |
| KV-cache memory | 2.12 GB | 0.53 GB | 4.0× |
Poiché il ViT elabora ogni riquadro in modo identico indipendentemente dal pooling, questi risparmi si applicano esclusivamente al modello linguistico, che è il costo dominante durante l'inferenza.
tagProcedura di addestramento
Una modalità di errore comune nell'addestramento VLM è la dimenticanza catastrofica: il modello linguistico perde le sue capacità di solo testo man mano che si adatta agli input visivi. Ciò è particolarmente acuto per i modelli multilingue, in cui l'adattamento alla visione può degradare le prestazioni nelle lingue non inglesi.
Affrontiamo questo problema attraverso una pipeline di addestramento in due fasi con dati multilingue espliciti e conservazione del solo testo.
Fase 1: addestramento all'allineamento
La prima fase si concentra sul grounding semantico cross-linguistico utilizzando set di dati di didascalie che coprono diversi domini visivi: scene naturali, documenti, infografiche e diagrammi. Fondamentalmente, includiamo il 15% di dati di solo testo per mantenere la comprensione del linguaggio del backbone. Il connettore utilizza un tasso di apprendimento più elevato (2e-4) e un warmup più breve rispetto all'encoder e al decoder, consentendogli di adattarsi rapidamente mentre i componenti pre-addestrati cambiano gradualmente.
Fase 2: fine-tuning delle istruzioni
La seconda fase addestra il modello a seguire le istruzioni per attività di VQA e di ragionamento. Combiniamo dataset pubblici che coprono VQA accademico, comprensione di documenti, OCR, matematica e ragionamento, con dati di istruzioni solo testuali per mantenere le capacità linguistiche.
I dati combinati comprendono circa 5 milioni di campioni multimodali e 12 miliardi di token di testo in 29 lingue, con circa la metà in inglese e il resto in cinese, arabo, tedesco, spagnolo, francese, italiano, giapponese, coreano, portoghese, russo, turco, vietnamita, tailandese, indonesiano, hindi, bengali e altre.
tagCome iniziare
tagTramite Jina API
Forniamo un'API compatibile con OpenAI all'indirizzo https://api-beta-vlm.jina.ai.
tagImmagine da URL
| Formato | Esempio |
|---|---|
| URL HTTP/HTTPS | https://example.com/image.jpg |
| URI dati Base64 | data:image/jpeg;base64,/9j/4AAQ... |
curl https://api-beta-vlm.jina.ai/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $JINA_API_KEY" \
-d '{
"model": "jina-vlm",
"messages": [{
"role": "user",
"content": [
{"type": "text", "text": "Describe this image"},
{"type": "image_url", "image_url": {"url": "https://example.com/photo.jpg"}}
]
}]
}'
Immagine locale (base64)
curl https://api-beta-vlm.jina.ai/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $JINA_API_KEY" \
-d '{
"model": "jina-vlm",
"messages": [{
"role": "user",
"content": [
{"type": "text", "text": "What is in this image?"},
{"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,'$(base64 -i image.jpg)'"}}
]
}]
}'
Query di solo testo
curl https://api-beta-vlm.jina.ai/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $JINA_API_KEY" \
-d '{
"model": "jina-vlm",
"messages": [{"role": "user", "content": "What is the capital of France?"}]
}'
Risposta in streaming
Aggiungi "stream": true per ricevere i token man mano che vengono generati:
curl https://api-beta-vlm.jina.ai/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $JINA_API_KEY" \
-d '{
"model": "jina-vlm",
"stream": true,
"messages": [{"role": "user", "content": "Write a haiku about coding"}]
}'
Quando il servizio è in fase di avvio a freddo, riceverai:
{
"error": {
"message": "Model is loading, please retry in 30-60 seconds. Cold start takes ~30s after the service scales up.",
"code": 503
}
}
È sufficiente riprovare la richiesta dopo aver atteso.
tagTramite CLI
Il repository di HuggingFace include uno script infer.py per esperimenti rapidi:
# Single image
python infer.py -i image.jpg -p "What's in this image?"
# Streaming output
python infer.py -i image.jpg -p "Describe this image" --stream
# Multiple images
python infer.py -i img1.jpg -i img2.jpg -p "Compare these images"
# Text-only
python infer.py -p "What is the capital of France?"tagTramite Transformers
from transformers import AutoModelForCausalLM, AutoProcessor
import torch
from PIL import Image
# Load model and processor
model = AutoModelForCausalLM.from_pretrained(
"jinaai/jina-vlm",
torch_dtype=torch.bfloat16,
trust_remote_code=True,
device_map="auto"
)
processor = AutoProcessor.from_pretrained(
"jinaai/jina-vlm",
trust_remote_code=True
)
# Load an image
image = Image.open("document.png")
# Create the conversation
messages = [
{
"role": "user",
"content": [
{"type": "image", "image": image},
{"type": "text", "text": "What is the main topic of this document?"}
]
}
]
# Process and generate
inputs = processor.apply_chat_template(
messages,
add_generation_prompt=True,
tokenize=True,
return_dict=True,
return_tensors="pt"
).to(model.device)
outputs = model.generate(**inputs, max_new_tokens=256, do_sample=False)
response = processor.decode(outputs[0], skip_special_tokens=True)
print(response)tagConclusione
jina-vlm dimostra che i VLM piccoli possono ottenere una forte comprensione visiva multilingue attraverso scelte architetturali e di addestramento attente. Il connettore di attention-pooling fornisce una riduzione dei token di 4× con un impatto minimo sulle prestazioni e l'incorporazione di dati di solo testo durante l'addestramento multimodale preserva le capacità linguistiche che altrimenti si degraderebbero.
Notiamo diverse limitazioni dell'approccio attuale:
- Overhead di tiling: l'elaborazione scala linearmente con il numero di tile. Per immagini a risoluzione molto alta, questo può diventare significativo. Inoltre, il tiling può compromettere le attività che richiedono una comprensione olistica della scena, come il conteggio degli oggetti o il ragionamento spaziale attraverso i confini delle tile. La miniatura globale mitiga parzialmente questo problema, ma gli approcci a risoluzione nativa potrebbero essere più adatti per tali attività.
- Ragionamento multi-immagine: le prestazioni sui benchmark multi-immagine sono più deboli a causa dei dati di addestramento limitati in questo regime. L'ottimizzazione per risposte visive concise sembra essere in conflitto con il ragionamento multi-step esteso, come evidenziato dal degrado di MMLU-Pro.
Il lavoro futuro potrebbe esplorare una gestione della risoluzione più efficiente, miglioramenti mirati per il conteggio e le attività spaziali e indagare se la nostra ricetta di addestramento multilingue si trasferisce a scale di modelli più grandi.








