0. 如何使用这份手册
学习目标
- 区分个人可完成的实验与大规模训练
- 理解九个实验组成的贯穿项目
- 建立证据优先的学习方式
前置知识
- 会使用终端执行基础命令
- 能够阅读简单 Python
本章产物创建个人实验目录,并复制第一份实验记录模板。
0.1 先建立正确预期
“亲手做一个大语言模型”有两种含义:
- 从零实现完整架构:普通个人计算机可以训练几十万到几百万参数的小型 GPT。模型规模有限,但 Tokenizer、因果注意力、Transformer Block、交叉熵、反向传播、AdamW 和自回归生成与大型模型遵循相同机制。
- 从零预训练 7B、70B 或更大模型:个人设备通常不具备所需资源。限制不仅来自模型权重,还包括激活、梯度、优化器状态、训练语料和持续计算时间。
建议按照以下规模逐级验证:
小模型上看清每一个张量
↓
真实 0.6B 模型上完成 LoRA/SFT
↓
8B 量化模型上研究推理与服务
↓
需要 CUDA/多卡时再迁移到云端0.2 三条学习线同时推进
| 学习线 | 核心问题 | 本手册对应实践 |
|---|---|---|
| 原理线 | 为什么这样设计?公式表达什么? | 手写 attention、TinyGPT、LoRA |
| 工程线 | 数据怎样进入模型?怎样训练和部署? | PyTorch、Transformers、TRL、MLX、llama.cpp |
| 实验线 | 怎样证明模型真的变好或变快? | loss、perplexity、任务评测、TTFT、token/s |
0.3 学完的验收标准
完成学习后,应能独立解释:
- token、embedding、logits、softmax 和交叉熵之间是什么关系。
- 为什么 attention 要除以
sqrt(d_k),为什么要因果遮罩。 - Transformer Block 中残差、归一化、注意力和 MLP 各自解决什么问题。
- 预训练、SFT、LoRA、QLoRA、DPO、RLHF 的目标分别是什么。
- 为什么 KV Cache 能加速,又为什么长上下文和并发会增加内存。
- 训练 loss 下降为什么不等于模型变好。
- 如何设计一个不发生数据泄漏、可复现的评估。
- Mac 适合做什么,何时必须使用 NVIDIA GPU 或多卡。
0.4 学习进度
- 能运行 PyTorch 自动微分示例
- 能手算一个 3-token 注意力矩阵
- 能运行并修改手写 attention
- 能训练 BPE tokenizer
- 能训练 TinyGPT 并生成文本
- 能解释一次训练 step 的内存组成
- 能区分 Prefill、Decode、TTFT 与吞吐
- 能手写 LoRA 层
- 能对 Qwen3-0.6B 做一次 SFT/LoRA
- 能正确划分并评估微调数据
- 能启动本地推理服务
- 能完成最终综合项目
0.5 资料与准确性规则
原理性内容按照以下优先级取材:
- 原始论文或正式发表版本。
- 项目维护方发布的官方文档、模型卡和技术报告。
- 大学课程、开放教材和标准组织文档。
- 经过独立实验验证的工程经验。
博客、论坛和二次解读可以用于发现问题,但不单独作为公式、架构或性能结论的依据。每个原理章节末尾列出“本章依据”,并遵守以下表述规则:
- 论文证明或定义的内容,说明原论文和适用假设。
- 论文报告的实验结果,保留模型、数据、硬件和评测设置的边界,不外推为普遍结论。
- 官方文档描述的是具体版本行为时,避免把实现细节表述为理论要求。
- 尚无统一结论的主题,明确标注为经验、假设或开放问题。
- 性能数字必须由可重复基准产生;无法复现实验时只解释机制,不复述孤立数字。
0.6 贯穿项目:从语料到本地 API
不要把 22 章当成 22 篇相互独立的文章。动手主线最终要交付一个可以复查的实验目录:
llm-learning-lab/
├── data/ # 原始语料、切分后的训练/验证/测试集
├── code/ # 实验脚本,不在 Notebook 中隐藏关键逻辑
├── notebooks/ # 逐步观察和修改参数
├── artifacts/
│ ├── tokenizer/ # tokenizer.json、词表和配置
│ ├── checkpoints/ # TinyGPT 与 Adapter
│ ├── evaluations/ # 逐样本结果、汇总指标和错误分类
│ ├── benchmarks/ # TTFT、TPOT、token/s 与资源记录
│ └── reports/ # 每次实验的结论与适用边界
└── requirements-lock.txt整条路线分为九个可验收实验:
| 实验 | 要回答的问题 | 最小产物 | 完成条件 |
|---|---|---|---|
| 00 环境自检 | 代码究竟运行在哪个设备? | 版本与设备记录 | 张量、梯度、一步更新断言通过 |
| 01 张量与梯度 | 参数如何被 loss 更新? | 梯度数值与形状表 | 手算值与自动微分一致 |
| 02 Tokenizer | 词表如何影响序列成本? | 三组词表对照 | 能往返解码并解释 token 数差异 |
| 03 Attention | 缩放和遮罩是否正确? | 注意力矩阵 | 未来位置概率为零,与 PyTorch 对齐 |
| 04 TinyGPT | 训练闭环是否成立? | checkpoint、loss 日志、样例生成 | loss 下降且 checkpoint 可重载 |
| 05 KV Cache | 加速是否保持语义? | logits 差值与延迟曲线 | 缓存前后 logits 在容差内一致 |
| 06 LoRA/SFT | Adapter 是否改变目标行为? | Adapter、前后对照 | 固定题集上报告逐题变化而非只报 loss |
| 07 评估与 RAG | 错误来自检索还是生成? | Hit@k、MRR、任务指标 | 能定位失败层并给出证据 |
| 08 本地服务 | 模型如何成为可观察的 API? | /healthz、生成接口、基准记录 | 可请求、可测量、错误输入可诊断 |
每个实验都从实验记录模板复制一份报告。所谓“完成”,不是代码没有报错,而是同时留下:输入版本、完整命令、原始结果、对照组、失败记录和结论边界。
0.7 第一次学习会话怎样进行
第一次不要安装所有微调和服务工具。只完成:
- 阅读 0~1 章,画出自己的 LLM 生命周期图。
- 下载实验包,建立虚拟环境。
- 运行环境自检 Notebook 和自动微分脚本。
- 把成功输出与一个故意制造的错误写进实验记录。
- 关闭文档,用 5 分钟向别人解释 token、模型、训练和服务分别是什么。
如果环境步骤失败,停在第 3 章排查;如果只能复述名词但无法举输入输出例子,回到对应原理章;如果代码能运行但无法解释断言,不能勾选完成。
0.8 导学验收
- 为什么个人电脑训练 TinyGPT 仍然有助于理解大模型?哪些结论不能外推?
- 为什么 Notebook 默认不保存执行输出?
- 一次实验必须保存哪六类证据?
- 遇到质量下降时,如何区分数据、训练、推理和系统问题?
- 何时应使用 RAG、工具或提示约束,而不是微调?
能基于自己的实验目录回答,而不是引用原文句子,才进入下一章。