首次發行
Browse files
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)。
|