Update model card
Browse files
README.md
CHANGED
|
@@ -12,33 +12,48 @@ datasets:
|
|
| 12 |
- Lyon28/Corpus-Indonesia
|
| 13 |
---
|
| 14 |
|
| 15 |
-
|
|
|
|
| 16 |
|
| 17 |
-
|
| 18 |
|
| 19 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 20 |
|
| 21 |
## Arsitektur
|
| 22 |
|
| 23 |
Konsep utamanya adalah **Dual Sparse** β dua level sparsity yang bekerja bersamaan supaya model kecil bisa berkapasitas lebih dari ukuran parameternya.
|
| 24 |
|
| 25 |
-
|
| 26 |
Satu shared expert yang selalu aktif ditambah empat specialist expert yang dipilih router per token. Efeknya: kapasitas representasi ~5x lebih tinggi dari parameter aktif per forward pass, tanpa nambah biaya komputasi secara proporsional.
|
| 27 |
|
| 28 |
-
|
| 29 |
-
Router kecil di tiap layer memutuskan apakah layer perlu diproses atau dilewati. Token sederhana bisa melewati beberapa layer, token kompleks dapat perhatian penuh. Diaktifkan di versi ini dengan skip probability 0.3.
|
| 30 |
|
| 31 |
-
|
|
|
|
| 32 |
|
| 33 |
-
|
| 34 |
-
|---|---|
|
| 35 |
-
| GQA | 4 query heads, 2 KV heads |
|
| 36 |
-
| RoPE | Rotary Position Embedding |
|
| 37 |
-
| SwiGLU | Aktivasi di FFN |
|
| 38 |
-
| RMSNorm | Normalisasi per layer |
|
| 39 |
-
| Weight Tying | Embedding dan output head berbagi bobot |
|
| 40 |
|
| 41 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 42 |
|
| 43 |
```
|
| 44 |
VOCAB_SIZE = 8.000
|
|
@@ -50,6 +65,7 @@ FF_MULT = 3
|
|
| 50 |
NUM_EXPERTS = 4 + 1 shared
|
| 51 |
MAX_SEQ = 256
|
| 52 |
Total params: 10.472.076
|
|
|
|
| 53 |
```
|
| 54 |
|
| 55 |
## Tokenizer
|
|
@@ -64,15 +80,15 @@ Special : [UNK] [BOS] [EOS] [PAD]
|
|
| 64 |
|
| 65 |
## Training
|
| 66 |
|
| 67 |
-
|
| 68 |
|
| 69 |
-
Sumber: `Lyon28/Corpus-Indonesia`
|
| 70 |
|
| 71 |
-
|
| 72 |
|
| 73 |
-
Mayoritas kalimat di dataset panjangnya di bawah 50 token. Dengan padding biasa, sekitar 96% slot per batch terisi token padding yang tidak berkontribusi ke loss. Solusinya: semua token digabung jadi satu stream panjang lalu dipotong jadi chunk 256 token. Hasilnya 21.237.953 token terpacking jadi 82.960 chunks, tidak ada padding sama sekali.
|
| 74 |
|
| 75 |
-
|
| 76 |
|
| 77 |
```
|
| 78 |
Hardware : Tesla T4 15.6GB (Google Colab Free)
|
|
@@ -84,29 +100,29 @@ Scheduler : Cosine Annealing Warm Restarts
|
|
| 84 |
Warmup : 500 steps
|
| 85 |
```
|
| 86 |
|
| 87 |
-
|
| 88 |
|
| 89 |
| Step | Loss | PPL |
|
| 90 |
|------|------|-----|
|
| 91 |
-
| 50
|
| 92 |
-
| 500
|
| 93 |
-
| 1000 | 6.50 | 662
|
| 94 |
-
| 1500 | 6.19 | 486
|
| 95 |
-
| 2000 | 5.89 | 360
|
| 96 |
|
| 97 |
-
Baseline acak untuk vocab 8.000: log(8000) = 8.987
|
| 98 |
|
| 99 |
-
|
| 100 |
|
| 101 |
Dua bug utama ditemukan dan diperbaiki selama proses ini:
|
| 102 |
|
| 103 |
-
|
| 104 |
|
| 105 |
-
|
| 106 |
|
| 107 |
## Cara Load
|
| 108 |
|
| 109 |
-
Model ini menggunakan arsitektur custom, jadi perlu menyertakan definisi kelas-kelasnya sebelum bisa diload. Salin file `modeling_photon.py` dari repo ini, lalu:
|
| 110 |
|
| 111 |
```python
|
| 112 |
import torch
|
|
@@ -159,24 +175,29 @@ Output belum koheren. Kata-katanya sudah valid Bahasa Indonesia dan tidak ada la
|
|
| 159 |
|
| 160 |
## Limitasi
|
| 161 |
|
| 162 |
-
Model ini adalah proof of concept arsitektur, bukan model siap pakai. Vocab 8.000 terlalu kecil untuk menghasilkan teks yang baik, hidden 128 membatasi kapasitas representasi, dan training baru sampai step 2000 dari 3.240 yang direncanakan. Untuk hasil yang lebih baik perlu scale up ke vocab yang lebih besar dan hidden yang lebih lebar.
|
| 163 |
|
| 164 |
## Isi Repo
|
| 165 |
|
| 166 |
```
|
| 167 |
Veenn/photon-3m
|
| 168 |
-
βββ model.pt
|
| 169 |
-
βββ config.pt
|
| 170 |
-
βββ modeling_photon.py
|
| 171 |
-
βββ training_state.pt
|
| 172 |
βββ tokenizer.json
|
| 173 |
βββ tokenizer_config.json
|
|
|
|
| 174 |
βββ README.md
|
| 175 |
```
|
| 176 |
|
| 177 |
## Rencana Selanjutnya
|
| 178 |
|
| 179 |
-
Iterasi berikutnya kemungkinan akan menaikkan vocab ke 16.000
|
|
|
|
|
|
|
| 180 |
|
| 181 |
-
|
| 182 |
-
|
|
|
|
|
|
|
|
|
| 12 |
- Lyon28/Corpus-Indonesia
|
| 13 |
---
|
| 14 |
|
| 15 |
+
<div align="center">
|
| 16 |
+
<img src="https://huggingface.co/Veenn/photon-3m/resolve/main/1000326189.png" alt="Photon Mascot" width="300"/>
|
| 17 |
|
| 18 |
+
# Photon-3M
|
| 19 |
|
| 20 |
+
Model bahasa Indonesia skala kecil dengan arsitektur *Dual Sparse*, dibangun dan dilatih dari nol di Google Colab Free T4.
|
| 21 |
+
|
| 22 |
+
[](https://opensource.org/licenses/Apache-2.0)
|
| 23 |
+
[](https://huggingface.co/Veenn/photon-3m)
|
| 24 |
+
[](https://huggingface.co/datasets/Lyon28/Corpus-Indonesia)
|
| 25 |
+
[](https://colab.research.google.com)
|
| 26 |
+
</div>
|
| 27 |
+
|
| 28 |
+
---
|
| 29 |
+
|
| 30 |
+
Nama "3M" merujuk pada jumlah parameter **aktif per forward pass**, bukan total parameter. Total parameter sebenarnya **10.47M** karena MoE.
|
| 31 |
|
| 32 |
## Arsitektur
|
| 33 |
|
| 34 |
Konsep utamanya adalah **Dual Sparse** β dua level sparsity yang bekerja bersamaan supaya model kecil bisa berkapasitas lebih dari ukuran parameternya.
|
| 35 |
|
| 36 |
+
### MoE (Mixture of Experts)
|
| 37 |
Satu shared expert yang selalu aktif ditambah empat specialist expert yang dipilih router per token. Efeknya: kapasitas representasi ~5x lebih tinggi dari parameter aktif per forward pass, tanpa nambah biaya komputasi secara proporsional.
|
| 38 |
|
| 39 |
+
> Referensi konsep: [Mixtral of Experts (Mistral AI)](https://arxiv.org/abs/2401.04088)
|
|
|
|
| 40 |
|
| 41 |
+
### Adaptive Layer Skipping
|
| 42 |
+
Router kecil di tiap layer memutuskan apakah layer perlu diproses atau dilewati. Token sederhana bisa melewati beberapa layer, token kompleks dapat perhatian penuh. Diaktifkan di versi ini dengan skip probability **0.3**.
|
| 43 |
|
| 44 |
+
> Referensi konsep: [Confident Adaptive Language Modeling (CALM)](https://arxiv.org/abs/2207.07061)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 45 |
|
| 46 |
+
### Komponen Lain
|
| 47 |
+
|
| 48 |
+
| Komponen | Keterangan | Referensi |
|
| 49 |
+
|---|---|---|
|
| 50 |
+
| GQA | 4 query heads, 2 KV heads | [GQA Paper](https://arxiv.org/abs/2305.13245) |
|
| 51 |
+
| RoPE | Rotary Position Embedding | [RoFormer](https://arxiv.org/abs/2104.09864) |
|
| 52 |
+
| SwiGLU | Aktivasi di FFN | [GLU Variants](https://arxiv.org/abs/2002.05202) |
|
| 53 |
+
| RMSNorm | Normalisasi per layer | [RMSNorm Paper](https://arxiv.org/abs/1910.07467) |
|
| 54 |
+
| Weight Tying | Embedding dan output head berbagi bobot | [Press & Wolf, 2017](https://arxiv.org/abs/1608.05859) |
|
| 55 |
+
|
| 56 |
+
### Konfigurasi
|
| 57 |
|
| 58 |
```
|
| 59 |
VOCAB_SIZE = 8.000
|
|
|
|
| 65 |
NUM_EXPERTS = 4 + 1 shared
|
| 66 |
MAX_SEQ = 256
|
| 67 |
Total params: 10.472.076
|
| 68 |
+
Active params per forward: ~3.000.000
|
| 69 |
```
|
| 70 |
|
| 71 |
## Tokenizer
|
|
|
|
| 80 |
|
| 81 |
## Training
|
| 82 |
|
| 83 |
+
### Dataset
|
| 84 |
|
| 85 |
+
Sumber: [`Lyon28/Corpus-Indonesia`](https://huggingface.co/datasets/Lyon28/Corpus-Indonesia) β 100.000 baris pertama dipakai untuk training tokenizer, 500.000 baris untuk training model. Setelah filter teks terlalu pendek: **449.909 valid**.
|
| 86 |
|
| 87 |
+
### Packing Dataset
|
| 88 |
|
| 89 |
+
Mayoritas kalimat di dataset panjangnya di bawah 50 token. Dengan padding biasa, sekitar 96% slot per batch terisi token padding yang tidak berkontribusi ke loss. Solusinya: semua token digabung jadi satu stream panjang lalu dipotong jadi chunk 256 token. Hasilnya 21.237.953 token terpacking jadi **82.960 chunks**, tidak ada padding sama sekali.
|
| 90 |
|
| 91 |
+
### Proses Training
|
| 92 |
|
| 93 |
```
|
| 94 |
Hardware : Tesla T4 15.6GB (Google Colab Free)
|
|
|
|
| 100 |
Warmup : 500 steps
|
| 101 |
```
|
| 102 |
|
| 103 |
+
### Kurva Loss
|
| 104 |
|
| 105 |
| Step | Loss | PPL |
|
| 106 |
|------|------|-----|
|
| 107 |
+
| 50 | 8.97 | 7836 |
|
| 108 |
+
| 500 | 7.39 | 1618 |
|
| 109 |
+
| 1000 | 6.50 | 662 |
|
| 110 |
+
| 1500 | 6.19 | 486 |
|
| 111 |
+
| 2000 | 5.89 | 360 |
|
| 112 |
|
| 113 |
+
Baseline acak untuk vocab 8.000: `log(8000) = 8.987`
|
| 114 |
|
| 115 |
+
### Bug yang Ditemui
|
| 116 |
|
| 117 |
Dua bug utama ditemukan dan diperbaiki selama proses ini:
|
| 118 |
|
| 119 |
+
**Masalah padding 96%.** Terdeteksi lewat print debug manual pada sample batch yang menunjukkan hampir seluruh slot terisi token `-100`. Solusinya beralih ke packing dataset.
|
| 120 |
|
| 121 |
+
**Posisi akumulasi loss yang salah.** `running_loss` diakumulasi di luar blok gradient accumulation tapi dibagi per step, menghasilkan angka loss yang tampak ~8x lebih besar dari nilai sebenarnya. Solusinya memindahkan akumulasi ke dalam blok yang benar.
|
| 122 |
|
| 123 |
## Cara Load
|
| 124 |
|
| 125 |
+
Model ini menggunakan arsitektur custom, jadi perlu menyertakan definisi kelas-kelasnya sebelum bisa diload. Salin file [`modeling_photon.py`](https://huggingface.co/Veenn/photon-3m/blob/main/modeling_photon.py) dari repo ini, lalu:
|
| 126 |
|
| 127 |
```python
|
| 128 |
import torch
|
|
|
|
| 175 |
|
| 176 |
## Limitasi
|
| 177 |
|
| 178 |
+
Model ini adalah **proof of concept arsitektur**, bukan model siap pakai. Vocab 8.000 terlalu kecil untuk menghasilkan teks yang baik, hidden 128 membatasi kapasitas representasi, dan training baru sampai step 2000 dari 3.240 yang direncanakan. Untuk hasil yang lebih baik perlu scale up ke vocab yang lebih besar dan hidden yang lebih lebar.
|
| 179 |
|
| 180 |
## Isi Repo
|
| 181 |
|
| 182 |
```
|
| 183 |
Veenn/photon-3m
|
| 184 |
+
βββ model.pt <- state dict model
|
| 185 |
+
βββ config.pt <- konfigurasi arsitektur
|
| 186 |
+
βββ modeling_photon.py <- definisi arsitektur (wajib disertakan)
|
| 187 |
+
βββ training_state.pt <- state training untuk resume
|
| 188 |
βββ tokenizer.json
|
| 189 |
βββ tokenizer_config.json
|
| 190 |
+
βββ 1000326189.png <- maskot Photon
|
| 191 |
βββ README.md
|
| 192 |
```
|
| 193 |
|
| 194 |
## Rencana Selanjutnya
|
| 195 |
|
| 196 |
+
Iterasi berikutnya kemungkinan akan menaikkan vocab ke **16.000β32.000** dan hidden ke **256**, dengan target parameter di kisaran **50β100M**. Adaptive Layer Skipping juga akan dievaluasi lebih lanjut apakah benar memberikan efek positif atau tidak setelah training lebih panjang.
|
| 197 |
+
|
| 198 |
+
---
|
| 199 |
|
| 200 |
+
<div align="center">
|
| 201 |
+
<em>Dikembangkan oleh <a href="https://huggingface.co/Veenn">Velyn</a></em><br>
|
| 202 |
+
<em>Dilatih di Google Colab Free T4</em>
|
| 203 |
+
</div>
|