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

首次發行

Browse files
Files changed (1) hide show
  1. README.md +466 -3
README.md CHANGED
@@ -1,3 +1,466 @@
1
- ---
2
- license: apache-2.0
3
- ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ datasets:
4
+ - HuggingFaceFW/fineweb-2
5
+ language:
6
+ - en
7
+ - zh
8
+ base_model:
9
+ - jslin09/KuiXing
10
+ ---
11
+ # KuiXing(魁星)-1.15B — 繁中 / 英 MoE 大型語言模型訓練框架
12
+
13
+ **KuiXing(魁星)-1.15B** 是一個從零開始訓練的 ~1.15B 參數稀疏 Mixture-of-Experts (MoE) 語言模型,支援繁體中文、簡體中文與英文,最大 context window 為 **1M tokens**(訓練 128K + YaRN 外推 ×8)。詞彙量擴充至 **56K**,對中文字符與多語言符號有更完整的覆蓋。
14
+
15
+ > **平台**:NVIDIA CUDA · Apple Silicon (MPS) · CPU — 三平台自動偵測,無需修改任何程式碼。
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)。