Appearance
大模型训练、适配与推理
本页聚焦大模型系统中特有的规模效应、并行训练、预训练目标、解码控制、参数高效适配和量化部署。
一、大模型系统的基本组成
一个完整的 LLM 应用不只是一个神经网络,通常可以拆成几层:
| 层次 | 主要职责 | 常见问题 |
|---|---|---|
| 基础模型 | 根据上下文生成或理解 token | 预训练目标、上下文长度、推理成本 |
| 适配与对齐 | 让模型适应领域、任务和偏好 | SFT、LoRA、偏好优化、奖励设计 |
| Agent 编排 | 让模型规划、调用工具、反思和修正 | 状态管理、工具可靠性、终止条件 |
| 外部知识 | 提供模型参数中没有或需要实时更新的信息 | RAG、Embedding、向量索引、重排序 |
| 评测反馈 | 判断输出是否正确、遵循指令并满足质量要求 | 自动指标、LLM-as-a-Judge、人工校验 |
回答大模型系统问题时,最好分别说明:
- 模型本身学到了什么;
- 训练或微调改变了什么;
- 推理时如何获得外部信息;
- 评测如何判断结果是否有效。
这样可以避免把模型能力、检索能力、索引效率和评测指标混为一谈。
1.1 模型规模与涌现能力
大模型的规模通常由参数量、训练数据量和训练计算量共同决定。随着规模扩大,语言建模损失等连续指标往往呈现较平滑的改善,但某些任务指标可能在达到一定规模后出现明显的跃升,这类现象通常被称为涌现能力(emergent abilities)。常见例子包括复杂指令遵循、少样本迁移、分步推理和更强的泛化表现。
“涌现”描述的是能力在观测指标上的非线性表现,不应简单理解为模型内部存在一个对所有任务都相同的临界参数量。能力是否突然出现,还会受到评测指标、提示模板、采样策略、任务难度和工具调用等因素影响;某些看似突变的现象,也可能来自离散的通过率指标或评测阈值。因此,讨论涌现能力时要同时说明规模条件和评测方法。
涌现能力的边界
涌现能力不是“参数越多就必然突然获得任意复杂能力”的保证。更稳妥的表述是:规模扩大可能使某些能力在特定任务和评测设置下跨过可观测阈值,但能力来源和是否存在严格临界点需要结合实验分析。
1.2 MHA、GQA、MQA 与 MLA
标准缩放点积注意力可以写成:
在自回归生成中,历史 token 的
| 形式 | Query Head 数 | KV Head 数 | 核心做法 |
|---|---|---|---|
| MHA | 每个 Query Head 使用独立的 K/V Head | ||
| GQA | 一组 Query Head 共享一个 K/V Head | ||
| MQA | 所有 Query Head 共享一组 K/V | ||
| MLA | 多头 Query | 不以 K/V Head 数为主要组织方式 | 将 K/V 信息压缩到低维 latent,并缓存压缩表示 |
在每头维度和上下文长度相近时,GQA 的 KV Cache 相对 MHA 大致按
因此,GQA 是 MHA 与 MQA 之间的折中路线;MLA 则是另一种改造思路。MLA 与 GQA 的思路不同:GQA 是“少保存几组 K/V”,MLA 是“把 K/V 信息压缩后再保存”。在一些实现中,MLA 还会将内容相关表示与位置相关表示解耦,例如为位置部分保留独立的紧凑表示。MLA 的突出优势在于降低生成阶段的 KV Cache、显存和内存带宽压力,不应据此断言它在所有硬件和实现下训练速度都快于 MHA。MHA、GQA、MQA 与 MLA 的矩阵细节参见Attention 与 Transformer。
在绝对位置编码下,输入表示通常写成
1.3 FlashAttention 与序列并行
FlashAttention:更高效地执行标准注意力
FlashAttention 是标准 Softmax Attention 的 IO-aware 精确实现。它通过 tiling、在线 Softmax、融合 kernel 和片上 SRAM 分块计算,避免把完整的
FlashAttention v2 进一步改进了工作划分和 GPU 并行利用率,但核心性质没有改变:它计算的仍是标准注意力,而不是低秩近似或线性注意力。因此注意力配对的理论计算量仍约为:
它主要优化的是显存访问、中间结果存储和 kernel 执行效率,不会自动把复杂度变成
稀疏与近似注意力:改变注意力计算规模
标准全注意力需要考虑长度为
| 方法 | 主要机制 | 复杂度趋势 | 主要取舍 |
|---|---|---|---|
| Sparse Attention | 只让每个 Query 访问局部、块状或其他预先设计的 Key 子集 | 若每个位置只访问 | 稀疏模式设计不当时可能丢失远距离依赖 |
| Performer | 用随机特征近似 Softmax 相似度,将注意力改写为可结合的线性计算 | 在特征维度固定时可随 | 近似误差、特征维度和随机特征质量会影响效果 |
| Linformer | 假设注意力矩阵具有低秩结构,并沿序列维度压缩 | 设投影长度为 | 低秩假设不成立或压缩过强时会损失信息 |
Sparse Attention 通过减少需要计算的位置对来降复杂度;Performer 通过核函数和随机特征近似改变计算顺序;Linformer 则直接压缩序列维度。这些方法通常以一定的结构假设或近似误差换取长序列效率,不能与 FlashAttention 的“精确计算、优化 IO”混为一谈。
RoPE 的角色又不同。RoPE 通过旋转 Query 和 Key 注入位置信息,使注意力内积感知相对位置,但它不限制可见位置,也不近似注意力矩阵,因此不会单独把
Sequence Parallelism:沿序列维度分摊激活
序列并行把长度为
序列并行的显存估算
若不做序列并行,某类激活显存可粗略写为:
序列并行度为
但
因此并行度从
序列并行的主要收益是降低单卡峰值、支持更长序列或更大的批量,而不是凭空减少整个计算问题的总工作量。FlashAttention 不显式保存完整注意力矩阵后,序列并行更容易在激活显存上获得这种分摊效果,但标准全注意力的核心计算仍然具有二次长度项。
1.4 Megatron-LM 与 MLP 张量并行
Megatron-LM 是 NVIDIA 开源的大规模 Transformer 训练框架,核心目标是把一个无法由单张 GPU 高效容纳或计算的模型拆分到多张 GPU 及多个节点上。它通常组合使用数据并行、张量并行、流水线并行和序列/上下文并行:数据并行切分样本,张量并行切分单层中的矩阵或激活,流水线并行切分网络层。
以标准两层 MLP 为例:
设张量并行度为
- 列并行将
按输出特征维切分为 。每张 GPU 计算自己的局部结果 ,其形状约为“token 数 ”。各列对应的输出特征可以独立计算,因此第一层之后不必立即把所有局部结果聚集起来。 - 行并行将
按输入特征维切分为纵向分块。每张 GPU 用自己的 计算一个局部输出 ,最后通过一次 All-Reduce 求和: ,恢复完整的隐藏维度输出。
这种“前层列并行、后层行并行”的排列会让中间隐藏维度的分片自然衔接:第一层产生的局部列正好是第二层需要的局部行输入,两个线性层之间不需要先 All-Gather 完整的
这里的“减少通信”不是完全没有通信。All-Reduce 仍然需要跨 GPU 交换数据,通信量还会受到 token 数、隐藏维度、并行度、互联带宽和实现方式影响;当张量并行跨越不同节点时,通信代价尤其需要关注。张量并行的收益是用可接受的集合通信换取单卡参数和矩阵计算规模下降。
列并行与行并行的矩阵形状
令
于是:
行并行时:
局部结果相加即可恢复:
这正是“列切分产生局部中间特征、行切分汇总输出”的形状匹配关系。
二、LLM 预训练与自监督学习
预训练是大模型获得通用语言能力的基础阶段。它通常使用海量文本,通过模型自身可以构造的预测目标学习语言规律,不要求人工为每条文本逐条提供类别标签。
这里的“无标注”更严格地说通常是“自监督”:监督信号来自原始文本本身,而不是人工额外标注。例如,原句中的 token 可以作为被遮盖位置或下一个位置的目标。
2.1 常见预训练目标
| 目标 | 输入与预测方式 | 常见架构 |
|---|---|---|
| Causal Language Modeling | 根据 | Decoder-only,如 GPT 类模型 |
| Masked Language Modeling | 根据未遮盖上下文预测被遮盖的原 token | Encoder-only,如原始 BERT |
| Denoising / Seq2Seq | 根据受损输入重建原文本或目标文本 | Encoder-Decoder,如 T5、BART |
GPT 类自回归语言模型的联合概率分解为:
给定真实序列时,训练损失通常是 token-level 的负对数似然,也就是多分类交叉熵:
MLM 只在被选中的位置计算预测损失。若被遮盖的位置集合为
其中
自监督标签如何从文本产生
对一段文本:
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 前进行缩放:
其中
| 温度 | 对 logits 的作用 | 采样分布 | 典型效果 |
|---|---|---|---|
| 放大相对差异 | 更尖锐 | 更确定、更容易重复 | |
| 不改变尺度 | 原始分布 | 使用模型原始概率 | |
| 缩小相对差异 | 更平滑 | 更多随机性和多样性 |
对任意固定的
Temperature 常与 Top-k、Top-p、重复惩罚等解码策略组合使用。它控制的是“从候选中随机到什么程度”,不能弥补事实错误,也不能凭空增加模型的推理能力。
温度速记
Temperature 是对 logits 做缩放:低温度让分布更尖锐、更确定,高温度让分布更平滑、更随机;它只改变生成分布,不改变模型参数。
三、参数高效微调与量化
3.1 LoRA 的基本思想
全量微调需要更新基础模型的所有权重。LoRA(Low-Rank Adaptation)则冻结原始权重,只为目标线性层增加一个低秩更新:
设原矩阵:
LoRA 两个矩阵为:
其中
实际实现中常加入缩放系数:
3.2 LoRA 训练和部署时发生什么?
LoRA 训练时通常:
- 基础模型权重
保持冻结; - 只对
、 计算梯度并维护优化器状态; - 推理时使用
; - 在不需要独立切换 adapter 时,可以把低秩更新合并回基础权重。
训练或未合并 adapter 时,一个线性层可以写成:
低秩矩阵的 rank 较小只能说明额外分支的计算量通常较低,并不意味着额外开销为零;仍可能增加矩阵乘法、中间激活、kernel launch 和显存读写。部署前可以先计算:
于是推理阶段直接执行:
LoRA 分支被数学等价地吸收到原线性层中,通常不会引入额外的 LoRA 推理路径。代价是合并后的权重不再方便在同一请求中动态切换多个 adapter;需要多 adapter 热切换时,通常保留未合并形式或采用其他服务策略。
LoRA 的参数节省主要体现在可训练参数、梯度和优化器状态上。冻结基础模型并不会让所有 activation 消失,长序列训练仍然可能受激活显存限制。
常见目标模块包括 Attention 中的
| 方法 | 基础模型权重 | 可训练参数 | 典型优点 | 主要代价 |
|---|---|---|---|---|
| 全量微调 | 更新 | 全部模型参数 | 适配自由度最大 | 显存和存储成本高 |
| LoRA | 冻结 | 低秩矩阵 | 参数少、adapter 易保存和切换 | rank 与目标层选择影响效果 |
| QLoRA | 通常量化并冻结 | LoRA 及相关低精度适配参数 | 进一步降低基础模型显存 | 量化误差、实现和硬件约束更复杂 |
| Prompt Tuning | 冻结 | 输入端可学习的 soft prompt | 参数量很小、实现简单 | 只在输入端注入任务信息,适配能力依赖提示长度和任务 |
| Prefix Tuning | 冻结 | 各层注意力使用的可学习 prefix 表示 | 比输入端 prompt 更直接地影响各层 | 参数和推理缓存开销通常高于 Prompt Tuning |
3.3 LoRA 参数量的通用估算
如果共有
词表大小只有在 Embedding 或 LM Head 也作为适配目标时才进入 LoRA 参数量计算;如果只对 Attention 的 Q、V 等矩阵添加 LoRA,词表大小与该估算无关。
Q、V 目标矩阵的参数量示例
假设模型有
每层有两个目标矩阵,因此:
总新增参数量为:
若基础模型约为
LoRA 速记
LoRA 冻结基础权重,只训练低秩更新
3.4 Prompt Tuning 与 Prefix Tuning
Prompt Tuning 和 Prefix Tuning 都属于参数高效微调(PEFT)。它们通常冻结基础模型,只增加少量连续、可学习的提示参数,而不是更新模型原有权重。这里的 prompt 不是必须由人直接写出的自然语言,而可以是训练得到的 soft prompt 向量。
Prompt Tuning 在输入 embedding 前后增加一段可学习向量。设 prompt 长度为
训练时只更新
Prefix Tuning 不只在输入端添加向量,而是为 Transformer 的各层注意力提供可学习的 prefix,常见抽象形式是把每层的前缀 Key/Value 拼接到原来的 K/V 前面:
这样每一层都可以直接读取任务相关的前缀信息。与只修改输入表示的 Prompt Tuning 相比,Prefix Tuning 对网络内部的信息流干预更深,通常具有更强的适配能力,但需要保存各层 prefix,并可能增加注意力计算和 KV Cache 的长度。
| 方法 | 可学习内容 | 注入位置 | 典型取舍 |
|---|---|---|---|
| Prompt Tuning | 输入端的 soft prompt | 输入 embedding 附近 | 参数少、结构简单,但作用路径较浅 |
| Prefix Tuning | 各层注意力的 prefix 表示,常体现为额外 K/V | Transformer 多层内部 | 控制能力更强,但参数和缓存开销更高 |
| LoRA | 目标线性层的低秩权重更新 | 选定的线性层 | 可合并部署,适配范围和 rank 有关 |
因此,三者的核心区别不是“是否冻结基础模型”,而是可学习参数注入到哪里:Prompt Tuning 注入输入,Prefix Tuning 注入各层注意力的上下文,LoRA 注入线性层权重更新。具体实现可能对 prefix 的参数化方式、层数和缓存策略做不同取舍。
3.5 SmoothQuant:把量化难度迁移到权重
大模型做低比特量化时,激活值往往比权重更难量化:激活可能存在少量幅度很大的离群值,导致为了覆盖极端值而把 scale 设得过大,常见激活只能使用很少的整数刻度。SmoothQuant 的核心是利用线性层中的等价缩放,把一部分 activation 的动态范围压力迁移到 weight。
对一个线性层
令:
在精确实数算术下,只要
也就是激活在某个通道上缩小多少,权重对应的输入通道行就放大多少。选择合适的每通道 scale 后,可以压低激活中的离群值,使
scale 不能随意选择,实际需要在 activation 和 weight 的动态范围之间做权衡。一个常见的示意形式是:
因此可以针对 Q/K/V 投影、输出投影以及 FFN 等线性层进行类似处理。卷积在适当展开后也可转化为矩阵乘法,但 SmoothQuant 在大模型中最常见的应用对象是这些 Transformer 线性层。
需要区分“代数等价”和“数值完全一致”:FP32、FP16 或 BF16 的缩放与乘法会产生舍入误差,而将
SmoothQuant 不是减少参数量的结构,也不是训练损失函数;它主要服务于量化部署或量化感知的校准流程。scale 的选择仍需结合校准数据、量化粒度、硬件算子和不同层的敏感性。若迁移过度,权重侧也可能出现新的离群值,因此不能把“迁移到权重”理解成误差必然消失。INT8、PTQ 与 QAT 的基础定义参见训练、优化与部署工程。
SmoothQuant 速记
SmoothQuant 通过等价变换