Jina AI has released jina-ocr-v1, a 3.4-billion parameter document parser designed to run on low-budget GPUs like the NVIDIA L4. The system processes PDFs, scans, and invoices in a single pass, outputting clean Markdown. It achieves a score of 91.14 on OmniDocBench v1.6 and 83.4 on olmOCR-Bench.
In this article
The model is available for research and non-commercial use under a CC BY-NC 4.0 license. Commercial deployment requires contacting Jina AI directly. The open weights are approximately 6.8 GB in BF16 format and support deployment via Transformers or vLLM.
Architecture and Efficiency
The system post-trains on the DeepSeek-OCR backbone while retaining its two efficiency components. The DeepEncoder module contains roughly 380 million parameters and chains Segment Anything Model (SAM) with a 16x convolutional compressor and CLIP-L. This process converts a 1024×1024 page view from 4,096 patches into 256 visual tokens. A dynamic-resolution mode adds up to nine local tiles at 100 tokens each, capping the total visual tokens per page at 1,156.
The decoder is a DeepSeek-3B-MoE architecture with 12 layers, 64 routed experts, and 2 shared experts. Top-6 routing activates approximately 570 million parameters per token. The position limit is 32,768. Output formats include Markdown for text, HTML for tables, and LaTeX for formulas.
FastMTP Speculative Decoding
OCR output is near-deterministic and locally structured, making it suitable for speculative decoding. Jina AI integrates a FastMTP head: one dense draft block applied recursively for K=3 steps. Draft parameters remain constant as depth increases.
The decoder verifies drafts greedily. It accepts the longest prefix matching its own choices and commits one additional token itself. If all three drafts match, the extra token serves as a bonus. The committed text always equals plain greedy decoding, ensuring the speedup is lossless. At K=3, the model commits an average of 2.73 tokens per step.
Training and Evaluation
Post-training combines instruction alignment, robustness fine-tuning on degraded pages, and Group Relative Policy Optimization (GRPO). Every reward term is deterministic code scored against a reference transcription. Categories include content, formulas, tables, structural validity, unit tests, repetition, and format.
Terms are multiplied and graded so that partly correct pages earn partial credit. Structural, unit-test, and format terms are floored at 0.2, while the table term is floored at 0.1. The repetition term has no floor to prevent loops from inflating the content score.
On natural pages, formula and table rewards apply to few samples. Jina AI therefore built JinaOCRSynth, synthetic pages packed with both, each carrying olmOCR-Bench-style unit tests. An agent merges candidate checkpoints under a fixed evaluation budget. The draft head is trained last, against the frozen final verifier.
Benchmarks and Throughput
| Model | Params as listed in the paper | OmniDocBench v1.6 | olmOCR-Bench |
|---|---|---|---|
| jina-ocr-v1 | 3B/570M | 91.14 | 83.4 |
| DeepSeek-OCR | 3B/570M | not listed | 76.0 |
| DeepSeek-OCR-2 | 3B/570M | 90.25 | not listed |
| PaddleOCR-VL-1.6 | 0.9B | 96.34 | not listed |
| chandra-ocr-2 | 4B | not listed | 85.8 |
| Qwen3-VL-235B | 235B/22B | 89.78 | not listed |
For MoE models, parameters show decoder total and active counts. The whole jina-ocr-v1 model is about 3.4 billion.
The model does not lead on accuracy. PaddleOCR-VL-1.6 and HunyuanOCR-1.5 score 94.74 on OmniDocBench. chandra-ocr-2 and dots.mocr score 83.9 on olmOCR-Bench. Post-training adds 7.4 points over the DeepSeek-OCR backbone on olmOCR-Bench.
Throughput is the main result. On one A100 40 GB at concurrency 32, jina-ocr-v1 parses 2.57 pages per second. That is the highest of 14 systems Jina AI measured, against 1.22 for olmOCR-2 and 0.38 for chandra-ocr-2. It emits 1,085 output tokens per page. Jina AI says that is the shortest output among systems scoring above 83.
On an NVIDIA L4 at batch size 1, eager decoding rises from 42.7 to 83.1 tokens per second. That is a 1.95x speedup at a 57.6% acceptance rate. With CUDA graphs the baseline is already 158.3 tokens per second. There, K=1 works best at 185.6 tokens per second, a 1.17x gain.
Deployment
The quickest route is Jina Reader. Send a URL to r.jina.ai with the header X-Respond-With: jina-ocr-v1. Reader fetches the page or PDF, runs the model and returns Markdown. An X-Page header transcribes one page of a longer document.
Jina AI also hosts an OpenAI-compatible endpoint at https://api.jina.ai/v1/chat/completions. A hosted demo is available for quick tests.
For self-hosting, weights and custom code ship in one repository and load with trust_remote_code=True. FastMTP requires vLLM 0.21 or later and a one-time register() call. The Transformers path runs the MoE decoder alone and ignores the draft weights.
What it means
Developers on constrained hardware now have a parser that processes pages faster than current alternatives without sacrificing accuracy. The integration of speculative decoding means the model processes text at a rate comparable to larger, more expensive systems, reducing the need for high-end GPU clusters to handle document ingestion tasks.




