获得类GPT模型的完整流程
根据nanochat项目的实现,训练一个类GPT的聊天模型需要以下完整步骤:
完整流程概览
整个训练流程遵循以下顺序,可以通过运行单个脚本完成:
详细步骤和顺序
1. 环境准备阶段
首先需要设置Python虚拟环境、安装依赖和Rust工具链:
2. Tokenizer训练阶段
训练一个BPE(Byte Pair Encoding)分词器,词汇表大小为65536(2^16):
分词器训练的具体实现包括:
- 从预训练数据集中迭代读取文本
- 使用Rust实现的BPE算法进行训练
- 保存分词器和token字节映射
3. Base模型预训练阶段
这是核心的语言模型预训练阶段,训练一个Transformer模型:
预训练的关键要素包括:
- 模型架构:深度为20层(d20),约561M参数
- 训练数据量:遵循Chinchilla定律,tokens = 20 × params
- 优化器: nanochat 在所有训练阶段使用的双重优化器策略。系统使用两个专门针对不同参数组的优化器:AdamW 用于嵌入和输出投影层,Muon 用于所有 Transformer 块矩阵参数。
- 评估指标:CORE分数和bits per byte (bpb)
4. Midtraining(中间训练)阶段
教会模型理解对话格式、特殊token和工具使用:
Midtraining使用的数据混合包括:
- SmolTalk:46万行通用对话
- MMLU:10万行多选题
- 合成身份对话数据
- GSM8K数学问题等
5. Supervised Finetuning (SFT) 阶段
对每个序列进行领域适应,使模型更好地遵循指令:
SFT训练数据包括:
- ARC科学问题(3.4K行)
- GSM8K数学问题(8K行)
- SmolTalk对话(1万行)
- 合成身份对话(1K行)
- 拼写任务(600行)
6. 强化学习阶段(可选)
目前仅在GSM8K数学问题上实现:
模型架构参数
模型的关键架构参数根据深度自动派生:
训练时间和成本
- $100版本(d20):约4小时,8xH100 GPU节点
- $1000版本(d32):约41.6小时,8xH100 GPU节点
Notes 笔记
nanochat项目的设计理念是提供一个端到端、最小化的完整实现,而不是一个高度可配置的框架。整个流程被精心设计为单个脚本即可运行,从零开始到获得可对话的ChatGPT克隆。
关键特点:
- 完全自动化:整个pipeline从分词器训练到最终模型部署都是自动化的
- 可扩展性:通过调整
--depth参数可以训练不同规模的模型 - 透明度:整个代码库仅约8000行,便于理解和修改
- 成本可控:从$100到$1000不等的训练预算
这个流程遵循现代大语言模型训练的标准范式:预训练(学习语言)→ 中间训练(学习格式)→ 监督微调(学习指令)→ 强化学习(优化特定能力)。