AI Infra、GPU 与大模型工程笔记

LLM 评估

0. 主题与结论预告 评测要回答的问题很朴素:在模型已经固定的情况下,它到底“好不好”? 不存在唯一正确的评测;必须先明确你想测量什么,再选择或设计评测。 不要只盯着汇总分数;要回到具体样本与模型预测,理解失败模式。 评测维度不止能力,还包括安全、成本、以及与真实使用场景的贴合度。 必须把“游戏规则”讲清楚:评的是方法,还是模型/系统(含提示词、工具、RAG、脚手架等)。 1. 分数与“氛围感” 1.1 基准分数 图:DeepSeek-R1 基准成绩 引用:DeepSeek-R1 论文(PDF)https://arxiv.org/pdf/2501.12948.pdf ...

阅读更多

LLM 推理(Inference)性能推导

1. 先把推理过程拆开:Prefill vs Decode 同一个模型,在推理时其实有两个阶段: Prefill(预填充):把 prompt 一次性喂进去,算出每层的隐藏状态,同时把 K/V 写入 KV Cache。这个阶段对 prompt 的 token 可并行,形态更像训练,通常更接近 compute-bound。 Decode(生成/解码):自回归逐 token 生成。每一步只处理 “当前 1 个 token”,需要读取(并更新)已有的 KV Cache。这个阶段通常 memory-bound,决定了 tokens/s。 2. 符号约定 2.1 变量的定义 为了方便推导,定义变量: B:batch size(并发请求数) S:上下文长度(pr...

阅读更多

Scaling Laws:从幂律到 Chinchilla(以及训练配方)

旧方法:在大模型上直接调参(极度昂贵且缓慢)。 新方法(Scaling Laws):在小模型上调参,总结规律,然后外推(extrapolate)到大模型。 1. Scaling law 是什么:为什么 log-log 上是一条直线? 幂律(Power law)的核心形式: \[\text{Loss} \approx A \cdot x^{-\alpha} + \text{(常数/下界)}\] 为简洁起见,本文把测试集上的 loss / error(如 test loss、generalization error)统称为 “Loss/误差”,不区分具体任务指标的常数差异。 在双对数坐标系中: \[\log(\text{Loss}) \approx -\alpha \log(x...

阅读更多

大模型并行的数学推导

1. 并行要解决的两个问题 把模型从一张卡搬到八张卡上,显存会变成原来的八分之一,训练也会快八倍吗?实际跑起来,往往两件事都没有这么简单:参数已经分片,激活仍可能 OOM;显存够用了,又可能有大量时间在等通信。 先把训练显存分成三部分:参数、梯度和优化器状态组成的模型状态;为反向传播保留的激活;以及当前算子、通信和内存分配所需的临时空间。ZeRO 主要减少第一部分,TP、SP、CP 和重计算还会改变第二部分。能否放下模型,要把三部分放在一起看。 放得下之后,问题才变成吞吐:每张卡分到多少计算,需要搬多少数据,这些通信能否与计算重叠。下面先算显存,再算通信,最后把两者放回 batch 和网络拓扑中讨论。推导以训练为主,推理中的 KV cache 不放进这套激活账本。 2. 统一符...

阅读更多

Megatron Float16Module 的参数传法

Megatron 的 Float16Module 只会把位置参数转换成半精度(bf16/fp16)。一旦只用关键字参数,输入会保持原 dtype,导致前向混用 fp32/bf16。 1 相关代码 代码位置:megatron/core/transformer/module.py#L404 https://github.com/NVIDIA/Megatron-LM/blob/main/megatron/core/transformer/module.py#L404 def forward(self, *inputs, fp32_output=True, **kwargs): if parallel_state.is_pipeline_first_stage(i...

阅读更多

ApexRMSNorm vs TENorm:bf16 大 weight 精度坑

bf16 下使用 ApexRMSNorm,一旦 weight/gamma/scale 放大,输出标准差看似稳定,但均值会随机机漂移;换成 Transformer Engine 的 TENorm 就恢复稳定。 1 RMSNorm RMSNorm 只做均方根归一化,不减均值、也没有 beta 偏置: \[y = \frac{x}{\sqrt{\frac{1}{d} \sum_{i=1}^{d} x_i^2 + \epsilon}} \odot \gamma\] d 为 hidden size,γ 逐通道缩放,通常初始化为 1。 由于不减均值,输出是否“居零”高度依赖舍入误差;γ 越大,误差越容易被放大。 2 现象 在 bf16 下把 γ 放大(例如 >3.5,或...

阅读更多

TP 下的激活显存公式

1 每层激活显存的估算式 \[\text{Activations memory per layer} = s b h \left( 10 + \frac{24}{t} + 5 \frac{a s}{h t} \right)\] 这个式子描述了 单层 Transformer 激活显存 与多种变量之间的关系:序列长度 $s$、micro-batch 大小 $b$、隐藏维度 $h$、注意力头数 $a$,以及张量并行度 $t$。展开后,前两项随 $sbh$ 增长,Attention Map 项随 $bas^2$ 增长;只有分到多张 GPU 的部分会对 $t$ 产生反比关系。 1.1 变量说明 符号 含义 ...

阅读更多

ZeRO 究竟算数据并行还是模型并行?

Zero(ZeRO, Zero Redundancy Optimizer)总被问:它究竟是数据并行(DP)的技巧,还是模型并行(MP)的变体? 本文把 ZeRO 放回数据并行的语境,解释它如何削减显存冗余、为何仍维持 DP 语义,以及和真正模型并行的根本区别。 1 数据并行的痛点:冗余状态 传统 DP 在每张卡上复制 完整模型: 参数、梯度、优化器状态都各存一份; Backward 结束后 All-Reduce 梯度,保持副本一致。 随着模型变大,显存中堆着 N 份(N=GPU 数)相同状态,浪费巨大。ZeRO 的目标就是保持 DP 训练语义不变,却让这些状态不再 N 份复制。 2 ZeRO 的核心:分区状态而非拆计算 ZeRO 把模型状态切成片,平均分到不同 ...

阅读更多