← 课程库
预训练工程模块四 · 综合项目项目25 分钟

阶段项目:从零训练一个 mini-GPT

把预训练工程完整走一遍

学完这节你能:
  • 从零搭一个小型因果 Transformer 并训练
  • 亲手观察损失/困惑度下降
  • 把参数量与显存账对上号

Stage 2 收尾:训一个 nanoGPT 级的小模型(几百万~几千万参数),在一小份语料上跑通预训练。让前面所有抽象概念变成屏幕上真实下降的 loss。

  1. 数据:一份小语料(如莎士比亚/中文小说),tokenize、打包成定长序列。
  2. 模型:因果解码器(token+位置嵌入 → 若干 Transformer 层 → 输出词表 logits),带因果掩码。
  3. 目标:交叉熵 = 下一个词预测;优化器 AdamW + warmup/cosine。
  4. 训练:标准循环 + 梯度裁剪 + 混合精度;记录 loss 与困惑度。
  5. 验证:算参数量(12·L·d²)、估显存(16 字节/参数),与实际占用对照;让模型生成几句话看看。
mini-GPT 一个 Block(复用 Stage 1 的注意力/FFN)
class Block(nn.Module):
    def __init__(self, d, h):
        super().__init__()
        self.ln1, self.ln2 = nn.RMSNorm(d), nn.RMSNorm(d)
        self.attn = CausalSelfAttention(d, h)   # 带因果掩码
        self.ffn = nn.Sequential(nn.Linear(d, 4*d), nn.GELU(), nn.Linear(4*d, d))
    def forward(self, x):
        x = x + self.attn(self.ln1(x))          # 残差 + Pre-Norm
        x = x + self.ffn(self.ln2(x))
        return x

💡 验收标准:loss 稳定下降、困惑度明显低于随机、能生成勉强通顺的文本;并能说清「我的模型有多少参数、训练大概要多少 FLOPs、占多少显存」。做到这些,你就真正掌握了预训练工程。

自测训练 mini-GPT 时,判断「训得对不对」最直接的内在指标是:
// 带走一句话

亲手训一个 mini-GPT:因果解码器+下一词预测+AdamW+混合精度;把参数量、FLOPs、显存三笔账与实测对上。

独立练习

做到这些,才算完成本节

  1. 把任务拆成可运行的最小步骤,每一步都保留输出证据。
  2. 提交 README、结果、失败分析和下一次改进计划。
学习记录

记录本节阅读进度

建议先独立回答自测。读完记录不等于已经掌握。

继续下一课
← 上一课
高效训练:FSDP、融合算子、通信优化
下一课 →
指令微调总览:从「会接话」到「听指令」

学完不要急着赶进度:去练习自测,或完成对应的阶段实验