Vega Mascot

Vega-100M-Indo

Model bahasa Indonesia 96.6M parameter β€” dilatih dari nol, gratis, dalam beberapa jam.

License Language Platform Budget Parameters


πŸ”§ 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 β€” tambah auto_map dan fix model_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:

  1. Pretraining pada Lyon28/Corpus-Indonesia (~175M token dari 1M baris) β€” dengan distilasi sebagai accelerator
  2. Continued Pretraining pada Wikipedia Bahasa Indonesia (3.7M baris, sesi 1–4, hingga step 12,182) β€” tanpa distilasi
  3. 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 1 Training

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 2 Training

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=True saat 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.6B yang digunakan sebagai teacher model (training accelerator)
  • Lyon28 β€” untuk Corpus-Indonesia dataset
  • Wikimedia β€” untuk Wikipedia Bahasa Indonesia
  • Google Colab β€” untuk akses GPU gratis yang memungkinkan proyek ini ada

Dilatih dari nol. Gratis. Untuk Bahasa Indonesia.
Downloads last month
2,108
Safetensors
Model size
0.1B params
Tensor type
F32
Β·
Inference Providers NEW
This model isn't deployed by any Inference Provider. πŸ™‹ Ask for provider support

Datasets used to train Veenn/vega-100m-indo