创作不易,请多多点赞收藏!!

#全唐诗训练流程

和三百首是同一套代码,差别在 数据量放大 100 倍、模型放大 10 倍、参数要调 。 

1:拿全唐诗数据

1.1 说明

由于网上存在开源且完整可用的全唐诗数据,所以直接拉取,不进行数据清洗,如要学习数据清洗,可收藏本专栏 ,详细查看第3篇文章,专栏永久免费

1.2 git clone 或者下载zip

1.2.1打开powershell(记住不是cmd)

1.2.2 git clone 方式

每当重开界面,切记环境要切到 llm

执行:

cd E:\模型训练            (注意,小白在这里改成你文件夹的地址)
git clone --depth 1 https://github.com/chinese-poetry/chinese-poetry.git

1.2.3:下载ZIP包的方式

网站:https://github.com/chinese-poetry/chinese-poetry.git

下载后解压到项目文件夹便可

1.2.4确认目录与数据

PowerShell

Get-ChildItem chinese-poetry\御定全唐詩

2:数据修正

2.1 装繁简转换

powershell 执行:pip install opencc-python-reimplemented

2.2 转换脚本

在`E:\模型训练\原生预训练\数据清洗` 下新建`prepare_tang_all.py` :

代码:

import glob
import json
import os
import re
from opencc import OpenCC

cc = OpenCC("t2s")
SRC = r"E:\模型训练\chinese-poetry\御定全唐詩\json"
OUT = "tang_all.txt"

files = sorted(glob.glob(os.path.join(SRC, "*.json")))
print("文件数:", len(files))

lines, skip_lianju, skip_short = [], 0, 0
for fp in files:
    with open(fp, encoding="utf-8") as f:
        poems = json.load(f)
    for p in poems:
        body = re.sub(r"\s+", "", "".join(p.get("paragraphs") or []))

        if "——" in body:      # 联句:正文里混了参与者姓名
            skip_lianju += 1
            continue
        if len(body) < 10:     # 残句
            skip_short += 1
            continue

        title = cc.convert(p.get("title") or "无题").replace("|", ",")
        author = cc.convert(p.get("author") or "佚名").replace("|", ",")
        body = cc.convert(body).replace("|", ",")
        lines.append(f"{title}|{author}|{body}<eos>")

with open(OUT, "w", encoding="utf-8") as f:
    f.write("\n".join(lines))

print("诗数:", len(lines))
print("跳过联句:", skip_lianju, " 跳过残句:", skip_short)
print("总字符:", sum(len(l) for l in lines))
print("唯一汉字:", len({c for l in lines for c in l if "\u4e00" <= c <= "\u9fff"}))

2.3 运行prepare_tang_all.py:

cd E:\模型训练\原生预训练\数据清洗

python prepare_tang_all.py

2.4期望输出:

文件数: 900
诗数: 42800 左右
跳过联句: 159  跳过残句: 67
总字符: 270 万左右
唯一汉字: 6500 左右

判断标准:

- `诗数` 在 42,000~43,000 之间
- `唯一汉字` 在 6,000~7,000 之间; 如果超过 9,000,说明繁转简没生效
- 打开`tang_all.txt` 抽查几行,应该是简体

3:建词表和二进制

3.1 依次执行

cd E:\模型训练\nanoGPT
mkdir data\tang_all
copy "E:\模型训练\原生预训练\数据清洗\tang_all.txt" data\tang_all\input.txt
copy data\poems_char\prepare.py data\tang_all\prepare.py
python data\tang_all\prepare.py

3.2 期望

length of dataset in characters: 3,374,915
vocab size: 7,100 左右      ← 7090 汉字 + 标点 + | + <eos>
train has 3,030,000 tokens, val has 340,000 tokens`

实际:

3.3 检查文件

4:开始训练

新开一个powershell

执行如下命令:

conda activate llm

chcp 65001
cd E:\模型训练\nanoGPT
python -u train.py --dataset=tang_all --out_dir=out-tang_all `
  --device=cuda --dtype=bfloat16 `
  --n_layer=6 --n_head=8 --n_embd=256 --block_size=512 `
  --batch_size=16 --gradient_accumulation_steps=2 --dropout=0.1 `
  --learning_rate=1e-3 --min_lr=1e-4 --warmup_iters=500 `
  --max_iters=10000 --lr_decay_iters=10000 `
  --eval_interval=250 --eval_iters=100 --log_interval=50 `
  --compile=False 2>&1 | Tee-Object -FilePath train_tang_all.log

warnning 不用管,目前设置的是训练10000步,接下来就是漫长的等待时间了

Logo

更多推荐