Indra developer reports CPU OCR throughput of 49 pages per second
Vik Paruchuri released Indra, a 1M-parameter OCR model with code and a local viewer. He reports higher OmniParseBench text scores than PaddleOCR and Tesseract, but notes limited handwriting support and no multi-page context.

TL;DR
- CPU-only OCR reaches 49 pages/s in Indra developer Vik Paruchuri's launch announcement, with Datalab's benchmark specifying 32 cores.
- The text-accuracy win depends on extraction mode: the launch comparison uses PDF text-layer extraction plus OCR, while the OCR-only result trails PaddleOCR's text models.
- Code, weights, and a local testing app are available through the release links and the viewer announcement.
- Handwriting and complex tables remain weak spots, as Paruchuri notes alongside the intended RAG and indexing workloads.
The math models download only when their flag is enabled. About half of upright Arabic and Hebrew pages mistakenly sent through OCR get rotated by the orientation model.
CPU throughput
Datalab released Indra on October 13, reporting throughput measured on an AMD EPYC machine without a GPU. Every engine processed the same 300 OmniParseBench pages, with one single-threaded worker per core; Indra's numbers average three runs.
| CPU cores | Indra pages/s | PaddleOCR PP-OCR pages/s | Tesseract 5 pages/s |
| --- | ---: | ---: | ---: |
| 4 | 7.3 | 0.65 | 0.78 |
| 8 | 14.2 | 1.24 | 1.37 |
| 16 | 27.2 | 2.42 | 2.27 |
| 32 | 49.4 | 4.28 | 2.92 |
The CLI and convert_many dispatch individual pages, so one long PDF can occupy every core. The headline timings exclude model loading and a warm-up page per worker; a 300-page job including loading reaches 37.7 pages/s on 32 cores.
Text-layer benchmark caveat
Indra defaults to reading usable PDF text layers and OCRing missing content. Its 41.3 text score therefore measures the combined extraction pipeline, rather than image recognition alone.
Datalab's OmniParseBench contains 16,288 pass/fail tests across 2,937 pages. The accuracy run gave each engine four x86 vCPUs and processed one page at a time with default settings.
| Engine or mode | Text score | Overall score | Median ms/page |
| --- | ---: | ---: | ---: |
| Indra, text layer + OCR | 41.3 | 62.1 | 228 |
| Indra, OCR only | 33.5 | 57.5 | 303 |
| PaddleOCR PP-OCRv6 small, via RapidOCR | 35.8 | N/A | 2,685 |
| PaddleOCR PP-StructureV3 | 55.6 | 58.4 | 40,958 |
| Tesseract 5 | 19.3 | N/A | 5,496 |
With the text layer disabled, Indra trails PP-OCR by 2.3 text points. PaddleOCR's full PP-StructureV3 pipeline also beats default Indra on text, while losing on the overall score, which averages text, tables, and layout.
PP-StructureV3's row excludes 19 pages after a shard stalled. Faster configurations of the competing engines exist, but Datalab did not score their accuracy in this comparison.
Paruchuri explicitly describes the tiny model as a tradeoff between accuracy and speed.
Layout output
The page output schema exposes more than a text string:
- Lines: bounding boxes in image pixels, recognized text, and confidence.
- Blocks: semantic labels and bounding boxes, returned in reading order.
- Provenance:
text,ocr,hybrid, orerrorfor each page. - Geometry and timing: applied rotation, corrected skew, and per-stage milliseconds.
- Rendered output: Markdown, plain text, or JSON; Markdown tables use HTML.
Page headers and footers are omitted from Markdown by default. --keep-furniture preserves them.
Math mode
With --math, a classifier finds mathematical lines and a second recognizer writes them with inline LaTeX. Datalab's matched-run results expose the cost:
- Text score: 41.4 → 57.5.
- Math tests: 14.3 → 56.5 across 3,252 LaTeX tests.
- Table score: 56.4 → 54.8, because some table-cell numbers are read as math.
- Median latency: roughly 210 → 360 ms on four AMD EPYC Genoa cores.
- Throughput: 44.9 → 29.2 pages/s on 32 cores in the separate math comparison, about 35% lower.
Old scanned math barely improved: 22.2 → 23.1.
Six OCR scripts
The launch claims 60 languages, but image OCR support is organized around six scripts:
- Latin: about 50 languages; Paruchuri confirmed Indonesian support.
- Cyrillic
- Greek
- Devanagari: Paruchuri specified Hindi in a language reply.
- Bengali
- Chinese: simplified and traditional.
Digital PDFs extend coverage through their text layers, including scripts that the recognizers cannot read from images. The repository reports testing 1,125 pages from 75 language families, retaining at least 98% of text-layer characters in every family on pages whose layers passed its checks.
Handwriting and page limits
Indra processes pages independently. Paruchuri confirmed that it does not use multi-page context.
The documented failure cases include:
- Handwriting: unsupported, with roughly 8% on OmniParseBench handwriting tests. Paruchuri attributes the accuracy gap to the model's small size.
- Complex tables: merged cells, wrapped cell text, nested headers, and missing ruling lines can put cells in the wrong rows or columns.
- Degraded scans: roughly 20% on the benchmark's old-scan tests.
- Large pages: pages exceeding 100 megapixels at 200 dpi render at a lower resolution, potentially losing small text; very wide pages also read poorly.
- Vertical text: unsupported, including traditional Chinese newspaper layouts.
Installation and licensing
The package includes the local viewer announced in the release thread:
Indra's runtime footprint is refreshingly small: roughly 18 MB of model downloads, ONNX Runtime, and no PyTorch dependency. The 1M-parameter claim refers specifically to rec.onnx, the main recognizer.
Python 3.10 or newer is required. The viewer keeps files on the local machine and can compare outputs with Tesseract when its optional dependencies and binary are installed.
The code is Apache 2.0, but the model weights use a modified OpenRAIL-M license. The repository's commercial terms describe free research and personal use, plus use by startups under $20 million in funding/revenue; competitive use against Datalab's API is prohibited, and broader commercial licensing is offered separately.