1
自回归语言模型和掩码语言模型
在自监督学习中,标签是从输入数据中推断出来的。 在无监督学习中,根本不需要标签。
2
Transformer

缩放定律
在固定计算预算(FLOPs)下,能够实现最佳性能的模型被称为计算最优。 Chinchilla论文发现,对于计算最优的训练,训练标记的数量应大约为模型大小的 20 倍。
后训练
预训练、监督微调 SFT、偏好微调之RLHF
采样
温度: logits除以温度T,然后计算softmax top-k:仅对前k个logits计算softmax top-p:按降序对下一个词的概率求和,在总和到达p时停止
3
困惑度
给定一个具有真实分布P的数据集,其困惑度为:
- 检测数据污染:若模型在基准数据上的困惑度较低,则该基准可能已包含在模型的训练数据中。
- 训练数据的去重:仅当新数据的困惑度较高时,才将其加入当前训练数据集。
- 检测异常文本:不可预测的文本,如表达不寻常想法的文本(如“我的狗在空闲时间教量子物理”)或胡言乱语(如“家猫去眼睛”),困惑度最高。
6
上下文构建的两种模式:RAG (Retrieval-Augmented Generation) 和 Agents
RAG
基础的 RAG
基于嵌入的 RAG
Retriever 的评估指标:
- 精度:在所有检索到的文档中,与查询有关的百分比是多少?
- 召回:在所有与查询有关的文档中,检索到的百分比是多少?
为文本块添加简短上下文
利用表格数据增强上下文的RAG
扩展:ANN 算法
向量搜索通常使用 ANN(Approximate Nearest Neighbor,近似最近邻) HNSW 和 IVF_PQ 较受欢迎
LSH
Locality Sensitive Hashing,局部敏感哈希 基于哈希的索引
用哈希函数族(多个哈希函数)将数据点映射到桶中
哈希函数族的例子
- 比如可以随机生成一些向量,计算数据点与这些向量的点积,点积为正映射到1、点积为负映射到0。假设生成了5个向量,数据点可以映射到形如11010的桶中。
- 比如应用于集合S的MinHash,整个集合是一个数据点,每个哈希函数是对所有可能元素(如 词表)作一次随机排列,然后对随机排列从左往右看哪个元素(如 单词)先出现在集合S(如 文档)中,这个元素在随机排列中的位置作为集合S的一个MinHash值,多个哈希函数就对应集合S的多个MinHash值。有了表示集合S的多个MinHash值,就可以用 Jaccard系数
计算集合A和B的相似度。
IVF
InVerted File index,倒排索引 基于聚类的索引
构建倒排索引: 在向量空间聚类出一些簇,对每个簇建立倒排索引(即记录簇中数据点的IDs)
搜索:
- 选择与查询点最接近的几个簇作为最近邻的候选集
- 计算查询点q与候选集中每个点的距离,选择topK
PQ
Product Quantization, 乘积量化 基于聚类的索引
将高维向量空间划分为m个低维子空间,每个子空间聚类出k个簇,k个簇中心构成该子空间的码本。将每个子向量变为最接近的簇中心在码本中的索引,这样高维向量变为了多码本的多个索引。
子码本大小为k,总码本(隐式)大小为
IVF_PQ
先用 IVF 将向量分配到不同的桶中,在每个桶内应用 PQ
ANNOY
Approximate Nearest Neighbors Oh Yeah 基于树的索引
构建二叉树森林,对每棵树:
- 随机选择两个点a和b,沿着与这两个点等距离的超平面分割空间(不需要实际计算超平面)
- 对每个点,若更接近a就分到左子树、更接近b就分到右子树
- 对每个子树做递归,直到包含的点数少于阈值K

搜索:
- 在每棵树中,根据查询点q与各层a、b的距离选择子树(若距离差别较小可以左右子树都选)
- 找到的叶节点合并成最近邻的候选集
- 计算查询点q与候选集中每个点的距离,选择topK
HNSW
Hierarchial Navigable Small Worlds,分层可导航小世界 基于图的索引
多层图,其中节点表示向量,边连接相似向量
节点密度随层数升高呈指数衰减,越高层连接的节点越远,类似于跳表
以概率 l是 0-based,p为提升概率。意思是前l次提升成功,第l+1次提升失败,停在第l层。
代理
代理是指任何能够感知其环境并基于该环境采取行动的实体。
Planner生成计划、Evaluator验证计划、Executor执行计划
ReAct的模式:Thought、Act、Observation
内在知识、长期记忆和短期记忆
7 微调
自回归模型使用前文作为上下文来预测下一个词。 掩码模型使用前后文来填充空白,也成为填充微调。
监督微调需要数据:(输入,输出)对。 偏好微调需要数据:(指令,获胜响应,失败响应)三元组。
微调是为了形式,RAG是为了事实。
训练所需内存 = 模型权重 + 激活值 + 梯度 + 优化器状态 在反向传播过程中,每个可训练参数需要1个梯度值、0-2个优化器状态值,取决有优化器:
- SGD优化器,没有状态值
- 动量优化器,1个状态值
- Adam优化器,2个状态值
注:TF32只有19位
量化
PTQ(训练后量化)
低精度推理已成为标准。用高精度格式进行训练以最大化模型性能,然后在推理时降低其精度。
QAT(量化感知训练)
低精度训练通常采用混合精度进行。
注:AMP(自动混合精度)
- 前向传播前将高精度权重(全部或部分)转为低精度副本
- 低精度副本参与前向传播和反向传播计算
- 为了防止低精度计算时的梯度下溢,对梯度进行算前放大和算后缩小
- 更新高精度权重
PEFT
通常分为两类:
- 基于适配器的方法向模型权重添加额外模块,也叫加法方法。
- 基于软提示的方法将输入标记与特殊的可训练标记(软提示标记)一起输入模型。软提示类似于嵌入向量,不是人类可读的,可通过反向传播进行训练。
Adapter层

软提示

LoRA
LoRA也算一种基于适配器的方法
LoRA 最常应用于注意力模块中的四个权重矩阵:查询
为什么LoRA有效?
许多论文认为,尽管LLMs拥有众多参数,但其内在维度却非常低;他们指出,预训练隐式地最小化了模型的内在维度。令人惊讶的是,更大的模型在预训练后往往具有更低的内在维度。这表明预训练充当了下游任务的压缩框架。换言之,LLM训练得越好,使用少量可训练参数和少量数据微调模型就越容易。
QRoLA
原始的LoRA论文中,微调期间模型的权重使用16位存储。 QLoRA将模型的权重以4位存储,但在计算前向和反向传播时将其反量化(转换)回BF16。QLoRA采用的4位格式是NF4(NormalFloat-4),它基于预训练权重通常遵循中位数为零的正态分布这一洞察进行量化。在4位量化基础上,QLoRA还使用分页优化器在GPU内存不足时自动在CPU和GPU之间传输数据。
模型合并

- 集成只结合模型输出,同时保持每个组成模型的完整性
- 模型合并将组成模型的参数混合在一起
模型合并是实现联邦学习的一种方式,其中多个设备使用各自的数据训练同一模型。例如,如果你将模型X部署到多个设备上,每个X的副本都可以继续从设备上的数据中独立学习。一段时间后,你将拥有多个X的副本,每个都在不同的数据上进行了训练。你可以将这些副本合并成一个新的基础模型,该模型包含了所有组成模型的学习成果。
*模型合并的三种主要方法:求和、层堆叠、拼接
求和
如果两个模型中的参数处于不同尺度,比如一个模型的参数值远大于另一个,可以在求和之前对模型进行重新缩放,使它们的参数值处于相同范围内。
线性组合
线性组合对于在同一基础模型上微调的模型最为有效。在这种情况下,线性组合可以通过任务向量的概念来理解。其核心思想是,一旦你为特定任务微调了一个模型,从中减去基础模型应该会得到一个捕捉任务本质的向量。任务向量也称为增量参数。如果你使用LoRA进行微调,可以从LoRA权重中构建任务向量。任务向量使我们能够进行任务算术,例如通过添加两个任务向量来结合任务能力,或通过减去一个任务向量来减少特定能力。
球面线性插值 (SLERP, Spherical Linear intERPolation)
将每个待合并的向量想象为球面上的一个点。要合并两个向量,沿着球面绘制这两点之间的最短路径,它们的合并向量就是最短路径上的一个点。该点具体在哪个位置,取决于插值因子(0到1之间)。若合并超过两个向量,可不断两两合并。
修剪冗余的任务特定参数
在微调过程中,许多模型的参数会被调整。然而,这些调整大多是微小的,对模型在任务上的表现没有显著贡献。 这些冗余调整虽然对单一模型无害,但对合并后的模型可能有害。可以在最小性能损失的情况下修剪大部分任务向量参数。需要合并的模型越多,修剪就越重要,因为在一个任务中冗余参数干扰其他任务的机会也越多。
图:保留前20%任务向量参数与保留100%性能相当
层堆叠
从一个或多个模型中提取不同的层并将它们堆叠在一起,通常需要进一步微调。
拼接
将组成模型的参数拼接起来。合并后组件的参数数量,是所有组成组件参数数量的总和。
8 数据集工程
*数据的质量 vs. 多样性
全量微调有望提供最佳性能,但需要比 PEFT 方法(如 LoRA)数量级地多的数据。如果你有数万到数百万条(指令、响应)对,可以尝试全量微调。如果你只有几百到几千个例子,PEFT 可能效果最好。
简而言之,如果你的数据量较小,可以考虑在更先进的模型上使用 PEFT 方法。如果你的数据量较大,则可以在较小的模型上使用完全微调。
在投资构建大规模数据集之前,你可以先从一个小而精的数据集(例如,50-100个例子)开始,看看微调是否能改进模型。如果这个小数据集足以达到你期望的性能,那就很好。明显的改进表明更多的数据将进一步提高性能。如果小数据集没有改进,更大的数据集通常也很难起到作用。
额外训练样本的收益递减
可以先用较低质量或不太相关的数据微调模型,以减少所需的高质量数据的数量。
- 自监督 → 监督 您想对模型进行微调以回答法律问题。您的(问题,答案)数据集较小,但您有很多法律文件。您可以首先以自监督的方式对模型进行微调,然后进一步在(问题,答案)对上对模型进行微调。
- 无关数据 → relevant data 您想对模型进行微调以分类产品评论的情感,但您只有少量的产品情感数据,却有大量推文情感数据。您可以首先将模型微调以分类推文情感,然后进一步微调以分类产品情感。
- 合成数据 → 实数据 您想从医疗报告中预测医疗状况。由于这项任务的敏感性,您的数据是有限的。您可以首先使用 AI 模型合成大量数据来微调您的模型,然后再在实际数据上进一步微调。
9 推理优化
计算强度(FLOP/byte)较低的区域是memory bandwidth bound,较高的区域是compute bound

- 屋顶线表示性能的理论上限。
- 两条横线可能代表不同计算模式(精度、计算单元、优化方式)的性能上限。
推理包含两个步骤:预填充(处理输入标记)和解码(生成输出标记)。
预填充阶段并行处理输入标记,是计算受限。解码阶段一次生成一个标记,是内存宽带受限。

两种推理API:在线和批量。在线API优化延迟,批量API优化成本(提高吞吐量)。
延迟:
- TTFT (Time To First Token),受预填充阶段影响
- TPOT (Time Per Output Token),受解码阶段影响
由于延迟是一个分布,查看平均值可能会误导人,查看百分位数更有帮助。通常,你应该关注的百分位数是 p90、p95 和 p99。
推理服务的吞吐量是为所有用户和请求每秒生成的token数
推理优化:模型级别
模型压缩
有三种方法:量化、蒸馏、剪枝
剪枝
在神经网络的上下文中,剪枝有两种含义。一种是移除神经网络中的整个节点,这意味着改变其架构并减少其参数数量。另一种是找到对预测最不重要的参数,并将这些参数设为零。在这种情况下,剪枝不会减少总参数数量,只会减少非零参数的数量。这使得模型更加稀疏,既减少了模型的存储空间,也加快了计算速度。
剪枝后的模型可以直接使用,也可以进一步微调以恢复由剪枝引起的性能下降。
实践中,剪枝较少应用。
克服自回归解码瓶颈
推测解码(Speculative Decoding)
使用一个更快但相对较弱的草稿模型生成一系列标记,然后由目标模型并行验证这些标记。如果草稿标记是下个标记的概率大于某个阈值,就接受该标记。

- 并行验证一系列标记所需的时间少于顺序生成它们的时间。
- 在输出标记序列中,有些标记比其他标记更容易预测。有可能找到一个较弱的草稿模型,能够正确预测这些更容易预测的标记,从而导致草稿标记的高接受率。
- 解码受内存带宽限制,这意味着通常会有闲置的 FLOPs 可以免费用于验证。
并行解码(Parallel Decoding)
不仅预测下一个位置,还为后面几个位置各预测几个选项,从这些选项中选择最有前途的序列

优化注意力机制
使用 KV缓存

KV 缓存仅在推理时使用,不在训练时使用。在训练时,因为序列中的所有令牌事先已知,所以可以一次性计算下一个令牌的生成,而无需像推理时那样顺序进行。因此,不需要 KV 缓存。
优化注意力机制的方法可以分为三类:重新设计注意力机制、优化KV缓存、为注意力计算编写内核
重新设计注意力机制
- 交错使用局部注意力和和全局注意力。局部注意力:在生成新token时只关注附近固定大小窗口内的token
- 跨层注意力:在相邻几层共享键值对
- 组查询注意力:将查询头分组,组内共享键值对
优化KV缓存
- 如 vLLM中的 PagedAttention
为注意力计算编写内核
- 如 FlashAttention,将 transformer 中常用的多个操作融合在一起
内核是针对特定硬件加速器(如 GPU 或 TPU)进行优化的专用代码。编写内核通常是为了执行那些需要重复执行(通常是并行执行)的计算密集型例程,以最大化这些加速器的性能。常见的 AI 操作,包括矩阵乘法、注意力计算和卷积操作,都有专门的内核,可以在不同硬件上更高效地计算。
推理优化:服务级别
大多数服务级别优化技术侧重于资源管理。给定固定数量的资源(计算和内存)和动态工作负载(来自用户的推理请求,这些请求可能涉及不同的模型),目标是高效地将资源分配给这些工作负载,以优化延迟和成本。
批处理
静态批处理
将固定数量的输入一起分组到一个批次中
动态批处理
为每个批次设置了一个超时时间。如果批次大小为4且超时时间为100毫秒,服务器将在有4次请求或100毫秒超时发生时处理该批次。
连续批处理
在简单批处理实现中,要等批次中的请求全部完成后再一起返回。
连续批处理,允许批次中的请求完成后立即返回,并将另一个请求放入批次中。

解耦预填充和解码
预填充是计算密集型,解码是内存宽带密集型
提示缓存(Prompt Caching)
也叫上下文缓存、前缀缓存。 可缓存的,比如:
- system prompt、many-shot prompt
- 多个查询涉及的同一个文档
- 多轮对话的历史消息

并行化
适用于所有模型的并行化策略
- DP(Data Parallelism, 数据并行):将样本数据分成多个部分,每个设备拥有完整的模型、处理一部分数据
- MP(Model Parallelism, 模型并行):将模型分成多个部分,每个设备计算一部分模型权重
模型并行,拆分模型的方法:
-
TP(Tensor Parallelism, 张量并行):将模型中的单个张量(如,权重矩阵)分割成多个块,将这些块分配给不同的设备。主要解决模型中单个层过大的问题。
矩阵乘法的张量并行 -
PP(Pipeline Parallelism, 流水线并行):将模型在深度方向上分成多个阶段,将每个阶段(连续的层组)分配给不同的设备。将一个批次的数据分成多个 micro-batch,每个 micro-batch 依次通过各个阶段,形成一个流水线。主要解决模型层数过多的问题。

-
MoE架构中的EP(Expert Parallelism,专家并行)
适用于LLMs长输入序列的并行化策略
- CP(Context Parallelism, 上下文并行):将输入序列本身分成多段,分配给不同的设备。如,序列的前半段在机器1处理,后半段在机器2处理。
- SP(Sequence Parallelism, 序列并行):将应用于整个输入序列的操作,分配给不同的设备。如,注意力计算在机器1处理,前向传播计算在机器2处理。
10
1. AI应用的最简架构
2. + 上下文构建
3. + 输入输出护栏
4. + 路由,多模型时为查询选择模型
路由通常发生在检索之前,路由-检索-生成-评分是常见的模式。
模型网关:为不同模型提供统一的接口
5. + 模型网关
6. + 缓存
7. 将响应加入上下文构建
8. 执行响应的写操作
参考
- 《AI Engineering: Building Applications with Foundation Models》, Chip Huyen