llm.c 提供了一个在纯 C 中完整、可运行的 GPT-2 训练实现。
graph LR
A[输入文本\n已分词] --> B[嵌入层\nToken + 位置嵌入]
B --> C[Transformer 块 x12\n自注意力 + FFN]
C --> D[层归一化 + 最终投影]
D --> E[交叉熵损失]
E --> F[反向传播\n显式梯度]
F --> G[参数更新\nC 语言 Adam 优化器]
G --> B
subgraph 反向传播
F --> H[嵌入的梯度]
F --> I[注意力的梯度\nQ, K, V, 输出]
F --> J[FFN 的梯度\n门, 向上, 向下]
F --> K[层归一化的梯度\n缩放 + 偏移]
end
| 组件 | C 实现 | 你学到的内容 |
|---|---|---|
| Token 嵌入 | 嵌入查找表 | Token 如何变成向量 |
| 自注意力 | QKV 投影 + softmax + 聚合 | 注意力权重如何计算 |
| 前馈网络 | 两层 MLP 搭配 GELU | FFN 如何转换表示 |
| 层归一化 | 均值 + 方差计算 | 归一化如何稳定训练 |
| 残差连接 | 跳跃连接 | 梯度如何在网络中流动 |
| Adam 优化器 | 动量 + 自适应学习率 | 参数如何更新 |
| 方面 | PyTorch 实现 | llm.c 实现 |
|---|---|---|
| 代码行数 | ~500(含框架) | ~5000(无框架) |
| 反向传播 | 自动(autograd) | 手动(每个梯度) |
| GPU 支持 | 自动(CUDA 张量) | 手动(自定义 CUDA 内核) |
| 教育价值 | 良好(高阶理解) | 优秀(完全理解) |
| 组件 | CPU 实现 | CUDA 内核 |
|---|---|---|
| 矩阵乘法 | 嵌套循环 | 共享内存平铺 |
| Softmax | 顺序计算 | Warp 层级归约 |
| 注意力 | 完整 O(n^2) 矩阵 | 内存高效内核 |
常见问题
什么是 llm.c? Andrej Karpathy 的教育性 GPT-2 训练实现,使用纯 C/CUDA。
为什么使用纯 C? 为了移除抽象层,使每个梯度计算显式可见。
CUDA 版本添加了什么? 所有操作的 GPU 加速内核,实现有意义的训练速度。
真的可以训练模型吗? 是的,可以训练完整的 GPT-2 模型。
可以学到什么? 完整 Transformer 训练堆栈的深入理解。
延伸阅读
- llm.c GitHub 仓库 – Andrej Karpathy 的源代码、文档和示例
- 从零构建 GPT – Karpathy 关于从零构建 GPT 的视频讲座
- Attention Is All You Need (ArXiv) – 原始 Transformer 论文
- CUDA 编程指南 – 官方 NVIDIA CUDA 文档
無程式碼也能輕鬆打造專業LINE官方帳號!一鍵導入模板,讓AI助你行銷加分!