Evidence at a glance

2.57 pages/sA100 throughput · 40GB · concurrency 32
1.95×L4 eager gain · 57.6% acceptance
91.14OmniDocBench · v1.6
4096 → 256Visual compression · patches → visual tokens
570MActive parameters · per token · Top-6
about 6.8GBBF16 weights · research/non-commercial license

The mechanism in one line

InputCompress the visual input

Turn 4,096 patches into 256 visual tokens; add tiles only when the page needs them.

ComputeActivate a subset of experts

Top-6 routing engages about 570M parameters per token.

DecodeDraft, then verify once

FastMTP drafts up to three tokens while greedy verification preserves the output.

Accuracy signals from the same comparison
SystemOmniDocBench v1.6olmOCR-Bench
jina-ocr-v191.1483.4
DeepSeek-OCRNot listed76.0
PaddleOCR-VL-1.696.34Not listed
chandra-ocr-2Not listed85.8
Qwen3-VL-235B89.78Not listed
Fastest testJina Reader ↗

Send a URL to r.jina.ai with X-Respond-With: jina-ocr-v1.

Application pathOpenAI-compatible API ↗

Useful for testing integration, not for proving your GPU cost.

Self-hostHugging Face weights ↗

Requires trust_remote_code=True; FastMTP also needs vLLM 0.21+.

Start with the result: the target is cost per page

First, establish the object. Jina AI, part of Elastic, has released jina-ocr-v1, an end-to-end visual document parser. It targets PDFs, scans, tables, charts, and invoices, returning Markdown in one pass. The public BF16 weights are about 6.8GB and run through Transformers or vLLM. Jina positions the release around low-budget GPUs such as the NVIDIA L4, not merely as another OCR leaderboard entry.

The strongest signal in the source is not a new accuracy crown. It is throughput. On one A100 40 GB at concurrency 32, Jina reports 2.57 pages per second, compared with 1.22 for olmOCR-2 and 0.38 for chandra-ocr-2 in the same comparison. The model emits about 1,085 output tokens per page, which Jina describes as the shortest output among systems scoring above 83. For batch PDFs, invoices, or scans, output length and pages per GPU can affect the bill more directly than another small leaderboard gain.

The low-budget GPU result makes the positioning clearer. On an L4, eager decoding rises from 42.7 to 83.1 tokens per second, with a 57.6% acceptance rate and roughly a 1.95× gain over greedy decoding. With CUDA graphs, the baseline is already faster and K=1 works best, producing about a 1.17× gain. So 1.95× is not a universal multiplier; it belongs to a particular hardware, batch-size, and decoding configuration.

The speed comes from three layers working together

The first layer is the visual input. DeepEncoder compresses a 1,024×1,024 page view from 4,096 image patches into 256 visual tokens. Dense pages can add up to nine local tiles in dynamic-resolution mode, at 100 tokens each, with a page cap of 1,156 visual tokens. Complexity is not free; it is selectively reintroduced where the page needs more detail.

The second layer is the MoE decoder. jina-ocr-v1 keeps the DeepSeek-OCR 3B MoE direction, with 64 routed experts and two shared experts. Top-6 routing activates roughly 570M parameters per token, although all weights still have to remain in memory. The third layer is FastMTP: one dense draft block recursively proposes up to three tokens, and the main decoder verifies them in one pass. The combined effect is broader than one kernel trick: it reduces the visual prefix, the active compute per token, and the number of decoding steps.

Why FastMTP fits OCR particularly well

Speculative decoding usually lets a smaller draft path guess ahead while a larger model verifies the guess. OCR is a good fit because its output is not open-ended prose; page text, table markup, formulas, and formatting tokens have strong local regularities. When the draft is often right, the main decoder can check several tokens at once instead of committing one token per pass. In Jina's K=3 test, the model commits 2.73 tokens per decoding step on average, with a bonus token when all drafts match.

Lossless needs a precise reading here. It means the committed text matches ordinary greedy decoding; it does not mean recognition quality improves. The benefit also does not cover every runtime. The source says the Transformers path ignores the draft weights, while FastMTP requires vLLM 0.21 or later and a one-time registration step. The model card, runtime, and hardware configuration have to be tested together; downloading 6.8GB of BF16 weights does not guarantee the reported throughput.

Training turns “looks right” into checkable errors

The other half of the approach is post-training. Jina combines instruction alignment, robustness tuning on degraded pages, and GRPO with deterministic checks for content, formulas, tables, structural validity, repetition, format, and unit tests. The reward terms are multiplied; structural, unit-test, and format terms have a 0.2 floor, while the table term has a 0.1 floor. One failed check does not erase every other correct signal, while repetition has no floor because loops can inflate a content score.

To make formula and table errors common enough to train against, Jina also builds synthetic pages containing those structures and attaches tests to them. The interesting part is not the GRPO label. It is the decision to turn errors that are easy for humans to overlook but damaging to downstream workflows into repeatable training signals. Document quality is not only whether the page looks familiar; it is also whether a table remains parseable, a formula remains reusable, and the output survives the next tool in the chain.

The leaderboard shows the trade-off, not a universal win

jina-ocr-v1 scores 91.14 on OmniDocBench v1.6 and 83.4 on olmOCR-Bench. Its main advantage is throughput and deployment cost, not every accuracy dimension. In the source comparison, PaddleOCR-VL-1.6 scores 96.34 on OmniDocBench and HunyuanOCR-1.5 scores 94.74; chandra-ocr-2 reaches 85.8 on olmOCR-Bench and dots.mocr 83.9. jina-ocr-v1 is still 7.4 points above the DeepSeek-OCR backbone on olmOCR-Bench, but that supports an efficiency trade-off, not a universal replacement claim.

The practical response is a bounded engineering evaluation. Use a fixed set of real documents and record pages per GPU, output length, table and formula error rates, and FastMTP acceptance on long or complicated pages. If the goal is maximum recognition quality, compare the systems on the same dataset and post-processing chain. If the goal is lower cost per page, include the runtime, license, and complete service path in the calculation.

Three ways to try it, with three different risk profiles

The fastest path is Jina Reader: send a URL to r.jina.ai and set X-Respond-With: jina-ocr-v1; X-Page can transcribe one page from a longer document. The second path is Jina's OpenAI-compatible API, useful for testing how the model fits an existing application. The third is self-hosting: load the weights and custom code from Hugging Face with trust_remote_code=True. FastMTP adds the requirement for vLLM 0.21 or later and a registration step.

The paths carry different costs and evidence. Reader and the hosted API can confirm output shape quickly, but they do not prove unit cost on your GPU. Self-hosting measures the real operating path, while exposing memory, runtime, and license constraints. The easily missed constraint is CC BY-NC 4.0: the public weights are for research and non-commercial use, and commercial deployment requires contacting Jina AI. Running on a low-memory GPU is an entry condition, not a substitute for procurement, compliance, or quality validation.