Views
No views yet
Note on effective bpw: mlx-vlm's quantizers only act on the language tower's linear weights. The vision encoder and embeddings stay at bf16, so the on-disk size averages the quantized text decoder with the full-precision vision components.
| Affine int8 (group size 64) | FP16 baseline | |
|---|---|---|
| FUNSD CER ↓ | 1.5720 | 1.7588 |
| Decode tok/s | 205.2 | 146.2 |
| Peak memory | 5.06 GB | 7.62 GB |
| Disk size | 3747 MB | 6464 MB |
| Variant | CER ↓ | Tok/s | Memory | Disk |
|---|---|---|---|---|
| FP16 (baseline) | 1.7588 | 146.2 | 7.62 GB | 6464 MB |
| MXFP8 | 1.4556 | 205.6 | 4.98 GB | 3660 MB |
| Int8 | 1.5720 | 205.2 | 5.06 GB | 3747 MB |
| MXFP4 | 2.3944 | 251.9 | 3.61 GB | 2260 MB |
| Int4 | 2.2879 | 252.6 | 3.7 GB | 2347 MB |
pip install mlx-vlm1from mlx_vlm import load, generate
2
3model, processor = load("sahilchachra/unlimited-ocr-8bit-mlx")
4
5# Single-image OCR (Gundam mode)
6response = generate(model, processor,
7 prompt="<image>document parsing.",
8 image="path/to/document.jpg",
9 max_tokens=4096, verbose=True)<|grounding|> whenever you also want bounding boxes for what was read.| Task | Prompt |
|---|---|
| Document → Markdown (layout-aware, with boxes) | ` |
| Plain text OCR (just the text, no layout) | <image>Free OCR. |
| OCR with bounding boxes | ` |
| Native parse | <image>document parsing. |
| Parse a figure / chart / diagram | <image>Parse the figure. |
| Describe the image (general VQA) | <image>Describe this image in detail. |
Note: Unlike the GGUF/llama.cpp workflow, mlx-vlm requires the literal<image>token in the prompt and a separateimage=argument pointing to the file path.
<|grounding|>, the model interleaves the recognized text with detection boxes:<|det|>title [37, 64, 464, 132]<|/det|>INVOICE #2026-0623
<|det|>text [37, 194, 350, 247]<|/det|>Bill To: Sahil Chachra
<|det|>text [37, 483, 329, 543]<|/det|>Total Due: $44.00[x1, y1, x2, y2] is the bounding box (top-left → bottom-right) of that span. Drop the
<|det|>...<|/det|> tags if you only want the text, or parse them to overlay boxes / build a layout.Tip — long documents: For multi-page scans, run page-by-page and concatenate.
baidu/Unlimited-OCR uses model_type: "unlimited-ocr" which is not directly
recognized by mlx-vlm. This quantized variant ships with the config already patched:config.json → "model_type": "deepseekocr" (was "unlimited-ocr"), auto_map removedprocessor_config.json → "processor_class": "DeepseekOCRProcessor" (was "UnlimitedOCRHFProcessor")load() and go.mlx_vlm convert.| Model | Variant | Disk |
|---|---|---|
| sahilchachra/unlimited-ocr-4bit-mlx | Affine int4 | 2347 MB |
| sahilchachra/unlimited-ocr-8bit-mlx | Affine int8 ← this model | 3747 MB |
| sahilchachra/unlimited-ocr-mxfp4-mlx | Block float MX FP4 | 2260 MB |
| sahilchachra/unlimited-ocr-mxfp8-mlx | Block float MX FP8 | 3660 MB |
| Model | Notes |
|---|---|
| sahilchachra/Unlimited-OCR-GGUF | K-quants & i-quants (BF16 → IQ2_M). Requires llama.cpp PR #17400. |