Skip to content
AI Primer
release

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.

5 min read
Indra developer reports CPU OCR throughput of 49 pages per second
Indra developer reports CPU OCR throughput of 49 pages per second

TL;DR

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, or error for 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:

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.

Further reading

Discussion across the web

Where this story is being discussed, in original context.

On X· 5 threads
TL;DR1 post
Text-layer benchmark caveat1 post
Six OCR scripts2 posts
Handwriting and page limits2 posts
Installation and licensing1 post
Share on X