OvisOCR2 (0.8B): first end-to-end model to top OmniDocBench - I threw 827 real scanned medical docs at it, here's everything I learned

Reddit r/LocalLLaMA Models

Summary

OvisOCR2 is a 0.8B end-to-end document-parsing VLM that tops the OmniDocBench leaderboard, outperforming pipeline OCR systems on real-world scanned medical documents with higher accuracy and efficiency.

What it is: ATH-MaaS/OvisOCR2 - a 0.8B document-parsing VLM post-trained from Qwen3.5-0.8B (SFT + RL + OPD), Apache 2.0, runs on vLLM 0.22.1. One prompt per page image -> complete markdown (HTML tables, LaTeX formulas, bbox stubs for figures). It scores 96.58 on OmniDocBench v1.6, and it's the first end-to-end model to top that leaderboard - everything above it until now was a pipeline. Why that matters: pipeline OCR (layout detector -> crop regions -> OCR each region -> reassemble) fails at the layout stage: if the detector misses a region, that text is silently gone. End-to-end has no layout stage to fail. It also means: one model, one serving stack, no glue config. My test: 827 real scanned documents vs a pipeline OCR I compared it against a GLM-OCR (0.9B pipeline) deployment on 827 real-world scanned medical letters (dense print, tables, faxes, terrible scans), scoring both against Gemini 3.5 Flash transcriptions as pseudo-ground-truth (word-level F1, ~780 docs with references): metric Pipeline (GLM-OCR) OvisOCR2 mean F1 0.908 0.947 median F1 0.942 0.971 p10 F1 (the tail!) 0.810 0.898 head-to-head wins 41 503 (236 ties) The tail is the story: Ovis's 10th percentile ~ the pipeline's median. Every doc where the pipeline lost badly was a layout-detector miss. Throughput on a single RTX 5090 (vLLM 0.22.1) 150 DPI renders, temperature 0, max_tokens 4096: concurrency pages/min p50 latency 8 304 1.6 s 16 427 2.2 s 32 590 3.0 s 64 550 5.7 s 96 535 8.7 s The elbow is cc=32 (~0.10 GPU-s/page). Past it, throughput declines and latency scales with queue depth. Where the limits are: single-request latency is decode-bound (~76% of page time; ~570 tok/s single-stream - classic small-model weight-read wall), but saturated throughput is prefill-bound: a page is ~2.3k image tokens vs ~600 output tokens, so ~4 of every 5 tokens the GPU touches are prefill. KV cache never crossed ~11% - VRAM is completely irrelevant for this model; a 16 GB card fits it fine, it'll just be proportionally slower (compute + bandwidth bound, not memory bound). DPI findings: 200->150 DPI = +50% throughput, zero F1 change (150 is free money). 100 DPI = another +30% but quality tail collapses in a nasty way: table cells fuse (dates merging with addresses, rowspan confusion). If your docs have tables that matter, don't go below 150. Gotchas (learned the hard way) Repetition loops (~0.5% of pages): greedy decode occasionally collapses into 1111111... / O O O O / emoji spam until the token cap. Deterministic, reproducible. Tested mitigations on the failing pages: frequency_penalty 0.3 fixed 5/5, presence_penalty 1.0 4/5, repetition_penalty 1.05-1.1 only 2/5 (!), temp 0.2 didn't help. Recipe: greedy first pass, detect (finish_reason=length OR degenerate tail), retry once with frequency_penalty 0.3. Don't put the penalty on the first pass - it distorts legitimately repetitive content (table columns). Cap max_tokens. One loop page decoding 16k tokens alone at the end of a batch = ~30 s straggler tail. My benchmark numbers swung 383->895 p/min on straggler placement alone until I capped at 4096 (normal pages top out ~800 output tokens; retry uncapped only if the tail is clean text, i.e. a genuinely long page). --mm-processor-cache-gb 0 for OCR workloads. Real pages are unique (0% hit rate), and if you benchmark with repeated images the cache warms up and hands you glorious fake numbers (I "measured" 1,000+ p/min before catching it at 100% MM cache hit). **ninja must be installed** or the --gdn-prefill-backend triton path dies at startup with a bare FileNotFoundError (the GDN linear-attention kernels JIT-compile). Launch command that survived all of the above: vllm serve ATH-MaaS/OvisOCR2 --gpu-memory-utilization 0.9 \ --max-model-len 32768 --gdn-prefill-backend triton \ --mm-processor-cache-gb 0 --disable-uvicorn-access-log Bottom line: on my corpus this 0.8B end-to-end model beat a tuned pipeline on accuracy (especially worst-case), at ~2-4x the per-GPU efficiency, with a dramatically simpler stack. The repetition loops are its one real vice and a detect-and-retry guard fully contains them. Pipeline OCR needs a very good reason now.
Original Article

Similar Articles

ATH-MaaS/OvisOCR2

Hugging Face Models Trending

OvisOCR2 is a compact 0.8B end-to-end model for page-level document parsing, achieving state-of-the-art performance on OmniDocBench and PureDocBench benchmarks.

OvisOCR2 Technical Report

Hugging Face Daily Papers

OvisOCR2 is a 0.8B parameter end-to-end document parsing model that converts document page images to Markdown, achieving state-of-the-art scores on public benchmarks through a combination of supervised fine-tuning, reinforcement learning, and model fusion.

OvisOCR2: a promising 0.8B local document parser

Reddit r/LocalLLaMA

OvisOCR2 is a new 0.8B end-to-end OCR model based on Qwen3.5-0.8B that converts full document pages directly into structured Markdown, including text, tables, formulas, and reading order. It achieves strong benchmark scores and is released under Apache 2.0 with vLLM support.

@berryxia: https://x.com/berryxia/status/2067078380017828205

X AI KOLs Timeline

The author tested the three tiers of PP-OCRv6 models and provided open-source tools for local deployment. They demonstrated performance comparisons of each model on OmniDocBench and real-world scenarios, emphasizing the advantages of lightweight specialized models for OCR tasks.