Elastic
Jina AI
Models
API
keyboard_arrow_down
Reader
Convert any URL to Markdown for better grounding LLMs.
Embeddings
Multimodal multilingual embeddings.
Reranker
Reranker for maximizing search relevance.
MCP
terminal
CLI
article
llms.txt
smart_toy
Agents
data_object
Schema
menu_book
Docs
Log in
login
Model and training
Results
Getting started
Conclusion
star
Featured
Press release
September 14, 2026

jina-ocr-v1: Faster Document Parsing on Low-Budget GPUs

jina-ocr-v1 is a vision language model with 3.4B parameters and 570M active parameters, scoring 91.1 on OmniDocBench v1.6 and 83.4 on olmOCR-Bench.
jina-ocr-v1
Jina AI
Jina AI • 9 minutes read
Jina-OCR-v1: Efficient Document Parsing with Speculative Decoding and Dense Verifiable Rewards
We present Jina-OCR-v1, an end-to-end document parsing model built to serve on low-budget GPUs. It combines the compressed-vision encoder and the 3B mixture-of-experts decoder of DeepSeek-OCR, which activates about 570M parameters per token, with a FastMTP speculative decoding head that shares a single draft block recursively across K=3 prediction steps. Greedy verification makes decoding lossless. Post-training combines instruction alignment, robustness fine-tuning on difficult documents, and GRPO under dense verifiable rewards: deterministic formula, table, and structural checks that award partial credit. The training data mixes cleaned public corpora with targeted synthetic pages. At the default dynamic-resolution setting, Jina-OCR-v1 scores 91.14 on OmniDocBench v1.6 and 83.4 on olmOCR-Bench, and reaches the highest page throughput in our comparison at 2.57 pages per second. On a low-budget GPU such as the NVIDIA L4, FastMTP doubles decoding speed over greedy autoregressive decoding. The model is publicly available at https://huggingface.co/jinaai/jina-ocr-v1.
arXiv.orgAlejandro Barón García

We release jina-ocr-v1, a 3.4B-parameter document parser with about 570M active decoder parameters per token. It scores 91.14 on OmniDocBench v1.6 and 83.4 on olmOCR-Bench, and at 2.57 pages per second it has the highest page throughput of the fourteen systems we measured. On an NVIDIA L4 its speculative decoding head nearly doubles decoding speed while keeping decoding lossless.

The model builds on the compressed-vision encoder and mixture-of-experts decoder of DeepSeek-OCR and adds two things. A FastMTP draft head applies one block recursively for three prediction steps, so draft parameters do not grow with depth. Post-training runs under dense verifiable rewards, where every check is deterministic code against a reference and every check is graded. Against that backbone, post-training adds 7.4 points on olmOCR-Bench and improves every OmniDocBench column.

Three-panel overview of specialized OCR models
Three axes that determine deployment cost. (a) Pixels per visual token, log scale. DeepEncoder maps a 1024x1024 view from 4,096 patches to 256 tokens, giving 3,887 pixels per visual token against 783 to 1,022 for encoders with 28 to 32 px patches. (b) Page throughput on olmOCR-Bench, one A100, concurrency 32. (c) Benchmark overall against active parameters, log scale, with the solid line joining the Pareto-optimal systems. jina-ocr-v1 lies on both frontiers at 570M active parameters.
Serving efficiency of fourteen OCR systems ranked three ways
The same fourteen systems on olmOCR-Bench, one A100 at concurrency 32, ranked by (a) output tokens per second, (b) output tokens per page, and (c) pages per second, which is the ratio of the first two. Surya OCR 2 leads on tokens per second at 3,760 but emits 3,568 tokens per page and completes 1.05 pages per second. jina-ocr-v1 combines 2,792 tokens per second with 1,085 tokens per page and reaches 2.57.

tagModel and training

Long outputs are what make document parsing expensive to decode. DeepSeek-OCR removed most of that cost with a compressed vision encoder and a compact mixture-of-experts decoder, and jina-ocr-v1 inherits both and targets the autoregressive bottleneck that remains.

Architecture of jina-ocr-v1
Architecture. DeepEncoder and the MoE decoder follow DeepSeek-OCR, and a page yields a 1024x1024 global view of 256 visual tokens plus n local tiles of 100 tokens each. The FastMTP head, in orange, proposes K = 3 tokens from one shared draft block for the decoder to verify.

OCR output is near-deterministic and locally structured, which makes it a favorable workload for speculative decoding. The usual construction attaches one draft head per prediction depth, so draft parameters grow with how far ahead the model looks. FastMTP uses a single dense block applied recursively for K = 3 steps. The verifier checks each proposal greedily and accepts the longest prefix on which draft and verifier agree, so the committed sequence equals the greedy sequence of the verifier and speculation changes only how long the output takes.

ComponentSpecification
Vision encoderDeepEncoder (~380M): SAM (80M) → 16x conv → CLIP-L (300M)
Vision tokens256 @ 1024x1024 (Base); 256+100n, n ≤ 9 (Gundam, ≤ 1,156/page)
DecoderDeepSeek-3B-MoE: 12 layers, d = 1280, 64 routed + 2 shared, top-6
Active / total params~570M / ~3B (decoder); < 1B / ~3.4B (whole model)
Vocabulary129,280
Position limit32,768 (RoPE, θ = 106)
MTP head1 shared dense block, recursive K = 3 steps (FastMTP)

Model specification. The decoder emits Markdown, with tables in HTML and formulas in LaTeX.

Training data draws on public OCR corpora including olmOCR-mix, FinePDFs, LightOnOCR, MMTab and UniMER, plus deliberately hard sources such as Europeana newspapers, Library of Congress transcripts and NARA pension files. A rule-based filter drops degeneration loops and duplicates, and a vision-language pass relabels the hard sources. We also synthesize pages for one specific reason: on natural pages the formula and table reward terms apply to very few samples, so most rollouts carry no structural signal. JinaOCRSynth packs each page with scorable formulas and tables and ships unit tests with it.

Post-training runs supervised alignment, robustness fine-tuning on degraded pages, and GRPO, repeated across the rounds of an outer loop. The GRPO reward is a product of verifiable terms, each computed by deterministic code against a reference transcription.

ComponentSignalRole
ContentNormalized edit distance on mixed LaTeX/HTMLTextual fidelity
FormulaFormula string matchingFormula correctness
TableTEDS, TEDS-S, table edit distanceStructure recovery
Structural validityBrace balance, tag closure, table integrityWell-formedness
Unit testsFraction of olmOCR-style presence, order, math and table tests passedDense feedback
Repetition and formatRepetition penalty, HTML conformanceDegeneration control

Multiplicative reward composition. Most terms carry a floor, since under a product one failed check would remove the gradient from an otherwise correct page. The repetition term has none, because degenerate loops are the failure mode that most readily inflates the content score.

Each round leaves a pool of candidate checkpoints. An agent searches merge configurations under a fixed evaluation budget and scores them with unit-test and edit-distance checks, and errors in the selected merge drive the next round of collection. The draft head is fitted last, on the verifier the loop selects.

tagResults

ModelParamsArXivOldScans-MathTablesOldScansMulti-colLongTinyHdr/FtrBaseOverall
Gemini 3 Flash–80.173.664.645.875.390.327.4––
Qwen3-VL-235B235B/22B88.481.286.749.685.988.933.6––
DeepSeek-OCR3B/570M77.574.577.333.167.383.096.199.376.0
dots.mocr3B85.985.590.748.285.381.694.099.783.9
olmOCR-28B82.982.184.348.384.381.4–99.782.4
LightOnOCR-21B89.685.689.042.284.891.419.799.683.2
chandra-ocr-24B86.989.192.151.182.193.791.499.985.8
<strong>jina-ocr-v1</strong>3B/570M86.182.388.842.685.593.288.799.983.4

olmOCR-Bench. jina-ocr-v1 reaches 83.4 overall, 7.4 points above the DeepSeek-OCR backbone it post-trains and ahead of the 8B olmOCR-2. The Hdr/Ftr column tests text absence and rewards omitting headers and footers, so faithful full-page transcription scores low there.

MethodParamsOverall ↑TextEdit ↓FormulaCDM ↑TableTEDS ↑TableTEDS-S ↑ROEdit ↓
Gemini 3 Flash–92.620.06695.1689.2993.510.172
Qwen3-VL-235B235B/22B89.780.06392.5583.0786.750.166
DeepSeek-OCR-23B/570M90.250.05091.8483.8987.750.144
HunyuanOCR-1.51B94.740.03994.5093.6794.710.129
PaddleOCR-VL-1.60.9B96.340.03397.5394.7697.100.128
<strong>jina-ocr-v1</strong>3B/570M91.140.04693.2884.6889.010.142

OmniDocBench v1.6. jina-ocr-v1 reaches 91.14 at 570M active parameters, ahead of DeepSeek-OCR-2 on every column and ahead of the much larger Qwen3-VL-235B.

tagSpeculative decoding on an L4

ModekOutput tok/s ↑Speedup S ↑Acceptance rateτc ↓
Eager042.71.00x––1.00
Eager164.01.50x82.6%1.831.22
Eager277.91.82x69.1%2.381.30
Eager383.11.95x57.6%2.731.40
Graph0158.31.00x––1.00
Graph1185.61.17x82.9%1.831.56
Graph2183.81.16x69.3%2.382.05
Graph3172.91.09x57.9%2.742.51

FastMTP on olmOCR-Bench, NVIDIA L4, vLLM 0.20.1, batch size 1. τ is the mean number of tokens committed per speculative step including the bonus token, and c = τ/S is the cost of one speculative step in units of one autoregressive step. Measured on a different device from the figures above.

Draft quality does not depend on the execution mode, since τ is 2.73 in eager mode and 2.74 under CUDA graphs at k = 3. The baseline does. CUDA graphs raise autoregressive decoding from 42.7 to 158.3 tokens per second while the overhead of a speculative step stays near 9 ms, so its cost rises from 1.40 to 2.51 autoregressive steps. The gain tracks the cost of the verifier step it replaces, which puts the best depth at k = 3 in eager mode and k = 1 under graphs.

tagGetting started

The quickest way to run it is Jina Reader. Point r.jina.ai at a URL and add one header: Reader fetches the page or PDF, renders it, runs jina-ocr-v1 over the result and hands back Markdown. Nothing to deploy, no image plumbing to write, and the same API key as the rest of the platform.

curl "https://r.jina.ai/https://example.com/document.pdf" \
  -H "Authorization: Bearer $JINA_API_KEY" \
  -H "X-Respond-With: jina-ocr-v1"

Add X-Page to transcribe one page of a multi-page document. Both parameters are in the Reader API editor, where the toggle writes the header for you.

For direct access to the model, the hosted endpoint is OpenAI-compatible and needs only an API key from jina.ai.

curl https://api.jina.ai/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer ***" \
  -d '{
    "model": "jina-ocr-v1",
    "messages": [{
      "role": "user",
      "content": [
        {"type": "text", "text": "Transcribe the provided document image into a clean Markdown format, preserving the natural reading order."},
        {"type": "image_url", "image_url": {"url": "https://example.com/document.png"}}
      ]
    }]
  }'

To serve it yourself, the weights and the custom modeling code ship in one Hugging Face repository loaded with trust_remote_code=True. FastMTP needs vLLM 0.21 or later and a one-time architecture registration before the engine starts.

import sys
from huggingface_hub import snapshot_download
from PIL import Image
from vllm import LLM

sys.path.insert(0, snapshot_download('jinaai/jina-ocr-v1'))
from deepseek_ocr_mtp import DEFAULT_OCR_PROMPT, register, vllm_llm_kwargs, vllm_sampling_params

register()
llm = LLM(**vllm_llm_kwargs('jinaai/jina-ocr-v1',
                            num_speculative_tokens=3,
                            mtp_heads=1,
                            mtp_recursive=True))

image = Image.open('document.png').convert('RGB')
outputs = llm.chat(
    [{'role': 'user', 'content': [{'type': 'image_pil', 'image_pil': image},
                                  {'type': 'text', 'text': DEFAULT_OCR_PROMPT}]}],
    sampling_params=vllm_sampling_params(max_tokens=4096),
)
print(outputs[0].outputs[0].text)

One detail decides whether the speedup appears. The helper registers the head with method="eagle", since FastMTP is trained with recursive hidden-state feedback and the default method="mtp" re-grounds every draft step on the target. The Transformers path runs the MoE decoder alone and ignores the MTP weights.

The model also handles element-level transcription of tables and formulas, captioning, document VQA and key-information extraction, in English and Chinese. Weights are released under CC BY-NC 4.0.

tagConclusion

At 570M active parameters jina-ocr-v1 lies on the accuracy-per-parameter frontier of both benchmarks and has the highest page throughput of the systems we measured. Two levers do that work and neither needs a larger model: a graded reward on every verifiable check, and a draft head trained against the final verifier.

Output length is worth a closer look. Token throughput and page throughput rank systems differently, and output length is independent of parsing quality, so conciseness can be optimized on its own. jina-ocr-v1 has the shortest outputs of any system scoring above 83.

Categories:
star
Featured
Press release
rss_feed

Read more
August 03, 2026 • 11 minutes read
jina-reranker-v3.5: Faster Listwise Reranking with Hybrid Attention and Self-Distillation
Jina AI
May 12, 2026 • 7 minutes read
jina-embeddings-v5-omni: Embeddings for Text, Image, Audio and Video
Jina AI
February 19, 2026 • 7 minutes read
jina-embeddings-v5-text: New SOTA Small Multilingual Embeddings
Jina AI
Abstract digital artwork in black and white, featuring scattered dots forming letters in a halftone effect. The central lette
Current language / theme
Search Foundation
Reader
Embeddings
Reranker
Get Jina API key
Rate Limit
About us
News
Download Jina logo
open_in_new
Download Elastic logo
open_in_new
API Status
Elastic © 2026.SecurityTerms & ConditionsPrivacyManage CookiesDo Not Sell or Share My Personal Information
This website and all associated content, software, products, and services are intended for professional use only. No consumer use is intended or directed.