跟着LAP啥都学 跟着LAP啥都学

构建你自己的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(/v1/chat、/v1/generate),可用 curl 直接调用; 其上还有 NL→Bash 与 Function Calling Agent 两个应用。

一个会推理的模型

推理时扩展(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 秒。显存要求见「环境速查」。

全书路线图

全书分为四个阶段,从环境搭建走到附录:

Diagram

章节目录

下表列出全书章节、各章产出与对应代码目录:

章 标题 本章产出 代码来源

0

环境准备与第一次运行

全部章节可执行文件构建成功 + 张量热身跑通

scripts/、chapters/chapter00_hello_torch

1

语言模型是什么

bigram「预言机」直觉 + 三阶段路线图

chapters/chapter01_bigram

2

文本 → 词元 → 向量

朴素分词器 + GPT-2 BPE 分词器

chapters/chapter02_text_data

3

注意力机制

四种变体逐个演进到高效多头注意力

chapters/chapter03_attention

4

组装 GPT-2

124M 完整模型 + 第一句话 + 参数核算

chapters/chapter04_gpt

5

预训练

loss 10.8 → 1.7 + 解码策略 + 官方权重加载

chapters/chapter05_pretraining

6

分类微调

垃圾短信二分类 46% → 97%

chapters/chapter06_finetuning

7

指令微调

GPT-2 medium 学会指令跟随 + LLM-as-judge 打分

chapters/chapter07_instruction_tuning

8

训练工程化

warmup + 余弦衰减 + 梯度裁剪的训练循环

chapters/chapter08_training_loop

9

LoRA 参数高效微调

只训 2.67M 参数达到 98% 准确率

chapters/chapter09_lora

10

训练-推理分离与 HTTP 服务

train/serve 分离 + REST API

chapters/chapter10_serving

11

NL → Bash

自然语言生成 bash 命令 + 沙箱试跑

chapters/chapter11_nl2bash

12

Function Calling Agent

Hermes 风格工具调用 + 多轮 dispatcher

chapters/chapter12_toolcalling

13

推理模型

CoT/投票/GRPO RL + 双规模评测报告

chapters/chapter13_reasoning

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),解压到 /opt/libtorch 或用 TORCH_ROOT 指定

CUDA Toolkit

与 LibTorch 配套(实测 CUDA 13.0);纯 CPU 也能编译运行

编译器

GCC ≥ 8,实测 GCC 11(需 C++17)

CMake

≥ 3.16

RE2

libre2-dev(第 2 章 torchtext 官方 GPT-2 BPE 的正则依赖)

Ollama

仅第 7 章 LLM-as-judge 使用(scripts/start-ollama.sh 启动)

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。

  • 拓展阅读:各章末尾给出延伸阅读材料(原始论文与配套工程)。