Surya OCR 2.5 reports 4.5 pages per second on H100
Surya OCR 2.5 reports 4.5 pages per second on H100, 1.7 times faster than Surya 2. The 689M-parameter model scores 85.9 on OmniParseBench and reports 38-fold fewer repetitive loops on a hard test set.

TL;DR
- Surya OCR 2.5 reaches 4.5 pages per second on one H100, 1.7x Surya 2, according to the launch announcement.
- The 689M-parameter model scores 85.9 on OmniParseBench, the highest among tested open models under 1B parameters in Datalab's comparison.
- Repetitive-output failures fell sharply: the loop test records token-cap hits on 2 of 1,390 requests, versus 38 of 988 for Surya 2 with MTP.
The clever bit is output compression: Datalab's release post credits a larger vocabulary and tighter page format with cutting output tokens per page 2.6-fold. One table-extraction mode now returns an error, because 2.5 does not produce row and column geometry.
H100 throughput
Datalab used one H100 80GB, vLLM 0.25.1, bf16 weights, and 300 pre-rendered document pages for its throughput tests. PDF rendering time is excluded.
At 192 DPI, comparing Surya 2 with multi-token prediction (MTP) against Surya 2.5:
- 32 concurrent requests: 2.72 → 4.52 completed pages/s.
- One request at a time: 0.12 → 0.34 pages/s.
- Median latency at 32 concurrent requests: 9.9 → 6.8 seconds.
- p95 latency at 32 concurrent requests: 26.0 → 11.3 seconds.
The speedup depends heavily on resolution: 2.3x at 96 DPI, 1.7x at 192 DPI, and 1.15x at 300 DPI. Throughput counts only pages that finish before the output-token cap.
Character tokenization
Surya 2.5 also changes how it serializes page structure. Datalab documents these mechanics in the output specification:
- Block headers encode labels and four coordinates as special tokens, with coordinates normalized to 0–1000.
- Tables omit closing tags and represent merged cells through compact attributes and parent/ghost spans.
- The package converts that representation into usable HTML. Raw model output needs
clean_block_htmlorparse_full_page_html;compact.decodealone leaves parent/ghost spans unconverted.
Repetition failures
Datalab measures looping through requests hitting the 12,288-token output cap. Its reported 38x reduction uses rounded percentages; the underlying request counts imply about a 27x reduction.
OmniParseBench
Datalab evaluated 16,288 code-scored pass/fail tests across 2,937 pages in 92 languages using OmniParseBench. The headline score averages text, tables, and layout:
- Overall: 83.3 → 85.9.
- Text: 81.0 → 83.8.
- Tables: 74.3 → 78.3.
- Layout: 94.5 → 95.7.
These accuracy runs enabled full-page regeneration, retrying looping or unparseable pages up to six times before falling back to block-by-block extraction. Regeneration is off by default in the package.
On olmOCR-bench, the overall score rises from 82.8 to 83.7. Old scans remain difficult, improving only from 43.2 to 44.3.
91 languages
Datalab's internal multilingual evaluation covers 36,089 tests spanning text, layout, tables, math, and reading order:
- Overall pass rate: 74.5% → 74.9%. Text accuracy is level; tables improve from 54.5 to 58.1.
- Languages scoring at least 80%: 47 → 52. Languages reaching 90% increase from 15 to 21.
- Gains: Chinese rises from 66.7% to 75.7%; German from 86.1% to 91.6%.
- Regressions: Bengali falls from 61.6% to 55.3%, Russian from 77.8% to 71.7%, and English from 94.3% to 90.3%.
The 74.9% result uses a newer, harder benchmark than the 87.2% reported in the original Surya 2 post.
Table geometry
Full-page OCR returns typed blocks with page positions and reading order. Tables arrive as HTML with colspan and rowspan; equations arrive as LaTeX.
Row and column bounding boxes still require a Surya 2 checkpoint. Under 2.5, surya_table --mode simple returns an error, as documented in the table-recognition interface.
Backends and licensing
The model weights and source code are available through the release links:
Datalab documents the following deployment and licensing details in the model card:
- Default checkpoint:
surya-ocr0.23.0 and later select Surya 2.5, preserving the Surya 2 interface. - NVIDIA: the inference manager starts vLLM in Docker. Surya and vLLM 0.25 pin incompatible OpenCV versions, so a shared Python environment produces a dependency conflict.
- CPU and Apple Silicon: inference runs through
llama.cpp. - Server lifecycle: commands normally start and stop the backend;
--keep_serverlets subsequent commands reuse it. - Licensing: code is Apache 2.0. Weights use modified OpenRAIL-M terms, free for research, personal use, and startups under $5M in funding/revenue; broader commercial use requires separate licensing.
Indra, Surya, and Chandra
Datalab separates three hardware and accuracy targets in the launch thread's model comparison:
- Indra: roughly 1M parameters, CPU-focused and very fast.
- Surya: the consumer-GPU tier, with 689M parameters in this release.
- Chandra: 5B parameters, positioned for accuracy-critical workloads or larger GPUs.