From tensors to aligned language models
不只“跑通”模型,
还要知道每个数为什么这样变。
这是一张把学习和实现绑在一起的路线图。每一阶段都回答五个问题:
它是什么、为什么需要、数学上怎么算、代码里张量怎样流动、用什么证据证明正确。
右侧任务面板与 Markdown 中的 98 项清单使用同一 ID。
98可验证任务
12从工程到交付的阶段
1×4090正式训练硬件
全链路依赖
模型正确性先于训练;训练恢复先于租卡;SFT 是 DPO/GRPO 的共同起点;
性能结论必须在生成结果一致后才有意义。
flowchart LR
A["M01 工程"] --> B["M02 模型"]
B --> C["M03 数值 / KV"]
A --> D["M04 数据 / BPE"]
D --> E["M05 Packing"]
C --> F["M06 训练引擎"]
E --> F
F --> G["M07 预训练"]
G --> H["M08 SFT"]
H --> I["M09 DPO"]
H --> J["M10 GRPO"]
C --> K["M11 性能"]
G --> L["M12 交付"]
I --> L
J --> L
K --> L
阅读方式
- 先看“前置知识”并点术语。
- 用小矩阵和滑块理解运算。
- 把公式映射到 PyTorch shape。
- 打开任务,按验收证据完成。
事实状态 ≠ 个人进度。
任务的 done/blocked 来自项目证据;你的勾选只保存在浏览器。
PRIMER · 开工前的数学工具箱
先把张量、维度和矩阵乘法看懂
深度学习代码最常见的错误不是“公式不会”,而是把 shape、广播或
收缩维度弄错。先掌握下面四件事,后续 Attention、RoPE、DPO 都会清晰很多。
标量
一个数,shape 为 []。例如 loss。
向量
一列特征,shape 为 [D]。例如一个 token embedding。
矩阵
二维数表,shape 为 [T,D]。例如一段序列的表示。
矩阵乘法不是逐元素乘法
若 \(A\in\mathbb{R}^{m\times k}\)、\(B\in\mathbb{R}^{k\times n}\),
共享的 \(k\) 是收缩维度,输出 \(C=AB\in\mathbb{R}^{m\times n}\):
\[C_{ij}=\sum_{r=1}^{k}A_{ir}B_{rj}\]
A [m,k]@
B [k,n]→C [m,n]
逐元素乘法要求两个张量 shape 相同或可广播,输出不会消去维度;
矩阵乘法则把左矩阵一行与右矩阵一列做点积。
Interactive 01
矩阵乘法逐元素演算器
点击输出单元,观察参与求和的行与列。
广播 Broadcasting
广播是在不真实复制数据的情况下,把长度为 1
或缺失的维度视作可扩展。例如 [B,T,D] * [D] 会让同一个特征权重
作用于每个 batch 和 token。广播方便,但也可能把写错的 shape 悄悄变成“能运行”。
梯度 Gradient
梯度 \(\partial L/\partial\theta\) 表示参数微小变化对
loss 的一阶影响。反向传播用链式法则从 loss 沿计算图反向累积这些导数。
M01 · FOUNDATION工程、环境与可复现性
同一份代码若依赖、CUDA、随机种子或数据版本不同,结果就可能不同。
“可复现”不是记住一个 seed,而是保存能重建整个运行条件的证据链。
Python moduleJSON命令行GPU 基础
Package、wheel 与依赖锁
Package 是可导入的代码单元;
wheel 是预构建安装包;
lock 文件记录解析后的精确版本。平台 marker 让 Windows 选择 CPU wheel,
Linux 训练机选择 CUDA 12.8 wheel。
只写 torch>=2 不可复现:半年后可能解析到不同算子、
不同 kernel,甚至不同数值行为。
CUDA 软件栈
Python / PyTorch
→
CUDA Runtime
→
NVIDIA Driver
→
RTX 4090
cuDNN 提供深度学习 kernel;
Compute Capability 描述 GPU 支持的指令特性;BF16 是否可用要运行时探测。
Interactive 02
FP32、FP16 与 BF16 位布局
指数位决定范围,尾数位决定精度。
可复现性的四层
- 代码:源码状态与配置 hash。
- 环境:Python、PyTorch、CUDA、driver、GPU。
- 随机性:Python/NumPy/CPU/CUDA RNG state。
- 数据:revision、manifest、shard hash、sampler cursor。
参考:PyTorch 安装 ·
PyTorch 可复现性说明
M02 · MODELDecoder-only Transformer 的数学骨架
语言模型把序列概率分解为“在已有前缀下预测下一个 token”。
每一层只做三件事:归一化、让 token 交换信息、对每个 token 做非线性变换。
\[p(x_1,\ldots,x_T)=\prod_{t=1}^{T}p(x_t\mid x_{<t})\]
Embedding 与 Logits
Embedding 矩阵 \(E\in\mathbb{R}^{V\times D}\) 把离散 token ID 查成 D 维向量。
最后的 LM Head 把隐藏状态乘 \(W\in\mathbb{R}^{D\times V}\) 得到 logits;
logits 是未归一化分数,不是概率。
IDs [B,T]lookup
X [B,T,D]@ Wlogits [B,T,V]
RMSNorm
\[\operatorname{RMSNorm}(x)=g\odot\frac{x}{\sqrt{\frac1D\sum_i x_i^2+\epsilon}}\]
它不减均值,只按均方根缩放。平方和与 rsqrt 用 float32 计算,
可降低 BF16 尾数较短带来的累计误差;\(g\) 是可训练逐特征缩放。
RoPE:用旋转写入位置
把每两个通道当成二维向量,位置 \(m\) 对应角度 \(m\theta_i\):
\(\begin{bmatrix}x'_{2i}\\x'_{2i+1}\end{bmatrix}=
\begin{bmatrix}\cos\phi&-\sin\phi\\\sin\phi&\cos\phi\end{bmatrix}
\begin{bmatrix}x_{2i}\\x_{2i+1}\end{bmatrix}\)。
旋转保持范数,且 Q/K 的点积自然包含相对位置 \(m-n\)。
Interactive 03
RoPE 二维旋转
拖动 position,观察旋转矩阵和范数。
Attention:从相似度到上下文
\[\operatorname{Attention}(Q,K,V)=\operatorname{softmax}\left(\frac{QK^\top}{\sqrt{d_h}}+M\right)V\]
\(QK^\top\) 的第 \(i,j\) 项衡量 token i 对 token j 的匹配;
除以 \(\sqrt{d_h}\) 防止维度增大时点积方差过大;因果 mask \(M\) 把未来位置设为
\(-\infty\),softmax 后其概率为 0。
Interactive 04
Attention 矩阵流水线
查看 score、mask 和逐行 softmax。
GQA:让多个 Q Head 共享 K/V
MHA 中每个 Query Head 都有自己的 K/V;
GQA 将 Query Head 分组,共享较少的 KV Head,降低参数量和解码缓存。
`n_heads % n_kv_heads == 0` 保证每组大小为整数。
SwiGLU 与 Pre-norm
\(\mathrm{down}(\mathrm{SiLU}(\mathrm{gate}(x))\odot
\mathrm{up}(x))\)。门控是逐元素乘法;Block 使用
\(x+\mathrm{Attn}(\mathrm{Norm}(x))\) 和 \(h+\mathrm{MLP}(\mathrm{Norm}(h))\)。
Interactive 05
Head 分组与理论 KV 显存
每种颜色代表一个共享 KV Head。
参考:Meta Llama 3 最小实现 ·
Attention Is All You Need ·
PyTorch SDPA
M03 · NUMERICS & CACHE数值对齐与 KV Cache
“看起来能生成”不能证明实现正确。先把同权重、同输入的每层输出
与参考实现比较,再证明缓存解码和全量解码得到同一 logits 与 token。
绝对误差与相对误差
绝对误差 \(|\hat y-y|\) 适合接近 0 的值;
相对误差 \(|\hat y-y|/(|y|+\epsilon)\) 衡量相对尺度。float32 与 BF16 不能使用
同一阈值,因为 BF16 只有 7 位显式尾数。
逐模块对齐的价值:如果整模 logits 超阈值,可以定位第一层、
第一个算子,而不是在 12 层以后猜原因。
Prefill 与 Decode
Prefill 一次处理整个 prompt,产生每层 K/V;
Decode 每次只输入新 token。若每步重新计算完整前缀,生成第 t 个 token 要重做
1…t 的工作;Cache 用显存换掉这些重复投影。
\[\mathrm{KVBytes}=2\cdot L\cdot B\cdot H_{kv}\cdot T\cdot D_h\cdot \mathrm{bytes(dtype)}\]
Interactive 06
Cache On / Off 计算区域
黄色是重算,绿色是复用,蓝色是新 token。
为什么 Cache 必须预分配
每个 token 都
torch.cat 会反复分配和复制旧 K/V;预分配 `[B,Hkv,Tmax,Dh]`
后用 slice 写入,只返回有效 prefix 的 view。overflow、start position、batch、
dtype 和 device 都属于必须在写入前验证的 invariant。
M04 · DATA & TOKENIZER文本不是“字符串那么简单”
同一个人眼字符可能有不同 Unicode 编码;同一文档如果在 train 和
validation 同时出现,PPL 会虚假变好。清洗、去重和切分顺序决定评测是否可信。
UTF-8、Unicode 与 NFC
Unicode 给字符分配 code point,UTF-8 把
code point 编成 bytes。NFC 把“e + 组合重音”规范成等价预组合形式;NFKC 还会做
兼容性折叠,可能改写全角字符,因此本项目只用 NFC。
Hash 切分避免泄漏
先对 normalized text 求 SHA256,再用 hash 分桶。
相同文本永远得到同一 hash,因此去重和 train/validation 切分都稳定。
从 packed block 随机切分会让同一文档片段泄漏到两边。
Byte-level BPE
从 byte alphabet 开始,反复统计相邻 token pair,合并频率最高的 pair,直到达到
32K vocabulary。因为任意 UTF-8 文本都能退化为 bytes,所以 unknown rate 可以为 0。
t h e
频率最高: t+h
th e
继续 mergethe
chars/token 适合人类字符视角;bytes/token
更适合跨语言比较。中文一个字符通常占 3 个 UTF-8 bytes,不能只比较字符数。
隐私边界:被丢弃文档只记录 reason code 和计数,
不把可能含敏感信息的原文写进日志。
参考:Unicode Normalization ·
Hugging Face Tokenizers
M05 · PACKING把文档变成连续、可恢复的训练记录
GPU 希望每个 batch shape 固定,但文档长度不同。Sequence Packing
把多个文档用 EOT 连接成 token stream,再切成固定记录,避免 padding 浪费。
文档 A
EOT
文档 B
EOT
→2,049 tokens
record[:-1] [2048]预测
record[1:] [2048]
32K vocab 小于 65,536,因此磁盘可用 `uint16` 每 token 2 bytes;送入 Embedding 前再转
`torch.long`。2.5B token 裸文件约 5GB。
Shard 与 Manifest
Shard 是分块二进制文件;manifest 保存来源、
revision、SHA256、文档数、token 数、丢弃量和 tokenizer hash。没有 manifest,
5GB 文件只是无法解释的 bytes。
Memory Mapping
mmap 让操作系统按需把文件页映射到内存,不必把整个
shard 一次读进 RAM。Dataset 用 global record index 定位 shard 与 byte offset。
\[\mathrm{PackingEfficiency}=\frac{\mathrm{used\ tokens}}{\mathrm{used\ tokens}+\mathrm{pad\ tokens}}\]
M06 · TRAINING ENGINELoss、优化器、显存与恢复
训练循环要让每次更新的数学含义稳定:global batch 不因显存改变,
学习率按 optimizer step 推进,checkpoint 恢复后下一 batch 和 RNG 也不能漂移。
Cross Entropy 与 PPL
\[L=-\frac1N\sum_{t=1}^{N}\log p_\theta(y_t\mid x_{\le t}),\qquad \mathrm{PPL}=e^L\]
若平均 NLL 为 2,PPL≈7.39,可直觉理解为模型平均在约 7.39 个等可能选择间犹豫。
`-100` token 不进入 N 和求和;全 mask 必须报错,不能产生 NaN。
AdamW
Adam 用一阶矩 \(m_t\) 和二阶矩 \(v_t\) 自适应缩放梯度;
AdamW 把 weight decay 从梯度更新中解耦:
\(\theta\leftarrow\theta-\eta\hat m/(\sqrt{\hat v}+\epsilon)-\eta\lambda\theta\)。
Norm 与 Embedding 不做 decay。
Interactive 07
Logits → Softmax → Cross Entropy
调节三个 logits 和目标类别。
梯度累积
16 个 micro-batch 的 loss 各除以 16,再累加梯度,
只在边界 optimizer.step。若忘记除以 16,梯度近似放大 16 倍;若 scheduler
每 micro-step 前进,学习率日程也快 16 倍。
梯度检查点
普通反向保存 activation;checkpoint 丢弃部分 activation,
反向时重算 forward,以计算换显存。它不是训练 checkpoint,两者名称相似但目的完全不同。
Interactive 08
Warmup + Cosine 学习率
横轴 optimizer step,不是 micro-step。
断点续训为什么要保存 RNG 与 Sampler
只保存模型和优化器,
恢复后 dropout、采样顺序或数据 cursor 会变化,轨迹不再等于连续训练。
正确 checkpoint 还要保存 scheduler、global step、consumed tokens、Python/NumPy/CPU/CUDA
RNG、sampler cursor、配置和环境证据,并用临时目录+原子重命名发布。
参考:AdamW ·
PyTorch Activation Checkpointing
M07 · PRETRAIN先用 Pilot 购买信息,再购买算力
Pilot 的目的不是得到“较差的小模型”,而是验证数据、吞吐、显存、
日志和恢复,并用真实速度估算 125M 主训练时长与费用。
Step、Micro-batch 与 Token Budget
主训练每 optimizer step:
\(4\text{ sequences}\times16\text{ accumulation}\times2048=131,072\) tokens。
19,074 step 共 2,500,067,328 tokens。这里“25亿”是 packed tokens,不是原始文档 token。
Median 与 P95
平均值容易被偶发慢 step 拉动。Median 表示典型速度;
P95 step time 表示 95% step 不超过该时长,更能暴露抖动。前 50 step 含编译和缓存 warmup,
不进入稳定吞吐统计。
\[\mathrm{EstimatedHours}=\frac{\mathrm{remaining\ tokens}}{\mathrm{median\ tokens/s}}\div3600\]
只有 56M pilot、125M 前 200 step 和恢复演练通过后,才启动完整租卡。
最佳 checkpoint 按 validation PPL 选择,不默认最后一步。
M08 · SFT让模型学习“如何回答”,而不是重复用户
SFT 仍是 next-token prediction;区别在于输入采用 chat template,
loss 只覆盖 assistant span。Teacher forcing 在训练时把真实历史 token 提供给模型。
System
mask=-100
User
mask=-100
Assistant
参与 loss
EOT
参与 loss
`-100` 是 PyTorch CrossEntropyLoss 的 ignore index 约定;它不是 token ID。
多轮对话中每一个 assistant span 都参与,header、user、system 和 padding 全忽略。
Chat Template 是协议
训练与生成必须调用同一模板函数。若训练使用
header token,而推理只拼 “User:”,模型看到的是分布外输入,容易泄漏模板或不回答。
截断的危险
最大长度 2048。若从错误一端截断,可能只留下 assistant 答案却丢掉问题,
或切断 special token。截断后要重新验证 span 与 EOT 完整性。
同时记录 all-token loss 和 assistant-only loss 可以诊断 mask,
但 early stopping 只依据 assistant-only validation loss。
M09 · DPO用偏好对直接推动 Chosen 胜过 Rejected
DPO 不单独训练 reward model。它比较 policy 相对 reference
对 chosen/rejected 的偏好变化;reference 固定为 SFT checkpoint,提供“不要偏离太远”的锚。
\[
L_{\mathrm{DPO}}=-\log\sigma\left(\beta\left[
(\log\pi_c-\log\pi_{\mathrm{ref},c})-(\log\pi_r-\log\pi_{\mathrm{ref},r})
\right]\right)
\]
Sequence Log-prob
对 response 的每个真实 token,从 logits 的 log-softmax
中 gather 对应项再求和。Prompt 只是条件,不进入 chosen/rejected 得分;不同长度会影响
总 log-prob,所以报告同时记录 token 数。
β 与 Margin
括号中的值是相对 preference margin。β 控制 loss 对 margin 的敏感度。
policy=reference 时 margin=0,\(-\log\sigma(0)=\log2\)。
Interactive 09
DPO 四个 Log-prob
提高 policy chosen,观察 loss 下降。
原论文:Direct Preference Optimization
M10 · GRPO在同一问题的多次 Rollout 中比较相对好坏
每个 prompt 采样一组回答,用组内奖励标准化得到 advantage。
本项目只使用可验证格式和数值答案奖励,避免把外部 LLM judge 的偏差引入实验。
\[A_i=\begin{cases}\frac{r_i-\bar r}{s_r},&s_r>0\\0,&s_r=0\end{cases}\]
Advantage
reward 衡量绝对结果;advantage 衡量某条回答相对同组平均好多少。
全组 reward 相同时没有学习信号,必须设 0 而不是除以 0。
Clipped Ratio
\(\rho=\exp(\log\pi_{\mathrm{new}}-\log\pi_{\mathrm{old}})\)。
PPO 风格目标比较 \(\rho A\) 与裁剪后的 \(\mathrm{clip}(\rho,1-\epsilon,1+\epsilon)A\),
防止一次更新移动过大;另加 KL penalty 约束对 reference 的偏离。
Interactive 10
Reward → Advantage → Clipped Objective
逗号输入一组奖励;尝试全部相同。
规则奖励与 Reward Hacking
格式完全匹配 +0.25,数值正确 +1。
空回复、多个 answer tag、解析失败总分 0。若模型只学会 tag 而答案率下降,这是 reward hacking
或目标错配;报告必须分开写 format compliance 与 exact match。
原论文:DeepSeekMath / GRPO
M11 · BENCHMARK只有隔离变量,才知道优化来自哪里
性能测试不是截一张 nvidia-smi。固定权重、输入、batch、dtype、
生成长度与计时协议;每次只改一个变量,并先证明输出一致。
正确的 CUDA 计时
GPU kernel 异步提交,CPU 计时器可能在 kernel 完成前停止。
测量边界要用 CUDA event 或 synchronize。先 warmup 5 次,再重复 30 次,
报 median、P10、P90,而不是挑最好一次。
理论显存 vs 峰值显存
KV 公式只计算 K/V 张量;CUDA 峰值还包含参数、
activation、临时 workspace 和 allocator 碎片。可以说 GQA 理论 KV 减少 66.67%,
实际峰值只能写实测值。
Ablation Matrix
| Case | Attention | Precision | Compile | Checkpoint |
| A | eager | FP32 | off | off |
| B | eager | BF16 | off | off |
| C | SDPA | BF16 | off | off |
| D | SDPA | BF16 | on | off |
| E | SDPA | BF16 | on | on |
A→D 衡量综合吞吐,D→E 衡量 checkpoint 的显存收益和速度代价。
M12 · DELIVERY让每一个简历数字都能反查
报告不是手工把数字粘进 Markdown;它应从原始 JSONL/CSV 自动生成。
Run ID、配置、环境、数据 hash、checkpoint hash 和生成脚本共同组成 provenance。
metrics.jsonl
eval.json
benchmark.csv
→build_report.py
→报告 / 简历摘要
Data Card
说明来源、revision、许可、过滤、去重、语言比例、切分、隐私与偏差。
它回答“模型看过什么、哪些没看过、数据有哪些风险”。
Model Card
说明架构、用途、限制、训练数据、评测、安全边界和 checkpoint hash。
125M 研究模型不能描述为生产级通用助手。
Fail closed:resume_summary 缺任何指标就失败,
而不是输出“XX GB”“提升 XX%”或猜测值。
Tensor · 张量M02/M06带 shape、dtype 和 device 的多维数值数组,是 PyTorch 计算的基本载体。
Shape · 形状全阶段张量各维长度;例如 [B,T,D] 分别表示 batch、序列和隐藏维。
Dtype · 数据类型M01/M06每个元素的编码与精度,如 float32、bfloat16、int64。
Device · 设备M01张量所在 CPU 或 CUDA GPU;参与同一运算的张量通常必须同设备。
Scalar · 标量数学基础只有一个数的 0 维张量,例如总 loss。
Vector · 向量数学基础一维有序数列,例如一个 token 的 D 维表示。
Matrix · 矩阵数学基础二维数表;矩阵乘法用行与列点积组合线性变换。
Broadcast · 广播数学基础按长度为 1 的维度逻辑扩展张量,不必真实复制数据。
Gradient · 梯度M06loss 对参数的一阶偏导,方向表示参数变化对 loss 的局部影响。
Autograd · 自动微分M02/M06PyTorch 记录计算图并用链式法则自动求梯度的系统。
Package · Python 包M01可通过 import 使用、具有模块命名空间的代码集合。
Module · 模块M01/M02Python 文件或 PyTorch nn.Module;后者封装参数和 forward。
WheelM01Python 的预构建安装包格式;PyTorch 的 CPU/CUDA wheel 内容不同。
Virtual Environment · 虚拟环境M01隔离项目 Python 解释器与依赖,避免全局包互相污染。
Lockfile · 锁文件M01记录依赖解析后的精确版本和来源,以便重建环境。
CI · 持续集成M01每次变更自动运行格式、类型和测试门禁。
CUDAM01/M11NVIDIA 的 GPU 并行计算平台与运行时接口。
cuDNNM01NVIDIA 面向深度神经网络的高性能算子库。
Compute CapabilityM01NVIDIA GPU 架构能力编号,决定支持的指令和数据类型。
BF16 · bfloat16M01/M068 位指数、7 位尾数的 16 位浮点,范围接近 FP32、精度更低。
FP16M01/M065 位指数、10 位尾数的半精度浮点,范围小于 BF16。
FP32M01/M068 位指数、23 位尾数的单精度浮点,是数值基线常用类型。
SDPAM02/M11Scaled Dot Product Attention 的 PyTorch 统一接口,可分派到优化 kernel。
Kernel · GPU 核函数M01/M11在 GPU 大量线程上并行执行的底层计算程序。
Seed · 随机种子M01伪随机序列起点;相同 seed 只是可复现性的一个条件。
RNG StateM01/M06随机数生成器当前内部状态,续训时决定后续随机序列。
Determinism · 确定性M01/M06相同输入与状态产生相同输出;某些 GPU 算子默认并不完全确定。
Decoder-onlyM02只使用因果自注意力、逐 token 预测后续内容的 Transformer 架构。
Autoregressive · 自回归M02把联合概率分解为每个位置在已有前缀条件下的概率。
TokenM02/M04模型处理的离散符号单位,可对应 byte、字符片段或特殊标记。
Vocabulary · 词表M02/M04token 与整数 ID 的有限映射集合。
Embedding · 嵌入M02通过查表把 token ID 映射为连续 D 维向量。
Hidden State · 隐藏状态M02每层对每个 token 的连续表示,shape 通常为 [B,T,D]。
LogitsM02/M06softmax 前的未归一化类别分数,可为任意实数。
SoftmaxM02/M06用指数归一化把一组 logits 变为和为 1 的概率。
RMSNormM02按均方根缩放特征、不减均值的归一化层。
RoPEM02Rotary Position Embedding,用二维旋转把位置写入 Q/K。
Attention · 注意力M02根据 Q/K 相似度对 V 做加权求和,让 token 汇集上下文。
Query · QM02表示当前位置想检索什么的向量。
Key · KM02/M03表示每个历史位置可被匹配内容的向量。
Value · VM02/M03Attention 概率最终加权汇总的内容向量。
Causal Mask · 因果遮罩M02禁止位置 i 看到未来 j>i 的上三角遮罩。
Attention HeadM02在较小 head_dim 子空间中独立计算注意力的一条分支。
MHA · Multi-head AttentionM02/M11每个 Query Head 都有独立 K/V Head 的多头注意力。
GQA · Grouped-query AttentionM02/M11多个 Query Head 分组共享较少 KV Head 的注意力。
MQA · Multi-query AttentionM02所有 Query Head 共享单个 K/V Head,是 GQA 的极端情形。
SwiGLUM02使用 SiLU 门控的前馈层:down(silu(gate(x))⊙up(x))。
SiLUM02x·sigmoid(x) 的平滑非线性激活函数。
Residual · 残差连接M02把子层输出加回输入,为信息与梯度提供直接路径。
Pre-normM02在 Attention/MLP 子层之前归一化,再做残差相加。
LM HeadM02把隐藏维 D 投影到词表维 V 的输出线性层。
Parameter · 参数M02通过梯度更新的可训练张量,如线性层权重。
Initialization · 初始化M02训练前给参数设置初值的分布与规则。
Overfitting · 过拟合M02/M07模型记住训练样本但泛化较差;小样本过拟合可作为实现门禁。
Reference ImplementationM03用于数值比较的可信实现,不代表本项目依赖其训练模型。
State DictM03/M06PyTorch 模块参数/缓冲区名称到张量的映射。
Tolerance · 数值容差M03浮点比较允许的绝对和相对误差范围。
KV CacheM03/M11保存历史 token 每层 K/V,避免自回归解码重复投影。
PrefillM03/M11生成开始时并行处理完整 prompt 并填充 KV Cache。
DecodeM03/M11自回归阶段每次根据已有前缀生成一个新 token。
Greedy DecodingM03每步选择概率最大 token,不进行随机采样。
UnicodeM04为世界文字定义 code point 的字符标准。
UTF-8M04把 Unicode code point 编码为 1–4 个 byte 的可变长编码。
NFCM04Unicode 规范组合形式,把等价字符序列统一表示。
SHA256M04/M12输出 256 位摘要的密码学 hash,用于标识内容和校验完整性。
Deduplication · 去重M04移除相同规范化文档,降低重复和评测泄漏。
Data Leakage · 数据泄漏M04训练数据包含评测内容或其重复,使评测结果虚高。
BPE · Byte Pair EncodingM04迭代合并高频相邻符号对的子词分词算法。
Special TokenM04/M08具有协议语义的保留 token,如 BOS、EOT、role header。
Round TripM04encode 后 decode 能恢复原文本的可逆性检查。
Sequence PackingM05把不同文档连接并切成固定长度记录,减少 padding。
EOT · End of TextM05/M08标记文档或对话轮次结束的特殊 token。
Shard · 分片M05大数据集拆分出的可独立校验与读取文件。
ManifestM04/M05/M12记录数据来源、hash、数量、配置和 lineage 的清单。
Memory Mapping · mmapM05把文件页映射进虚拟内存,按需读取而不整体加载。
SamplerM05决定 Dataset record 访问顺序的组件。
Cross Entropy · 交叉熵M06对正确类别负对数概率求平均的分类损失。
NLL · Negative Log-likelihoodM06正确 token 概率的负对数;概率越高,NLL 越低。
Perplexity · PPLM06/M07平均 NLL 的指数,衡量模型对真实 token 的不确定性。
AdamWM06带解耦权重衰减的自适应一阶优化器。
Weight DecayM06按比例收缩参数的正则化;AdamW 将其与梯度更新解耦。
WarmupM06/M11训练早期从低学习率逐步升高;基准 warmup 则用于排除启动开销。
Cosine DecayM06按余弦曲线从峰值平滑降低学习率的调度策略。
Micro-batchM06单次前向/反向实际放入显存的样本集合。
Global BatchM06一次 optimizer update 累计使用的全部样本或 token。
Gradient AccumulationM06多个 micro-batch 反向累加梯度后再更新一次参数。
Gradient ClippingM06当全局梯度范数超过阈值时按比例缩小,抑制爆炸。
AutocastM06按算子安全性自动选择低精度或高精度计算的上下文。
Activation CheckpointM06反向时重算 forward 以减少保存 activation 的显存。
Training CheckpointM06保存模型、优化器、调度器、RNG 和数据 cursor 的续训快照。
Atomic Write · 原子写入M06先完整写临时目标,再一次重命名发布,避免半成品被读取。
OOM · Out of MemoryM06/M07设备无法满足内存分配请求的错误。
Pilot RunM07在较小模型或 token 预算上验证系统并估算正式成本的实验。
Token BudgetM07训练计划要消费的有效 packed tokens 总量。
Optimizer StepM06/M07根据已累积梯度实际更新一次参数的时刻。
Throughput · 吞吐M07/M11单位时间处理或生成的 token 数。
Latency · 延迟M11一次请求或一个步骤从开始到完成的时间。
Median · 中位数M07/M11排序后位于中间的观测值,对极端值较稳健。
Percentile · 百分位数M07/M11P95 表示 95% 观测值不超过该数。
SFT · Supervised Fine-tuningM08在示范指令-回答上用监督 next-token loss 微调模型。
Chat TemplateM08把角色消息序列化为模型 token 协议的唯一规则。
Teacher ForcingM08训练每个位置时提供真实历史 token,而非模型先前生成。
Assistant-only MaskM08只让 assistant response token 贡献 SFT loss 的标签遮罩。
PaddingM08为对齐 batch 长度补入的无语义 token,必须不贡献 loss。
Truncation · 截断M08序列超出最大长度时移除部分 token,需要保护角色和答案边界。
Early StoppingM08验证指标不再改善时停止训练,降低过拟合和无效计算。
DPOM09直接用偏好对优化 policy 相对 reference 的 chosen/rejected margin。
ChosenM09偏好数据中被标注为更好的 response。
RejectedM09同一 prompt 下被标注为较差的 response。
Log-probM09/M10概率的自然对数;序列 log-prob 是各 token log-prob 之和。
LogSigmoidM09数值稳定计算 log(sigmoid(x)) 的函数。
Reference PolicyM09/M10冻结的基线策略,用于约束更新后模型不要偏离过远。
Preference MarginM09模型对 chosen 相对 rejected 的得分差。
KL DivergenceM09/M10衡量两个概率分布差异的非对称散度。
GRPOM10在同 prompt 的一组 rollout 内标准化 reward,并用 clipped objective 更新策略。
RolloutM10从当前策略采样得到的完整 response 及其 log-prob、reward。
Policy GradientM10用采样回报加权 log-prob 梯度来优化策略期望奖励。
Reward · 奖励M10对生成结果质量的标量反馈。
Advantage · 优势M10某行动/回答相对基线或组均值好多少的学习信号。
Importance RatioM10新旧策略对同一 token 序列概率之比。
Clipping · 裁剪M10限制 importance ratio 的有效范围,避免单次更新过大。
Exact MatchM10规范化后的预测答案与标准答案完全相等的指标。
Reward HackingM10模型利用奖励规则漏洞提高分数,却没有改善真正目标。
BenchmarkM11在固定输入、环境和协议下可重复的性能测量。
CUDA SynchronizeM11等待已提交 GPU 工作完成,避免异步执行破坏计时。
Peak MemoryM11测量区间内 allocator 记录的最大设备内存使用。
Ablation · 消融M11保持其他条件不变,只移除或改变一个组件来测其影响。
Control Variable · 控制变量M11对比实验中必须保持相同的非目标条件。
Run IDM12唯一标识一次实验并连接配置、日志、模型和报告的字符串。
Provenance · 溯源M12说明某个产物由哪些代码、数据、配置和运行生成的证据链。
Data CardM12描述数据来源、许可、处理、组成、风险和限制的文档。
Model CardM12描述模型用途、训练、评测、限制和安全边界的文档。
Raw Metric · 原始指标M12训练或评测直接记录的数值,如每 step loss。
Derived Metric · 派生指标M12由原始指标计算的数值,如 PPL 或提升百分比。
Fail ClosedM12缺少证据时拒绝输出结果,而不是猜测或填默认值。