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 主要有两个作用:

  1. 需要在 HBM 中存储这些数据
  2. 这些数据必须传输到加速器上

如何减少训练时的显存占用?

rematerialization, Key idea: 对于前向传播,只保留一部分层的激活值,反向传播在遇到最近的checkpoint的时候把缺失的层激活值再算出来。

Lecture3 - Architecture

diagram

残差链接是必要的,在层数很高的模型中,如果不能把 $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%。

image

RoPE(rotary position embeddings), 相对位置函数:

$$ \frac{\frac{x,i}, \frac{y,i}} = g(x,y,i-j) $$

image

门控,在 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.

image

稳定性问题:

  • softmax (指数运算和除法)
  • attention image