本节摘要:后半程不是从零开始,而是从三样"行李"出发:分词器的词表文件、基座模型权重、以及加载它们的分词器对象。本节逐一清点这三样产物的形态与验收方法(一段代码跑通即验收),然后做一次对照回顾:它们与你在 《ht-gpt:从零搭建 GPT 训练与推理实战》里亲手训过的 GPT、在《Happy-LLM:从零训练大语言模型》里推导过的结构是同一族东西——nanochat 只是用了更小的词表与更短的训练。本节末尾给出对齐训练的路标:SFT 之后的 RLHF/DPO/GRPO 不在本书,详见 《深入理解 AI Agent:设计原理与工程实践》第 7 章。
阅读完本节,你应当能够:
| 产物 | 形态 | 来源 | 验收方式 |
|---|---|---|---|
| 词表文件 | BPE 词表(约 2000 token,含 merges) | 阶段① | 加载后能 encode/decode 一段文本 |
| 基座权重 | checkpoint(模型参数 + 优化器状态) | 阶段② | 加载后能续写文本、loss 合理 |
| 分词器对象 | 封装词表的 encode/decode 接口 | 阶段① | 与词表文件同源、vocab 尺寸一致 |
工作区里这三样产物齐不齐,一行命令先看个大概:
# ls_base.sh —— 产物存在性快查(写法示意,目录结构按 0.2 节约定) ls -lh base/tokenizer/ # 期望:词表与分词器配置文件 ls -lh base/model/ # 期望:模型权重 checkpoint
验收脚本(配合 0.2 节的工作区约定):
# check_artifacts.py —— 验收前三阶段产物(写法示意,以官方仓库 README 为准) from transformers import AutoTokenizer, AutoModelForCausalLM import torch TOK_PATH, BASE_PATH = "base/tokenizer", "base/model" tok = AutoTokenizer.from_pretrained(TOK_PATH) print(f"词表大小: {len(tok)}") # nanochat 口径约 2000 ids = tok("The Yangtze is the longest river in China.") print(f"编码: {ids['input_ids']}") # 能编码即验收通过 assert tok.decode(ids["input_ids"]) == "The Yangtze is the longest river in China." model = AutoModelForCausalLM.from_pretrained(BASE_PATH, dtype=torch.bfloat16) prompt = "Once upon a time" x = tok(prompt, return_tensors="pt")["input_ids"] with torch.no_grad(): y = model.generate(x, max_new_tokens=30, do_sample=True, top_k=40) print(tok.decode(y[0])) # 输出像样的英文续写 = 基座验收通过
⚠️ 验收时若输出乱码或复读,先查三件事:词表与权重是否配套(阶段②用的就是这份词表吗)、生成参数是否过贪(temperature 太高)、加载的 dtype 是否正确。基座问题是前半程问题——排障思路详见 《ht-gpt:从零搭建 GPT 训练与推理实战》训练与推理章节,本书不重复。
如果你读过或跑过《ht-gpt:从零搭建 GPT 训练与推理实战》,这里的对照表能让你立刻把旧知识接上:
| 维度 | 《ht-gpt:从零搭建 GPT 训练与推理实战》的基座 | nanochat 的基座 | 关系 |
|---|---|---|---|
| 架构 | decoder-only GPT | decoder-only GPT(124M) | 同族 |
| 训练目标 | 下一词预测 | 下一词预测 | 相同 |
| 数据 | 中文/自选语料 | FineWeb-Edu ~100B tokens 高质量子集 | 思路同(清洗→分块→打包),规模不同 |
| 分词器 | 自训 BPE | 自训 BPE(约 2000 词表) | 同原理,词表刻意更小 |
| 理论依据 | 《Happy-LLM:从零训练大语言模型》对应章节 | 同 | 理解注意力、warmup、cosine 衰减等概念,详见《Happy-LLM:从零训练大语言模型》 |
一句话:nanochat 的前三阶段 = 《ht-gpt:从零搭建 GPT 训练与推理实战》流程的一个"小词表、大数据、固定预算"实例化。因此本书默认你懂以下概念(不懂先补,括号内为指引):注意力与 KV cache(《Happy-LLM:从零训练大语言模型》)、混合精度与梯度累积(《ht-gpt:从零搭建 GPT 训练与推理实战》训练章)、数据清洗与打包(《ht-gpt:从零搭建 GPT 训练与推理实战》数据章)。
词表约 2000 vs 主流几万的差别,在后半程会显形两次:一是同样文本切出的序列更长(每 token 承载信息少),二是中文改造时几乎必然要扩词表(第 8 章)。
两条替代路径:
💡 本书所有代码把
base/当成黑盒目录:里面是你训的、社区下的还是《ht-gpt:从零搭建 GPT 训练与推理实战》的产物,对后半程的脚本一视同仁。三条路的建议优先级:有卡有闲走自训(收获最大,且第 8 章中文化时对分词器的掌控最彻底);想快走社区权重;换第三方基座时唯一要重做的是第 4 章的 special tokens 设计(词表不同,标记也要跟着重设)。
SFT 之上还有一层"用偏好信号继续训练"的深水区——RLHF、DPO、GRPO 等。nanochat 后续版本的流水线也包含了对话 RL 阶段(官方仓库 chat_rl.py 一类脚本,接口以官方 README 为准)。本书停在 SFT 与部署,理由有二:一是 100 美元 预算内,SFT 已经能得到"会好好说话"的模型;二是偏好优化自成体系,硬塞进来会挤掉工程细节的篇幅。延伸阅读:详见 《深入理解 AI Agent:设计原理与工程实践》第 7 章后训练,那里以完整的对齐训练为主题展开。
行李验收完毕,正式进入后半程第一站——第 2 章解决"拿什么数据教会基座对话"。