Veenn commited on
Commit
27bbbd7
Β·
verified Β·
1 Parent(s): d007d5a

Update model card

Browse files
Files changed (1) hide show
  1. README.md +60 -39
README.md CHANGED
@@ -12,33 +12,48 @@ datasets:
12
  - Lyon28/Corpus-Indonesia
13
  ---
14
 
15
- # Photon-3M
 
16
 
17
- Model bahasa Indonesia skala kecil dengan arsitektur *Dual Sparse*, dibangun dan dilatih dari nol di Google Colab Free T4.
18
 
19
- Nama "3M" merujuk pada jumlah parameter aktif per forward pass, bukan total parameter. Total parameter sebenarnya 10.47M karena MoE.
 
 
 
 
 
 
 
 
 
 
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
- **MoE (Mixture of Experts)**
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
- **Adaptive Layer Skipping**
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
- **Komponen lain**
 
32
 
33
- | Komponen | Keterangan |
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
- **Konfigurasi**
 
 
 
 
 
 
 
 
 
 
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
- **Dataset**
68
 
69
- Sumber: `Lyon28/Corpus-Indonesia`, 100.000 baris pertama dipakai untuk tokenizer, 500.000 baris untuk training. Setelah filter teks terlalu pendek: 449.909 valid.
70
 
71
- **Packing Dataset**
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
- **Proses Training**
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
- **Kurva Loss**
88
 
89
  | Step | Loss | PPL |
90
  |------|------|-----|
91
- | 50 | 8.97 | 7836 |
92
- | 500 | 7.39 | 1618 |
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
- **Bug yang ditemui**
100
 
101
  Dua bug utama ditemukan dan diperbaiki selama proses ini:
102
 
103
- Pertama, masalah padding 96%. Terdeteksi lewat print debug manual pada sample batch yang menunjukkan hampir seluruh slot terisi token -100. Solusinya beralih ke packing dataset.
104
 
105
- Kedua, 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.
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 <- state dict model
169
- β”œβ”€β”€ config.pt <- konfigurasi arsitektur
170
- β”œβ”€β”€ modeling_photon.py <- definisi arsitektur (wajib disertakan)
171
- β”œβ”€β”€ training_state.pt <- state training untuk resume
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-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.
 
 
180
 
181
- *Dikembangkan oleh [Velyn](https://huggingface.co/Veenn)*
182
- *Dilatih di Google Colab Free T4*
 
 
 
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
+ [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
23
+ [![HuggingFace](https://img.shields.io/badge/πŸ€—%20HuggingFace-Veenn%2Fphoton--3m-yellow)](https://huggingface.co/Veenn/photon-3m)
24
+ [![Dataset](https://img.shields.io/badge/Dataset-Lyon28%2FCorpus--Indonesia-green)](https://huggingface.co/datasets/Lyon28/Corpus-Indonesia)
25
+ [![Colab](https://img.shields.io/badge/Trained%20on-Google%20Colab%20Free%20T4-orange)](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>