Downloads · 30 days
40
19% of all-time downloads
MegawizCo/typhoon-ocr-3b-mlx-q4
typhoon-ocr-3b-mlx-q4 is a image-text-to-text model from MegawizCo. Use it for the image-text-to-text task on the model card, and read the license before you ship it in a product. It is set up for mlx. The card lists the license as apache-2.0.
MLX-quantized port of typhoon-ai/typhoon-ocr-3b for native Apple Silicon inference.
Downloads · 30 days
40
19% of all-time downloads
All-time downloads
215
Public
Parameters
3.8B
3.1 GB on disk
Likes
0
Public
Click a slice to open those files.
.safetensors3.1 GB · 100%
How the weights are stored.
U323.1B · 82%
From the Hugging Face model README
MLX-quantized port of typhoon-ai/typhoon-ocr-3b for native Apple Silicon inference.
Quantization: 4-bit affine, group size 64. Effective rate 6.549 bits/weight (vision-projector + layer-norm weights stay full precision per mlx-vlm defaults). Size on disk: 2.9 GB.
7-image internal smoke set (2 synthetic printed Thai/English + 5 synthetic mixed-Thai handwriting). Same prompt (Extract all text from this image.) on Mac mini Apple Silicon, 2026-05-12:
| Backend | CER median (HW) | CER max | Wall median | Generation TPS | Peak RAM |
|---|---|---|---|---|---|
| MLX q4 (this) | 0.009 | 0.081 | 1.95 s | ~107 | ~3.5 GB |
| MLX q8 | 0.000 | 0.081 | 2.34 s | ~65 | ~5 GB |
Ollama typhoon-ocr1.5-3b Q4 | 0.000 | 0.058 | 2.90 s | ~78 (variable 40-84) | ~4 GB |
q4 trades ~1pp of CER on one handwriting sample for a 33% wall-clock speedup and a smaller footprint vs q8. Pick q4 for latency-bound serving, q8 for strict quality.
The test set is synthetic — generated Thai medical-style text — not real PHI. Real-world photographed handwriting is harder; expect higher CER.
uv pip install mlx-vlm
from mlx_vlm import generate, load
from mlx_vlm.prompt_utils import apply_chat_template
from mlx_vlm.utils import load_config
model, processor = load("MegawizCo/typhoon-ocr-3b-mlx-q4")
config = load_config("MegawizCo/typhoon-ocr-3b-mlx-q4")
prompt = apply_chat_template(processor, config, "Extract all text from this image.", num_images=1)
out = generate(model, processor, prompt, image=["prescription.png"], max_tokens=512)
print(out.text) # Typhoon-OCR wraps output in {"text": "..."}
CLI:
mlx_vlm.generate \
--model MegawizCo/typhoon-ocr-3b-mlx-q4 \
--image prescription.png \
--prompt "Extract all text from this image." \
--max-tokens 512
mlx_vlm.convert \
--hf-path typhoon-ai/typhoon-ocr-3b \
-q --q-bits 4 \
--mlx-path typhoon-ocr-3b-mlx-q4
Reproducible — re-run on the upstream typhoon-ai/typhoon-ocr-3b to regenerate equivalent weights.
typhoon-ai/typhoon-ocr-3b.MegawizCo/typhoon-ocr-3b-mlx-q8 — higher-quality variant, ~50% bigger, ~30% slower