全套训练已形成专栏,可免费订阅

训练至10,000步后,模型验证损失(valloss)稳定在4.15附近,训练损失(trainloss)持续下降至2.69,表明已进入泛化平台期。继续训练至30,000步将导致过拟合,生成质量下降。当前瓶颈在于数据量不足(仅341万token,远低于Chinchilla建议的1.4亿),而非模型容量或训练步数。生成结果整体良好,个别语义漂移属正常现象。建议:停止续训,不缩小模型;优先扩充高质量古诗语料(如全宋诗、古诗文网),并优化采样参数与保存逻辑,确保最优权重可被有效利用。

本章目的:

训练结束: train 2.69 / val 4.22 。结论很明确: 不要续训到 30000 步。

1.分析训练日志

1.1因为模型较小,我们分析日志原文

Overriding: dataset = tang_all
Overriding: out_dir = out-tang_all
Overriding: device = cuda2.
Overriding: dtype = bfloat16
Overriding: n_layer = 6
Overriding: n_head = 8
Overriding: n_embd = 256
Overriding: block_size = 512
Overriding: batch_size = 16
Overriding: gradient_accumulation_steps = 2
Overriding: dropout = 0.1
Overriding: learning_rate = 0.001
Overriding: min_lr = 0.0001
Overriding: warmup_iters = 500
Overriding: max_iters = 10000
Overriding: lr_decay_iters = 10000
Overriding: eval_interval = 250
Overriding: eval_iters = 100
Overriding: log_interval = 50
Overriding: compile = False
tokens per iteration will be: 16,384
found vocab_size = 7367 (inside data\tang_all\meta.pkl)
Initializing a new model from scratch
number of parameters: 6.61M
python : E:\模型训练\nanoGPT\train.py:196:
FutureWarning: `torch.cuda.amp.GradScaler(args...)` is deprecated. Please us
e `torch.amp.GradScaler('cuda', args...)` instead.
所在位置 行:1 字符: 1
+ python -u train.py --dataset=tang_all --out_dir=out-tang_all ` --devi ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (E:\模型训练\nanoGPT...s...)` instead.:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

  scaler = torch.cuda.amp.GradScaler(enabled=(dtype == 'float16'))
num decayed parameter tensors: 26, with 6,735,616 parameters
num non-decayed parameter tensors: 13, with 3,328 parameters
using fused AdamW: True
step 0: train loss 8.9523, val loss 8.9495
iter 0: loss 8.9517, time 1969.18ms, mfu -100.00%
iter 50: loss 7.5655, time 47.63ms, mfu 5.41%
iter 100: loss 6.4012, time 43.24ms, mfu 5.47%
iter 150: loss 5.9816, time 35.54ms, mfu 5.65%
iter 200: loss 5.8300, time 42.78ms, mfu 5.68%
step 250: train loss 5.5944, val loss 5.7209
saving checkpoint to out-tang_all
iter 250: loss 5.5502, time 1564.57ms, mfu 5.13%
iter 300: loss 5.5249, time 46.06ms, mfu 5.18%
iter 350: loss 5.2298, time 37.54ms, mfu 5.35%
iter 400: loss 5.2727, time 45.89ms, mfu 5.37%
iter 450: loss 5.2278, time 42.06ms, mfu 5.45%
step 500: train loss 4.8843, val loss 5.1459
saving checkpoint to out-tang_all
iter 500: loss 5.0301, time 1544.70ms, mfu 4.92%
iter 550: loss 4.7947, time 47.25ms, mfu 4.97%
iter 600: loss 4.7532, time 32.29ms, mfu 5.28%
iter 650: loss 4.8104, time 55.40ms, mfu 5.21%
iter 700: loss 4.5523, time 44.72ms, mfu 5.27%
step 750: train loss 4.3929, val loss 4.8058
saving checkpoint to out-tang_all
iter 750: loss 4.4660, time 1530.89ms, mfu 4.76%
iter 800: loss 4.5489, time 32.84ms, mfu 5.07%
iter 850: loss 4.2920, time 40.87ms, mfu 5.19%
iter 900: loss 4.3123, time 45.03ms, mfu 5.24%
iter 950: loss 4.3582, time 45.69ms, mfu 5.28%
step 1000: train loss 4.1100, val loss 4.5713
saving checkpoint to out-tang_all
iter 1000: loss 4.2842, time 1565.56ms, mfu 4.77%
iter 1050: loss 4.2255, time 33.78ms, mfu 5.06%
iter 1100: loss 4.0964, time 38.33ms, mfu 5.22%
iter 1150: loss 4.1637, time 34.72ms, mfu 5.44%
iter 1200: loss 3.9974, time 54.17ms, mfu 5.38%
step 1250: train loss 3.9050, val loss 4.4224
saving checkpoint to out-tang_all
iter 1250: loss 4.2600, time 1548.80ms, mfu 4.85%
iter 1300: loss 3.9631, time 35.88ms, mfu 5.09%
iter 1350: loss 4.1037, time 34.39ms, mfu 5.33%
iter 1400: loss 3.9457, time 46.81ms, mfu 5.35%
iter 1450: loss 3.9337, time 49.60ms, mfu 5.33%
step 1500: train loss 3.7539, val loss 4.3172
saving checkpoint to out-tang_all
iter 1500: loss 4.0411, time 1571.24ms, mfu 4.81%
iter 1550: loss 3.7957, time 31.58ms, mfu 5.15%
iter 1600: loss 3.8317, time 42.72ms, mfu 5.24%
iter 1650: loss 3.9262, time 43.66ms, mfu 5.30%
iter 1700: loss 3.9968, time 33.64ms, mfu 5.54%
step 1750: train loss 3.6816, val loss 4.2773
saving checkpoint to out-tang_all
iter 1750: loss 3.7262, time 1583.45ms, mfu 5.00%
iter 1800: loss 3.8787, time 47.24ms, mfu 5.05%
iter 1850: loss 3.8239, time 49.39ms, mfu 5.06%
iter 1900: loss 3.5489, time 37.46ms, mfu 5.25%
iter 1950: loss 3.6881, time 46.33ms, mfu 5.28%
step 2000: train loss 3.5599, val loss 4.2412
saving checkpoint to out-tang_all
iter 2000: loss 3.4620, time 1559.39ms, mfu 4.77%
iter 2050: loss 3.7644, time 44.22ms, mfu 4.87%
iter 2100: loss 3.4424, time 46.06ms, mfu 4.95%
iter 2150: loss 3.6287, time 48.81ms, mfu 4.98%
iter 2200: loss 3.7650, time 35.15ms, mfu 5.21%
step 2250: train loss 3.5244, val loss 4.2129
saving checkpoint to out-tang_all
iter 2250: loss 3.6826, time 1597.92ms, mfu 4.71%
iter 2300: loss 3.6840, time 36.07ms, mfu 4.95%
iter 2350: loss 3.6920, time 45.02ms, mfu 5.03%
iter 2400: loss 3.6594, time 48.40ms, mfu 5.06%
iter 2450: loss 3.5508, time 42.37ms, mfu 5.16%
step 2500: train loss 3.4528, val loss 4.2105
saving checkpoint to out-tang_all
iter 2500: loss 3.5639, time 1518.98ms, mfu 4.66%
iter 2550: loss 3.5929, time 37.46ms, mfu 4.88%
iter 2600: loss 3.6454, time 35.26ms, mfu 5.13%
iter 2650: loss 3.5120, time 41.87ms, mfu 5.23%
iter 2700: loss 3.4597, time 48.88ms, mfu 5.23%
step 2750: train loss 3.3965, val loss 4.1825
saving checkpoint to out-tang_all
iter 2750: loss 3.6917, time 1577.46ms, mfu 4.73%
iter 2800: loss 3.5105, time 45.45ms, mfu 4.82%
iter 2850: loss 3.5891, time 46.15ms, mfu 4.90%
iter 2900: loss 3.3882, time 48.45ms, mfu 4.94%
iter 2950: loss 3.4853, time 48.95ms, mfu 4.97%
step 3000: train loss 3.3317, val loss 4.1949
saving checkpoint to out-tang_all
iter 3000: loss 3.4345, time 1525.93ms, mfu 4.49%
iter 3050: loss 3.6739, time 31.68ms, mfu 4.86%
iter 3100: loss 3.5657, time 34.06ms, mfu 5.13%
iter 3150: loss 3.4562, time 47.47ms, mfu 5.16%
iter 3200: loss 3.3042, time 46.15ms, mfu 5.20%
step 3250: train loss 3.2915, val loss 4.1528
saving checkpoint to out-tang_all
iter 3250: loss 3.6338, time 1603.39ms, mfu 4.70%
iter 3300: loss 3.5087, time 46.08ms, mfu 4.79%
iter 3350: loss 3.4209, time 44.99ms, mfu 4.88%
iter 3400: loss 3.4873, time 33.55ms, mfu 5.16%
iter 3450: loss 3.3006, time 32.81ms, mfu 5.43%
step 3500: train loss 3.2659, val loss 4.1968
saving checkpoint to out-tang_all
iter 3500: loss 3.4381, time 1625.60ms, mfu 4.90%
iter 3550: loss 3.5192, time 43.11ms, mfu 5.01%
iter 3600: loss 3.3629, time 44.75ms, mfu 5.09%
iter 3650: loss 3.4393, time 38.14ms, mfu 5.25%
iter 3700: loss 3.3184, time 54.97ms, mfu 5.20%
step 3750: train loss 3.2408, val loss 4.1467
saving checkpoint to out-tang_all
iter 3750: loss 3.1853, time 1758.41ms, mfu 4.69%
iter 3800: loss 3.2741, time 47.70ms, mfu 4.76%
iter 3850: loss 3.3373, time 53.52ms, mfu 4.77%
iter 3900: loss 3.3958, time 37.69ms, mfu 4.98%
iter 3950: loss 3.4481, time 36.71ms, mfu 5.18%
step 4000: train loss 3.1943, val loss 4.1601
saving checkpoint to out-tang_all
iter 4000: loss 3.2458, time 1827.78ms, mfu 4.68%
iter 4050: loss 3.4598, time 30.65ms, mfu 5.05%
iter 4100: loss 3.2228, time 47.42ms, mfu 5.09%
iter 4150: loss 3.1607, time 51.30ms, mfu 5.08%
iter 4200: loss 3.2819, time 33.49ms, mfu 5.34%
step 4250: train loss 3.1466, val loss 4.1687
saving checkpoint to out-tang_all
iter 4250: loss 3.2801, time 1760.46ms, mfu 4.82%
iter 4300: loss 3.2041, time 43.30ms, mfu 4.94%
iter 4350: loss 3.3816, time 45.55ms, mfu 5.01%
iter 4400: loss 3.3869, time 45.33ms, mfu 5.08%
iter 4450: loss 3.4158, time 48.43ms, mfu 5.10%
step 4500: train loss 3.1276, val loss 4.1750
saving checkpoint to out-tang_all
iter 4500: loss 3.3695, time 1549.00ms, mfu 4.61%
iter 4550: loss 3.3499, time 43.37ms, mfu 4.74%
iter 4600: loss 3.0370, time 41.94ms, mfu 4.88%
iter 4650: loss 3.2175, time 47.47ms, mfu 4.94%
iter 4700: loss 3.3842, time 47.59ms, mfu 4.98%
step 4750: train loss 3.0819, val loss 4.1733
saving checkpoint to out-tang_all
iter 4750: loss 3.1947, time 1582.39ms, mfu 4.50%
iter 4800: loss 3.3987, time 36.81ms, mfu 4.75%
iter 4850: loss 3.0945, time 48.41ms, mfu 4.81%
iter 4900: loss 3.3958, time 39.94ms, mfu 4.97%
iter 4950: loss 3.3215, time 38.75ms, mfu 5.14%
step 5000: train loss 3.0503, val loss 4.1573
saving checkpoint to out-tang_all
iter 5000: loss 3.3121, time 1653.01ms, mfu 4.64%
iter 5050: loss 3.1410, time 33.26ms, mfu 4.95%
iter 5100: loss 3.2585, time 47.08ms, mfu 5.01%
iter 5150: loss 3.1723, time 37.80ms, mfu 5.19%
iter 5200: loss 3.4084, time 47.22ms, mfu 5.21%
step 5250: train loss 3.0413, val loss 4.1589
saving checkpoint to out-tang_all
iter 5250: loss 3.3757, time 1704.97ms, mfu 4.71%
iter 5300: loss 3.2619, time 40.34ms, mfu 4.88%
iter 5350: loss 3.1622, time 38.11ms, mfu 5.06%
iter 5400: loss 3.1607, time 46.39ms, mfu 5.11%
iter 5450: loss 3.1507, time 35.63ms, mfu 5.33%
step 5500: train loss 3.0214, val loss 4.1936
saving checkpoint to out-tang_all
iter 5500: loss 3.1243, time 1614.18ms, mfu 4.81%
iter 5550: loss 3.1360, time 48.63ms, mfu 4.86%
iter 5600: loss 3.0818, time 54.63ms, mfu 4.84%
iter 5650: loss 3.1912, time 37.12ms, mfu 5.05%
iter 5700: loss 3.1513, time 44.70ms, mfu 5.13%
step 5750: train loss 2.9930, val loss 4.2063
saving checkpoint to out-tang_all
iter 5750: loss 3.2970, time 1532.03ms, mfu 4.63%
iter 5800: loss 3.2681, time 41.34ms, mfu 4.79%
iter 5850: loss 3.0257, time 44.54ms, mfu 4.89%
iter 5900: loss 3.1348, time 43.98ms, mfu 4.99%
iter 5950: loss 3.1771, time 41.34ms, mfu 5.11%
step 6000: train loss 2.9684, val loss 4.1651
saving checkpoint to out-tang_all
iter 6000: loss 3.2791, time 1551.04ms, mfu 4.62%
iter 6050: loss 3.1027, time 47.47ms, mfu 4.70%
iter 6100: loss 3.1217, time 47.99ms, mfu 4.77%
iter 6150: loss 3.1368, time 45.91ms, mfu 4.85%
iter 6200: loss 3.2192, time 37.49ms, mfu 5.05%
step 6250: train loss 2.9281, val loss 4.1917
saving checkpoint to out-tang_all
iter 6250: loss 3.1847, time 1549.01ms, mfu 4.56%
iter 6300: loss 3.0785, time 36.97ms, mfu 4.81%
iter 6350: loss 3.2269, time 48.00ms, mfu 4.86%
iter 6400: loss 2.9563, time 49.50ms, mfu 4.90%
iter 6450: loss 3.0917, time 38.14ms, mfu 5.08%
step 6500: train loss 2.8967, val loss 4.1729
saving checkpoint to out-tang_all
iter 6500: loss 3.2434, time 1597.63ms, mfu 4.59%
iter 6550: loss 3.2526, time 52.62ms, mfu 4.62%
iter 6600: loss 3.0173, time 46.38ms, mfu 4.71%
iter 6650: loss 3.0663, time 47.80ms, mfu 4.78%
iter 6700: loss 3.1271, time 45.41ms, mfu 4.87%
step 6750: train loss 2.8776, val loss 4.1683
saving checkpoint to out-tang_all
iter 6750: loss 3.0547, time 1575.35ms, mfu 4.40%
iter 6800: loss 3.2767, time 45.81ms, mfu 4.52%
iter 6850: loss 3.0733, time 45.54ms, mfu 4.64%
iter 6900: loss 3.0695, time 41.37ms, mfu 4.80%
iter 6950: loss 3.2026, time 38.02ms, mfu 4.99%
step 7000: train loss 2.8626, val loss 4.1826
saving checkpoint to out-tang_all
iter 7000: loss 3.2945, time 1545.77ms, mfu 4.51%
iter 7050: loss 3.2073, time 39.11ms, mfu 4.72%
iter 7100: loss 2.9221, time 53.74ms, mfu 4.73%
iter 7150: loss 3.0175, time 37.75ms, mfu 4.94%
iter 7200: loss 3.1146, time 45.15ms, mfu 5.01%
step 7250: train loss 2.8379, val loss 4.1857
saving checkpoint to out-tang_all
iter 7250: loss 2.9442, time 1601.81ms, mfu 4.53%
iter 7300: loss 3.1458, time 29.66ms, mfu 4.95%
iter 7350: loss 3.1823, time 41.82ms, mfu 5.07%
iter 7400: loss 2.9764, time 36.45ms, mfu 5.27%
iter 7450: loss 3.0213, time 36.77ms, mfu 5.44%
step 7500: train loss 2.8045, val loss 4.1672
saving checkpoint to out-tang_all
iter 7500: loss 3.0586, time 1533.96ms, mfu 4.91%
iter 7550: loss 3.0779, time 46.33ms, mfu 4.98%
iter 7600: loss 3.1149, time 34.80ms, mfu 5.22%
iter 7650: loss 3.2908, time 45.86ms, mfu 5.26%
iter 7700: loss 3.3121, time 47.47ms, mfu 5.28%
step 7750: train loss 2.8262, val loss 4.1990
saving checkpoint to out-tang_all
iter 7750: loss 3.0410, time 1582.34ms, mfu 4.77%
iter 7800: loss 2.6866, time 47.53ms, mfu 4.83%
iter 7850: loss 3.1015, time 40.66ms, mfu 4.98%
iter 7900: loss 3.0018, time 46.25ms, mfu 5.04%
iter 7950: loss 3.0762, time 46.21ms, mfu 5.10%
step 8000: train loss 2.7932, val loss 4.2414
saving checkpoint to out-tang_all
iter 8000: loss 3.0184, time 1563.33ms, mfu 4.60%
iter 8050: loss 2.9803, time 36.75ms, mfu 4.84%
iter 8100: loss 3.1275, time 53.04ms, mfu 4.85%
iter 8150: loss 3.0493, time 40.00ms, mfu 5.01%
iter 8200: loss 3.1412, time 46.63ms, mfu 5.06%
step 8250: train loss 2.7701, val loss 4.1841
saving checkpoint to out-tang_all
iter 8250: loss 3.2340, time 1574.96ms, mfu 4.57%
iter 8300: loss 3.0463, time 51.00ms, mfu 4.62%
iter 8350: loss 3.0805, time 36.71ms, mfu 4.86%
iter 8400: loss 3.0676, time 34.18ms, mfu 5.13%
iter 8450: loss 3.1611, time 44.25ms, mfu 5.20%
step 8500: train loss 2.7957, val loss 4.2199
saving checkpoint to out-tang_all
iter 8500: loss 2.9547, time 1606.24ms, mfu 4.69%
iter 8550: loss 3.1539, time 46.29ms, mfu 4.78%
iter 8600: loss 2.8552, time 46.37ms, mfu 4.86%
iter 8650: loss 2.9372, time 34.12ms, mfu 5.13%
iter 8700: loss 3.1108, time 46.00ms, mfu 5.17%
step 8750: train loss 2.7575, val loss 4.1780
saving checkpoint to out-tang_all
iter 8750: loss 2.9701, time 1572.50ms, mfu 4.67%
iter 8800: loss 2.9831, time 44.35ms, mfu 4.79%
iter 8850: loss 3.2153, time 46.11ms, mfu 4.87%
iter 8900: loss 3.0944, time 38.34ms, mfu 5.05%
iter 8950: loss 2.9713, time 34.39ms, mfu 5.30%
step 9000: train loss 2.7441, val loss 4.1933
saving checkpoint to out-tang_all
iter 9000: loss 2.7792, time 1599.60ms, mfu 4.78%
iter 9050: loss 2.8917, time 46.05ms, mfu 4.87%
iter 9100: loss 2.9180, time 44.51ms, mfu 4.96%
iter 9150: loss 2.9594, time 48.36ms, mfu 4.99%
iter 9200: loss 3.0858, time 44.32ms, mfu 5.08%
step 9250: train loss 2.7353, val loss 4.2329
saving checkpoint to out-tang_all
iter 9250: loss 3.0534, time 1621.86ms, mfu 4.59%
iter 9300: loss 3.0867, time 46.52ms, mfu 4.68%
iter 9350: loss 3.0377, time 40.45ms, mfu 4.85%
iter 9400: loss 2.8793, time 44.87ms, mfu 4.94%
iter 9450: loss 2.8942, time 47.87ms, mfu 4.98%
step 9500: train loss 2.7190, val loss 4.2222
saving checkpoint to out-tang_all
iter 9500: loss 3.0337, time 1569.23ms, mfu 4.50%
iter 9550: loss 2.9013, time 45.05ms, mfu 4.62%
iter 9600: loss 3.0363, time 42.29ms, mfu 4.77%
iter 9650: loss 3.0107, time 46.18ms, mfu 4.85%
iter 9700: loss 3.0300, time 35.22ms, mfu 5.10%
step 9750: train loss 2.7034, val loss 4.2334
saving checkpoint to out-tang_all
iter 9750: loss 3.0297, time 1591.63ms, mfu 4.61%
iter 9800: loss 2.9599, time 48.17ms, mfu 4.68%
iter 9850: loss 2.8905, time 37.71ms, mfu 4.90%
iter 9900: loss 2.9502, time 42.63ms, mfu 5.01%
iter 9950: loss 2.8661, time 46.48ms, mfu 5.06%
step 10000: train loss 2.6901, val loss 4.2218
saving checkpoint to out-tang_all
iter 10000: loss 3.0188, time 1539.79ms, mfu 4.57%

1.2曲线分析

两个关键事实:

1. val loss 从 step 3750 之后就基本不动了 (4.15 ± 0.05 来回波动,最后反而略微回升到 4.22)
2. train loss 还在稳定下降 (3.24 → 2.69),这段下降全部是"背得更准"
把这两条放在一起看,就是标准的 泛化平台期 :模型已经学完了数据里能学的规律,继续训练只会在训练集上抠细节。续训到 30000 步,大概会得到`train 1.8 / val 4.4` ——训练指标更漂亮,验证和生成质量更差。

另外`eval_iters=100` 本身有 ±0.03 的噪声,所以 4.15 和 4.22 的差别不必当真, 6000 步不动的平台才是真信号 。

1.3 更本质的账

当前:模型 7M 参数 / 语料 341 万 token
Chinchilla 建议:7M × 20 = 1.4 亿 token
你现在只有建议量的 1/40

数据量是瓶颈,不是训练步数。这也是为什么 val loss 卡在 4.15(困惑度约 64)——唐诗字级模型在有充足数据时能到 2.5~3.0

2:采样

2.1先采样,再决定优化方向

训练已经收敛,直接看生成效果,这比任何指标都直观:

重新开一个powershell,执行:

chcp 65001


cd E:\模型训练\nanoGPT

pip install tiktoken


python sample.py --out_dir=out-tang_all --device=cuda `
  --start="静夜思|李白|" --num_samples=2 --max_new_tokens=100 `
  --temperature=0.8 --top_k=100

python sample.py --out_dir=out-tang_all --device=cuda `
  --start="秋日登高|杜甫|" --num_samples=5 --max_new_tokens=80 `
  --temperature=0.9 --top_k=80

3:评估

3.1 总评

生成结果比预期好很多,不需要做缩小模型 + 加 dropout实验

介绍实验(本次不执行):

rain 2.69 远低于 val 4.22,说明 模型容量对这份数据来说偏大 。降低容量通常能让 val 更低:

执行:

python -u train.py --dataset=tang_all --out_dir=out-tang_small `
  --device=cuda --dtype=bfloat16 `
  --n_layer=4 --n_head=8 --n_embd=192 --block_size=512 `
  --batch_size=16 --gradient_accumulation_steps=2 --dropout=0.2 `
  --learning_rate=1.5e-3 --min_lr=1.5e-4 --warmup_iters=400 `
  --max_iters=8000 --lr_decay_iters=8000 `
  --eval_interval=250 --eval_iters=100 --log_interval=50 `
  --compile=False 2>&1 | Tee-Object -FilePath train_small.log

判断标准:看 val 能否低于 4.15。 如果降到 3.8 以下,说明这个方向对了;如果还是 4.2,说明瓶颈纯粹在数据量,模型怎么调都到不了。

3.2 逐条评估

结果:

秋日登高|杜甫|江云自兹始,孤城临极山。水空随晚浪,树杪引秋颜。
欲徇烟霞志,能随野老还。不知心性外,日夕坐书间。<eos>

第三、四、五条尤其关键。对比三百首那轮

4:结论

4.1 现存的问题(都属正常范围)

- 个别句子不通 :`报恩如铅获` 、`碧碧色已半` ——语义漂移,数据量不足的典型表现
- 偶尔失律 :七言里混进 8 字句
- <eos> 后继续生成 </eos> :输出里出现`咏史|李白|` ,这是因为`sample.py` 不检测结束符,模型写完一首就顺势写下一首。 不是 bug

4.2 结论

不续训,不缩模型

4.3 优化方向

4.3.1:先把采样参数调顺

4.3.2 加数据(唯一能突破当前天花板的路)

当前仓库里能补充的不多(`唐诗补录.json` 、`水墨唐诗` ,几千首量级,对 340 万 token 帮助有限)。真要提升,需要外部更大语料:

- 全宋诗(规模与全唐诗相当)
- 古诗文网抓取的历代诗
- 中文维基的诗歌章节

4.3.3 一个工程建议

将E:\模型训练\nanoGPT\train.py第 274~286 行修改

原代码:

        if losses['val'] < best_val_loss or always_save_checkpoint:
            best_val_loss = losses['val']
            if iter_num > 0:
                checkpoint = {
                    'model': raw_model.state_dict(),
                    'optimizer': optimizer.state_dict(),
                    'model_args': model_args,
                    'iter_num': iter_num,
                    'best_val_loss': best_val_loss,
                    'config': config,
                }
                print(f"saving checkpoint to {out_dir}")
                torch.save(checkpoint, os.path.join(out_dir, 'ckpt.pt'))

修改为:

        improved = losses['val'] < best_val_loss
        if improved:
            best_val_loss = losses['val']
        if iter_num > 0 and (improved or always_save_checkpoint):
            checkpoint = {
                'model': raw_model.state_dict(),
                'optimizer': optimizer.state_dict(),
                'model_args': model_args,
                'iter_num': iter_num,
                'best_val_loss': best_val_loss,
                'config': config,
            }
            print(f"saving checkpoint to {out_dir}")
            torch.save(checkpoint, os.path.join(out_dir, 'ckpt.pt'))
            if improved:
                torch.save(checkpoint, os.path.join(out_dir, 'ckpt_best.pt'))
                print(f"  -> val 创新低 {best_val_loss:.4f},另存 ckpt_best.pt")

建议像我一样注释掉

改动就三处:

1. 把"是否变好"抽成`improved` 变量,先判断再决定
2. `best_val_loss` 只在真变好时更新(原来是每次无条件更新)
3. 变好时额外存一份`ckpt_best.pt`
这样`ckpt.pt` 始终是最新的(续训用),`ckpt_best.pt` 是最优的(采样用)

Logo

更多推荐