Model reference · open weights
chandra is an open-weight language model from datalab-to. chandra (BF16) weighs 17.5 GB; the smallest configuration that runs it is 2× RTX 3060 12 GB.
For self-hosting, compare this build's requirements below with the GPU you plan to rent.
Summary of the datalab-to/chandra model card, 2026-10-01
What it is
| Released by | datalab-to |
|---|---|
| Released | 2025-10-21 |
| Parameters | 8.8B |
| VRAM | 17.5 GB for the weights |
What it runs on
| Card | Requests at once | Context max | Memory | |
|---|---|---|---|---|
| 8K each | 32K each | |||
| RTX 3060 12 GB … RTX 4060 Ti 16 GB 2 smaller cards | ||||
| RTX 3090 24 GB | 3 | 25K | 23.4 GB | |
| RTX 4090 24 GB | 3 | 25K | 23.4 GB | |
| RTX 5090 32 GB | 9 | 2 | 75K | 31.0 GB |
| L40S 48 GB | 20 | 5 | 161K | 44.0 GB |
| A100 80 GB | 48 | 12 | all 256K | 78.2 GB |
| H100 80 GB | 44 | 11 | all 256K | 78.1 GB |
| RTX PRO 6000 Blackwell 96 GB | 57 | 14 | all 256K | 93.8 GB |
| DGX Spark (GB10) 128 GB unified | 69 | 17 | all 256K | 107 GB |
| H200 141 GB | 94 | 23 | all 256K | 138 GB |
| B200 180 GB | 125 | 31 | all 256K | 176 GB |
| 2× RTX 3060 12 GB tensor parallel | 1 | 10K | 11.6 GB a card | |
| 2× RTX 4060 Ti 16 GB tensor parallel | 7 | 1 | 60K | 15.4 GB a card |
| 2× RTX 4090 24 GB tensor parallel | 20 | 5 | 166K | 23.4 GB a card |
| 2× RTX 3090 24 GB tensor parallel | 20 | 5 | 166K | 23.4 GB a card |
| Requests at once | 8K tokens each | 32K tokens each |
|---|---|---|
| 1 | 20.8 GB | 24.4 GB |
| 5 | 25.6 GB | 43.7 GB |
| 8 | 29.2 GB | 58.2 GB |
| 16 | 38.9 GB | 96.9 GB |
| 32 | 58.2 GB | 174 GB |
| 64 | 96.9 GB | 329 GB |
One card, with vLLM's small-card settings.
From the model card
Chandra is an OCR model that outputs markdown, HTML, and JSON. It is highly accurate at extracting text from images and PDFs, while preserving layout information.
You can try Chandra in the free playground here, or at a hosted API here.
The easiest way to start is with the CLI tools:
pip install chandra-ocr
# With VLLM
chandra_vllm
chandra input.pdf ./output
# With HuggingFace
chandra input.pdf ./output --method hf
# Interactive streamlit app
chandra_app
We used the olmocr benchmark, which seems to be the most reliable current OCR benchmark in our testing.
| Model | ArXiv | Old Scans Math | Tables | Old Scans | Headers and Footers | Multi column | Long tiny text | Base | Overall | Source |
|---|---|---|---|---|---|---|---|---|---|---|
| Datalab Chandra v0.1.0 | 82.2 | 80.3 | 88.0 | 50.4 | 90.8 | 81.2 | 92.3 | 99.9 | 83.1 ± 0.9 | Own benchmarks |
| Datalab Marker v1.10.0 | 83.8 | 69.7 | 74.8 | 32.3 | 86.6 | 79.4 | 85.7 | 99.6 | 76.5 ± 1.0 | Own benchmarks |
| Mistral OCR API | 77.2 | 67.5 | 60.6 | 29.3 | 93.6 | 71.3 | 77.1 | 99.4 | 72.0 ± 1.1 | olmocr repo |
| Deepseek OCR | 75.2 | 72.3 | 79.7 | 33.3 | 96.1 | 66.7 | 80.1 | 99.7 | 75.4 ± 1.0 | Own benchmarks |
| GPT-4o (Anchored) | 53.5 | 74.5 | 70.0 | 40.7 | 93.8 | 69.3 | 60.6 | 96.8 | 69.9 ± 1.1 | olmocr repo |
| Gemini Flash 2 (Anchored) | 54.5 | 56.1 | 72.1 | 34.2 | 64.7 | 61.5 | 71.5 | 95.6 | 63.8 ± 1.2 | olmocr repo |
| Qwen 3 VL | 70.2 | 75.1 | 45.6 | 37.5 | 89.1 | 62.1 | 43.0 | 94.3 | 64.6 ± 1.1 | Own benchmarks |
| olmOCR v0.3.0 | 78.6 | 79.9 | 72.9 | 43.9 | 95.1 | 77.3 | 81.2 | 98.9 | 78.5 ± 1.1 | olmocr repo |
| dots.ocr | 82.1 | 64.2 | 88.3 | 40.9 | 94.1 | 82.4 | 81.2 | 99.5 | 79.1 ± 1.0 | dots.ocr repo |
| Type | Name | Link |
|---|---|---|
| Tables | Water Damage Form | View |
| Tables | 10K Filing | View |
| Forms | Handwritten Form | View |
| Forms | Lease Agreement | View |
| Handwriting | Doctor Note | View |
| Handwriting | Math Homework | View |
| Books | Geography Textbook | View |
| Books | Exercise Problems | View |
| Math | Attention Diagram | View |
| Math | Worksheet | View |
| Math | EGA Page | View |
| Newspapers | New York Times | View |
| Newspapers | LA Times | View |
| Other | Transcript | View |
| Other | Flowchart | View |
pip install chandra-ocr
from chandra.model import InferenceManager
from chandra.model.schema import BatchInputItem
# Run chandra_vllm to start a vLLM server first if you pass vllm, else pass hf
# you can also start your own vllm server with the datalab-to/chandra model
manager = InferenceManager(method="vllm")
batch = [
BatchInputItem(
image=PIL_IMAGE,
prompt_type="ocr_layout"
)
]
result = manager.generate(batch)[0]
print(result.markdown)
from transformers import AutoModel, AutoProcessor
from chandra.model.hf import generate_hf
from chandra.model.schema import BatchInputItem
from chandra.output import parse_markdown
model = AutoModel.from_pretrained("datalab-to/chandra").cuda()
model.processor = AutoProcessor.from_pretrained("datalab-to/chandra")
batch = [
BatchInputItem(
image=PIL_IMAGE,
prompt_type="ocr_layout"
)
]
result = generate_hf(batch, model)[0]
markdown = parse_markdown(result.raw)
Thank you to the following open source projects:
Quoted from the model card on Hugging Face. The full card is behind the Hugging Face link above.