Instructions to use NeuralMetrics/RolmOCR with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use NeuralMetrics/RolmOCR with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("image-text-to-text", model="NeuralMetrics/RolmOCR") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] pipe(text=messages)# Load model directly from transformers import AutoProcessor, AutoModelForMultimodalLM processor = AutoProcessor.from_pretrained("NeuralMetrics/RolmOCR") model = AutoModelForMultimodalLM.from_pretrained("NeuralMetrics/RolmOCR", device_map="auto") messages = [ { "role": "user", "content": [ {"type": "image", "url": "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/p-blog/candy.JPG"}, {"type": "text", "text": "What animal is on the candy?"} ] }, ] inputs = processor.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors="pt", ).to(model.device) outputs = model.generate(**inputs, max_new_tokens=40) print(processor.decode(outputs[0][inputs["input_ids"].shape[-1]:])) - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use NeuralMetrics/RolmOCR with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "NeuralMetrics/RolmOCR" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "NeuralMetrics/RolmOCR", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'Use Docker
docker model run hf.co/NeuralMetrics/RolmOCR
- SGLang
How to use NeuralMetrics/RolmOCR with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "NeuralMetrics/RolmOCR" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "NeuralMetrics/RolmOCR", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "NeuralMetrics/RolmOCR" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "NeuralMetrics/RolmOCR", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Describe this image in one sentence." }, { "type": "image_url", "image_url": { "url": "https://cdn.britannica.com/61/93061-050-99147DCE/Statue-of-Liberty-Island-New-York-Bay.jpg" } } ] } ] }' - Docker Model Runner
How to use NeuralMetrics/RolmOCR with Docker Model Runner:
docker model run hf.co/NeuralMetrics/RolmOCR
| library_name: transformers | |
| license: apache-2.0 | |
| datasets: | |
| - allenai/olmOCR-mix-0225 | |
| base_model: Qwen/Qwen2.5-VL-7B-Instruct | |
| <div align="center"> | |
| # Neural Metrics · A faster, lighter take on the olmOCR recipe. | |
| <img src="https://img.shields.io/badge/Neural%20Metrics-document%20extraction-4F46E5?style=for-the-badge" alt="Neural Metrics" /> | |
| <img src="https://img.shields.io/badge/fork%20of-reducto%2FRolmOCR-2563EB?style=flat-square" alt="fork" /> | |
| </div> | |
| 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`](https://huggingface.co/reducto/RolmOCR), created by the [Qwen team](https://huggingface.co/Qwen). | |
| > 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](https://huggingface.co/reducto/RolmOCR). | |
| --- | |
| <details> | |
| <summary><b>Original model card from reducto/RolmOCR</b> (click to expand)</summary> | |
| # RolmOCR by [Reducto AI](https://reducto.ai/) | |
| Earlier this year, the [Allen Institute for AI](https://allenai.org/) 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. | |
| This model is a fine-tuned version of [Qwen/Qwen2.5-VL-7B-Instruct](https://huggingface.co/Qwen/Qwen2.5-VL-7B-Instruct) on the full [allenai/olmOCR-mix-0225](https://huggingface.co/datasets/allenai/olmOCR-mix-0225) dataset. | |
| ## Key changes | |
| We made three notable changes: | |
| 1. **New Base Model**: We swapped in a more recent version of the existing model (Qwen2.5-VL-7B) as the foundation. | |
| 2. **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. | |
| 3. **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 | |
| export VLLM_USE_V1=1 | |
| vllm serve reducto/RolmOCR | |
| ``` | |
| Call the model via openai compatible server: | |
| ```python | |
| # HOST YOUR OPENAI COMPATIBLE API WITH THE FOLLOWING COMMAND in VLLM: | |
| # export VLLM_USE_V1=1 | |
| # vllm serve reducto/RolmOCR | |
| from openai import OpenAI | |
| import base64 | |
| client = OpenAI(api_key="123", base_url="http://localhost:8000/v1") | |
| model = "reducto/RolmOCR-7b" | |
| def encode_image(image_path): | |
| with open(image_path, "rb") as image_file: | |
| return base64.b64encode(image_file.read()).decode("utf-8") | |
| def ocr_page_with_rolm(img_base64): | |
| response = client.chat.completions.create( | |
| model=model, | |
| messages=[ | |
| { | |
| "role": "user", | |
| "content": [ | |
| { | |
| "type": "image_url", | |
| "image_url": {"url": f"data:image/png;base64,{img_base64}"}, | |
| }, | |
| { | |
| "type": "text", | |
| "text": "Return the plain text representation of this document as if you were reading it naturally.\n", | |
| }, | |
| ], | |
| } | |
| ], | |
| temperature=0.2, | |
| max_tokens=4096 | |
| ) | |
| return response.choices[0].message.content | |
| test_img_path = "path/to/image.png" | |
| img_base64 = encode_image(test_img_path) | |
| print(ocr_page_with_rolm(img_base64)) | |
| ``` | |
| ## Limitations | |
| - RolmOCR, like other VLM-based OCR solutions, still suffer from hallucination or dropping contents. | |
| - Unlike the [Reducto Parsing API](https://app.reducto.ai/), RolmOCR cannot output layout bounding boxes. | |
| - We have not evaluated the performance of any quantized versions. | |
| ## BibTex and citation info | |
| ``` | |
| @misc{RolmOCR, | |
| author = {Reducto AI}, | |
| title = {RolmOCR: A Faster, Lighter Open Source OCR Model}, | |
| year = {2025}, | |
| } | |
| ``` | |
| </details> | |