Neural Metrics · A faster, lighter take on the olmOCR recipe.
Neural Metrics
fork
Reducto's RolmOCR builds on the olmOCR approach with a Qwen2.5-VL backbone, trading some setup complexity for speed and lower memory use - no PDF metadata prompting required.
We use it for: throughput-sensitive batch OCR - head-to-head comparison against olmOCR on our own document mix.
Attribution
This is an unmodified fork of reducto/RolmOCR, created by the Qwen team.
All weights, files and behaviour are identical to upstream — we rehost it so our experiments stay
reproducible and version-pinned. The original license and all credit remain with the Qwen team.
If you want the canonical model, please use the original.
Original model card from reducto/RolmOCR (click to expand)
Earlier this year, the Allen Institute for AI released olmOCR, an open-source tool that performs document OCR using the Qwen2-VL-7B vision language model (VLM). We were excited to see a high-quality, openly available approach to parsing PDFs and other complex documents — and curious to explore what else might be possible using newer foundation models and some lightweight optimizations.
The result is RolmOCR, a drop-in alternative to olmOCR that’s faster, uses less memory, and still performs well on a variety of document types. We're releasing it under Apache 2.0 for anyone to try out, explore, or build on.
New Base Model: We swapped in a more recent version of the existing model (Qwen2.5-VL-7B) as the foundation.
No Metadata inputs: Unlike the original, we don’t use metadata extracted from PDFs. This significantly reduces prompt length, which in turn lowers both processing time and VRAM usage — without hurting accuracy in most cases.
Rotation of training data: About 15% of the training data was rotated to enhance robustness to off-angle documents. We otherwise use the same training set.
Usage
Host your model with vLLM:
bash
1exportVLLM_USE_V1=12vllm serve reducto/RolmOCR
Call the model via openai compatible server:
python
1# HOST YOUR OPENAI COMPATIBLE API WITH THE FOLLOWING COMMAND in VLLM:2# export VLLM_USE_V1=13# vllm serve reducto/RolmOCR 45from openai import OpenAI
6import base64
78client = OpenAI(api_key="123", base_url="http://localhost:8000/v1")910model ="reducto/RolmOCR-7b"1112defencode_image(image_path):13withopen(image_path,"rb")as image_file:14return base64.b64encode(image_file.read()).decode("utf-8")1516defocr_page_with_rolm(img_base64):17 response = client.chat.completions.create(18 model=model,19 messages=[20{21"role":"user",22"content":[23{24"type":"image_url",25"image_url":{"url":f"data:image/png;base64,{img_base64}"},26},27{28"type":"text",29"text":"Return the plain text representation of this document as if you were reading it naturally.\n",30},31],32}33],34 temperature=0.2,35 max_tokens=409636)37return response.choices[0].message.content
3839test_img_path ="path/to/image.png"40img_base64 = encode_image(test_img_path)41print(ocr_page_with_rolm(img_base64))
Limitations
RolmOCR, like other VLM-based OCR solutions, still suffer from hallucination or dropping contents.