构建你自己的LLM
Part 0 起步
Part A 实现 GPT
Part B 训练 GPT
Part C 从模型到产品
附录
用 C++ 与 LibTorch 从零实现一个大模型
从张量到权重,从预训练到上线服务:用 C++ 与 LibTorch 完整实现一个 GPT-2,并走通微调、部署与强化学习。
本教程是什么
市面上教你「用好大模型」的资料很多:调 API、写 prompt、做应用。但模型内部的结构与训练过程,多数使用者没有接触过。本教程从张量操作开始,用 C++17 与 LibTorch 逐步实现 GPT-2,并完成预训练、微调、服务化与强化学习。
教程中的全部代码均已编译通过并实测运行。各章的「预期输出」都来自真实运行结果,可用于核对自己的运行环境。
与同类教程相比,本教程有两个不同点:
-
实现语言:主流大模型教学几乎都基于 Python + PyTorch。本教程全部用 C++17 + LibTorch 实现,适合想了解 C++ 侧写法的读者。
-
覆盖范围:多数入门教程到「微调出能对话的模型」为止。本教程在此基础上 继续四步:把微调后的模型做成 HTTP 服务;让它学会把自然语言翻译成 bash 命令;让它学会调用工具(Function Calling);用强化学习(GRPO)训练出 会推理的模型。
用 C++ 有明确的代价:每次改动都要重新编译,报错信息不如 Python 友好,新手可能还要在 CMake 配置上花不少时间。收益同样明确:本地与端侧推理引擎的核心大多是 C++ 代码;内存、张量、计算图的每个细节都直接体现在实现里,模型内部没有黑盒。
全部代码集中在代码仓库 build-your-own-llm-using-cpp-and-libtorch。
完成后你将得到
四件可运行的产物:
| 产物 | 说明 |
|---|---|
一个亲手组装的 GPT-2 |
124M 参数,分词器 → 注意力 → Transformer Block → 完整模型逐模块从零实现; 能加载 OpenAI 官方权重,每个关键数值都有实测锚点,算错立刻能发现。 |
一条完整的微调流水线 |
分类微调(垃圾短信识别 46% → 97%)、指令微调(Alpaca + LLM-as-judge 评估)、 LoRA 参数高效微调(124M 模型只训 2.67M 参数),三种方式都完整走通。 |
一个可部署的推理服务 |
训练/推理分离的独立工程,提供 REST API( |
一个会推理的模型 |
推理时扩展(CoT、自一致性投票、束搜索)+ 纯强化学习(GRPO)+ SFT+RL 流水线, 附 small/medium 双规模对比实验报告。 |
前置知识
-
必须掌握:C++17 与 CMake 的基本使用——会写类,会执行
cmake -B build && cmake --build build。 -
不要求:掌握 PyTorch 或 Python。第 0 章会用一整章介绍 LibTorch 的写法; Part C 中仅有的几段 Python(数据转换、工具 dispatcher)都是可整段复制的脚本。
-
刚接触人工智能:读完第 0 章后,先读 附录 A:深度学习的心智模型。它把梯度、 反向传播、batch、概率采样等核心概念,用日常编程的对照讲清,不涉及复杂数学推导。
-
硬件:GPU 可选。没有 GPU 也能跑通全部实验;有 GPU 时预训练从 8 分钟 缩短到 15 秒。显存要求见「环境速查」。
章节目录
下表列出全书章节、各章产出与对应代码目录:
| 章 | 标题 | 本章产出 | 代码来源 |
|---|---|---|---|
0 |
环境准备与第一次运行 |
全部章节可执行文件构建成功 + 张量热身跑通 |
|
1 |
语言模型是什么 |
bigram「预言机」直觉 + 三阶段路线图 |
|
2 |
文本 → 词元 → 向量 |
朴素分词器 + GPT-2 BPE 分词器 |
|
3 |
注意力机制 |
四种变体逐个演进到高效多头注意力 |
|
4 |
组装 GPT-2 |
124M 完整模型 + 第一句话 + 参数核算 |
|
5 |
预训练 |
loss 10.8 → 1.7 + 解码策略 + 官方权重加载 |
|
6 |
分类微调 |
垃圾短信二分类 46% → 97% |
|
7 |
指令微调 |
GPT-2 medium 学会指令跟随 + LLM-as-judge 打分 |
|
8 |
训练工程化 |
warmup + 余弦衰减 + 梯度裁剪的训练循环 |
|
9 |
LoRA 参数高效微调 |
只训 2.67M 参数达到 98% 准确率 |
|
10 |
训练-推理分离与 HTTP 服务 |
train/serve 分离 + REST API |
|
11 |
NL → Bash |
自然语言生成 bash 命令 + 沙箱试跑 |
|
12 |
Function Calling Agent |
Hermes 风格工具调用 + 多轮 dispatcher |
|
13 |
推理模型 |
CoT/投票/GRPO RL + 双规模评测报告 |
|
A |
深度学习的心智模型(选读) |
梯度/反向传播/batch/概率采样从零讲透 |
(概念附录,映射第 0 章实验) |
B |
教程 ↔ 代码目录对照表 |
全教程索引 |
— |
C |
踩坑与 FAQ |
依赖/代理/显存/数值对齐的坑 |
— |
阅读路径
不必按顺序读完,可按目标选择路径:
| 你想要 | 路径 | 跳过什么 |
|---|---|---|
完整理解原理 |
第 0 章 →(零基础先读附录 A)→ 第 1 章 → Part A → Part B 逐章走 |
可以先不碰 Part C |
尽快做出能用的东西 |
第 0 章 → 附录 A 的 A.4–A.6(梯度/batch/epoch 速览)→ 第 5 章(加载官方权重跳过自训)→ 第 7 章 → Part C |
第 1–4 章的推导细节可以回补 |
只关心部署与 Agent |
直接读第 10–13 章(遇到不认识的模块回查第 2–4 章) |
理论推导 |
环境速查
各组件要求如下:
| 组件 | 要求 |
|---|---|
LibTorch |
2.x CUDA 版(项目实测 2.13.0+cu130),解压到 |
CUDA Toolkit |
与 LibTorch 配套(实测 CUDA 13.0);纯 CPU 也能编译运行 |
编译器 |
GCC ≥ 8,实测 GCC 11(需 C++17) |
CMake |
≥ 3.16 |
RE2 |
|
Ollama |
仅第 7 章 LLM-as-judge 使用( |
GPU |
可选;第 5/6 章加速 15–30 倍,medium(355M)训练建议 ≥ 12 GB 显存 |
全书约定
以下约定适用于全书各章:
-
源码引用:正文提到代码位置时直接给出代码仓库中的路径,例如
chapters/chapter03_attention/include/attention.h,路径均相对代码仓库根build-your-own-llm-using-cpp-and-libtorch/。建议阅读时同时打开代码仓库对照。 -
数值锚点:所有「预期输出」都是实测结果,不是手打的示意图。为保证跨机器 数值可复现,各章先在 CPU 上以固定随机种子(
manual_seed)初始化权重,再 迁移到 GPU,并禁用 TF32。具体原因见第 0 章。 -
运行方式:第 0–7 章统一用
./scripts/run.sh <章节名>运行,脚本会自动 设置LD_LIBRARY_PATH与 CUDA 环境;第 8–13 章是独立工程,构建与运行入口 见各章说明(各自的scripts/包装同样会设置运行环境)。绕开脚本直接执行 可执行文件时,最常见的报错是libtorch.so: cannot open shared object file。 -
拓展阅读:各章末尾给出延伸阅读材料(原始论文与配套工程)。