library_name: transformers base_model:
- lightonai/LightOnOCR-3-0.8B
- huihui-ai/Huihui-Qwen3.5-0.8B-abliterated tags:
- ocr
- image-text-to-text
- abliterated
- uncensored
- qwen3_5
- vision
- gguf
- llama.cpp
- document-parsing license: apache-2.0 language:
- en
- id pipeline_tag: image-text-to-text
Irwan-LightOnOCR-3-0.8B-abliterated
OCR vision-language model 0.8B dengan kecenderungan menolak yang dihapus, dibuat lewat abliteration transfer — memindahkan "arah penolakan" dari Qwen3.5 yang sudah di-abliterasi ke fine-tune OCR, tanpa melatih ulang apa pun.
English summary: an 0.8B OCR vision-language model derived from LightOnOCR-3-0.8B by
adding the abliteration delta of huihui-ai/Huihui-Qwen3.5-0.8B-abliterated. No fine-tuning
or retraining — pure weight arithmetic. GGUF (Q8_0) and mmproj included.
Daftar isi
- Kenapa model ini ada
- Silsilah model
- Metode
- Spesifikasi
- File di repo ini
- Cara pakai — llama.cpp (disarankan)
- Cara pakai — AnythingLLM
- Cara pakai — transformers
- Performa
- Catatan prompting
- Keterbatasan
- Lisensi dan atribusi
Kenapa model ini ada
lightonai/LightOnOCR-3-0.8B adalah fine-tune OCR di atas arsitektur
Qwen3_5ForConditionalGeneration (Qwen3.5-VL 0.8B). Model OCR semacam ini tetap
mewarisi kecenderungan menolak dari base-nya: ketika dihadapkan pada dokumen berisi
konten eksplisit, transkripsi bisa terpotong, diringkas, atau ditolak sama sekali —
padahal tugasnya hanya membaca teks yang ada di gambar.
Karena huihui-ai/Huihui-Qwen3.5-0.8B-abliterated adalah abliterasi dari base yang
sama persis (Qwen/Qwen3.5-0.8B), selisih bobot keduanya berisi arah penolakan
yang sudah dihapus. Selisih itulah yang dipindahkan ke fine-tune OCR.
Hasilnya: kemampuan membaca dokumen tetap, kecenderungan menolak hilang.
Silsilah model
graph TD
Q["Qwen/Qwen3.5-0.8B<br/>base model asli"]
Q -->|"fine-tune OCR"| L["lightonai/LightOnOCR-3-0.8B<br/>bobot fondasi"]
Q -->|"abliterasi"| H["huihui-ai/Huihui-Qwen3.5-0.8B-abliterated<br/>sumber delta"]
L --> R["Irwan-LightOnOCR-3-0.8B-abliterated<br/>hasil gabungan"]
H --> R
Yang penting dipahami: arsitekturnya Qwen, fondasi bobotnya LightOnOCR. LightOnOCR sendiri adalah Qwen3.5-0.8B yang di-fine-tune untuk OCR, jadi keduanya berbagi ruang parameter yang sama — itulah sebabnya delta bisa dijumlahkan langsung.
Metode
delta = W_abliterated - W_base
W_uncensored = W_ocr + alpha * delta
- Diterapkan tensor-per-tensor, hanya pada tensor yang dimensinya cocok di ketiga model.
- Tensor yang hanya ada di LightOnOCR disalin apa adanya.
alpha = 1.0(delta penuh).- Perhitungan dilakukan di
float32, hasil dikembalikan ke dtype asli (bfloat16). - 473 dari 473 tensor yang cocok kena delta — tidak ada yang terlewat.
Tidak ada training, tidak ada data baru, tidak ada perubahan arsitektur.
Metadatanya dicatat di config.json pada key _uncensored_graft.
Spesifikasi
| Arsitektur | Qwen3_5ForConditionalGeneration (model_type: qwen3_5) |
| Parameter | 0,8B |
| Hidden size | 1024 |
| Layer | 24 (hybrid: 3 linear_attention + 1 full_attention, diulang 6x) |
| Attention heads | 8 query / 2 KV |
| Intermediate size | 3584 |
| Vocab | 248.320 |
| Context maksimum | 262.144 token |
| Tied embeddings | ya |
| Vision encoder | depth 12, hidden 768, 12 head, patch 16, spatial merge 2 |
| Presisi | bfloat16 (safetensors) |
| Ukuran safetensors | 1,7 GB |
| Ukuran GGUF Q8_0 | 811 MB |
| Ukuran mmproj f16 | 207 MB |
File di repo ini
| File | Ukuran | Keterangan |
|---|---|---|
model.safetensors | 1,7 GB | format transformers asli (bf16) |
Irwan-LightOnOCR-3-0.8B-abliterated-Q8_0.gguf | 811 MB | LLM dalam GGUF, untuk llama.cpp / AnythingLLM |
Irwan-LightOnOCR-3-0.8B-abliterated-mmproj-f16.gguf | 207 MB | encoder vision (mmproj), dipakai bareng GGUF di atas |
config.json | kecil | berisi metadata _uncensored_graft |
tokenizer*, vocab.json, merges.txt | — | tokenizer Qwen |
preprocessor_config.json, processor_config.json | kecil | konfigurasi image processor |
chat_template.jinja | kecil | chat template |
Kalau hanya butuh OCR lewat llama.cpp, cukup ambil dua file GGUF.
Cara pakai — llama.cpp (disarankan)
Ini jalur tercepat di CPU. Perlu llama.cpp yang sudah mendukung qwen3_5
(cukup build dari master terkini).
# 1. ambil dua file GGUF
huggingface-cli download irwanworld/Irwan-LightOnOCR-3-0.8B-abliterated \
Irwan-LightOnOCR-3-0.8B-abliterated-Q8_0.gguf \
Irwan-LightOnOCR-3-0.8B-abliterated-mmproj-f16.gguf --local-dir ./irwan-ocr
# 2. jalankan OCR
./llama-cli \
-m ./irwan-ocr/Irwan-LightOnOCR-3-0.8B-abliterated-Q8_0.gguf \
--mmproj ./irwan-ocr/Irwan-LightOnOCR-3-0.8B-abliterated-mmproj-f16.gguf \
--image dokumen.png \
-p "OCR" -n 1024 -c 4096 --no-warmup
Contoh keluaran nyata pada struk uji:
Document No : TD0116/104
Date : 25/12/2018 8:13:39 PM
Cashier : MANIS
Member :
# CASH BILL
Untuk mode server (OpenAI-compatible), pakai llama-server dengan flag yang sama
(-m ... --mmproj ...), lalu kirim gambar sebagai image_url di messages.
Cara pakai — AnythingLLM
AnythingLLM Desktop memakai engine built-in (Lemonade + llama.cpp) yang bisa
meng-import file .gguf.
- Download
Irwan-LightOnOCR-3-0.8B-abliterated-Q8_0.gguf. - Settings → LLM Preference → provider AnythingLLM (built-in).
- Klik Import custom model, pilih file
.gguf, tunggu 2–3 menit, lalu Save. - Alternatif: pull repo langsung dengan
irwanworld/Irwan-LightOnOCR-3-0.8B-abliterated:Q8_0.
Penting: AnythingLLM tidak menerima upload gambar di chat, dan dokumentasi import custom model-nya memang menyarankan "only use text based LLMs". Jadi encoder vision (mmproj) tidak akan terpakai di sana. Model akan berjalan sebagai LLM teks dengan kecenderungan output berupa transkripsi dokumen, bukan jawaban chat. Untuk chat/RP, pakai model chat biasa, bukan model OCR ini.
Cara pakai — transformers
Sama seperti LightOnOCR-3-0.8B, tidak ada perubahan API.
uv pip install "transformers>=5.5.4" pillow
import torch
from transformers import AutoProcessor, Qwen3_5ForConditionalGeneration
model_id = "irwanworld/Irwan-LightOnOCR-3-0.8B-abliterated"
model = Qwen3_5ForConditionalGeneration.from_pretrained(model_id, dtype=torch.bfloat16)
processor = AutoProcessor.from_pretrained(model_id)
prompt = "" # "" = transkripsi penuh; "grounding" = plus bounding box
conversation = [{"role": "user", "content": [
{"type": "image", "url": "dokumen.png"},
*([{"type": "text", "text": prompt}] if prompt else []),
]}]
inputs = processor.apply_chat_template(
conversation, add_generation_prompt=True, tokenize=True,
return_dict=True, return_tensors="pt", enable_thinking=False,
)
output_ids = model.generate(**inputs, max_new_tokens=1024, do_sample=False)
print(processor.decode(output_ids[0, inputs["input_ids"].shape[1]:], skip_special_tokens=True))
Catatan: gunakan {"type": "image", "url": ...}. Jangan pakai placeholder
{"type": "image"} dengan kwarg images=[...] — processor Qwen3.5-VL menolaknya
(TypeError).
Performa
Diukur di GitHub Codespace, 4 vCPU, 16 GB RAM, tanpa GPU, -t 4:
| Backend | Prompt | Generation | Catatan |
|---|---|---|---|
| llama.cpp (Q8_0 + mmproj) | 58,3 t/s | 33,2 t/s | direkomendasikan |
| transformers (bf16, PyTorch) | — | ~0,3 t/s | praktis tidak terpakai |
Selisihnya sekitar 110x. Penyebabnya: kernel causal_conv1d dan
chunk_gated_delta_rule untuk layer linear_attention sudah dioptimasi di ggml,
sementara di PyTorch jalur CPU jatuh ke implementasi referensi yang sangat lambat.
Karena 18 dari 24 layer memakai linear_attention, dampaknya besar sekali.
Dengan GPU, jalur transformers akan jauh lebih cepat karena kernel CUDA/Triton aktif.
Catatan prompting
- Prompt kosong (
"") → transkripsi penuh dokumen. - Prompt
"grounding"→ transkripsi plus bounding box. do_sample=False(greedy) untuk hasil paling deterministik.- Token maksimum keluaran praktis dibatasi ukuran halaman; 1024 cukup untuk sebagian besar dokumen satu halaman, naikkan untuk halaman padat.
Keterbatasan
- Belum dievaluasi formal. Ini weight arithmetic eksperimental, bukan model yang dilatih ulang. Kualitas OCR diasumsikan mendekati model asli, tapi tidak dijamin identik — verifikasi pada data kamu sendiri sebelum dipakai serius.
- Verifikasi yang sudah dilakukan hanya pada satu sampel struk (SROIE): teks terbaca benar dan identik dengan output model asli. Belum ada uji pada korpus luas.
alpha = 1.0menerapkan delta penuh. Kalau output jadi terlalu liar atau rusak, turunkan (mis.--alpha 0.5) lalu graft ulang.- Model ini model OCR, bukan model chat. Untuk percakapan, pakai model chat.
- Tanpa GPU, pakai llama.cpp. Jalur transformers di CPU praktis tidak terpakai.
Lisensi dan atribusi
Lisensi mengikuti base model: Apache 2.0.
Model ini adalah karya turunan. Semua kredit untuk arsitektur, bobot dasar, dan metode abliterasi tetap milik penulis aslinya:
Qwen/Qwen3.5-0.8B— base modellightonai/LightOnOCR-3-0.8B— fine-tune OCRhuihui-ai/Huihui-Qwen3.5-0.8B-abliterated— sumber delta abliterasi
Sitasi LightOnOCR
@misc{lightonocr2_2026,
title = {LightOnOCR: A 1B End-to-End Multilingual Vision-Language Model for State-of-the-Art OCR},
author = {Said Taghadouini and Adrien Cavaillès and Baptiste Aubertin},
year = {2026},
howpublished = {\url{https://arxiv.org/abs/2601.14251}}
}