Skip to content

大模型训练、适配与推理 ​

本页聚焦大模型系统中特有的规模效应、并行训练、预训练目标、解码控制、参数高效适配和量化部署。

一、大模型系统的基本组成 ​

一个完整的 LLM 应用不只是一个神经网络,通常可以拆成几层:

层次主要职责常见问题
基础模型根据上下文生成或理解 token预训练目标、上下文长度、推理成本
适配与对齐让模型适应领域、任务和偏好SFT、LoRA、偏好优化、奖励设计
Agent 编排让模型规划、调用工具、反思和修正状态管理、工具可靠性、终止条件
外部知识提供模型参数中没有或需要实时更新的信息RAG、Embedding、向量索引、重排序
评测反馈判断输出是否正确、遵循指令并满足质量要求自动指标、LLM-as-a-Judge、人工校验

回答大模型系统问题时,最好分别说明:

  • 模型本身学到了什么;
  • 训练或微调改变了什么;
  • 推理时如何获得外部信息;
  • 评测如何判断结果是否有效。

这样可以避免把模型能力、检索能力、索引效率和评测指标混为一谈。

1.1 模型规模与涌现能力 ​

大模型的规模通常由参数量、训练数据量和训练计算量共同决定。随着规模扩大,语言建模损失等连续指标往往呈现较平滑的改善,但某些任务指标可能在达到一定规模后出现明显的跃升,这类现象通常被称为涌现能力(emergent abilities)。常见例子包括复杂指令遵循、少样本迁移、分步推理和更强的泛化表现。

“涌现”描述的是能力在观测指标上的非线性表现,不应简单理解为模型内部存在一个对所有任务都相同的临界参数量。能力是否突然出现,还会受到评测指标、提示模板、采样策略、任务难度和工具调用等因素影响;某些看似突变的现象,也可能来自离散的通过率指标或评测阈值。因此,讨论涌现能力时要同时说明规模条件和评测方法。

涌现能力的边界

涌现能力不是“参数越多就必然突然获得任意复杂能力”的保证。更稳妥的表述是:规模扩大可能使某些能力在特定任务和评测设置下跨过可观测阈值,但能力来源和是否存在严格临界点需要结合实验分析。

1.2 MHA、GQA、MQA 与 MLA ​

标准缩放点积注意力可以写成:

Attention(Q,K,V)=softmax(QKTdk)V

在自回归生成中,历史 token 的 K,V 会被后续每一步的新 Query 重复读取,因此需要保存为 KV Cache。不同注意力变体主要通过减少或压缩这部分历史信息来降低推理成本:

形式Query Head 数KV Head 数核心做法
MHAhh每个 Query Head 使用独立的 K/V Head
GQAhg,其中 1<g<h一组 Query Head 共享一个 K/V Head
MQAh1所有 Query Head 共享一组 K/V
MLA多头 Query不以 K/V Head 数为主要组织方式将 K/V 信息压缩到低维 latent,并缓存压缩表示

在每头维度和上下文长度相近时,GQA 的 KV Cache 相对 MHA 大致按 NKV/NQ 缩放。例如 32 个 Query Head 配 8 个 KV Head 时,K/V 缓存的主体约为 MHA 的四分之一。共享 K/V 只是改变数据复用方式,并不要求不同 Query 组串行执行;这些运算仍可组织成批量矩阵计算。

因此,GQA 是 MHA 与 MQA 之间的折中路线;MLA 则是另一种改造思路。MLA 与 GQA 的思路不同:GQA 是“少保存几组 K/V”,MLA 是“把 K/V 信息压缩后再保存”。在一些实现中,MLA 还会将内容相关表示与位置相关表示解耦,例如为位置部分保留独立的紧凑表示。MLA 的突出优势在于降低生成阶段的 KV Cache、显存和内存带宽压力,不应据此断言它在所有硬件和实现下训练速度都快于 MHA。MHA、GQA、MQA 与 MLA 的矩阵细节参见Attention 与 Transformer。

在绝对位置编码下,输入表示通常写成 xi=ei+pi,其中 ei 是 token 内容表示,pi 是位置表示。因此,只有交换 token、移动序列或改变 token 与位置的对应关系时,位置关系才会改变;对 ei 做加法或线性变换并不会改变 token 所处的索引位置。若变换作用在已经相加的整体 xi 上,则位置成分也会被一并变换,不能再套用“只改变内容表示”的结论。RoPE 的位置机制则直接作用于 Query 和 Key,详细对比参见Attention 与 Transformer。

1.3 FlashAttention 与序列并行 ​

FlashAttention:更高效地执行标准注意力 ​

FlashAttention 是标准 Softmax Attention 的 IO-aware 精确实现。它通过 tiling、在线 Softmax、融合 kernel 和片上 SRAM 分块计算,避免把完整的 L×L 注意力矩阵反复写入和读回显存,从而减少 HBM 与片上高速存储之间的数据搬运,通常降低显存峰值并提高实际吞吐。

FlashAttention v2 进一步改进了工作划分和 GPU 并行利用率,但核心性质没有改变:它计算的仍是标准注意力,而不是低秩近似或线性注意力。因此注意力配对的理论计算量仍约为:

O(L2d)

它主要优化的是显存访问、中间结果存储和 kernel 执行效率,不会自动把复杂度变成 O(L),也不等同于减少每个历史 token 的 KV Cache。后者通常要通过 GQA、MQA、MLA 或窗口注意力等结构处理。更完整的实现对比参见Attention 与 Transformer。

稀疏与近似注意力:改变注意力计算规模 ​

标准全注意力需要考虑长度为 L 的序列中大量位置对,核心计算通常含有 O(L2d) 项。Sparse Attention、Performer 和 Linformer 都试图减少这部分成本,但采用的机制不同:

方法主要机制复杂度趋势主要取舍
Sparse Attention只让每个 Query 访问局部、块状或其他预先设计的 Key 子集若每个位置只访问 s 个位置,约为 O(Lsd)稀疏模式设计不当时可能丢失远距离依赖
Performer用随机特征近似 Softmax 相似度,将注意力改写为可结合的线性计算在特征维度固定时可随 L 近似线性增长近似误差、特征维度和随机特征质量会影响效果
Linformer假设注意力矩阵具有低秩结构,并沿序列维度压缩 K,V设投影长度为 k≪L 时,约为 O(Lkd)低秩假设不成立或压缩过强时会损失信息

Sparse Attention 通过减少需要计算的位置对来降复杂度;Performer 通过核函数和随机特征近似改变计算顺序;Linformer 则直接压缩序列维度。这些方法通常以一定的结构假设或近似误差换取长序列效率,不能与 FlashAttention 的“精确计算、优化 IO”混为一谈。

RoPE 的角色又不同。RoPE 通过旋转 Query 和 Key 注入位置信息,使注意力内积感知相对位置,但它不限制可见位置,也不近似注意力矩阵,因此不会单独把 O(L2d) 降为更低的复杂度。它可以与稀疏注意力、近似注意力或 FlashAttention 组合使用。

Sequence Parallelism:沿序列维度分摊激活 ​

序列并行把长度为 L 的 token 序列切分到 p 张 GPU 上。对与序列长度线性相关的激活而言,理想情况下每张 GPU 只需保存约 L/p 的部分,因此单卡显存下降;但所有 GPU 合计保存的 token 数没有减少,不能把 GPU 数量增加 p 倍直接理解成总显存增加 p 倍。

序列并行的显存估算

若不做序列并行,某类激活显存可粗略写为:

Mact∝Ld

序列并行度为 p 后,单卡的序列相关部分约为:

Mper GPU≈1pMact

但 p 张 GPU 的合计约为:

p×1pMact≈Mact

因此并行度从 1 增加到 4 时,理想模型是单卡相关显存约降为四分之一,而总的序列相关显存基本不变。实际还要加上通信 buffer、临时 workspace、复制的参数或状态等开销。

序列并行的主要收益是降低单卡峰值、支持更长序列或更大的批量,而不是凭空减少整个计算问题的总工作量。FlashAttention 不显式保存完整注意力矩阵后,序列并行更容易在激活显存上获得这种分摊效果,但标准全注意力的核心计算仍然具有二次长度项。

1.4 Megatron-LM 与 MLP 张量并行 ​

Megatron-LM 是 NVIDIA 开源的大规模 Transformer 训练框架,核心目标是把一个无法由单张 GPU 高效容纳或计算的模型拆分到多张 GPU 及多个节点上。它通常组合使用数据并行、张量并行、流水线并行和序列/上下文并行:数据并行切分样本,张量并行切分单层中的矩阵或激活,流水线并行切分网络层。

以标准两层 MLP 为例:

H=ϕ(XW1+b1),Y=HW2+b2

设张量并行度为 p,第一层采用列并行,第二层采用行并行:

  • 列并行将 W1 按输出特征维切分为 [W1(1),…,W1(p)]。每张 GPU 计算自己的局部结果 Hi=ϕ(XW1(i)),其形状约为“token 数 ×dff/p”。各列对应的输出特征可以独立计算,因此第一层之后不必立即把所有局部结果聚集起来。
  • 行并行将 W2 按输入特征维切分为纵向分块。每张 GPU 用自己的 Hi 计算一个局部输出 Yi=HiW2(i),最后通过一次 All-Reduce 求和:Y=∑i=1pYi,恢复完整的隐藏维度输出。

这种“前层列并行、后层行并行”的排列会让中间隐藏维度的分片自然衔接:第一层产生的局部列正好是第二层需要的局部行输入,两个线性层之间不需要先 All-Gather 完整的 H。只需在第二层输出处聚合局部结果,就能得到后续残差连接或下一子层通常需要的完整隐藏表示。相比在两层之间反复聚集和重新切分,它减少了通信次数、同步点和中间激活搬运。

这里的“减少通信”不是完全没有通信。All-Reduce 仍然需要跨 GPU 交换数据,通信量还会受到 token 数、隐藏维度、并行度、互联带宽和实现方式影响;当张量并行跨越不同节点时,通信代价尤其需要关注。张量并行的收益是用可接受的集合通信换取单卡参数和矩阵计算规模下降。

列并行与行并行的矩阵形状

令 X∈RN×d,W1∈Rd×m,W2∈Rm×d,其中 m=dff。列并行时:

W1=[W1(1),…,W1(p)],W1(i)∈Rd×m/p

于是:

Hi=XW1(i)∈RN×m/p

行并行时:

W2=[W2(1)⋮W2(p)],W2(i)∈Rm/p×d

局部结果相加即可恢复:

Y=∑i=1pHiW2(i)

这正是“列切分产生局部中间特征、行切分汇总输出”的形状匹配关系。

二、LLM 预训练与自监督学习 ​

预训练是大模型获得通用语言能力的基础阶段。它通常使用海量文本,通过模型自身可以构造的预测目标学习语言规律,不要求人工为每条文本逐条提供类别标签。

这里的“无标注”更严格地说通常是“自监督”:监督信号来自原始文本本身,而不是人工额外标注。例如,原句中的 token 可以作为被遮盖位置或下一个位置的目标。

2.1 常见预训练目标 ​

目标输入与预测方式常见架构
Causal Language Modeling根据 x<t 预测下一个 token xtDecoder-only,如 GPT 类模型
Masked Language Modeling根据未遮盖上下文预测被遮盖的原 tokenEncoder-only,如原始 BERT
Denoising / Seq2Seq根据受损输入重建原文本或目标文本Encoder-Decoder,如 T5、BART

GPT 类自回归语言模型的联合概率分解为:

P(x1,…,xn)=∏t=1nP(xt∣x<t)

给定真实序列时,训练损失通常是 token-level 的负对数似然,也就是多分类交叉熵:

LCLM=−∑t=1nlog⁡P(xt∣x<t)

MLM 只在被选中的位置计算预测损失。若被遮盖的位置集合为 M,则可以写成:

LMLM=−∑i∈Mlog⁡P(xi∣x∉M)

其中 x∉M 表示未被遮盖的上下文。模型不是在学习一个人工定义的“语言类别”,而是在大量预测任务中逐渐学习词法、语法、语义、上下文依赖和部分世界知识。

自监督标签如何从文本产生

对一段文本:

text
原始文本:巴黎是法国的首都
MLM 输入:巴黎是法国的 [MASK]
MLM 目标:首都

或者在自回归训练中:

text
上下文:巴黎是法国的
目标:首都

目标 token 直接来自原始文本,因此不需要人工为每个样本编写标签。不同模型会使用不同的遮盖、移位或去噪方式,但共同点都是从数据自身构造训练信号。

2.2 预训练、SFT 与对齐 ​

预训练、监督微调和对齐阶段的训练数据及目标并不相同:

阶段典型数据主要目标
Pretraining海量原始文本,通常没有人工逐条标签学习语言统计规律、通用表示和生成能力
SFT指令、问题、回答或任务示例学习遵循任务格式和用户指令
Preference / Alignment偏好对、奖励模型或其他反馈信号调整回答风格、偏好和任务行为
Inference新的用户输入与外部上下文使用已学参数完成预测或生成

预训练得到的是通用能力,不等于模型已经可靠地遵循任意指令;SFT 和偏好对齐也不能替代事实验证、工具调用和检索系统。

需要区分 token embedding 和上下文表示:Embedding 层提供 token 的初始向量,Self-Attention 等后续层才根据上下文交互生成当前句子中的 contextual representation。相关数据流参见深度学习与神经网络基础。

预训练速记

预训练通常利用无人工标签文本进行自监督学习;GPT 类模型预测下一个 token,BERT 类模型预测被遮盖 token,T5/BART 类模型通过 Encoder-Decoder 完成去噪或文本到文本学习。

2.3 生成解码中的 Temperature ​

Temperature(温度)用于调整模型输出 logits 的尺度,通常在 Softmax 前进行缩放:

pi(T)=exp⁡(zi/T)∑jexp⁡(zj/T)

其中 zi 是第 i 个 token 的 logit,T>0 是温度。温度不是重新训练模型,也不会改变模型参数,只会在生成时改变概率分布的尖锐程度:

温度对 logits 的作用采样分布典型效果
T<1放大相对差异更尖锐更确定、更容易重复
T=1不改变尺度原始分布使用模型原始概率
T>1缩小相对差异更平滑更多随机性和多样性

对任意固定的 T>0,logit 的大小顺序不会改变,因此贪心解码选择的最大 logit token 通常不变;温度主要影响随机采样时各候选被选中的概率。T 趋近于 0 时分布趋向于选择最大 logit,T 很大时分布趋向于平坦,但工程实现通常不会真的用 T=0 去做除法,而是直接切换为贪心或近似贪心策略。

Temperature 常与 Top-k、Top-p、重复惩罚等解码策略组合使用。它控制的是“从候选中随机到什么程度”,不能弥补事实错误,也不能凭空增加模型的推理能力。

温度速记

Temperature 是对 logits 做缩放:低温度让分布更尖锐、更确定,高温度让分布更平滑、更随机;它只改变生成分布,不改变模型参数。

三、参数高效微调与量化 ​

3.1 LoRA 的基本思想 ​

全量微调需要更新基础模型的所有权重。LoRA(Low-Rank Adaptation)则冻结原始权重,只为目标线性层增加一个低秩更新:

W′=W+ΔWΔW=BA

设原矩阵:

W∈Rdout×din

LoRA 两个矩阵为:

A∈Rr×din,B∈Rdout×r

其中 r 是远小于输入输出维度的 rank。新增参数量为:

NLoRA=r(din+dout)

实际实现中常加入缩放系数:

W′=W+αrBA

α 控制适配分支的整体影响。常见初始化方式是让其中一个低秩矩阵初始化为零,使训练开始时 W′≈W,避免刚接入 adapter 就显著改变基础模型输出。

3.2 LoRA 训练和部署时发生什么? ​

LoRA 训练时通常:

  • 基础模型权重 W 保持冻结;
  • 只对 A、B 计算梯度并维护优化器状态;
  • 推理时使用 W+αrBA;
  • 在不需要独立切换 adapter 时,可以把低秩更新合并回基础权重。

训练或未合并 adapter 时,一个线性层可以写成:

y=Wx+αrB(Ax)

低秩矩阵的 rank 较小只能说明额外分支的计算量通常较低,并不意味着额外开销为零;仍可能增加矩阵乘法、中间激活、kernel launch 和显存读写。部署前可以先计算:

Wdeploy=W+αrBA

于是推理阶段直接执行:

y=Wdeployx

LoRA 分支被数学等价地吸收到原线性层中,通常不会引入额外的 LoRA 推理路径。代价是合并后的权重不再方便在同一请求中动态切换多个 adapter;需要多 adapter 热切换时,通常保留未合并形式或采用其他服务策略。

LoRA 的参数节省主要体现在可训练参数、梯度和优化器状态上。冻结基础模型并不会让所有 activation 消失,长序列训练仍然可能受激活显存限制。

常见目标模块包括 Attention 中的 WQ、WK、WV、WO,也可以扩展到 FFN 或其他线性层。目标模块越多、rank 越大,适配能力通常越强,但新增参数、显存和计算开销也随之增加。

方法基础模型权重可训练参数典型优点主要代价
全量微调更新全部模型参数适配自由度最大显存和存储成本高
LoRA冻结低秩矩阵参数少、adapter 易保存和切换rank 与目标层选择影响效果
QLoRA通常量化并冻结LoRA 及相关低精度适配参数进一步降低基础模型显存量化误差、实现和硬件约束更复杂
Prompt Tuning冻结输入端可学习的 soft prompt参数量很小、实现简单只在输入端注入任务信息,适配能力依赖提示长度和任务
Prefix Tuning冻结各层注意力使用的可学习 prefix 表示比输入端 prompt 更直接地影响各层参数和推理缓存开销通常高于 Prompt Tuning

3.3 LoRA 参数量的通用估算 ​

如果共有 L 层,在每层的 n 个线性矩阵上添加 LoRA,且它们的输入输出维度分别为 din 和 dout,则:

Ntotal=L×n×r(din+dout)

词表大小只有在 Embedding 或 LM Head 也作为适配目标时才进入 LoRA 参数量计算;如果只对 Attention 的 Q、V 等矩阵添加 LoRA,词表大小与该估算无关。

Q、V 目标矩阵的参数量示例

假设模型有 32 层,隐藏维度为 4096,只对每层的 WQ 和 WV 添加 rank r=64 的 LoRA。由于每个矩阵都是 4096×4096:

None=64(4096+4096)=524,288

每层有两个目标矩阵,因此:

Nlayer=2×524,288=1,048,576

总新增参数量为:

32×1,048,576=33,554,432≈33.6M

若基础模型约为 7B 参数,则 LoRA 参数占比约为:

33.6M7B×100%≈0.48%

LoRA 速记

LoRA 冻结基础权重,只训练低秩更新 ΔW=BA;新增参数量是 r(din+dout),总量还要乘目标层数和目标矩阵数量。

3.4 Prompt Tuning 与 Prefix Tuning ​

Prompt Tuning 和 Prefix Tuning 都属于参数高效微调(PEFT)。它们通常冻结基础模型,只增加少量连续、可学习的提示参数,而不是更新模型原有权重。这里的 prompt 不是必须由人直接写出的自然语言,而可以是训练得到的 soft prompt 向量。

Prompt Tuning 在输入 embedding 前后增加一段可学习向量。设 prompt 长度为 m、模型隐藏维度为 d,可以概念性地写成:

P∈Rm×d,H0=[P;E(x1);E(x2);…;E(xn)]

训练时只更新 P,基础模型参数保持冻结。它的参数量约为 md,但这些向量会占用额外的输入序列位置,因此会增加少量上下文计算和推理长度。

Prefix Tuning 不只在输入端添加向量,而是为 Transformer 的各层注意力提供可学习的 prefix,常见抽象形式是把每层的前缀 Key/Value 拼接到原来的 K/V 前面:

Kl′=[Klprefix;Kl],Vl′=[Vlprefix;Vl]

这样每一层都可以直接读取任务相关的前缀信息。与只修改输入表示的 Prompt Tuning 相比,Prefix Tuning 对网络内部的信息流干预更深,通常具有更强的适配能力,但需要保存各层 prefix,并可能增加注意力计算和 KV Cache 的长度。

方法可学习内容注入位置典型取舍
Prompt Tuning输入端的 soft prompt输入 embedding 附近参数少、结构简单,但作用路径较浅
Prefix Tuning各层注意力的 prefix 表示,常体现为额外 K/VTransformer 多层内部控制能力更强,但参数和缓存开销更高
LoRA目标线性层的低秩权重更新选定的线性层可合并部署,适配范围和 rank 有关

因此,三者的核心区别不是“是否冻结基础模型”,而是可学习参数注入到哪里:Prompt Tuning 注入输入,Prefix Tuning 注入各层注意力的上下文,LoRA 注入线性层权重更新。具体实现可能对 prefix 的参数化方式、层数和缓存策略做不同取舍。

3.5 SmoothQuant:把量化难度迁移到权重 ​

大模型做低比特量化时,激活值往往比权重更难量化:激活可能存在少量幅度很大的离群值,导致为了覆盖极端值而把 scale 设得过大,常见激活只能使用很少的整数刻度。SmoothQuant 的核心是利用线性层中的等价缩放,把一部分 activation 的动态范围压力迁移到 weight。

对一个线性层 Y=XW,设 S 是按输入通道构造的对角缩放矩阵,则可以写成:

Y=XW=(XS−1)(SW)

令:

X′=XS−1,W′=SW

在精确实数算术下,只要 S 可逆,变换前后的线性层结果严格相同。若第 j 个输入通道的缩放因子为 sj,则对应关系可以写成:

Xij′=Xijsj,Wjk′=sjWjk

也就是激活在某个通道上缩小多少,权重对应的输入通道行就放大多少。选择合适的每通道 scale 后,可以压低激活中的离群值,使 X′ 更容易进行 INT8 等低比特量化;相应的尺度变化被吸收到 W′ 中。权重通常比激活更容易采用逐通道量化,因此整体量化误差有机会降低。

scale 不能随意选择,实际需要在 activation 和 weight 的动态范围之间做权衡。一个常见的示意形式是:

sj∝(maxi|Xij|)α(maxk|Wjk|)1−α,0≤α≤1

α 控制量化难度向权重侧迁移的程度;实际实现还会结合校准数据、数值稳定项和具体量化粒度。这个等价变换不限于普通全连接层,Transformer 中的线性投影同样符合 XW 形式:

Q=XWQ,K=XWK,V=XWV

因此可以针对 Q/K/V 投影、输出投影以及 FFN 等线性层进行类似处理。卷积在适当展开后也可转化为矩阵乘法,但 SmoothQuant 在大模型中最常见的应用对象是这些 Transformer 线性层。

需要区分“代数等价”和“数值完全一致”:FP32、FP16 或 BF16 的缩放与乘法会产生舍入误差,而将 X′、W′ 量化为整数后还会产生量化误差。因此 SmoothQuant 追求的是在可接受误差下改善量化条件,而不是保证部署输出逐 bit 相同。

SmoothQuant 不是减少参数量的结构,也不是训练损失函数;它主要服务于量化部署或量化感知的校准流程。scale 的选择仍需结合校准数据、量化粒度、硬件算子和不同层的敏感性。若迁移过度,权重侧也可能出现新的离群值,因此不能把“迁移到权重”理解成误差必然消失。INT8、PTQ 与 QAT 的基础定义参见训练、优化与部署工程。

SmoothQuant 速记

SmoothQuant 通过等价变换 XW=(XS−1)(SW) 平滑激活分布,把部分量化难度迁移到更容易逐通道量化的权重侧;精确实数计算的线性层函数不变,但实际浮点和低比特计算会有舍入与量化误差。

使用 Markdown 与 VitePress 构建