Note
Assignment plan
Lecture 3–5: 重点掌握 architecture、attention、MoE、GPU 推进 A1 模型主体
Lecture 6–10: 重点掌握 kernel、parallelism、inference 结合 vLLM-o profiling 选择性推进 A2
Lecture 11–12: 轻量学习 scaling law 和 evaluation 选择性做 A3
Lecture 13–17: 以建立知识地图为主 不做 A4、A5
Lecture2 - Resource Counting
Total_compute ≈ 6 * num_parameters * total_training_tokens
Forward pass: 2(# data points)(# parameters) FLOPs
Backward pass: 4(# data points)(# parameters) FLOPs
bf16 用于参数、激活值、梯度, fp32 用于优化器状态 optimizer states.
num_parameters: D * D * L
flops: 6 * B * num_parameters
混合精度训练: Pytorch 会自动优化数据精度,如果是做矩阵乘法,fp16是安全的,但如果是指数运算,则会保留为fp32
缩小维度的矩阵运算并不能提高提升运算速度,要看 计算密度 是否满足了硬件的计算密度规格,硬件计算密度是规格上的 单位时间浮点数计算量 / 单位时间通信字节量,计算密度是算法的 浮点数计算量 / 总搬运字节量, 可以由此来判断是 memory bound 还是 compute bound,
Total memory:
parameter_memory = 2 * (D * D * L) #(2 bytes for bf16)
activation_memory = 2 * B * D * L #(2 bytes for bf16)
gradient_memory = 2 * num_parameters #(2 bytes for bf16)
optimizer_state_memory = 4 * num_parameters #(4 bytes for fp32)s
Memory 主要有两个作用:
- 需要在 HBM 中存储这些数据
- 这些数据必须传输到加速器上
如何减少训练时的显存占用?
rematerialization, Key idea: 对于前向传播,只保留一部分层的激活值,反向传播在遇到最近的checkpoint的时候把缺失的层激活值再算出来。
Lecture3 - Architecture

残差链接是必要的,在层数很高的模型中,如果不能把 $x_0$ 传递进最后一层,则计算 Loss 对 $x_0$ 的梯度会渐进消失。
layer norm 在现代 transformer 中的位置不同: pre norm 和 post norm。 post norm 和 LSTM 的问题一样,在长下文(大量 layer)的计算中会导致初始信息缺失。
LayerNorm:
$$ y_i=\gamma_i\frac{x_i-\mu}{\sqrt{\sigma^2+\epsilon}}+\beta_i $$
其中:
- $\epsilon$:防止除以零;
- $\gamma$:可学习的缩放参数;
- $\beta$:可学习的偏移参数。
如果隐藏维度为 (D),那么:
$$ \gamma,\beta\in\mathbb R^D $$
也就是说,LayerNorm 先把数值标准化,然后允许模型通过 $\gamma$ 和 $\beta$
RMSNorm: 现代 Llama 经常使用 RMSNorm。RMSNorm 通常不减均值,也没有 $\beta$,主要按照均方根调整尺度(单纯的先缩小再放大):
$$ \operatorname{RMSNorm}(x)=\gamma\odot\frac{x}{\sqrt{\frac1D\sum_i x_i^2+\epsilon}} $$
但它的主要目的和 LayerNorm相似:控制输入尺度,提高训练稳定性。
理论上 LN 的表达能力更强,但在实践中 RMSNorm 没有表达能力的损失,并且运行的更快。 我们不想让 GPU 浪费在来回搬运微不足道的计算数据上,所以要去掉规模小、涉及内存搬运、对表达能力贡献不大的操作,比如均值减法和加法,偏置项。
LN 这种操作虽然只占据 总flops 的 0.17%,但实际运行时间可能占据总时间的 25%。

RoPE(rotary position embeddings), 相对位置函数:
$$ \frac{\frac{x,i}, \frac{y,i}} = g(x,y,i-j) $$

门控,在 LSTM 中和 Transformer 中的表现是什么? LSTM 是门控注意力,Transformer 是门控激活函数?在 FFN 中,应该怎么理解门口激活函数,如何理解什么是好的激活函数?什么是 MLP 门控?什么是 MLP?
现代 LLM 将 FFN 替换成 gated MLP(Multi-Layer Perceptron),也就是 SwiGLU,用激活函数产生一条门控分支,再于零一条内容分支逐元素相乘。 门控的通用形式可以写成:
$$ y=g(x)\odot v(x) $$
- $v(x)$:真正准备传递的内容;$g(x)$:门控信号;$\odot$:逐元素相乘。
最基本的 MLP 可以写成:
$$ y=W_2\phi(W_1x+b_1)+b_2 $$
- 线性层;非线性激活函数;另一个线性层。
什么是好的激活函数?
- 必须有非线性,梯度容易传播,数值变化最好平滑,允许保留有价值的负值,计算成本合理
超参数:隐藏维度,模型深度(纵横比),词汇表大小
GLU 模型为什么是升维比例大约是 2.6,而不是 4?
因为 gated MLP 比传统 FFN 多一个矩阵。传统 FFN 有两个矩阵:
x → W_up → 激活 → W_down
GLU/SwiGLU 有三个矩阵:
┌→ W_gate → 激活 ─┐
x ───────────┤ ├→ 逐元素乘法 → W_down
└→ W_up ─────────┘
三个权重矩阵分别是:
$$
W_{\text{gate}}\in\mathbb R^{D\times M}
$$
$$
W_{\text{up}}\in\mathbb R^{D\times M}
$$
$$
W_{\text{down}}\in\mathbb R^{M\times D}
$$
总参数量:$DM+DM+MD=3DM$,为了让 gated MLP 和传统 (4D) FFN 的参数量大致相同,需要令:
$$
3DM\approx8D^2
$$
两边除以 (3D):
$$
M\approx\frac83D
$$
因此:
$$
\frac{d_{\text{ff}}}{d_{\text{model}}}\approx\frac83\approx2.67
$$
更准确地说,理论参数匹配值是:$2.666\ldots$
实际模型可能取:2.6 或其他接近的值。因为需要让维度满足硬件友好的倍数,例如 128、256 等。
系统层的原因会使我们使用宽架构(PP),表达能力的原因会使我们使用深架构(TP)。纵横比 $d_model/d_layer$ 大约是 100.

稳定性问题:
- softmax (指数运算和除法)
- attention
