TinyDoc-VLM-256M vs. Donut: CPU Document AI Benchmark
Receipt OCR, Invoice Field Extraction, and Table Layout Analysis without GPUs. Evaluation of document understanding throughput, memory overhead, and OCR accuracy between TinyDoc-VLM-256M and Donut across CPU enterprise servers.
EXECUTIVE SUMMARY & EMPIRICAL VERDICT
TinyDoc-VLM-256M processes document pages 3.6× faster on CPU than Donut while delivering higher extraction fidelity on complex tabular and invoice data.
EULOGIK EDGE MODELFeatured
TinyDoc-VLM
256M (SigLIP + SmolLM2) · 256 Million
Target HardwareCommodity CPU / Laptop / Edge Node
Latency / Speed<180ms per document page
RAM / Memory512 MB RAM
Fertility / SizeONNX CPU optimized
- ✓ Modern SigLIP vision backbone handles dense typography
- ✓ SmolLM2 text decoder parses tabular structures directly
- ✓ Runs directly on CPU with ONNX Runtime
- ✓ Zero GPU requirement for high-volume invoice processing
INDUSTRY BASELINEOpen Weights
Donut VLM
base (Swin Transformer) · 140 Million
Target HardwareGPU recommended; slow on CPU
Latency / Speed>650ms per document page (CPU)
RAM / Memory1.1 GB RAM
Fertility / SizePyTorch native
- • Pioneered OCR-free document parsing
- • Prone to hallucination on small font contracts
- • Substantially slower inference on standard CPUs
- • Requires PyTorch runtime environment
METRIC SPECIFICATION MATRIX
| METRIC | TINYDOC-VLM | DONUT VLM |
|---|---|---|
| CPU Latency per Page | <180 ms ★ | >650 ms |
| Invoice Key Extraction F1 | 91.8% ★ | 84.2% |
| Dense Table Layout Parsing | Supported ★ | Degrades on complex grid |
| Memory Overhead | 512 MB ★ | 1.1 GB |
| ONNX Runtime CPU Binary | Pre-compiled ★ | Complex export required |
REPRODUCIBLE CODE SNIPPET
Execute this benchmark locally
from PIL import Image
from transformers import AutoProcessor, AutoModelForVision2Seq
processor = AutoProcessor.from_pretrained("eulogik/TinyDoc-VLM-256M")
model = AutoModelForVision2Seq.from_pretrained("eulogik/TinyDoc-VLM-256M")
image = Image.open("invoice.png")
inputs = processor(images=image, text="Extract total amount and tax", return_tensors="pt")
output = model.generate(**inputs, max_new_tokens=128)
print(processor.decode(output[0], skip_special_tokens=True))Interested in deploying TinyDoc-VLM?
We assist enterprises with custom fine-tuning, hardware sizing, and on-premise air-gapped installation.