Instructions to use gojiberries/savitr-bf16 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use gojiberries/savitr-bf16 with Transformers:
# Use a pipeline as a high-level helper # Warning: Pipeline type "image-to-text" is no longer supported in transformers v5. # You must load the model directly (see below) or downgrade to v4.x with: # 'pip install "transformers<5.0.0' from transformers import pipeline pipe = pipeline("image-to-text", model="gojiberries/savitr-bf16")# Load model directly from transformers import AutoProcessor, AutoModelForMultimodalLM processor = AutoProcessor.from_pretrained("gojiberries/savitr-bf16") model = AutoModelForMultimodalLM.from_pretrained("gojiberries/savitr-bf16", device_map="auto") - Notebooks
- Google Colab
- Kaggle
savitr-bf16 β full-precision terse electoral-roll OCR (distilled Surya)
Full-precision (bf16) merged weights for savitr's distilled terse model. This is the checkpoint
that gojiberries/savitr (MLX 8-bit) was quantized
from β same model, same training run, higher precision.
Use gojiberries/savitr if you just want to read electoral rolls on Apple Silicon: it is smaller
(~800 MB vs 1.33 GB), faster, and what pip install savitr fetches automatically. Use this repo
if you want to:
- re-quantize to a different format or bit width (MLX 4/8-bit, GGUF, AWQ)
- continue training or distilling from the merged weights
- evaluate without quantization error
Base model = datalab-to/surya-ocr-2 (650M
Qwen3.5-VL-style OCR), self-distilled to emit one compact pipe-delimited line per voter instead of
verbose HTML:
epic|name|relation(F/H/M)|relative_name|house|age|sex
~5Γ fewer decode tokens than the HTML output, at the teacher's accuracy.
Usage
Re-quantize to MLX (what the published 8-bit is):
python -m mlx_vlm convert --hf-path gojiberries/savitr-bf16 \
--mlx-path savitr-mlx-8bit -q --q-bits 8
Load directly:
from transformers import AutoModelForImageTextToText, AutoProcessor
model = AutoModelForImageTextToText.from_pretrained("gojiberries/savitr-bf16")
proc = AutoProcessor.from_pretrained("gojiberries/savitr-bf16")
Parse the output with savitr's value-anchored parser, which stays column-aligned even when the model drops a field:
from savitr.rolls.parse import parse_terse, TERSE_PROMPT
How it was trained
Teacher = full Surya (surya-ocr-2) OCRs roll pages to HTML; a parser cleans them into terse
targets; the model is LoRA-fine-tuned on (page image β terse rows) β 450 pages drawn from
constituencies held out of the eval, 1 epoch, for $0 on a free Kaggle T4 β then the adapter is merged
into the base weights. The terse format is the only behavioral change; reading ability is inherited
from Surya.
Evaluation (out-of-sample, vs the Surya teacher)
Held-out constituencies never seen in training (37 pages, 1,076 teacher voters):
| Field | Fidelity | Field | Fidelity | |
|---|---|---|---|---|
| voter recall | 99.3% | relative name | 96.2% | |
| EPIC | 97.2% | relation code (F/H/M) | 97.9% | |
| name | 96.2% | house | 98.8% | |
| age | 97.5% | sex | 98.2% |
Per-voter record similarity 98.7%, whole-page similarity 92.9% (1 β normalized edit distance). Fidelity = agreement with the teacher's output; absolute accuracy β these Γ Surya's own ~93β95%. Measured on the 8-bit quantization of these weights, so bf16 is a floor, not a ceiling.
Limitations
v0.2 (450 training pages, AC-holdout). Trained on Manipur 2025 English rolls; other states and
scripts are out of distribution. The tokenizer, processor, and chat template here come from the base
model β the training run's own tokenizer was written by a newer transformers and is not loadable by
current mlx-vlm.
License & attribution
Derived from datalab-to/surya-ocr-2; its license governs use of these weights. savitr's code is
MIT (github.com/in-rolls/savitr). Electoral rolls are public
records published by the Election Commission of India.
- Downloads last month
- 10
Model tree for gojiberries/savitr-bf16
Base model
datalab-to/surya-ocr-2