Vega-100M-Indo
Model bahasa Indonesia 96.6M parameter β dilatih dari nol, gratis, dalam beberapa jam.
π§ Update Log
v1.2 β Fase 3 Continued Pretraining + Model Inspection (April 2026)
Weight model diperbarui ke checkpoint step 17,500 β hasil lanjutan training Fase 2 (Wikipedia Indonesia) yang sebelumnya berhenti di step 12,182. Sesi ini melanjutkan dari checkpoint-12000 dengan learning rate yang dilanjutkan dari cosine schedule yang sama.
Yang berubah:
- β Weight diperbarui ke checkpoint-17500 (loss turun dari 3.099 β 2.965)
- β Tambah log training Fase 3 lengkap per 100 step
- β Tambah section hasil model inspection (embedding, attention, generation)
- β
Upload
inspect_vega.pyβ script untuk membedah perilaku model
v1.1 β Bug Fix Kritis (April 2026)
β οΈ Pengguna sebelumnya wajib baca!
Ditemukan bug kritis: modeling_vegalm.py tidak ikut terupload saat rilis pertama, sehingga semua pengguna sebelumnya tidak bisa load model sama sekali β baik untuk inference maupun fine-tuning. Mohon maaf atas ketidaknyamanannya! π
Fix yang dilakukan:
- β
Upload
modeling_vegalm.py(arsitektur VegaLM) - β
Update
config.jsonβ tambahauto_mapdan fixmodel_type - β Update cara penggunaan di README
Cara load yang benar (wajib tambah trust_remote_code=True):
model = AutoModelForCausalLM.from_pretrained(
"Veenn/vega-100m-indo",
trust_remote_code=True # β wajib, tanpa ini error
)
π Deskripsi
Vega-100M-Indo adalah causal language model untuk Bahasa Indonesia yang dilatih dari nol (from scratch) di Google Colab dengan GPU T4 gratis β tanpa biaya sepeser pun.
Model ini dirilis di bawah lisensi Apache 2.0 β bebas digunakan, dimodifikasi, dan didistribusikan untuk keperluan apapun, termasuk komersial, selama menyertakan atribusi yang sesuai.
Tentang Knowledge Distillation yang Digunakan
Model ini menggunakan teknik Knowledge Distillation dari Qwen/Qwen3-0.6B sebagai teacher β tapi bukan distilasi konvensional.
Distilasi konvensional bertujuan agar student semirip mungkin dengan teacher: student belajar meniru distribusi output teacher, sehingga menjadi versi yang lebih kecil dan lebih cepat dari model yang sama.
Vega menggunakan distilasi sebagai training accelerator, bukan sebagai cara mentransfer pengetahuan dari teacher ke student. Tujuannya bukan agar Vega menjadi "Qwen versi kecil". Pretraining dari nol di hardware terbatas (T4 16GB) sangat brutal β tanpa sinyal tambahan, model kecil bisa stuck lama di loss tinggi sebelum representasi internal-nya mulai terbentuk. Distilasi di sini berfungsi sebagai scaffolding: sinyal dari representasi intermediate teacher membantu gradien mengalir lebih bermakna di awal training, sehingga model bisa belajar lebih efisien dari data yang sama. Teacher dibuang setelah fase 1 selesai β fase 2 dan 3 berjalan murni dengan CE loss tanpa teacher sama sekali.
Model ini melewati tiga fase training:
- Pretraining pada
Lyon28/Corpus-Indonesia(~175M token dari 1M baris) β dengan distilasi sebagai accelerator - Continued Pretraining pada Wikipedia Bahasa Indonesia (3.7M baris, sesi 1β4, hingga step 12,182) β tanpa distilasi
- Continued Pretraining lanjutan pada Wikipedia Bahasa Indonesia (resume dari step 12,000, hingga step 17,500) β tanpa distilasi
Model ini dirilis sebagai base model β fondasi yang bisa di-fine-tune untuk berbagai downstream task.
ποΈ Arsitektur
| Komponen | Nilai |
|---|---|
| Arsitektur | VegaLM (Causal LM Custom) |
| Hidden Size | 768 |
| Jumlah Layer | 12 |
| Attention Heads | 8 Query / 2 Key-Value (GQA) |
| Head Dimension | 64 |
| FFN Dimension | 2048 (SwiGLU) |
| Vocab Size | 32,000 (SentencePiece Unigram) |
| Max Sequence | 512 token |
| Hybrid Attention | Full Attention setiap 3 layer; Sliding Window (128) untuk sisanya |
| Tied Embeddings | Ya |
| Total Parameter Fisik | 96.6M |
Desain Arsitektur
- GQA (Grouped Query Attention): Rasio 8Q:2KV mengurangi memory footprint KV cache tanpa degradasi performa signifikan.
- Hybrid Attention: Layer 2, 5, 8, 11 menggunakan full attention untuk konteks global; layer lainnya pakai sliding window 128 untuk efisiensi.
- SwiGLU FFN: Gated activation function yang terbukti lebih efisien dibanding ReLU/GELU standar.
- Tied Embeddings: Input dan output embedding di-share untuk menghemat parameter.
π Training
Fase 1 β Pretraining (Lyon28 Corpus)
| Parameter | Nilai |
|---|---|
| Dataset | Lyon28/Corpus-Indonesia |
| Jumlah Baris | 1,000,000 |
| Total Token | ~175 juta |
| Teacher Model | Qwen/Qwen3-0.6B (sebagai accelerator, bukan imitasi) |
| Distilled Layers | 7, 14, 21, 28 (projector Linear 1024β768 + LayerNorm) |
| Distillation Weight | 0.5 |
| Batch Size Efektif | 64 (8 Γ 8 grad accum) |
| Learning Rate | 1e-4 (cosine + warmup 1000 step) |
| Optimizer | AdamW (Ξ²1=0.9, Ξ²2=0.95) |
| Precision | FP16 |
| Total Steps | ~5,086 |
| Waktu Training | ~2 jam 42 menit |
| Loss Akhir | 2.126 (Perplexity β 8.39) |
Fase 2 β Continued Pretraining (Wikipedia Indonesia, Sesi 1β4)
| Parameter | Nilai |
|---|---|
| Dataset | Wikipedia Bahasa Indonesia |
| Jumlah Baris | ~3,700,000 |
| Teacher | Tidak ada (pure CE loss) |
| Learning Rate | 3e-5 (cosine decay) |
| Batch Size Efektif | 64 |
| Total Steps | 12,182 |
| Jumlah Sesi | 4 sesi terpisah (Colab timeout) |
| Waktu Training | ~2 jam 54 menit |
| Loss Akhir | 3.099 (step 12,182) |
Fase 3 β Continued Pretraining (Wikipedia Indonesia, Sesi 5)
Resume dari checkpoint-12000, melanjutkan cosine schedule yang sama.
| Parameter | Nilai |
|---|---|
| Dataset | Wikipedia Bahasa Indonesia (lanjutan) |
| Resume dari | checkpoint-12000 |
| Learning Rate | 3e-5 β decay ke ~2.42e-5 |
| Batch Size Efektif | 64 |
| Total Steps | 12,500 β 17,500 |
| Loss Akhir | 2.965 (step 17,200β17,300) |
Catatan: Loss di Fase 3 berhasil menembus di bawah 3.0 untuk pertama kalinya di Wikipedia domain β turun dari 3.099 ke 2.965. Tren penurunan masih aktif saat sesi dihentikan di step 17,520.
Log Training Fase 3 (per 100 Step)
| Step | Loss | Grad Norm | LR | Ξ Loss |
|---|---|---|---|---|
| 12,500 | 3.099 | 1.418 | 2.72e-5 | β |
| 12,600 | 3.102 | 1.501 | 2.71e-5 | +0.003 |
| 12,700 | 3.077 | 1.632 | 2.71e-5 | -0.025 |
| 12,800 | 3.092 | 2.261 | 2.70e-5 | +0.015 |
| 12,900 | 3.088 | 1.823 | 2.70e-5 | -0.004 |
| 13,000 | 3.066 | 1.730 | 2.69e-5 | -0.022 |
| 13,100 | 3.066 | 1.550 | 2.69e-5 | 0.000 |
| 13,200 | 3.088 | 1.478 | 2.68e-5 | +0.022 |
| 13,300 | 3.100 | 1.660 | 2.68e-5 | +0.012 |
| 13,400 | 3.057 | 1.731 | 2.67e-5 | -0.043 |
| 13,500 | 3.052 | 1.666 | 2.64e-5 | -0.005 |
| 13,600 | 3.083 | 1.753 | 2.64e-5 | +0.031 |
| 13,700 | 3.062 | 1.638 | 2.63e-5 | -0.021 |
| 13,800 | 3.060 | 1.670 | 2.63e-5 | -0.002 |
| 13,900 | 3.073 | 2.131 | 2.62e-5 | +0.013 |
| 14,000 | 3.031 | 1.583 | 2.62e-5 | -0.042 |
| 14,100 | 3.022 | 1.485 | 2.61e-5 | -0.009 |
| 14,200 | 3.055 | 1.778 | 2.61e-5 | +0.033 |
| 14,300 | 3.025 | 1.820 | 2.60e-5 | -0.030 |
| 14,400 | 3.024 | 2.373 | 2.60e-5 | -0.001 |
| 14,500 | 3.052 | 1.930 | 2.59e-5 | +0.028 |
| 14,600 | 3.029 | 1.825 | 2.58e-5 | -0.023 |
| 14,700 | 3.046 | 1.707 | 2.58e-5 | +0.017 |
| 14,800 | 3.037 | 1.440 | 2.57e-5 | -0.009 |
| 14,900 | 3.018 | 1.853 | 2.57e-5 | -0.019 |
| 15,000 | 3.009 | 1.971 | 2.56e-5 | -0.009 |
| 15,100 | 3.050 | 2.175 | 2.56e-5 | +0.041 |
| 15,200 | 3.027 | 1.586 | 2.55e-5 | -0.023 |
| 15,300 | 3.014 | 1.489 | 2.54e-5 | -0.013 |
| 15,400 | 3.026 | 1.441 | 2.54e-5 | +0.012 |
| 15,500 | 3.022 | 1.599 | 2.53e-5 | -0.004 |
| 15,600 | 3.027 | 1.844 | 2.53e-5 | +0.005 |
| 15,700 | 3.018 | 1.577 | 2.52e-5 | -0.009 |
| 15,800 | 3.015 | 1.604 | 2.51e-5 | -0.003 |
| 15,900 | 3.008 | 1.764 | 2.51e-5 | -0.007 |
| 16,000 | 2.985 | 1.697 | 2.50e-5 | -0.023 |
| 16,100 | 2.999 | 1.732 | 2.50e-5 | +0.014 |
| 16,200 | 3.004 | 1.640 | 2.49e-5 | +0.005 |
| 16,300 | 3.005 | 1.414 | 2.48e-5 | +0.001 |
| 16,400 | 3.026 | 1.723 | 2.48e-5 | +0.021 |
| 16,500 | 2.972 | 1.477 | 2.47e-5 | -0.054 |
| 16,600 | 3.027 | 1.538 | 2.47e-5 | +0.055 |
| 16,700 | 3.006 | 1.459 | 2.46e-5 | -0.021 |
| 16,800 | 2.985 | 1.624 | 2.45e-5 | -0.021 |
| 16,900 | 2.971 | 1.570 | 2.45e-5 | -0.014 |
| 17,000 | 3.006 | 1.712 | 2.44e-5 | +0.035 |
| 17,100 | 2.966 | 1.422 | 2.44e-5 | -0.040 |
| 17,200 | 2.965 | 1.834 | 2.43e-5 | -0.001 |
| 17,300 | 2.985 | 2.522 | 2.42e-5 | +0.020 |
| 17,400 | 2.997 | 1.955 | 2.42e-5 | +0.012 |
| 17,500 | β | β | β | (checkpoint saved) |
π Kurva Loss Lengkap
Ringkasan per 1000 Step (Fase 1)
| Range | Ξ Loss | Fase |
|---|---|---|
| 0 β 1000 | -2.093 | Rapid Learning |
| 1000 β 2000 | -0.786 | Momentum Building |
| 2000 β 3000 | -0.412 | Overdrive |
| 3000 β 4000 | -0.169 | Fine-Tuning Alami |
| 4000 β 5000 | -0.126 | Konvergensi |
Ringkasan per Sesi (Fase 2 + 3)
| Sesi | Steps | Loss Akhir | Catatan |
|---|---|---|---|
| Sesi 1 | 0 β 1,500 | 3.640 | |
| Sesi 2 | 1,500 β 4,004 | 3.400 | |
| Sesi 3 | 4,004 β 9,009 | 3.186 | |
| Sesi 4 | 9,009 β 12,182 | 3.099 | |
| Sesi 5 | 12,500 β 17,500 | 2.965 | Tembus < 3.0 pertama kali |
βοΈ Cara Penggunaan
β οΈ Penting: Model ini menggunakan arsitektur custom. Wajib menambahkan
trust_remote_code=Truesaat load model, jika tidak akan error.
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
tokenizer = AutoTokenizer.from_pretrained("Veenn/vega-100m-indo")
model = AutoModelForCausalLM.from_pretrained(
"Veenn/vega-100m-indo",
trust_remote_code=True # wajib untuk arsitektur custom VegaLM
)
model.eval()
prompt = "Bahasa Indonesia adalah"
inputs = tokenizer(prompt, return_tensors="pt")
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=100,
temperature=0.8,
top_p=0.9,
top_k=50,
repetition_penalty=1.3,
do_sample=True,
)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
Inference Config yang Direkomendasikan
generation_config = {
"max_new_tokens": 100,
"temperature": 0.8,
"top_p": 0.9,
"top_k": 50,
"repetition_penalty": 1.3,
"no_repeat_ngram_size": 3,
"min_new_tokens": 10,
"do_sample": True,
}
π¬ Model Inspection
Setelah training selesai, model dibedah menggunakan inspect_vega.py untuk memahami perilaku internal β mulai dari representasi embedding, pola attention, distribusi prediksi token, hingga tracing generasi step-by-step. Berikut temuan-temuannya.
Embedding Space
Cosine similarity antar kata menunjukkan bahwa model belum membangun semantic clustering yang kuat di level embedding. Kata-kata yang secara intuitif berkaitan (jakartaβindonesia, gunungβsungai) hanya punya similarity 0.09β0.22 β rendah untuk model yang sudah melihat ratusan juta token. Ini konsisten dengan arsitektur tied embedding: karena embedding input dan output berbagi weight, gradien dari LM objective menarik embedding ke arah prediksi token berikutnya, bukan ke arah semantic similarity antar kata.
Satu anomali menarik: surabaya dan sungai punya cosine similarity = 1.000 β persis identik. Ini hampir pasti karena keduanya di-tokenize ke token yang sama oleh tokenizer Unigram 32K (kemungkinan keduanya collapse ke prefix S atau subword yang overlap).
Nearest neighbors juga masih didominasi prefix token (J, In, S, G) daripada kata-kata semantically related. Ini side effect dari tokenizer Unigram yang agresif split kata kapital jadi subword.
Attention Pattern
Entropy attention per layer berkisar 0.8β1.4 untuk sequence pendek (9 token), yang wajar β pada sequence sepanjang ini semua token masih dalam sliding window 128, jadi tidak ada perbedaan visible antara layer full attention dan sliding window. Perbedaan baru akan terlihat pada sequence panjang (>128 token).
Yang menarik: layer pertama (layer 0) punya entropy paling rendah (0.808) dibanding layer lain. Ini menunjukkan bahwa layer awal lebih "fokus" dan selektif β kemungkinan belajar mengekstrak fitur lokal yang tajam, sementara layer tengah dan akhir lebih "spread" untuk integrasi konteks yang lebih luas.
Token Prediction & Generasi
Distribusi prediksi menunjukkan model sudah berfungsi dengan benar:
- "Ibukota Indonesia adalah" β top prediction:
sebuah(24.4%), entropy 4.30. Model tahu ini konteks deskripsi, tapi belum tahu bahwa "ibukota" harus diikuti nama kota. - "Presiden pertama Indonesia adalah" β top prediction:
P(7.3%),W(6.8%), entropy 5.48. Model ragu antara nama yang diawali P atau W β distribusi masih cukup flat, belum confident ke "Soekarno". - "Bahasa resmi Indonesia adalah" β top prediction:
b(93.5%) yang berlanjut ke "bahasa" β "tradisional". Model tahu konteksnya bahasa, tapi lanjutnya salah faktual.
Generasi traced menunjukkan banyak token di tengah kalimat punya probabilitas mendekati 1.0 β artinya setelah beberapa token pertama model sangat confident dengan kelanjutannya (misalnya setelah "Kemen" β "ter" β "ian" semua p=1.0). Ini tanda model sudah menguasai morfologi dan struktur kata Bahasa Indonesia dengan baik, tapi factual recall masih terbatas β karena base model ini dilatih untuk memprediksi teks, bukan untuk menjawab pertanyaan faktual.
Kesimpulan Inspection
Model berfungsi normal dan weight ter-load dengan benar (entropy turun dari ~7.1 di awal ke 4.3β5.5 setelah fix). Kelemahan utama ada di dua area: (1) semantic embedding space yang belum ter-cluster dengan baik, dan (2) factual recall yang masih lemah untuk pertanyaan seperti "ibukota X adalah Y". Keduanya adalah karakteristik wajar base model yang belum instruction-tuned β dan keduanya bisa diperbaiki dengan fine-tuning yang tepat.
π§ͺ Contoh Output
Model ini adalah base model β outputnya adalah kelanjutan teks, bukan jawaban instruksi.
Prompt: "Ibukota Indonesia adalah"
"...bagian dari Kementerian Kelautan dan Perikanan Republik Indonesia..."
Prompt: "Presiden pertama Indonesia adalah"
"...Wakil Presiden Indonesia, pada tanggal 8 Desember 1994..."
Prompt: "Bahasa resmi Indonesia adalah"
"...bahasa tradisional yang dituturkan oleh bahasa Indonesia..."
Model sudah menguasai struktur Bahasa Indonesia dengan baik (morfologi, kalimat kompleks, SPOK benar) namun pengetahuan faktual masih terbatas. Fine-tuning instruksi diperlukan untuk task factual QA.
π Zona Loss Optimal (96M Parameter)
| Range Loss | Status |
|---|---|
| < 1.5 | β Impossible (information theory) |
| 1.5 β 1.8 | β οΈ Kemungkinan Overfit |
| 1.8 β 2.0 | β οΈ Risky |
| 2.0 β 2.3 | β OPTIMAL |
| 2.3 β 2.6 | π‘ Good |
| 2.6 β 3.0 | π Acceptable |
| > 3.0 | π΄ Underfit |
Loss Fase 1 sebesar 2.126 berada di zona optimal β . Loss Fase 2+3 (2.965) mencerminkan kesulitan domain Wikipedia yang lebih tinggi β sekarang masuk zona Acceptable dan terus turun.
π― Intended Use & Limitasi
β Cocok untuk:
- Fine-tuning untuk downstream task Bahasa Indonesia (klasifikasi, NER, QA, summarization)
- Penelitian NLP bahasa Indonesia
- Basis eksperimen arsitektur LM skala kecil
- Deployment edge device (96M param, ringan)
β Tidak cocok untuk:
- Penggunaan langsung sebagai chatbot/asisten (belum instruction-tuned)
- Factual QA tanpa fine-tuning tambahan
- Aplikasi produksi yang memerlukan akurasi faktual tinggi
β οΈ Limitasi yang Diketahui:
- Factual recall masih lemah β model tahu konteks tapi bukan fakta spesifik
- Semantic embedding space belum ter-cluster kuat (tied embedding trade-off)
- Tokenizer Unigram 32K agresif split kata kapital jadi subword
- Max sequence 512 token
π Isi Repo
Semua file di repo ini dirilis secara terbuka β bukan hanya weights-nya, tapi juga kode dan artefak training yang memungkinkan siapapun untuk mereproduksi atau melanjutkan eksperimen ini dari nol.
Model & Arsitektur
model.safetensors β Weight model hasil training Fase 3 (checkpoint step 17,500), format SafeTensors. Ini yang di-load saat from_pretrained().
modeling_vegalm.py β Definisi arsitektur VegaLM dalam PyTorch. File ini wajib ada di repo agar AutoModelForCausalLM bisa mengenali arsitektur custom ini via trust_remote_code=True. Berisi implementasi lengkap GQA, hybrid attention, SwiGLU FFN, dan tied embeddings.
config.json β Konfigurasi model: hidden size, jumlah layer, vocab size, parameter distilasi, dll. Juga berisi auto_map yang menghubungkan AutoModelForCausalLM ke VegaLMForCausalLM di modeling_vegalm.py.
Tokenizer
tokenizer.model β File model SentencePiece Unigram 32K yang dilatih langsung dari Lyon28/Corpus-Indonesia. Bukan tokenizer off-the-shelf β dilatih khusus untuk distribusi teks Bahasa Indonesia.
tokenizer.json β Representasi tokenizer dalam format HuggingFace, digunakan oleh AutoTokenizer.
tokenizer.vocab β Daftar lengkap 32,000 token beserta skor unigram-nya. Berguna untuk inspeksi vocab atau analisis coverage.
tokenizer_config.json β Metadata tokenizer: special tokens (<pad>, <unk>, <s>, </s>), model_max_length, dan pointer ke class tokenizer.
Training & Inspection Scripts
train_phase1.py β Script training Fase 1 yang digunakan untuk melatih Vega dari nol. Ini bukan sekadar boilerplate β script ini mendokumentasikan seluruh keputusan arsitektur dan engineering yang dibuat selama proses development, termasuk implementasi DistillationTrainer custom, mekanisme attention pooling per-layer untuk distilasi, dan serangkaian fix engineering yang terdokumentasi ([F1]β[F9], [FIX-A]β[FIX-C]). Script ini bisa dijalankan langsung di Google Colab T4 gratis dan otomatis resume dari checkpoint terakhir di Google Drive.
inspect_vega.py β Script untuk membedah perilaku model secara menyeluruh: analisis cosine similarity embedding antar kata, visualisasi entropy attention per layer, distribusi prediksi next token, dan generation trace step-by-step dengan probabilitas tiap token. Berguna untuk memahami apa yang sudah dan belum dipelajari model sebelum memutuskan strategi fine-tuning.
Artefak Training
trainer_state.json β Log training step-by-step dari HuggingFace Trainer: loss per step, learning rate schedule, dan metadata checkpoint.
training_args.bin β Serialisasi TrainingArguments yang dipakai saat training. Berisi semua hyperparameter: batch size, learning rate, scheduler, precision, dll.
scheduler.pt β State LR scheduler di akhir training.
training_phase1_pretrain.png β Grafik kurva loss Fase 1 (Lyon28 corpus, ~5086 steps).
training_phase2_wiki.png β Grafik kurva loss Fase 2 (Wikipedia Indonesia, 12,182 steps lintas 4 sesi Colab).
mascot.png β Maskot Vega. π
πΊοΈ Roadmap
- Vega-100M-Indo-Instruct β Instruction tuning dengan dataset Alpaca/ShareGPT Bahasa Indonesia
- Evaluasi formal (validation perplexity, downstream benchmarks)
- Extended pretraining dengan lebih banyak data
π» Infrastruktur Training
| Item | Detail |
|---|---|
| Platform | Google Colab (Free Tier) |
| GPU | NVIDIA T4 (16GB VRAM) |
| Budget | $0 |
| Framework | PyTorch + HuggingFace Transformers |
| Precision | FP16 |
| Total Waktu | ~7 jam+ (ketiga fase) |
π Acknowledgements
- Qwen Team β untuk
Qwen3-0.6Byang digunakan sebagai teacher model (training accelerator) - Lyon28 β untuk
Corpus-Indonesiadataset - Wikimedia β untuk Wikipedia Bahasa Indonesia
- Google Colab β untuk akses GPU gratis yang memungkinkan proyek ini ada
- Downloads last month
- 2,108

