Instructions to use zidanmubarak/jawi-qwen25-vl-qlora with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- PEFT
How to use zidanmubarak/jawi-qwen25-vl-qlora with PEFT:
from peft import PeftModel from transformers import AutoModelForCausalLM base_model = AutoModelForCausalLM.from_pretrained("unsloth/qwen2.5-vl-3b-instruct-unsloth-bnb-4bit") model = PeftModel.from_pretrained(base_model, "zidanmubarak/jawi-qwen25-vl-qlora") - Transformers
How to use zidanmubarak/jawi-qwen25-vl-qlora with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="zidanmubarak/jawi-qwen25-vl-qlora") messages = [ {"role": "user", "content": "Who are you?"}, ] pipe(messages)# Load model directly from transformers import AutoModel model = AutoModel.from_pretrained("zidanmubarak/jawi-qwen25-vl-qlora", dtype="auto") - Notebooks
- Google Colab
- Kaggle
- Local Apps Settings
- vLLM
How to use zidanmubarak/jawi-qwen25-vl-qlora with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "zidanmubarak/jawi-qwen25-vl-qlora" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "zidanmubarak/jawi-qwen25-vl-qlora", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker
docker model run hf.co/zidanmubarak/jawi-qwen25-vl-qlora
- SGLang
How to use zidanmubarak/jawi-qwen25-vl-qlora with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "zidanmubarak/jawi-qwen25-vl-qlora" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "zidanmubarak/jawi-qwen25-vl-qlora", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "zidanmubarak/jawi-qwen25-vl-qlora" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/chat/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "zidanmubarak/jawi-qwen25-vl-qlora", "messages": [ { "role": "user", "content": "What is the capital of France?" } ] }' - Unsloth Studio
How to use zidanmubarak/jawi-qwen25-vl-qlora with Unsloth Studio:
Install Unsloth Studio (macOS, Linux, WSL)
curl -fsSL https://unsloth.ai/install.sh | sh # Run unsloth studio unsloth studio -H 0.0.0.0 -p 8888 # Then open http://localhost:8888 in your browser # Search for zidanmubarak/jawi-qwen25-vl-qlora to start chatting
Install Unsloth Studio (Windows)
irm https://unsloth.ai/install.ps1 | iex # Run unsloth studio unsloth studio -H 0.0.0.0 -p 8888 # Then open http://localhost:8888 in your browser # Search for zidanmubarak/jawi-qwen25-vl-qlora to start chatting
Using HuggingFace Spaces for Unsloth
# No setup required # Open https://huggingface.co/spaces/unsloth/studio in your browser # Search for zidanmubarak/jawi-qwen25-vl-qlora to start chatting
Load model with FastModel
pip install unsloth from unsloth import FastModel model, tokenizer = FastModel.from_pretrained( model_name="zidanmubarak/jawi-qwen25-vl-qlora", max_seq_length=2048, ) - Docker Model Runner
How to use zidanmubarak/jawi-qwen25-vl-qlora with Docker Model Runner:
docker model run hf.co/zidanmubarak/jawi-qwen25-vl-qlora
Jawi OCR & Transliteration Model (Qwen2.5-VL-3B QLoRA)
Model Details
Model Description
Model ini adalah model Vision-Language (VLM) yang telah di- fine-tune secara khusus untuk melakukan dua tugas utama secara berurutan pada gambar teks cetak berbahasa Melayu/Indonesia:
- Ekstraksi Teks (OCR): Membaca aksara Jawi (huruf Arab gundul/berharkat) dari sebuah gambar dengan tingkat akurasi tinggi.
- Transliterasi: Mengonversi teks Jawi hasil ekstraksi tersebut menjadi huruf Latin (Rumi) berdasarkan standar Pedoman Ejaan Jawi Yang Disempurnakan (PEJYD) oleh Dewan Bahasa dan Pustaka.
Model ini dilatih menggunakan metode QLoRA (Parameter-Efficient Fine-Tuning) di atas arsitektur dasar Qwen2.5-VL-3B-Instruct. Pelatihan (Ablation Study Skenario C) menggunakan kombinasi dataset sintetik dan data manuskrip/dokumen autentik, menjadikannya sangat tangguh dalam menangani berbagai variasi font Jawi cetak.
- Developed by: Zidan Mubarak (sebagai bagian dari penelitian Skripsi)
- Model type: Vision-Language Causal LM (Qwen2.5-VL) + LoRA Adapter
- Language(s) (NLP): Melayu (ms), Indonesia (id), Arab (ar - khusus aksara Jawi)
- License: Apache 2.0
- Finetuned from model:
Qwen/Qwen2.5-VL-3B-Instruct
Model Sources
- Demo (Hugging Face Space): Jawi Transliterasi Demo
- Repository:
zidanmubarak/jawi-qwen25-vl-qlora
Uses
Direct Use
Model ini dirancang untuk langsung digunakan oleh:
- Peneliti linguistik, sejarawan, atau filolog yang ingin mendigitalisasi dokumen Jawi klasik/modern.
- Pengembang aplikasi edukasi atau penerjemah otomatis dokumen Jawi ke Rumi.
- Masyarakat umum yang ingin membaca literatur cetak Jawi kuno ke dalam tulisan Latin yang lebih familier.
Pengguna cukup memberikan gambar berisi teks Jawi beserta prompt instruksi standar, dan model akan mengembalikan teks Jawi sekaligus hasil transliterasinya.
Out-of-Scope Use
- Tulisan Tangan (Handwritten): Model ini dioptimalkan untuk Jawi Cetak (Printed/Typeset). Performa pada manuskrip tulisan tangan kursif yang sangat usang mungkin mengalami penurunan (meskipun sebagian data autentik telah disertakan).
- Penerjemahan Makna: Model ini melakukan transliterasi (konversi karakter/fonetis), bukan penerjemahan makna antar bahasa. Jika teks aslinya adalah bahasa Melayu klasik, hasil Rumi-nya tetap bahasa Melayu klasik.
Bias, Risks, and Limitations
- Akurasi model sangat bergantung pada kualitas resolusi gambar yang diberikan. Gambar yang buram, terpotong, atau memiliki noise latar belakang yang parah dapat meningkatkan rasio Character Error Rate (CER).
- Aturan PEJYD memiliki beberapa pengecualian linguistik yang kompleks (seperti kata serapan Arab vs kata dasar Melayu). Model mungkin sesekali melakukan kesalahan ejaan Rumi pada kata-kata serapan yang sangat jarang (Out-of-Vocabulary).
Recommendations
Pengguna disarankan untuk memproses gambar dengan pencahayaan dan kontras yang baik. Untuk digitalisasi dokumen arsip resmi, hasil keluaran Rumi dari model ini sebaiknya tetap ditinjau ulang oleh ahli bahasa (Human-in-the-loop) sebelum dipublikasikan.
How to Get Started with the Model
Untuk menjalankan model ini, Anda membutuhkan pustaka transformers, peft, dan qwen-vl-utils. Sangat disarankan untuk menjalankan model ini dalam format bfloat16 atau 4-bit menggunakan GPU.
import torch
from PIL import Image
from peft import PeftModel
from qwen_vl_utils import process_vision_info
from transformers import AutoProcessor, Qwen2_5_VLForConditionalGeneration
BASE_MODEL = "Qwen/Qwen2.5-VL-3B-Instruct"
ADAPTER_ID = "zidanmubarak/jawi-qwen25-vl-qlora"
# 1. Load Base Model dan Processor
base = Qwen2_5_VLForConditionalGeneration.from_pretrained(
BASE_MODEL,
device_map="auto",
torch_dtype=torch.bfloat16,
)
model = PeftModel.from_pretrained(base, ADAPTER_ID)
model.eval()
processor = AutoProcessor.from_pretrained(ADAPTER_ID)
# 2. Siapkan Gambar dan Prompt
SYSTEM_PROMPT = (
"Anda adalah sistem multimodal untuk ekstraksi dan transliterasi aksara Jawi cetak. "
"Tugas Anda terdiri dari dua langkah yang harus dilakukan secara berurutan:\\n"
"1. Ekstraksi: Baca gambar dan ekstrak teks aksara Jawi (huruf Arab) yang tertulis "
"pada gambar secara akurat, persis seperti yang tertulis.\\n"
"2. Transliterasi: Konversi teks Jawi yang telah diekstrak ke huruf Latin (Rumi) "
"sesuai pedoman Ejaan Jawi Yang Disempurnakan (PEJYD) oleh Dewan Bahasa dan Pustaka Malaysia.\\n\\n"
"ATURAN OUTPUT:\\n"
"- Keluarkan hasil dalam format berikut secara tepat:\\n"
" Jawi: [teks aksara Arab hasil ekstraksi]\\n"
" Rumi: [teks Latin hasil transliterasi]\\n"
"- Jangan menambahkan penjelasan, komentar, atau teks lain di luar format tersebut.\\n"
"- Transliterasi bersifat karakter ke karakter, bukan penerjemahan makna."
)
image = Image.open("contoh_jawi.jpg").convert("RGB")
messages = [
{"role": "system", "content": SYSTEM_PROMPT},
{"role": "user", "content": [
{"type": "image", "image": image},
{"type": "text", "text": "Ekstrak teks aksara Jawi dari gambar ini, kemudian transliterasikan ke huruf Latin (Rumi)."},
]},
]
# 3. Proses Inferensi
text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
image_inputs, _ = process_vision_info(messages)
inputs = processor(text=[text], images=image_inputs, padding=True, return_tensors="pt").to("cuda")
with torch.no_grad():
generated = model.generate(**inputs, max_new_tokens=1024, do_sample=False)
trimmed = [out[len(inp):] for inp, out in zip(inputs.input_ids, generated)]
output_text = processor.batch_decode(trimmed, skip_special_tokens=True)[0].strip()
print(output_text)
Training Details
Training Data
Model ini dilatih menggunakan dua jenis dataset yang dikurasi secara manual dan di- generate secara komputasional:
- Data Sintetik: Teks Jawi yang di- generate menggunakan berbagai macam font Arab/Jawi standar komputer (seperti font Jawi Uthman Taha, Arabic Typesetting, dll) untuk memperkaya pemahaman dasar karakter.
- Data Autentik (Real-world): Potongan gambar dari buku, koran, dan dokumen sejarah berbahasa Melayu beraksara Jawi asli.
Pelatihan Ablation Study membuktikan bahwa pencampuran data sintetik dan autentik (Skenario C) memberikan generalisasi terbaik dibandingkan hanya dilatih pada satu jenis data saja.
Training Procedure
Pelatihan dilakukan menggunakan pustaka Unsloth untuk mempercepat proses kalkulasi dan mengurangi penggunaan memori VRAM secara signifikan.
Training Hyperparameters
- Training regime: QLoRA (4-bit NF4 Quantization pada Base Model) dengan mixed precision
bfloat16. - Optimizer: AdamW (8-bit paged optimizer)
- Gradient Checkpointing: Unsloth optimized
Evaluation
Testing Data, Factors & Metrics
Evaluasi akhir (Mega Evaluasi) dilakukan pada subset 10% Data Autentik yang sama sekali tidak pernah dilihat oleh model selama proses training (Unseen Data).
Metrics
Tiga metrik utama digunakan untuk mengukur keandalan sistem:
- CER Jawi (Character Error Rate): Mengukur ketepatan ejaan saat mengekstrak aksara Arab/Jawi dari gambar.
- CER Rumi: Mengukur ketepatan ejaan hasil transliterasi huruf Latin per karakter.
- WER Rumi (Word Error Rate): Mengukur tingkat pemahaman kata secara utuh pada hasil transliterasi.
Results
Ablation Study membuktikan bahwa integrasi LoRA berhasil menurunkan tingkat kesalahan secara drastis dibandingkan dengan kemampuan dasar (Zero-Shot) dari Qwen2.5-VL asli.
| Skenario Model | CER Jawi | CER Rumi | WER Rumi |
|---|---|---|---|
| Baseline (Qwen Asli Zero-Shot) | 82.51% | 90.59% | 107.08% |
| Model Final (Skenario C - Epoch 3) | 17.35% | 16.48% | 39.36% |
| Persentase Penurunan Error | โ 79% | โ 82% | โ 63% |
Summary
Performa model dalam mengekstrak dan mentransliterasi Jawi cetak mengalami lompatan raksasa. Model mampu menekan Character Error Rate untuk ekstraksi maupun transliterasi hingga di bawah batas ambang wajar (berkisar ~16%), menandakan bahwa model sudah sangat adaptif dalam membaca font Jawi nyata.
Environmental Impact
Pelatihan model dijalankan dengan optimasi tingkat tinggi menggunakan pustaka Unsloth yang memangkas waktu komputasi hingga 2x lebih cepat, secara signifikan mengurangi jejak karbon dibandingkan pelatihan full-parameter tradisional.
- Hardware Type: NVIDIA Tesla T4 / A100 (Google Colab)
- Cloud Provider: Google Cloud (via Colab)
- Compute Region: Dinamis (Global)
Framework versions
- PEFT 0.19.1
- Transformers 4.56.2
- Unsloth 2026.6.7
- Torch 2.11.0+cu128
- Downloads last month
- 56
Model tree for zidanmubarak/jawi-qwen25-vl-qlora
Base model
Qwen/Qwen2.5-VL-3B-Instruct