jslin09 commited on
Commit
cdbfd1d
·
verified ·
1 Parent(s): 5489c01

Update README.md

Browse files
Files changed (1) hide show
  1. README.md +385 -328
README.md CHANGED
@@ -1,7 +1,7 @@
1
  ---
2
  license: apache-2.0
3
  datasets:
4
- - HuggingFaceFW/fineweb-2
5
  language:
6
  - en
7
  - zh
@@ -16,451 +16,508 @@ base_model:
16
 
17
  ---
18
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  ## 目錄
20
 
21
- - [模型架構](#模型架構)
22
- - [環境安裝](#環境安裝)
23
- - [快速開始](#快速開始)
24
- - [資料集設定](#資料集設定)
25
- - [訓練模式](#訓練模式)
26
- - [CLI 完整參數](#cli-完整參數)
27
- - [發布存檔格式](#發布存檔格式)
28
- - [專案結構](#專案結構)
29
- - [常見問題](#常見問題)
30
- - [授權](#授權)
 
 
 
 
31
 
32
  ---
33
 
34
- ## 模型架構
35
 
36
- | 項目 | 數值 |
37
  |------|------|
38
- | 總參數量 | ~1.15B |
39
- | 激活參數量(推理時)| ~460M |
40
- | 隱藏層總數 | 24 |
41
- | 其中 Dense 層 | 16 3 層中的前 2 層)|
42
- | 其中 MoE 層 | 8 3 層中的第 3 層)|
43
- | 隱藏維度 | 2048 |
44
- | Attention 機制 | GQA Q heads: 16 / KV heads: 4 |
45
- | Head 維度 | 128 |
46
- | Dense FFN 中間維度 | 5632(SwiGLU)|
47
- | MoE 專家數 | 16(top-2 稀疏激活)|
48
- | 每個 Expert 中間維度 | 2048 |
49
- | 位置編碼 | YaRN RoPE(θ=500000, factor=8)|
50
- | 訓練 context 長度 | 128K tokens |
51
- | 推理 context 長度 | 最大 **1M tokens**(YaRN 外推)|
52
- | 注意力策略 | 偶數層:全注意力;奇數層:Sliding Window (4096)|
53
- | Normalization | RMSNorm(ε=1e-5,float32 計算)|
54
- | 詞彙量 | 56,000(SentencePiece BPE)|
55
- | MoE 輔助損失 | Load Balancing Loss + Router Z-Loss |
56
 
57
  ---
58
 
59
- ## 環境安裝
60
 
61
- ### NVIDIA CUDA(推薦)
62
 
63
- ```bash
64
- # PyTorch with CUDA 12.1
65
- pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
66
- pip install transformers datasets sentencepiece tensorboard accelerate safetensors
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67
  ```
68
 
69
- ### Apple Silicon(macOS 12.3+)
70
 
71
- ```bash
72
- # PyTorch with MPS(BF16 PyTorch >= 2.3)
73
- pip install torch torchvision torchaudio
74
- pip install transformers datasets sentencepiece tensorboard accelerate safetensors
75
- ```
76
 
77
- > **注意**:macOS 上的 OpenMP 衝突問題已由程式自動處理,不需要手動設定環境變數。
 
78
 
79
- ### 最低 Python 版本
 
80
 
81
- Python **3.10+**(使用了 walrus operator `:=`)
 
82
 
83
- ---
 
84
 
85
- ## 快速開始
 
86
 
87
- ### 步驟 0:確認平台偵測
 
88
 
89
- ```bash
90
- python train_llm.py --mode info
91
- ```
92
 
93
- 輸出範例(Apple M2 Pro):
94
- ```json
95
- {
96
- "device": "mps",
97
- "device_name": "Apple M2 Pro",
98
- "use_bf16": true,
99
- "recommended_batch": 1,
100
- "fused_adamw": false,
101
- "dataloader_workers": 0
102
- }
103
- ```
 
 
104
 
105
- ### 步驟 1:訓練分詞器(首次執行,只需一次)
106
 
107
- ```bash
108
- python train_llm.py --mode tokenizer --data_dir ./data
109
- ```
110
 
111
- FineWeb2 下載約 500 萬行語料訓練 SentencePiece BPE 分詞器(56K 詞彙,中英文及多語言 character coverage 99.95%)。
 
 
 
 
 
 
 
 
112
 
113
- ### 步驟 2訓練模型
 
 
114
 
115
- ```bash
116
- # 最簡單:使用預設 FineWeb2,所有超參數自動偵測
117
- python train_llm.py --mode train --model_name kuixing-1.15b
118
-
119
- # 使用自訂資料集設定
120
- python train_llm.py --mode train \
121
- --dataset_config dataset_config.json \
122
- --mix_strategy weighted \
123
- --model_name kuixing-1.15b
124
- ```
125
 
126
- ### 步驟 3:推論測試
127
 
128
- ```bash
129
- python train_llm.py --mode demo
130
- ```
 
 
 
 
 
 
131
 
132
  ---
133
 
134
- ## 資料集設定
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
135
 
136
- 支援三種方式指定訓練資料,可任意混合多個來源。
137
 
138
- ### 方式 1:JSON 設定���(最彈性)
139
 
140
- ```bash
141
- python train_llm.py --mode train --dataset_config dataset_config.json
142
- ```
143
 
144
- 參見 [`dataset_config.json`](dataset_config.json) 範例(FineWeb2 + Wikipedia 混合)
145
-
146
- `dataset_config_local.json` 示範本地 JSONL 檔案的用法。
147
-
148
- **DatasetSource 完整欄位:**
149
-
150
- | 欄位 | 型別 | 預設 | 說明 |
151
- |------|------|------|------|
152
- | `source` | str | `"huggingface"` | `huggingface` / `local_files` / `local_dir` |
153
- | `path` | str | — | HF dataset id 或本地路徑(多檔用逗號分隔)|
154
- | `name` | str | `""` | HF subset name,如 `"20231101.zh"` |
155
- | `split` | str | `"train"` | HF split |
156
- | `text_field` | str | `"text"` | 要讀取的欄位名稱 |
157
- | `filter_field` | str | `""` | 過濾欄位(空=不過濾)|
158
- | `filter_values` | list | `[]` | 允許通過的值清單 |
159
- | `streaming` | bool | `true` | 串流載入(省記憶體)|
160
- | `shuffle` | bool | `true` | 是否打亂 |
161
- | `buffer_size` | int | `10000` | shuffle 緩衝大小 |
162
- | `min_length` | int | `50` | 最短文字長度(字元)|
163
- | `max_samples` | int | `0` | 最多取用樣本數(0=不限)|
164
- | `weight` | float | `1.0` | weighted 混合時的取樣比例 |
165
- | `file_format` | str | `"txt"` | 本地格式:`txt` / `jsonl` / `csv` |
166
- | `glob_pattern` | str | `"**/*.txt"` | local_dir 模式的 glob |
167
- | `csv_delimiter` | str | `","` | CSV 分隔符 |
168
- | `seed` | int | `42` | 隨機種子 |
169
- | `label` | str | _(path basename)_ | 日誌顯示標籤 |
170
-
171
- ### 方式 2:CLI 快速指定
172
 
173
- ```bash
174
- # HuggingFace 資料集
175
- python train_llm.py --mode train \
176
- --dataset_path "wikimedia/wikipedia" \
177
- --dataset_name "20231101.zh" \
178
- --text_field "text"
179
-
180
- # 本地 JSONL 檔案
181
- python train_llm.py --mode train \
182
- --dataset_path "/data/corpus.jsonl" \
183
- --source_type local_files \
184
- --file_format jsonl \
185
- --text_field "content"
186
-
187
- # 本地目錄(掃描所有 .txt)
188
- python train_llm.py --mode train \
189
- --dataset_path "/data/articles/" \
190
- --source_type local_dir \
191
- --file_format txt
192
- ```
193
 
194
- ### 方式 3預設 FineWeb2(無額外設定)
 
 
 
 
 
195
 
196
- ```bash
197
- # 預設語言:簡體中文 + 繁體中文 + 英文
198
- python train_llm.py --mode train
199
 
200
- # 自訂語言過濾
201
- python train_llm.py --mode train --langs "zho_Hans,eng_Latn"
 
 
 
 
 
 
 
 
202
  ```
203
 
204
- ### 多來源混合策略
 
 
205
 
206
  ```bash
207
- # sequential(預設):依序消耗每個來源
208
- python train_llm.py --mode train --dataset_config dataset_config.json
 
 
 
 
 
 
 
 
 
 
 
 
 
 
209
 
210
- # weighted:依 weight 比例同時交錯取樣(推薦多語料混訓)
211
- python train_llm.py --mode train \
212
- --dataset_config dataset_config.json \
213
- --mix_strategy weighted
214
  ```
215
 
216
  ---
217
 
218
- ## 訓練
219
 
220
- ### 從頭訓練Pretrain
221
 
222
  ```bash
223
- python train_llm.py --mode train \
224
- --model_name kuixing-1.15b \
225
- --max_steps 1000000 \
226
- --seq_len 4096 \
227
- --lr 2e-4
228
  ```
229
 
230
- ### 接續訓練(Continue)
231
 
232
- **從 Trainer Checkpoint 接續**(訓練中斷後繼續,保留優化器狀態與步驟):
233
 
234
  ```bash
235
- python train_llm.py --mode train \
236
- --train_mode continue \
237
- --resume_from_checkpoint ./checkpoints/checkpoint-50000 \
238
- --max_steps 1000000
239
- ```
240
 
241
- **從 Release Export 接續**(換資料集繼續預訓練,步驟重設)
 
242
 
243
- ```bash
244
- python train_llm.py --mode train \
245
- --train_mode continue \
246
- --resume_from_checkpoint ./checkpoints/release/kuixing-1.15b-20250101_120000/model \
247
- --dataset_path "wikimedia/wikipedia" \
248
- --dataset_name "20231101.zh" \
249
- --lr 1e-4 \
250
- --max_steps 200000
251
- ```
252
 
253
- ### 發布存檔
 
254
 
255
- 對已完成訓練的 checkpoint 重新打包(不需重新訓練)
 
256
 
257
- ```bash
258
- python train_llm.py --mode export \
259
- --output_dir ./checkpoints \
260
- --tokenizer_model ./data/spm_tokenizer.model \
261
- --model_name kuixing-1.15b
262
  ```
263
 
264
  ---
265
 
266
- ## CLI 完整參數
 
 
 
 
 
 
 
 
 
 
 
 
 
 
267
 
268
  ```
269
- --mode train | tokenizer | demo | info | export
270
- --model_name 發布名稱前綴(預設: kuixing-1.15b)
271
- --data_dir 分詞器語料目錄(預設: ./data)
272
- --output_dir 訓練輸出目(預設: ./checkpoints
273
- --tokenizer_model SPM 模型路徑(預設: ./data/spm_tokenizer.model)
274
-
275
- 訓練模式:
276
- --train_mode pretrain(預設)| continue
277
- --resume_from_checkpoint 接續訓練的 checkpoint 路徑
278
-
279
- 資料集(三選一):
280
- --dataset_config JSON 設定檔路徑最高優先
281
- --dataset_path 單一資料集路徑(HF id 或本地路徑)
282
- --dataset_name HF subset name
283
- --dataset_split HF split(預設: train)
284
- --text_field 文字欄位名稱(預設: text)
285
- --filter_field 過濾欄位名稱
286
- --filter_values 過濾值,逗號分隔
287
- --source_type huggingface | local_files | local_dir
288
- --file_format txt | jsonl | csv
289
- --langs FineWeb2 語言清單,逗號分隔(預設行為)
290
- --mix_strategy sequential(預設)| weighted
291
- --no_streaming 停用串流,完整下載後載入
292
-
293
- 超參數:
294
- --batch_size per-device batch size(-1=自動)
295
- --grad_accum gradient accumulation steps(-1=自動)
296
- --lr 學習率(預設: 2e-4)
297
- --max_steps 總訓練步數(串流資料集用;預設 1,000,000)
298
- 與 --num_epochs 同時指定時 epoch 模式優先
299
- --num_epochs 訓練 epoch 數(有限資料集用;-1=停用,改用 --max_steps)
300
- 適合本地資料集或固定大小的 HuggingFace 資料集
301
- --seq_len 訓練序列長度(預設: 4096)
302
- --warmup_steps warmup 步數(預設: 4000)
303
-
304
- Checkpoint 儲存(--save_steps 與 --save_total_limit 搭配使用):
305
- --save_steps 每幾步儲存一個 checkpoint(預設: 5000)
306
- --save_total_limit 最多同時保留幾份 checkpoint(預設: 3)
307
- 0 = 無限制,保留所有 checkpoint
308
- 例: --save_steps 2000 --save_total_limit 10
309
-
310
- 精度:
311
- --bf16 BF16:-1=自動,0=關,1=開
312
- --fp16 FP16:-1=自動,0=關,1=開
313
-
314
- Loss 記錄:
315
- --loss_log_file Training loss CSV 路徑
316
- 空字串 = 自動使用 {output_dir}/training_loss.csv
317
- 接續訓練時自動 append,不覆蓋已��記錄
318
-
319
- 其他:
320
- --no_grad_ckpt 停用 gradient checkpointing
321
- --workers DataLoader workers(-1=自動)
322
  ```
323
 
324
  ---
325
 
326
- ## Training Loss 記錄繪圖
327
 
328
- ### CSV 格
329
-
330
- 訓練過程中自動產生 `{output_dir}/training_loss.csv`(或 `--loss_log_file` 指定路徑):
331
 
332
  ```
333
- step,epoch,loss,learning_rate,grad_norm,samples_seen,elapsed_sec
334
- 100,0.0,8.312451,0.0002,1.2341,3200,45.2
335
- 200,0.0,7.891234,0.00019,1.1892,6400,89.7
336
- ...
337
- 1000000,0.0,2.341200,2e-05,0.8123,3200000,18420.0
338
- 1000000,0.0,END,,,,18421.1
339
  ```
340
 
341
- - **接續訓練**:自動 append,`END` 行標記每段訓練結束,可區分多次訓練
342
- - **即時 flush**:每個 log step 寫入後立即 flush,中斷也不丟失記錄
343
-
344
- ### 繪圖工具 `plot_loss.py`
345
 
346
- ```bash
347
- # 基本使用(讀取預設 CSV,輸出 PNG)
348
- python plot_loss.py
349
 
350
- # 指定路徑與輸出
351
- python plot_loss.py \
352
- --csv ./checkpoints/training_loss.csv \
353
- --out ./loss_curve.png
354
 
355
- # 印出訓練摘要統計(最終 loss、最低點、收斂步數)
356
- python plot_loss.py --summary
 
357
 
358
- # 比較 pretrain + continue 兩段訓練
359
- python plot_loss.py \
360
- --csv ./run1/training_loss.csv ./run2/training_loss.csv \
361
- --labels "Pretrain" "Continue (Wikipedia)" \
362
- --out compare.png
363
 
364
- # 以訓練時間為 X 軸,顯示互動視窗
365
- python plot_loss.py --x_axis elapsed_sec --show
 
366
 
367
- # 過濾初期 spike,調整平滑視窗
368
- python plot_loss.py --max_loss 10.0 --smooth 100
369
  ```
370
 
371
- 圖表包含個面板
372
 
373
- | 面板 | 內容 |
374
- |------|------|
375
- | Loss 曲線 | 原始 loss(半透明)+ 滾動平均平滑,自動標記最低點 |
376
- | Learning Rate | Cosine decay + warmup 排程曲線 |
377
- | Gradient Norm | L2 norm 趨勢(反映訓練穩定性)|
378
 
379
- ---
 
 
 
 
380
 
381
- ## 發布存檔格
382
 
383
- 訓練完成後自動產生(也可用 `--mode export` 手動觸發):
 
384
 
385
- ```
386
- checkpoints/release/{model_name}-{timestamp}/
387
- ├── model/
388
- │ ├── model.safetensors # 模型權重(SafeTensors,推薦)
389
- │ ├── pytorch_model.bin # 模型權重(PyTorch bin,相容備用)
390
- │ ├── config.json # 架構與超參數設定
391
- │ └── generation_config.json # 預設生成參數
392
- ├── tokenizer/
393
- │ ├── spm_tokenizer.model # SentencePiece 模型
394
- │ ├── spm_tokenizer.vocab # 詞彙表(piece + BPE score)
395
- │ ├── tokenizer_config.json # HuggingFace tokenizer 設定
396
- │ └── special_tokens_map.json
397
- ├── model_card.md # HuggingFace Hub 模型說明卡
398
- ├── manifest.json # 所有檔案 SHA-256 + 大小清單
399
- └── release_info.json # 訓練環境、超參數完整快照
400
  ```
401
 
402
  ---
403
 
404
- ## 建議硬體配置
 
 
 
 
 
 
 
 
405
 
406
- | 硬體 | batch | grad_accum | seq_len | 精度 |
407
- |------|-------|------------|---------|------|
408
- | A100 80G | 4 | 8 | 4096 | BF16 |
409
- | A100 40G | 2 | 16 | 4096 | BF16 |
410
- | RTX 4090 24G | 1 | 32 | 2048 | BF16 |
411
- | RTX 3090 24G | 1 | 32 | 2048 | FP16 |
412
- | M3 Max 128G | 2 | 16 | 4096 | BF16 |
413
- | M2 Ultra 192G | 2 | 16 | 4096 | BF16 |
414
- | M2 Max 96G | 1 | 32 | 2048 | BF16 |
415
- | M1/M2 16-24G | 1 | 32 | 1024 | FP32 |
416
 
417
- > **1M context 推理**需搭配 Flash Attention 2(CUDA A100/H100)或足夠的 Apple Silicon Unified Memory。訓練時 `seq_len=4096` 即可;長上下文外推由 YaRN 在推理時自動完成。
 
 
 
 
 
 
 
 
 
 
 
 
 
418
 
419
  ---
420
 
421
- ## 專案結構
 
 
422
 
423
  ```
424
- .
425
- ├── train_llm.py # 主程式(分詞器 / 訓練 / 推論 / 存檔)
426
- ├── plot_loss.py # Training loss 曲線繪圖工具
427
- ├── dataset_config.json # 多來源混合範例(FineWeb2 + Wikipedia
428
- ├── dataset_config_local.json # 本地 JSONL 資料集範例
429
- ── requirements.txt # Python 套件需求
430
- ├── README.md # 本文件
431
- ├── CHANGELOG.md # 版本變更記錄
432
- ├── LICENSE # Apache 2.0 授權
433
- ── .gitignore # Git 排除規則
 
 
 
 
 
 
 
 
 
 
 
 
434
  ```
435
 
436
  ---
437
 
438
- ## 常見問題
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
439
 
440
- **Q: macOS 出現 `OMP: Error #15: Initializing libomp.dylib` 然後 abort?**
 
441
 
442
- A: 這是 macOS PyTorch、sentencepiece 等套件各自靜態連結不同版本 libomp 所導致的衝突。本程式已在啟動時自動設定 `KMP_DUPLICATE_LIB_OK=TRUE` 等環境變數,理論上不會出現此問題。若仍發生,請確認您使用的是 `python train_llm.py` 而非直接 import 本模組。
 
 
 
443
 
444
- **Q: MPS 上訓練比 CPU 還慢?**
445
 
446
- A: 部分運算(如 MoE router scatter/gather MPS 上會 fallback CPU,導致額外的資料搬移開銷。可嘗試減小 `--seq_len` `--batch_size` 以提高 Metal GPU 利用率
447
 
448
- **Q: 1M context 真的能用嗎?**
 
 
 
449
 
450
- A: 訓練時固定使用 `--seq_len 4096`(或自訂),推理時 YaRN 外推讓模型能處理更長序列。實際最大長度受限於可用記憶體80GB A100 約可推理 128K–512K tokens(使用 Flash Attention + KV cache 量化)。
 
 
 
451
 
452
- **Q: `safetensors` 套件未安裝時怎麼辦?**
453
 
454
- A: 程式會自動偵測。若未安裝,則跳過 SafeTensors 格式,仍輸出 `pytorch_model.bin`。建議安裝:`pip install safetensors`。
455
 
456
- **Q: 如何只訓練分詞器而不訓練模型?**
457
 
458
- A: `python train_llm.py --mode tokenizer --data_dir ./data`
 
 
459
 
460
  ---
461
 
462
- ## 授權
 
 
463
 
464
- 本專案採用 **Apache License 2.0**。詳見 [LICENSE](LICENSE)。
 
 
 
 
 
 
 
 
 
 
465
 
466
- 訓練資料 FineWeb2 由 HuggingFace 提供,請遵守其[資料集授權](https://huggingface.co/datasets/HuggingFaceFW/fineweb-2)。
 
 
 
 
1
  ---
2
  license: apache-2.0
3
  datasets:
4
+ - jslin09/wikipedia_tw
5
  language:
6
  - en
7
  - zh
 
16
 
17
  ---
18
 
19
+ # 魁星 (KuiXing) — 繁體中文預訓練語言模型
20
+
21
+ <p align="center">
22
+ <img src="https://img.shields.io/badge/語言-繁體中文-red?style=flat-square" />
23
+ <img src="https://img.shields.io/badge/架構-Decoder--Only Transformer-blue?style=flat-square" />
24
+ <img src="https://img.shields.io/badge/參數量-1.07B-green?style=flat-square" />
25
+ <img src="https://img.shields.io/badge/框架-PyTorch%20%7C%20MLX-orange?style=flat-square" />
26
+ <img src="https://img.shields.io/badge/授權-CC BY--NC 4.0-lightgrey?style=flat-square" />
27
+ </p>
28
+
29
+ **魁星(KuiXing)** 是一個從零開始、以繁體中文語料預訓練的 Decoder-Only 大型語言模型。取名自中國傳統文化中掌管文章與科舉的神祇「魁星」,象徵對中文語言理解能力的追求。本專案包含完整的訓練程式碼,可在 Apple Silicon(MLX)或 NVIDIA GPU(CUDA)上執行,並輸出與 HuggingFace `transformers` 相容的模型格式。
30
+
31
+ ---
32
+
33
  ## 目錄
34
 
35
+ - [模型概覽](#模型概覽)
36
+ - [模型架構詳情](#模型架構詳情)
37
+ - [參數量統計](#參數量統計)
38
+ - [訓練資料](#訓練資料)
39
+ - [訓練超參數](#訓練超參數)
40
+ - [環境需求](#環境需求)
41
+ - [安裝](#安裝)
42
+ - [訓練程式用法](#訓練程式用法)
43
+ - [CLI 參數說明](#cli-參數說明)
44
+ - [輸出格式與載入方式](#輸出格式與載入方式)
45
+ - [程式限制](#程式限制)
46
+ - [目錄結構](#目錄結構)
47
+ - [授權事項](#授權事項)
48
+ - [引用](#引用)
49
 
50
  ---
51
 
52
+ ## 模型概覽
53
 
54
+ | 項目 | 內容 |
55
  |------|------|
56
+ | 模型名稱 | KuiXing(魁星) |
57
+ | 模型類型 | Decoder-Only Transformer(自迴歸語言模型) |
58
+ | 主要語言 | 繁體中文(Traditional Chinese) |
59
+ | 參數量 | **1.07B**10.7 |
60
+ | 詞彙量 | 99,384SentencePiece BPE |
61
+ | 最大序列長度 | 2,048 tokens |
62
+ | 訓練框架 | PyTorch(CUDA)/MLX(Apple Silicon) |
63
+ | 輸出格式 | HuggingFace `safetensors` + `config.json` |
64
+ | 授權 | CC BY-NC 4.0 |
 
 
 
 
 
 
 
 
 
65
 
66
  ---
67
 
68
+ ## 模型架構詳情
69
 
70
+ KuiXing 採用標準 Pre-Norm Decoder-Only Transformer 架構,設計重點在於繁體中文的高效表示與訓練穩定性。
71
 
72
+ ### 整體架構
73
+
74
+ ```
75
+ 輸入 token IDs
76
+
77
+ Token Embedding(vocab_size × d_model)
78
+ + Position Embedding(max_seq_len × d_model)
79
+ + Embedding Dropout
80
+
81
+ × 12 Transformer Blocks(Pre-Norm)
82
+ ├── RMSNorm
83
+ ├── Multi-Head Self-Attention(Causal Mask)
84
+ │ ├── Q / K / V Projection(無 bias)
85
+ │ ├── Scaled Dot-Product(float32 精度)
86
+ │ ├── Causal Mask(上三角 -1e4,非 -inf)
87
+ │ ├── Softmax → Attention Dropout
88
+ │ └── Output Projection(無 bias)
89
+ ├── Residual + Dropout
90
+ ├── RMSNorm
91
+ ├── Feed-Forward Network(GELU)
92
+ │ ├── Linear: d_model → d_ff(無 bias)
93
+ │ ├── GELU Activation
94
+ │ ├── Dropout
95
+ │ └── Linear: d_ff → d_model(無 bias)
96
+ └── Residual + Dropout
97
+
98
+ Final RMSNorm
99
+
100
+ LM Head(d_model → vocab_size,**與 Token Embedding 共享權重**)
101
+
102
+ Logits(float32)
103
  ```
104
 
105
+ ### 關鍵設計決策
106
 
107
+ **Pre-Norm(前置正規化)**
108
+ Norm 層置於 Attention MLP 之前,訓練更穩定,梯度流動更順暢,特別適合深層網路。
 
 
 
109
 
110
+ **RMSNorm 取代 LayerNorm**
111
+ Root Mean Square Normalization 省去均值計算,計算效率更高,且在語言模型中表現與 LayerNorm 相當。
112
 
113
+ **Causal Mask 使用 -1e4 而非 -inf**
114
+ 避免 bfloat16 下 `-inf` 經過 softmax 產生 `NaN` 的數值不穩定問題。
115
 
116
+ **Attention Score float32 計算**
117
+ 即使在 bfloat16 訓練模式下,Q·Kᵀ 的縮放點積與 softmax 仍升型至 float32 進行,確保精度。
118
 
119
+ **Weight Tying(權重綁定)**
120
+ LM Head 與 Token Embedding 共享同一組權重矩陣,減少約 2.39 億參數,並有助於語意一致性。
121
 
122
+ **無 Bias 的線性層**
123
+ 所有 Q/K/V/O Projection 及 FFN 的線性層均不使用 bias,符合現代大型語言模型的主流做法。
124
 
125
+ **Dropout 正則化**
126
+ Embedding dropout、Attention dropout 及殘差連接處均加入 dropout(預設 0.1),有效防止過擬合。
127
 
128
+ ### 架構超參數
 
 
129
 
130
+ | 參數 | 數值 | 說明 |
131
+ |------|------|------|
132
+ | `n_layers` | 12 | Transformer Block 層數 |
133
+ | `d_model` | 2,400 | 隱藏層維度 |
134
+ | `n_heads` | 32 | 注意力頭數 |
135
+ | `d_head` | 75 | 每個注意力頭的維度(d_model / n_heads) |
136
+ | `d_ff` | 9,600 | Feed-Forward 中間層維度(4× d_model) |
137
+ | `max_seq_len` | 2,048 | 最大序列長度 |
138
+ | `vocab_size` | 99,384 | BPE 詞彙量 |
139
+ | `dropout` | 0.1 | Dropout 比率 |
140
+ | `activation` | GELU | FFN 激活函數 |
141
+ | `norm` | RMSNorm | 正規化層類型 |
142
+ | `pos_encoding` | Learned | 可學習的位置嵌入 |
143
 
144
+ ---
145
 
146
+ ## 參數量統計
 
 
147
 
148
+ | 模組 | 參數量 |
149
+ |------|--------|
150
+ | Token Embedding | 238,521,600(238.5M) |
151
+ | Position Embedding | 4,915,200(4.9M) |
152
+ | Attention(×12 層) | 276,480,000(276.5M) |
153
+ | Feed-Forward(×12 層) | 552,960,000(553.0M) |
154
+ | RMSNorm(×25 個) | 62,400 |
155
+ | LM Head | 0(與 Token Embedding 共享) |
156
+ | **合計** | **1,072,936,800(≈ 1.07B)** |
157
 
158
+ > **儲存大小估算**
159
+ > - float32(訓練 / safetensors 輸出):≈ **4.3 GB**
160
+ > - bfloat16(推理建議):≈ **2.1 GB**
161
 
162
+ ---
 
 
 
 
 
 
 
 
 
163
 
164
+ ## 訓練資料
165
 
166
+ | 項目 | 內容 |
167
+ |------|------|
168
+ | 主要語料 | [jslin09/wikipedia_tw](https://huggingface.co/datasets/jslin09/wikipedia_tw)(台灣維基百科) |
169
+ | 語言 | 繁體中文 |
170
+ | Tokenizer | SentencePiece BPE,從語料訓練,詞彙量 99,384 |
171
+ | 資料處理 | 全文 tokenize → 串接為長序列 → 切成固定長度 chunk(2,049 tokens/chunk)→ 打散 |
172
+ | BOS / EOS | 每篇文章前後分別加入 `<s>` / `</s>` token |
173
+
174
+ 訓練支援多資料集接續(Continual Training),可在訓練完成後以不同語料繼續微調,無需重新初始化模型。
175
 
176
  ---
177
 
178
+ ## 訓練超參數
179
+
180
+ | 超參數 | 數值 | 說明 |
181
+ |--------|------|------|
182
+ | `batch_size` | 4 | 每步實際 mini-batch 大小 |
183
+ | `accum_steps` | 32 | 梯度累積步數 |
184
+ | 有效 Batch Size | 128 | `batch_size × accum_steps` |
185
+ | `learning_rate` | 3×10⁻⁴ | AdamW 峰值學習率 |
186
+ | LR Schedule | Linear Warmup + Cosine Decay | |
187
+ | `warmup_steps` | 250 | 線性暖身步數 |
188
+ | `weight_decay` | 0.1 | AdamW L2 正則化係數 |
189
+ | `betas` | (0.9, 0.95) | AdamW 動量係數 |
190
+ | `eps` | 1×10⁻⁶ | AdamW 數值穩定項 |
191
+ | `grad_clip` | 1.0 | 全局梯度裁剪閾值(L2 norm) |
192
+ | `epochs` | 3 | 訓練回合數 |
193
+ | `steps` | 30,000 | 每 epoch 最大步數 |
194
+ | 混合精度 | bfloat16(CUDA)/float32(MPS)/bfloat16(MLX) | |
195
+
196
+ **Weight Decay 策略:** 僅對 `dim ≥ 2` 的權重矩陣施加 weight decay;bias、RMSNorm 參數不衰減。
197
 
198
+ ---
199
 
200
+ ## 環境需求
201
 
202
+ ### 必要條件
 
 
203
 
204
+ 本程式**不支援純 CPU 執行**,需要以下其中一種硬體加速環境以下規格為**最低需求**,不符合者將無法完成訓練:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
205
 
206
+ | 環境 | 最低需求 | 建議機型範例 |
207
+ |------|----------|-------------|
208
+ | Apple Silicon Mac | 統一記憶體(RAM)**≥ 128 GB**,需安裝 MLX | Mac Studio / Mac Pro(M2 Ultra 192GB、M3 Ultra 192GB) |
209
+ | NVIDIA GPU | 單卡顯存 **≥ 92 GB**,CUDA 11.8 或以上 | H100 NVL(94 GB)、H200(141 GB) |
210
+ | 主機記憶體(RAM) | **≥ 64 GB**(兩種環境皆適用) | — |
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
211
 
212
+ > ⚠️ **重要** 訓練環境低於以上任一最低求,程式將因記憶體不足而無法執行完整訓練。
213
+ >
214
+ > **需求說明:**
215
+ > - float32 模型權重 ≈ 4.3 GB;加上梯度與 AdamW 狀態(各一份,共 3× 權重大小),訓練峰值顯存約 **90 GB 以上**。
216
+ > - Apple Silicon 的統一記憶體由 CPU 與 GPU 共用,128 GB 為能在 MLX bfloat16 模式下穩定訓練的最低配置。
217
+ > - 主機記憶體(系統 RAM)需 ≥ 64 GB,以容納分詞器訓練資料、資料集 tokenize、chunk 建構及 PyTorch 的系統側暫存空間。
218
 
219
+ ### Python 套件
 
 
220
 
221
+ ```
222
+ torch >= 2.2.0
223
+ mlx >= 0.12.0 # 僅 Apple Silicon 需要
224
+ sentencepiece >= 0.1.99
225
+ datasets >= 2.14.0
226
+ transformers >= 4.38.0
227
+ safetensors >= 0.4.0
228
+ numpy >= 1.24.0
229
+ matplotlib >= 3.7.0
230
+ tqdm >= 4.65.0
231
  ```
232
 
233
+ ---
234
+
235
+ ## 安裝
236
 
237
  ```bash
238
+ # 1. 複製專案
239
+ git clone https://github.com/your-username/kuixing.git
240
+ cd kuixing
241
+
242
+ # 2. 建立虛擬環境(建議)
243
+ python -m venv venv
244
+ source venv/bin/activate # Windows: venv\Scripts\activate
245
+
246
+ # 3. 安裝 PyTorch(依據您的硬體選擇)
247
+ # CUDA 12.1:
248
+ pip install torch --index-url https://download.pytorch.org/whl/cu121
249
+ # Apple Silicon(CPU/MPS fallback):
250
+ pip install torch
251
+
252
+ # 4. 安裝 MLX(Apple Silicon 專用,建議安裝以獲得最佳性能)
253
+ pip install mlx
254
 
255
+ # 5. 安裝其餘相依套件
256
+ pip install sentencepiece datasets transformers safetensors numpy matplotlib tqdm
 
 
257
  ```
258
 
259
  ---
260
 
261
+ ## 訓練用法
262
 
263
+ ### 互動模式無參數,推薦初次使用
264
 
265
  ```bash
266
+ python KuiXing_Trainer_MLT.py
 
 
 
 
267
  ```
268
 
269
+ 程式會自動偵測硬體環境,若有既有模型則詢問是否接續訓練及使用哪個資料集;若無既有模型則從頭開始訓練。
270
 
271
+ ### 常用指令
272
 
273
  ```bash
274
+ # 從頭訓練(強制忽略已存在的模型)
275
+ python KuiXing_Trainer_MLT.py --from-scratch
 
 
 
276
 
277
+ # 續訓練(不互動詢問使用 config 預資料集
278
+ python KuiXing_Trainer_MLT.py --resume
279
 
280
+ # 接續訓練並切換到新資料集
281
+ python KuiXing_Trainer_MLT.py --resume --dataset jslin09/other_dataset --column text
 
 
 
 
 
 
 
282
 
283
+ # 資料集從頭訓練
284
+ python KuiXing_Trainer_MLT.py --from-scratch --dataset your_org/dataset_name --column article
285
 
286
+ # 獨立繪圖模式讀取訓練記錄後生成曲線圖,啟動訓練)
287
+ python KuiXing_Trainer_MLT.py --plot
288
 
289
+ # 訓練摘要模式(顯示 loss / perplexity 統計後結束,不啟動訓練)
290
+ python KuiXing_Trainer_MLT.py --summary
 
 
 
291
  ```
292
 
293
  ---
294
 
295
+ ## CLI 參數說明
296
+
297
+ | 參數 | 類型 | 說明 |
298
+ |------|------|------|
299
+ | `--from-scratch` | flag | 強制從頭訓練,忽略已存在的 checkpoint 與模型 |
300
+ | `--resume` | flag | 直接接續上次訓練,跳過互動詢問 |
301
+ | `--dataset NAME` | string | 指定 HuggingFace 資料集名稱(如 `jslin09/wikipedia_tw`) |
302
+ | `--column COL` | string | 指定資料集中的文章欄位名稱(如 `article`、`text`) |
303
+ | `--plot` | flag | 讀取 JSONL 訓練記錄,生成四格訓練曲線圖後結束 |
304
+ | `--summary` | flag | 讀取 JSONL 訓練記錄,顯示訓練摘要統計後結束 |
305
+
306
+ > **注意:** `--from-scratch` 與 `--resume` 互斥,不可同時使用。
307
+ > `--plot` 與 `--summary` 為獨立模式,不觸發硬體偵測或訓練流程。
308
+
309
+ ### 訓練摘要輸出範例(`--summary`)
310
 
311
  ```
312
+ ============================================================
313
+ 🏁 KuiXing 訓練完成摘要
314
+ ============================================================
315
+ 總記步數 : 2,811 步(optimizer update
316
+ 訓練 Epoch : 3
317
+ 學習率範圍 : 0.00e+00 → 3.00e-04
318
+ 梯度被裁剪次數 : 51 次(佔 1.8%)
319
+ ============================================================
320
+ 最終 Loss : 2.741243
321
+ 最終 Perplexity : 15.5062
322
+ ============================================================
323
+ 最佳 Loss : 2.639037 第 81,311 步
324
+ 最佳 Perplexity : 13.9997
325
+ ============================================================
326
+ 100 步平均 Loss : 2.784486
327
+ 末 100 步平均 PPL : 16.1915
328
+ ============================================================
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
329
  ```
330
 
331
  ---
332
 
333
+ ## 輸出格式載入方式
334
 
335
+ 訓練完成後,程自動將模型輸出至 `./kuixing_model/`,包含以下檔案:
 
 
336
 
337
  ```
338
+ kuixing_model/
339
+ ├── model.safetensors # float32 模型權重(HuggingFace 格式)
340
+ ├── config.json # 模型架構設定
341
+ ├── modeling_kuixing.py # 自訂架構定義(含 AutoModel 支援)
342
+ ├── tokenizer_config.json # Tokenizer 設定
343
+ └── tokenizer.model # SentencePiece BPE tokenizer
344
  ```
345
 
346
+ ### 載入方式
 
 
 
347
 
348
+ **方式一:直接使用自訂類別(推薦)**
 
 
349
 
350
+ ```python
351
+ from modeling_kuixing import KuiXingForCausalLM
 
 
352
 
353
+ model = KuiXingForCausalLM.from_pretrained("./kuixing_model")
354
+ model = model.eval()
355
+ ```
356
 
357
+ **方式二:bfloat16 推理(節省記憶體)**
 
 
 
 
358
 
359
+ ```python
360
+ import torch
361
+ from modeling_kuixing import KuiXingForCausalLM
362
 
363
+ model = KuiXingForCausalLM.from_pretrained("./kuixing_model")
364
+ model = model.to(torch.bfloat16).eval()
365
  ```
366
 
367
+ **方式三:透過 HuggingFace AutoModel**
368
 
369
+ ```python
370
+ from transformers import AutoModelForCausalLM
 
 
 
371
 
372
+ model = AutoModelForCausalLM.from_pretrained(
373
+ "./kuixing_model",
374
+ trust_remote_code=True,
375
+ )
376
+ ```
377
 
378
+ **方四:從 HuggingFace Hub 載入**
379
 
380
+ ```python
381
+ from transformers import AutoModelForCausalLM
382
 
383
+ model = AutoModelForCausalLM.from_pretrained(
384
+ "jslin09/kuixing",
385
+ trust_remote_code=True,
386
+ )
 
 
 
 
 
 
 
 
 
 
 
387
  ```
388
 
389
  ---
390
 
391
+ ## 程式限制
392
+
393
+ 使用本訓練程式前,請了解以下限制:
394
+
395
+ **硬體限制**
396
+ - 不支援純 CPU 執行。程式於啟動時偵測硬體,若未找到 MPS 或 CUDA 裝置,將直接終止並提示錯誤。純 CPU 模式因速度過慢(預估為 GPU 的 50–200 倍)而刻意排除。
397
+
398
+ **記憶體需求為硬性限制**
399
+ - 訓練峰值顯存(含模型權重、梯度、AdamW 狀態)約需 **90 GB 以上**。NVIDIA GPU 需單卡顯存 ≥ 92 GB(如 H100 NVL 94 GB),Apple Silicon 需統一記憶體 ≥ 128 GB,主機 RAM 需 ≥ 64 GB。低於上述任一門檻者將因記憶體不足而無法完成訓練,此為硬性限制,無法透過縮減 `batch_size` 解決(梯度累積步數已補償批次大小,顯存瓶頸在於模型本身與優化器狀態)。
400
 
401
+ **MPS 平台限制**
402
+ - Apple Silicon 使用 MPS 後端(無 MLX)時,MPS 尚不支援 `torch.autocast`,因此以 float32 全精度訓練,速度與記憶體效率低於 MLX 路徑。建議安裝 MLX 以獲得最佳性能。
 
 
 
 
 
 
 
 
403
 
404
+ ** GPU 不支援**
405
+ - 本程式目前僅支援單一 GPU 訓練,未實作 DDP(DistributedDataParallel)或 FSDP,無法直接用於多卡並行訓練。
406
+
407
+ **Checkpoint 跨平台相容性**
408
+ - PyTorch(CUDA/MPS)與 MLX(Apple Silicon)的 checkpoint 格式不同,無法直接互換。MLX checkpoint 以 `.npz` 儲存,PyTorch checkpoint 以 `.pt` 儲存。
409
+
410
+ **Tokenizer 字型依賴**
411
+ - 訓練曲線繪圖功能依賴本地安裝的繁體中文字型(Noto Sans CJK TC),字型路徑硬編碼於程式中。若路徑不符,繪圖將失敗或顯示亂碼。**此設定不應修改**(程式設計刻意保留)。
412
+
413
+ **資料集格式**
414
+ - 目前僅支援 HuggingFace `datasets` 格式的文字資料集,需指定文字欄位名稱。不支援本地 jsonl、txt、csv 直接輸入(需先上傳至 HuggingFace 或自行修改 `build_chunks()` 函式)。
415
+
416
+ **推理功能**
417
+ - 本程式為**預訓練專用訓練器**,不包含文字生成(inference)功能。推理請使用輸出的 HuggingFace 格式模型搭配 `transformers` 的 `generate()` 方法。
418
 
419
  ---
420
 
421
+ ## 目錄結構
422
+
423
+ 執行訓練後,工作目錄將產生以下結構:
424
 
425
  ```
426
+ ./
427
+ ├── KuiXing_Trainer_MLT.py # 主訓練程式
428
+
429
+ ├── kuixing_tokenizer/ # Tokenizer 檔案(自動生成
430
+ ├── tokenizer.model
431
+ │ └── tokenizer.vocab
432
+
433
+ ├── kuixing_checkpoints/ # 訓練 Checkpoint(自動生成)
434
+ ├── ckpt_ep0_step500.pt
435
+ │ ├── ckpt_ep0_step1000.pt
436
+ │ └── ...(保留最新 3 個)
437
+
438
+ ├── kuixing_logs/ # 訓練記錄(自動生成)
439
+ │ ├── training_log.jsonl # 每步指標(loss, lr, grad_norm, ...)
440
+ │ └── training_curves.png # 訓練曲線圖(每 200 步更新)
441
+
442
+ └── kuixing_model/ # 最終輸出(訓練完成後生成)
443
+ ├── model.safetensors
444
+ ├── config.json
445
+ ├── modeling_kuixing.py
446
+ ├── tokenizer_config.json
447
+ └── tokenizer.model
448
  ```
449
 
450
  ---
451
 
452
+ ## 授權事項
453
+
454
+ ### 程式碼授權
455
+
456
+ 本專案訓練程式碼(`KuiXing_Trainer_MLT.py` 及相關檔案)以 **MIT License** 授權,允許自由使用、修改與散布,包含商業用途,惟需保留原始版權聲明。
457
+
458
+ ```
459
+ MIT License
460
+
461
+ Copyright (c) 2025 Chun-Hsien Lin
462
+
463
+ Permission is hereby granted, free of charge, to any person obtaining a copy
464
+ of this software and associated documentation files (the "Software"), to deal
465
+ in the Software without restriction, including without limitation the rights
466
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
467
+ copies of the Software, and to permit persons to whom the Software is
468
+ furnished to do so, subject to the following conditions:
469
 
470
+ The above copyright notice and this permission notice shall be included in all
471
+ copies or substantial portions of the Software.
472
 
473
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
474
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
475
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
476
+ ```
477
 
478
+ ### 模型權重授權
479
 
480
+ 訓練完成模型權重(`model.safetensors` **Creative Commons Attribution-NonCommercial 4.0 International(CC BY-NC 4.0)** 授權發布
481
 
482
+ **您可以:**
483
+ - ✅ 分享:以任何媒介或格式複製、散布本模型
484
+ - ✅ 改作:修改、轉換本模型,以其為基礎進行創作(如微調)
485
+ - ✅ 學術研究與個人使用
486
 
487
+ **但需遵守以下條件**
488
+ - 📌 **姓名標示(Attribution):** 使用本模型時,需標示原始作者(jslin09 / KuiXing)及授權連結
489
+ - 🚫 **非商業性(NonCommercial):** 不得將本模型或其衍生物用於商業目的
490
+ - 📌 **相同方式分享(ShareAlike):** 若散布衍生模型,需採用相同的 CC BY-NC 4.0 或相容授權
491
 
492
+ 完整授權條款請見:https://creativecommons.org/licenses/by-nc/4.0/
493
 
494
+ ### 訓練資料聲明
495
 
496
+ 本模型以台灣維基百科(`jslin09/wikipedia_tw`)為主要訓練語料,該語料源自維基媒體基金會,依據 [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) 授權。使用者在引用本模型產出內容時,亦應留意上游授權要求。
497
 
498
+ ### 免責聲明
499
+
500
+ 本模型為研究性質的預訓練語言模型,**不保證輸出內容的正確性、完整性或安全性**。使用者需自行評估並承擔模型輸出的風險。作者不對因使用本模型造成的任何直接或間接損失負責。
501
 
502
  ---
503
 
504
+ ## 引用
505
+
506
+ 若您在研究或作品中使用了 KuiXing,請引用本專案:
507
 
508
+ ```bibtex
509
+ @misc{kuixing2026,
510
+ author = {Chun-Hsien Lin},
511
+ title = {KuiXing: A Traditional Chinese Pre-trained Language Model},
512
+ year = {2026},
513
+ publisher = {HuggingFace},
514
+ howpublished = {\url{https://huggingface.co/jslin09/kuixing}},
515
+ }
516
+ ```
517
+
518
+ ---
519
 
520
+ <p align="center">
521
+ 以繁體中文為本,從零開始。<br>
522
+ <em>Built from scratch, for Traditional Chinese.</em>
523
+ </p>