In this categoryLocal AI · 59
More guides
Local AIIntermediate

How to Run Indra OCR Locally: a 1M-Parameter CPU Model That Hits 49 Pages a Second

Indra OCR is an open-weight document parsing model from Datalab that runs on CPU through ONNX Runtime, no PyTorch and no GPU required. It turns PDFs and images into markdown, plain text or JSON with layout boxes, and on Datalab's own benchmark it processes about 49 pages a second at 32 cores.

7 minIntermediate

Indra OCR is an open-weight document parsing model from Datalab that runs on CPU through ONNX Runtime, no PyTorch and no GPU required. It turns PDFs and images into markdown, plain text or JSON with layout boxes, and on Datalab's own benchmark it processes about 49 pages a second at 32 cores.

Written by Priya Raghunathan, local-AI hardware reviewer. I check parameter counts, licenses and benchmark numbers against the primary source before recommending an install path.

Indra OCR entered the top 20 of Hugging Face's overall trending list. At time of writing it has 218 likes and 2,433 downloads on the datalab-to/indra-ocr model page, released October 10, 2026, under a modified OpenRAIL-M license. Its companion benchmark repo, datalab-to/omni_parse_bench, has 21 stars on GitHub. The most-liked Space linking to it is tardellirs/model-pulse (237 likes), a Hub-wide stats dashboard rather than a demo of the model itself.

Specs at a glance

FieldValue
PublisherDatalab (datalab-to)
PipelineImage-to-text: PDFs and images in, markdown, text or JSON out
ParametersAbout 1.24 million total (1,236,366 F32, per the HF API's safetensors metadata); the model card describes the main recognizer, rec.onnx, as roughly 1M params on its own
RuntimeONNX Runtime, no PyTorch required
Model size on diskAbout 18 MB
Throughput49.4 pages/s at 32 cores on the OmniParseBench test set (x86, no GPU)
LicenseCode: Apache 2.0. Model weights: modified OpenRAIL-M
Release dateOctober 10, 2026
GitHub stars21 (datalab-to/omni_parse_bench)

What it actually does

Indra OCR converts PDFs and images into markdown, plain text or structured JSON. For scanned pages and photos it runs its own OCR models; for digital PDFs it reads the PDF's existing text layer directly and only falls back to OCR on the parts that layer is missing, such as text baked into an image. Every output line and layout block comes with a bounding box and a label (heading, list, table, caption, footnote, page header and so on), and the whole page comes back in reading order rather than raw position order. The whole thing ships as a handful of small ONNX models, about 18 MB total, which is why it starts up fast and runs on a laptop CPU instead of needing a GPU.

A speed-first model, not Datalab's most accurate one
Datalab also publishes Chandra, a larger model aimed at handwriting, math and badly degraded scans, through their hosted platform. Indra OCR is the fast, small, CPU-only option for clean print; reach for Chandra or a similar heavier model when accuracy on hard documents matters more than throughput.

Benchmarks: how it stacks up against Tesseract and PaddleOCR

Datalab tested Indra OCR against Tesseract 5 and two PaddleOCR configurations on OmniParseBench, a 2,937-page, 16,288-test benchmark they maintain. Every engine ran on the same x86 machine with 4 vCPUs, one page at a time, on the same pages. The headline score is the mean of the text, tables and layout sub-scores.

EngineHeadlineTextTablesLayoutMedian ms/page
Indra OCR (auto mode)62.141.356.488.6228
Indra OCR (OCR only)57.533.550.988.2303
PaddleOCR PP-OCRv6 small (text only)not scored35.80.0not scored2,685
PaddleOCR PP-StructureV358.455.647.871.740,958
Tesseract 5not scored19.30.0not scored5,496

Two things stand out. PP-StructureV3 actually reads plain text more accurately than Indra OCR's default mode (55.6 versus 41.3), but it takes about 180 times as long per page to do it. And turning on Indra OCR's optional math mode with the --math flag closes most of that gap: text accuracy jumps to 57.5 and the headline score to 66.8, at roughly 71 to 73 percent more time per page (360 ms versus 208 to 210 ms per page in Datalab's single-page timing runs). The tradeoff is explicit and dial-able, which is unusual for a model this small.

Throughput by core count

Indra OCR runs one single-threaded worker process per CPU core, so a single long PDF uses every core you give it. Datalab measured pages-per-second across 4, 8, 16 and 32 cores on the same 300-page test set.

CoresIndra OCRPaddleOCR PP-OCRv6 smallTesseract 5PaddleOCR PP-StructureV3
47.30.650.78≤ 0.022
814.21.241.37≤ 0.044
1627.22.422.27≤ 0.089
3249.44.282.92≤ 0.18

At 32 cores, Datalab's numbers put Indra OCR at about 11.5 times the throughput of PaddleOCR's text-only models, 16.9 times Tesseract 5, and roughly 280 times PP-StructureV3, though that last figure is against an upper bound since PP-StructureV3 ran a time-capped subset of pages. The gap narrows at low core counts, since Indra OCR's per-worker speed matters more there than its scaling behavior.

Install it

Indra OCR installs as a plain Python package. You need Python 3.10 or newer; it pulls in ONNX Runtime, OpenCV and pypdfium2, and nothing that touches PyTorch or CUDA.

bash - install
$pip install indra-ocr
$

The model files, about 18 MB, download from Hugging Face automatically the first time you run the tool and are cached after that. To point at a local copy instead, set the INDRA_OCR_MODEL_DIR environment variable or pass --model-dir on the command line.

Run it from the command line

The CLI covers most jobs without writing any code: single files, whole folders, and three output formats.

bash - cli basics
$indra-ocr paper.pdf
markdown to stdout
$indra-ocr *.pdf --out results/
one .md file per input, uses all cores
$indra-ocr scan.png --format json
lines, boxes, layout blocks and confidences as JSON
$

A few flags worth knowing: --mode controls whether a digital PDF's text layer is trusted (auto, the default, OCRs only where that layer fails its checks; ocr ignores the text layer entirely; text trusts it even when the checks fail). --keep-furniture keeps page headers and footers in the markdown output, which is off by default. --math turns on a second recognizer that reads mathematical notation as LaTeX, at the cost of roughly 71 to 73 percent more time per page. --cores limits how many worker processes it spawns, useful if you don't want it claiming every core on a shared machine.

datalab-to/omni_parse_benchDatalab's document parsing benchmark: the 2,937-page test set and scorer used for every number in this guide.github.com21

Use it from Python

For anything beyond a one-off file, the Python API gives you per-page objects with markdown, plain text lines, layout blocks and timings attached.

parse.py
import indra_ocr

conv = indra_ocr.load(threads=4)
for i, page in conv.convert("paper.pdf"):
    print(page.source, page.timings["total_ms"])
    print(page.markdown)   # headings, lists, tables as HTML
    page.blocks            # layout blocks, in reading order
    page.lines              # Line(box, text, conf), in reading order

For many files at once, convert_many spins up one single-threaded worker process per core and hands back results in input order. On macOS and Windows it needs the usual if __name__ == "__main__": guard, since worker processes re-import the script; skip that guard and it falls back to one process with a warning instead of failing outright.

There's a local viewer, too
Running indra-ocr-viewer opens a web page at localhost:8765 where you can drop in a PDF or image and see the lines, layout boxes and reading order drawn over the page, next to the markdown and JSON output. Files stay on your machine; forward the port over SSH (ssh -N -L 8765:localhost:8765 host) if the model runs on a remote box.

Language coverage

OCR mode, meaning scans and photographed pages, covers Latin script (about 50 languages), Cyrillic, Greek, Devanagari, Bengali, and Chinese in both simplified and traditional form. Digital PDFs are a separate story: Indra OCR reads any script through the PDF's own text layer, and Datalab says it keeps at least 98 percent of that layer's characters across 75 language families they tested, including Arabic, Hebrew, Thai, Japanese, Korean and the Indic scripts, with right-to-left lines kept in right-to-left order. In short, if the source is a digital PDF, language support is wide; if it's a scan or photo, only the languages listed above get OCR'd correctly.

Known limitations

Complex tables with merged cells, multi-line headers or no ruling lines can land in the wrong rows or columns; simple grid tables read fine. Handwriting isn't supported at all, scoring around 8 percent on Datalab's own handwriting tests. Scripts outside the OCR list, including Arabic, Hebrew, Thai and Korean Hangul, only work through a digital PDF's text layer; run them through OCR on a scan and they come out as wrong characters, not an error. Old or low-resolution scans score around 20 percent on Datalab's degraded-scan tests. And pages above 100 megapixels at 200 DPI get rendered at a lower resolution automatically, which can lose small text.

Indra OCR vs TeleOCR

Both are open-weight document parsers, but they're built for opposite ends of the same job. TeleOCR is a 1.42 billion parameter vision-language model that reads both clean digital pages and tilted, camera-photographed documents, and needs a GPU with a few gigabytes of VRAM to run well. Indra OCR is about a thousand times smaller at roughly 1.24 million parameters, runs on CPU alone, and trades some accuracy on hard cases, handwriting, badly warped photos, unusual scripts, for raw speed: 49 pages a second at 32 cores against TeleOCR's GPU-bound inference. Reach for Indra OCR when you're parsing clean PDFs or scans in bulk and don't have a GPU to spare; reach for TeleOCR when the source documents are photographed, distorted or need a model that can also read formulas and tables with higher accuracy.

FAQ

What is Indra OCR?

An open-weight document parsing model from Datalab that converts PDFs and images into markdown, plain text or JSON. It runs on CPU through ONNX Runtime, with no PyTorch or GPU required.

How many parameters does Indra OCR have?

About 1.24 million total, per the safetensors metadata in the Hugging Face API. The model card describes rec.onnx, the main text recognizer, as roughly 1 million parameters on its own, with several smaller models for detection, layout order and script identification alongside it.

Can I use Indra OCR commercially?

The code is Apache 2.0. The model weights use a modified OpenRAIL-M license, which is free for research, personal use, and startups under $20 million in funding or revenue, and cannot be used to compete with Datalab's own API. Read the LICENSE file in the model repo before shipping it in a paid product.

Does it need a GPU?

No. Indra OCR runs entirely on CPU through ONNX Runtime. Datalab's own benchmarks were run on an x86 machine with no GPU involved at all.

Where to go from here

  • Need a model that also handles photographed or tilted pages? Run TeleOCR locally covers a 1.42 billion parameter vision-language model built for that case.
  • Want another self-hosted document parser to compare against? Self-host baidu Unlimited-OCR covers a different open-weight parser.
  • Browse other open OCR and document models: the local AI model directory lets you compare specs side by side.

Local models run better with more VRAM. CompareRTX GPUs on Amazonbefore you upgrade.(affiliate link. We may earn a commission at no extra cost. Disclosure)

Watch related tutorials

Free weekly email

Weekly local AI drops

New models, what runs on your hardware, and the guides to set them up. One email a week, unsubscribe any time.

Tags
#indra ocr#datalab indra ocr#run indra ocr locally#cpu ocr model#fast open source ocr#pdf to markdown ocr