笃行
首页
个人 & 心法
互联网/硬件后台
游戏基础架构
UE 引擎
游戏业务
AI / 大模型
数据结构与算法
机器学习数学
通用基础
GitHub
首页
个人 & 心法
互联网/硬件后台
游戏基础架构
UE 引擎
游戏业务
AI / 大模型
数据结构与算法
机器学习数学
通用基础
GitHub
  • AI / 大模型

    • AI / 大模型
    • 大模型核心原理
    • 推理与微调优化
    • RAG 检索增强生成
    • RAG 上下文剪枝实战(Listwise Pruning 复现)
    • RAG 数据清理
    • RAG 存量数据清理
    • Agent 开发
    • Agent 运行时深水区
    • Multi-Agent 协作
    • Agent 评测与线上运营
    • AI 与游戏研发周期
    • 互动影游与长视频创作 Agent
    • LLM 应用安全
    • LLM 评测方法论
    • LLM 成本与延迟
    • 微调策略
    • AI 研发工程化

推理与微调优化

Prefill/Decode · KV Cache · FlashAttention · PagedAttention/vLLM · 量化 · 投机解码 · MoE · LoRA/QLoRA · RLHF/DPO · 蒸馏

🧠 一句话记忆锚点

先量瓶颈再选招:Prefill 卡算力、Decode 卡显存带宽。KV Cache 降复杂度、FlashAttention 降访存、PagedAttention + Continuous Batching 提吞吐、量化 + 投机解码降延迟与成本。训练侧——能不训就 RAG/prompt,要训用 LoRA/QLoRA,对齐用 DPO 起步。

名词速查

首次阅读可跳过本表,直接看「场景问题」,遇到生词再回查。

本篇是推理服务这一组名词的归属页。这一组名词几乎全是后台工程师的老朋友换了层皮——缓存、连接复用、批处理、分页、压缩、预测执行,招式都认得,只是作用对象从请求换成了张量。

名词后台类比在系统里干什么类比失效边界
Prefill(预填充)批量导入——一次把整批数据推进去算完把整个输入 prompt 一次性并行过一遍模型,算出全部 K/V 并填进 cache,产出第一个 token。受算力(FLOPs)约束批量导入的耗时随行数线性增长;prefill 的 attention 部分是 O(n²),prompt 翻倍它涨四倍。所以"把上下文塞满"的代价远超直觉
Decode(解码)单条 SQL 循环查询——一次只出一行,逐行往下走逐 token 生成:每步只算 1 个新 token,复用已有 KV Cache。受显存带宽约束(算力大量闲置,卡在把权重从显存搬进计算单元)循环查询慢是因为 RTT 累积,加并发就能摊平;decode 慢是因为每生成一个 token 都要把整个模型权重读一遍,单条请求加机器毫无帮助——只能靠批处理把这次搬运摊给多个请求
KV Cache会话级缓存——把本次会话算过的中间结果存住,后续步骤直接复用存下已生成 token 的 K/V 张量,让 decode 每步只算新 token,把每步成本从 O(n²) 降到 O(n)Redis 缓存跨请求共享、有淘汰策略、miss 了重算一遍就行;KV Cache 三条全不成立:它每个请求独占、不能淘汰(丢了就得从头重算整个 prompt)、且随生成长度线性膨胀。它是显存里一块只增不减的账,这才是长上下文服务真正的成本墙——不是"加机器扩容"能解的
prefix cache(前缀缓存)CDN 边缘缓存公共资源——多个请求共享同一份已算好的开头多个请求共享同一段 system prompt / few-shot 前缀时,复用它们的 KV,跳过重复的 prefill,直接降 TTFTCDN 按 URL 精确命中;prefix cache 要求前缀 token 序列逐字节完全一致——system prompt 里插一个时间戳或用户名,命中率立刻归零。想吃到它,得把可变内容一律挪到 prompt 尾部
FlashAttention零拷贝 / 顺序 IO 优化——不减少计算量,只减少数据搬运分块计算 attention + online softmax,避免把 n×n 的注意力矩阵写回显存,省显存带宽也省显存占用零拷贝真的省了 CPU 拷贝动作;FlashAttention 一个 FLOP 都没省(甚至因重算略有增加),它只是把访存换成了计算。所以在带宽受限时提速明显,在算力已经打满时收益很小
PagedAttention / vLLM操作系统的虚拟内存分页——逻辑连续、物理离散,按页分配把 KV Cache 切成固定大小的块非连续存放,消灭"为最长可能长度预留连续显存"造成的碎片,显存利用率大幅提升OS 分页有换出到磁盘的兜底;PagedAttention 没有 swap,显存满了就是排队或抢占,不会优雅降级。且块大小是需要调的参数,不像页大小那样可以无脑用默认值
Continuous / In-flight Batching线程池不等凑满就派活——有空位立刻补新任务,而不是等整批做完一个请求生成完就立刻让位给队列里的新请求,不必等同批里最慢的那条,显著提升 GPU 利用率与吞吐线程池里各任务互不干扰;这里同批请求共享一次权重搬运,所以是相互补贴的关系——但也因此,混进一条超长请求会拉长整批的每步耗时,吞吐涨了单请求延迟可能反而变差
量化(INT8/INT4、GPTQ/AWQ)字段降精度存储——double 换 float、时间戳换秒级,用精度换容量把权重(有时也含激活、KV Cache)从 FP16 压到 8/4 bit,省显存、省带宽,从而提吞吐降成本字段降精度的误差是可算、可界定的;量化的精度损失分布不均——大部分任务几乎不掉点,但长文本推理、数学、代码这些对尾部概率敏感的任务可能明显退化。必须按业务任务实测回归,不能只看 perplexity
投机解码(Speculative Decoding)分支预测 / 预读——先赌一把,猜错了回滚重来小模型(draft)一次猜出若干 token,大模型一次并行验证,接受前缀、拒绝后重算。用闲置算力换延迟分支预测猜错只损失几个周期;这里猜错要丢弃整段并重新验证,接受率低时反而比不用更慢。且它的收益来自 decode 阶段算力闲置——批量已经打满算力时,加速几乎归零
MoE(混合专家)分库分表 + 路由层——总容量很大,每次请求只落到少数分片用路由把每个 token 只发给少数专家(如 8 选 2),总参数量做大而单次激活的计算量不变分库路由键是业务定的、分布可控;MoE 的路由是学出来的,天然容易倾斜到少数热门专家,需要额外的负载均衡损失去压。而且全部专家都得常驻显存——省的是算力,不是显存
张量并行 / 流水线并行分片(sharding)vs 多级流水——一个横切、一个纵切张量并行把单层权重切到多卡(每步都要 all-reduce 通信);流水线并行把不同层放到不同卡(引入气泡)业务分片后各分片能独立服务;张量并行的各卡每一层都要同步通信,一张卡慢全组都慢,必须同规格同机高速互联。跨机做张量并行通常得不偿失
GQA / MQA(分组 / 多查询注意力)多个读副本共用一份主库——把"每人一份"改成"一组共享一份"让多个 Q 头共享同一组 K/V 头,直接把 n_kv_heads 砍下来(MQA 砍到 1 组,GQA 砍到若干组),是省 KV Cache 显存最直接的一招读副本共享主库不改变数据内容,只影响一致性时延;这里共享 K/V 是改了模型结构——省显存的同时会损失一点表达能力,且不能对已训好的模型事后开启(要么训练时就这么设计,要么做一次转换再微调)。它是选型时的决策,不是上线后的开关
n_kv_heads分片数 / 副本数这类容量参数KV Cache 显存公式里的一个乘数因子:2 × layers × seq_len × n_kv_heads × head_dim × bytes ——它翻倍,KV 显存就翻倍分片数通常可以在线扩缩;这个值由模型架构在训练时定死,推理侧只能读不能改。要动它只能换模型或做架构转换
IO-aware(访存感知)顺序 IO 优化 / 减少磁盘往返——不减少要处理的数据量,只减少搬运次数描述一类优化的思路:算法在设计时就把"数据在存储层级间搬几次"当作首要成本(FlashAttention 即典型),而非只数 FLOPs磁盘 IO 优化省下的是真实时间且上限清楚(数据量 / 带宽);这里省的访存只在带宽受限时兑现成加速——算力已经打满时,同样的优化几乎零收益。它的收益取决于你卡在哪一侧
PEFT(参数高效微调)打补丁 / 挂插件——不重新编译整个程序,只加一个小模块一类只训练少量新增参数、冻结主干权重的微调方法(LoRA / QLoRA / Adapter 等),把微调 70B 的门槛从几百 GB 显存降到单卡可做打补丁改的是确定的代码路径,效果可预期;PEFT 冻结主干意味着能学的东西有上限——领域差距过大或要教全新能力时,低秩增量学不进去,此时只能全参微调。选型对比见 微调策略选型
NF4 / LLM.int8(量化数据格式)变长编码 / 按分布选码表——不是均匀截断,而是按数据实际分布分配精度具体的低比特权重格式:NF4 是 4bit 的"正态分布最优"编码(QLoRA 用它存主干),LLM.int8 是对异常值走 FP16、其余走 INT8 的混合方案变长编码是无损的,解压后原样还原;这两者都是有损的——NF4 假设权重近似正态分布,分布不符时误差变大;LLM.int8 近乎无损但要额外识别异常值,吞吐收益不如纯 INT8。别把"近乎无损"当"无损"
PPO(近端策略优化)带步长限制的灰度调参——每次只允许小幅偏离上一版,防止一步调崩RLHF 流程里做策略更新的那个强化学习算法:用奖励模型的打分更新模型,同时用 KL 惩罚拽住它别偏离原模型太远灰度调参调错了回滚即可,代价可控;PPO 训崩是渐进且不易察觉的——奖励分一路上涨而实际输出退化(reward hacking),且它要同时在显存里放策略/参考/奖励/价值四个模型,工程复杂度远超普通训练。这正是 DPO 取代它成为主流的原因,详见 微调策略选型
RAG(检索增强生成)查库再拼模板——先取数据,再组装成最终输出在本篇里只作为"该不该微调"的对照项出现:事实类、时效类需求优先走检索而不是训进权重完整链路(Chunking / 索引 / 混合检索 / Rerank)不在本篇展开,见 RAG 检索增强生成
detokenize反序列化——把内部 id 还原成对外的字符串把生成的 token id 序列拼回文本;流式输出时需处理"半个多字节字符"的边界普通反序列化拿到完整字节就能还原;流式 detokenize 会遇到一个汉字或 emoji 跨两个 token 的情况,逐 token 直接解码会吐出乱码——必须缓冲到字符边界完整再发出

同名异义:三个词在别的上下文里是另一个意思

这三个词跨上下文撞名,含义完全不同。混淆它们会直接推出错误结论,比如"把上下文窗口扩大就等于 Agent 记得更多"——不对,那是两个东西。

名词在推理服务(本篇)指在另一个上下文指去哪读另一侧
context注意力可见的 token 窗口:一次前向里模型能看到的 token 上限,受 O(n²) 算力与 KV Cache 显存双重约束。它是模型的物理能力上限Agent 运行时:本轮装配进 prompt 的记忆检索结果——是一次主动的取舍决策,决定"这轮让模型看到哪些信息"Agent 运行时深水区 · 名词速查
memoryGPU 显存:权重 + KV Cache + 激活占用的那块物理内存,是容量规划的硬约束Agent 运行时:分层记忆(短期窗口 / 工作记忆 / 长期向量库)——是一套读写策略,与物理内存无关Agent 运行时深水区 · 名词速查
cacheKV Cache / prefix cache:缓存的是中间张量,作用是省重复计算,不改变输出内容成本与延迟:语义缓存——缓存的是"相似问题的成品答案",命中就完全跳过模型调用,会改变输出(返回的是别人的答案)成本与延迟 · 名词速查

一句话记住:窗口是能力上限,装配是本轮选择;显存是物理资源,分层记忆是读写策略;张量缓存省算力,语义缓存省调用。

本篇引用的其他上下文名词

名词在本篇里的角色完整解释去哪读
Self-Attention / O(n²) / 采样策略本篇只讲流程与工程落点,公式与数学定义不在此展开大模型核心原理 · 名词速查
LoRA / QLoRA / SFT / RLHF / DPO / 蒸馏训练侧手段,本篇给推理视角的取舍微调策略选型 · 名词速查
TTFT / TPOT / token 经济本篇各优化手段对应的指标口径成本与延迟 · 名词速查

场景问题

一次生成到底慢在哪、贵在哪?

面试高频:"70B 模型部署,QPS 上不去、显存爆、首字慢,怎么优化?"——先把一次推理拆成两个性质完全不同的阶段:

阶段做什么瓶颈优化方向
Prefill(预填充)并行处理整个 prompt,算出 KV、吐出第 1 个 token算力(compute-bound)大 batch、FlashAttention、张量并行
Decode(解码)自回归逐个吐 token,每步只算 1 个新 token显存带宽(memory-bound)KV Cache、量化、投机解码、Continuous Batching

关键洞察:Decode 阶段每生成一个 token 都要把整个模型权重从显存搬一遍,算得少、搬得多,所以是带宽瓶颈——这解释了为什么"量化权重"能直接提速(搬的数据变少了)。

实现方案

一次 generate() 的端到端流程

上面两阶段是优化视角的切分。这里补一条完整主线:从调用 generate() 到流式吐完最后一个 token,中间到底经过了哪些步骤、每步产生哪个可观测指标。面试里"讲一下 LLM 推理流程"问的就是这条线。

本节边界

本节只讲流程与工程落点。Self-Attention 的计算公式(softmax(QKᵀ/√d)V)、位置编码、各种采样策略的数学定义(temperature / top-k / top-p 怎么算)归 大模型核心原理,本节不重复推导,只标注它们在流程中的位置。

逐步说清每步在做什么、卡在哪、产生什么指标:

步做什么对应指标常见卡点
① Tokenize文本按 BPE/BBPE 切成 token id。注意这一步不是按字符或词切的——中文一个字常占 1~2 token,代码里的缩进和符号很吃 token计入 TTFT(占比极小)计价按 token 而非字符,估算成本时用字符数换算会明显偏差;特殊符号/emoji 可能爆 token
② Embedding 查表token id 查嵌入矩阵得向量,叠加位置信息(绝对编码相加 / RoPE 在注意力内旋转)计入 TTFT极少成为瓶颈
③ Prefix Cache 命中判定检查本次请求的前缀是否与已缓存的 KV 前缀逐 token 相同,命中部分直接复用 KV,跳过重算直接决定 TTFT:命中 90% 前缀 ≈ prefill 只做 10% 的活命中条件是逐 token 前缀完全相同——system prompt 里塞了时间戳/用户名,或做了一次上下文压缩,缓存立刻失配(这正是 Agent 压缩的隐藏成本)。把变动内容放前面 = 永不命中
④ Prefill未命中部分并行过全部 layer,算出每层每个 token 的 K/V 写入 KV Cache,最后一个位置产出首个 logitsTTFT 的主体(算力瓶颈)prompt 越长越慢,且是超线性(注意力 O(n²));长 prompt 是 TTFT 高的第一嫌疑
⑤ 输出层 → logits末层隐状态乘 lm_head 得到 vocab 维打分向量计入每步耗时词表大时(十万量级)这一步的矩阵乘不可忽略
⑥ 采样按 temperature / top-k / top-p 从 logits 采出一个 token(公式见 核心原理)计入 TPOT(占比小)同一模型输出风格由这一步决定;温度设错比换模型影响更大。结构化输出的约束解码也挂在这一步
⑦ 停止条件三个来源:采到 EOS / 达到 max_tokens / 命中 stop 序列—max_tokens 截断会产生语法不完整的 JSON,这是结构化输出最常见的失败原因,而它看起来像"模型不听话"
⑧ Decode 一步只把新 token 过一遍网络,Q 与 KV Cache 里全部历史 K/V 做注意力,新 K/V 追加进 cacheTPOT(显存带宽瓶颈)每步都要把整个模型权重从显存搬一遍——所以量化能直接提速;KV Cache 随输出长度线性增长,长输出会吃爆显存
⑨ Detokenizetoken id 拼回文本—流式场景的真陷阱:一个 UTF-8 汉字可能横跨两个 token,逐 token 直接解码会吐出乱码,必须缓冲到能构成完整字符再吐

三条把流程与指标接起来的结论:

  1. TTFT ≈ tokenize + embedding + prefill,主体是 prefill,而 prefill 的量由「prompt 长度 − prefix cache 命中长度」决定。所以降 TTFT 的两个杠杆是缩短 prompt 和提高缓存命中率,而不是换更快的卡。
  2. TPOT ≈ 单次 decode 步耗时,受显存带宽约束,与输出长度无关(每步都差不多)。总生成时长 ≈ TTFT + 输出 token 数 × TPOT——所以让模型少说话是降端到端延迟最直接的手段。
  3. 吞吐由 batch 决定,与单请求延迟是矛盾的:Continuous Batching 把不同请求的 decode 步拼进同一批,吞吐上去了但单请求的 TPOT 会略微变差。这个权衡见下文与 成本与延迟。

KV Cache:Decode 提速的基石

自回归每步都要对"之前所有 token"做注意力。若每步都重算全部 K/V,是 O(n²) 的重复劳动。KV Cache 把已算过的 K、V 缓存下来,每步只算新 token 的 Q 和它的 K/V,追加进 cache——把每步复杂度从 O(n²) 降到 O(n)。

代价是显存。KV Cache 大小估算:

KV_bytes ≈ 2 (K和V) × layers × seq_len × n_kv_heads × head_dim × bytes_per_elem × batch

例:LLaMA-13B, 40 层, head_dim=128, n_kv_heads=40, fp16(2B), seq=2048, batch=1
  ≈ 2 × 40 × 2048 × 40 × 128 × 2 ≈ 3.4 GB   ← 仅一条序列的 KV!

所以长上下文 + 大 batch 时,KV Cache 常比模型权重还吃显存。省 KV 的招:GQA/MQA(多个 Q 头共享一组 K/V 头,直接砍 n_kv_heads)、KV Cache 量化(存 int8/int4)、PagedAttention(消除碎片)。

FlashAttention:省显存、不改结果

朴素注意力要显式生成 n×n 的分数矩阵并写回显存(HBM),n 大时既慢又爆显存。FlashAttention 是 IO-aware 的:分块(tiling)把 Q/K/V 搬进 SRAM,用 online softmax 增量计算,从不落地完整的 n×n 矩阵。

  • 结果数学上完全等价(不是近似),只是省了 HBM 读写。
  • 省的是显存和访存,FLOPs 不变——但因为访存是瓶颈,实测大幅提速。

PagedAttention / vLLM:像操作系统管内存一样管 KV

问题:传统实现给每个请求预分配"最大长度"的连续 KV 显存 → 内部碎片 + 无法共享,利用率常不足 40%。

PagedAttention(vLLM)借鉴 OS 虚拟内存分页:KV 切成固定大小的 block,非连续存放、按需分配,逻辑连续、物理分散。收益:

  • 显存碎片几乎消除,吞吐提升数倍;
  • 相同前缀(system prompt、few-shot)的 KV 可跨请求共享(prefix caching)。

Continuous Batching:吞吐的另一半

静态 batching 要等一批里最慢的序列结束才能收下一批 → GPU 空转。Continuous / In-flight Batching:谁生成完 EOS 就立刻替换成排队中的新请求,迭代级动态拼批,GPU 始终打满。vLLM / TGI / TensorRT-LLM 的核心吞吐来源。

打个比方:Continuous Batching + PagedAttention 就像拼车 + 分页停车场——一趟车凑几个顺路的乘客(迭代级动态拼批,谁下车立刻上新客,GPU 不空转),车里每个人的行李(KV Cache)不再各占一格连续车厢,而是按小块随手塞进分页格位,逻辑连续、物理分散、几乎不留死角。投机解码再加一位小助手:便宜小模型先猜 k 个 token,大模型只干"验草稿"一次并行核验,猜中白赚、猜错回退。类比失效边界:拼车省钱的前提是"路线相似"——一旦请求的上下文长度极端不均(少数几万 token、多数几百),长请求会拖住短请求,收益被 padding 和等待吃掉;投机解码只对"分布容易猜准"的 prompt 有加速,冷门 prompt 里小模型猜不中,反而多做了一次核验、比原生 decode 还慢。

量化:用精度换显存和带宽

把权重(有时含激活、KV)从 fp16 降到 int8/int4,搬得少 → decode 更快,占得少 → 单卡塞更大模型。

方案量化对象特点
INT8 (LLM.int8)权重近乎无损,通用
GPTQ权重(4bit)训练后量化,逐层校准,精度好、社区广
AWQ权重(4bit)保护"重要权重"通道,推理快、精度稳
KV Cache 量化KV(int8/int4)直接砍长上下文显存,注意精度回退

权重量化通常安全;激活量化更难(动态范围大、离群值)。

投机解码(Speculative Decoding):小模型探路,大模型验收

Decode 是带宽瓶颈,大模型每步只吐 1 token 很浪费带宽。用一个小 draft 模型一次猜 k 个 token,大模型一次并行 verify 这 k 个——猜中就白赚,猜错回退。结果分布与只用大模型完全一致(无损加速),实测 2~3x。变体:Medusa(多头自投机)、EAGLE。

下图:draft 小模型飞快连吐 5 个候选,大模型一次并行核验——前 3 个命中(转绿、白赚),第 4 个失配(变红)→ 从失配处回退,后面作废重猜。

draft 小模型(快)连猜:thecatsatonsky↓ 大模型一次并行 verify ↓核验结果: the ✓cat ✓sat ✓on ✗作废命中 3 个 = 一次前向白赚 3 步;第 4 个失配 → 回退到此处,由大模型给出正确 token 后重新起猜。

MoE:稀疏激活,参数多但每次只用一部分

Mixture-of-Experts:把 FFN 换成 N 个专家 + 一个路由器,每个 token 只激活 top-k(如 8 选 2)个专家。总参数量巨大,单次推理算力却只用一小部分——用显存换算力效率。挑战:路由负载均衡、专家显存占用、通信开销。代表:Mixtral、DeepSeek-MoE。

训练/微调侧:LoRA / QLoRA / RLHF / DPO / 蒸馏

PEFT(参数高效微调):全参微调 70B 要几百 GB 显存、成本高。LoRA 冻结主干权重 W,只训练一个低秩增量:

h = W·x + (B·A)·x        # A: [r, d]  B: [d, r],秩 r 远小于 d(如 r=8/16)
                          # 只训练 A、B(占原参数 <1%),推理时可合并回 W

「秩 r」是什么:一张表里"真正独立的列有几列"。这里的意思是——微调要改的那份权重增量,虽然形状是 d × d 的大方阵,但它含的独立信息其实很少,所以能用两个瘦矩阵相乘来代替。完整解释与失效边界见 微调策略选型 · 名词速查。

代一遍数字:取 d = 4096、r = 8,则原矩阵 4096 × 4096 ≈ 1678 万参数,而 LoRA 两个瘦矩阵是 2 × 8 × 4096 ≈ 6.6 万 —— 只有 0.39%。

所以工程上意味着什么:要存的不再是一份完整权重,而是几十 MB 的 adapter。一个底座可以挂几十个任务的 adapter 并按需加载,这才是 PEFT 真正改变的事——省的不只是训练显存,更是"每个任务一份全量权重"的存储与部署成本。

  • QLoRA:主干权重 4bit 量化(NF4)存储 + LoRA 微调,单张 24G/48G 卡就能微调 65B。
  • 对齐:RLHF(训练奖励模型 + PPO 强化学习,效果强但流程复杂、易训崩)vs DPO(直接用偏好对做分类式优化,免奖励模型、免 RL,更稳更省,成主流)。
  • 蒸馏:用大模型(teacher)的输出/logits 训练小模型(student),把能力压进小模型降本。

为什么这么做

"何时选哪种优化"决策指引

  • 首字延迟(TTFT)高 → 优化 Prefill:FlashAttention、张量并行、prefix caching 复用 system prompt 的 KV。
  • 吞吐(QPS/throughput)低 → Continuous Batching + PagedAttention,把 GPU 填满。
  • 单卡放不下 / 长上下文爆显存 → 权重量化(AWQ/GPTQ)+ GQA + KV Cache 量化。
  • 端到端延迟敏感(如实时对话) → 投机解码(无损)+ 低比特量化。
  • 要定制风格/格式/领域能力 → LoRA/QLoRA(而非从头训);要加事实知识优先 RAG。
  • 要对齐人类偏好 → DPO 起步,数据/资源充足且追求上限再上 RLHF。

为什么别的选择不行

微调路线对比

方案显存/成本适合不适合
全参微调 (SFT)最高(数百 GB)有充足算力、要最大化效果中小团队、快速迭代
LoRA低(原参数 <1% 可训)多任务、快速试验、可插拔需要改动底层表征的极端场景
QLoRA最低(单卡微调 65B)显存受限、个人/小团队对量化误差极敏感的任务
Prompt/RAG(不训)几乎为零加知识、时效性内容、频繁变动需改变模型固有行为/风格

结论:能不训就不训(RAG/prompt);要训优先 PEFT;全参微调是"最后一档"。

常见坑与反直觉

  • "量化一定掉点":权重 int8/4bit 通常近乎无损,但激活/KV 量化和极端 4bit在数学/代码任务上可能明显回退——要按任务评测,别只看 PPL。
  • "投机解码是近似加速":错,它是无损的(verify 保证输出分布一致),只有速度收益。
  • "batch 越大越好":Prefill 是算力瓶颈,batch 大到打满算力后收益消失;Decode 受带宽和 KV 显存约束,batch 大到 KV 爆显存反而 OOM。
  • "KV Cache 越长越好":KV 显存随 seq_len 线性涨,长上下文时它才是显存主要占用,不是权重。
  • "MoE = 免费的大模型":算力省,但显存要装下所有专家,且路由/通信复杂。

沉淀结论

心法总结

推理优化 = 认清 Prefill(算力) / Decode(带宽) 两阶段 → KV Cache 降复杂度、FlashAttention 降访存、PagedAttention+Continuous Batching 提吞吐、量化+投机解码降延迟与成本。训练优化 = 能不训就 RAG/prompt,要训就 PEFT(LoRA/QLoRA),对齐用 DPO 起步。 每一招都对应一个明确瓶颈——先量瓶颈,再选招。

面试常见问题清单(按主题分类)

两阶段与瓶颈

  • Q:讲一下 LLM 的推理流程。 A:九步一条线——① tokenize(BPE 切 token,中文一字常占 1~2 token)② embedding 查表 + 位置信息 ③ prefix cache 命中判定(逐 token 前缀完全相同才命中)④ prefill 未命中部分,并行过全层写 KV Cache ⑤ 输出层得 logits ⑥ 采样(temperature/top-k/top-p)⑦ 停止判定(EOS / max_tokens / stop 序列)⑧ decode 一步,只算新 token、KV Cache 追加一格,回到 ⑤ ⑨ detokenize + 流式回传。指标挂法:TTFT ≈ ①②③④(主体是 prefill),TPOT = 单次 ⑧ 的耗时,总时长 ≈ TTFT + 输出 token 数 × TPOT。
  • Q:一次推理慢在哪、贵在哪? A:拆两阶段——Prefill 并行处理 prompt、算力瓶颈;Decode 自回归逐 token、显存带宽瓶颈(每步要把整个模型权重搬一遍)。
  • Q:怎么降 TTFT? A:两个杠杆——缩短 prompt、提高 prefix cache 命中率,而不是换更快的卡。注意命中条件是逐 token 前缀完全相同:system prompt 里放时间戳/用户名,或做过一次上下文压缩,缓存立刻失配。
  • Q:为什么量化能直接提速? A:Decode 是带宽瓶颈,权重从 fp16 降到 int8/4bit,搬的数据变少,decode 更快、单卡还能塞更大模型。

KV Cache 与显存

  • Q:KV Cache 解决什么、代价是什么? A:缓存已算的 K/V,每步只算新 token,复杂度 O(n²)→O(n);代价是显存,长上下文/大 batch 时常比权重还吃显存。
  • Q:怎么省 KV 显存? A:GQA/MQA(多 Q 头共享一组 KV 头)、KV Cache 量化(int8/int4)、PagedAttention 消碎片。

吞吐与延迟

  • Q:FlashAttention 是近似吗? A:不是,数学上完全等价;它是 IO-aware 分块 + online softmax,不落地 n×n 矩阵,省的是访存。
  • Q:PagedAttention / Continuous Batching 各解决什么? A:前者像 OS 分页管 KV、消碎片 + 前缀共享;后者迭代级动态拼批、谁完谁换,GPU 始终打满。
  • Q:投机解码是近似加速吗? A:不是,无损——大模型 verify 保证输出分布一致,只有速度收益(2~3x)。

训练与微调

  • Q:LoRA / QLoRA / 全参微调怎么选? A:能不训就 RAG/prompt;要训优先 LoRA(只训 <1% 参数);显存紧张用 QLoRA(4bit 主干,单卡微调 65B);全参是最后一档。
  • Q:RLHF 与 DPO 区别? A:RLHF 需奖励模型 + PPO,效果强但复杂易训崩;DPO 直接用偏好对做分类式优化,免奖励模型免 RL,更稳更省,成主流。
  • Q:MoE = 免费的大模型吗? A:否,算力省(每 token 只激活 top-k 专家),但显存要装下所有专家,且路由/通信复杂。

延伸阅读:大模型核心原理 · RAG 检索增强生成 · Agent 开发

记忆口诀

  • 两阶段:Prefill 卡算力 / Decode 卡带宽 / 先量瓶颈再选招
  • 省显存:KV Cache 降复杂度 / GQA-MQA 砍 KV 头 / 量化搬得少
  • 提吞吐:PagedAttention 消碎片 / Continuous Batching 动态拼批 / prefix 共享
  • 降延迟:投机解码无损 2~3x / 低比特量化 / FlashAttention 省访存
  • 训练侧:能不训就 RAG-prompt / 要训用 LoRA-QLoRA / 对齐 DPO 起步

内容来源

综合整理:FlashAttention(Dao 2022)、vLLM/PagedAttention 论文、GPTQ/AWQ/QLoRA/LoRA 论文、Speculative Decoding(Leviathan 2023)、DPO 论文、vLLM/TensorRT-LLM/Hugging Face 官方文档(2026-07;领域更新极快,请以最新论文与官方文档为准)。

自测:合上资料能说清楚吗?

  1. 一次推理为什么要拆成 Prefill 和 Decode 两个阶段?各自的瓶颈是什么?
参考答案

Prefill 并行处理整个 prompt、算 KV,瓶颈是算力;Decode 自回归逐 token,每步要把整个模型权重从显存搬一遍,瓶颈是显存带宽。这解释了量化为何直接提速。

  1. KV Cache 解决了什么问题?它的代价是什么,怎么省?
参考答案

缓存已算的 K/V,每步只算新 token,复杂度 O(n²)→O(n);代价是显存(长上下文/大 batch 常比权重还吃显存)。省法:GQA/MQA、KV 量化、PagedAttention 消碎片。

  1. 对比 FlashAttention 与投机解码:它们分别优化什么?都是"近似"加速吗?
参考答案

都无损(数学等价)。FlashAttention 是 IO-aware 分块 + online softmax,不落地 n×n 矩阵,省访存;投机解码用小模型猜 k 个 token、大模型并行 verify,省带宽、提 2~3x 速度。

  1. 对比 RLHF 与 DPO:为什么 DPO 逐渐成主流?
参考答案

RLHF 需奖励模型 + PPO 强化学习,效果强但流程复杂、易训崩;DPO 直接用偏好对做分类式优化,免奖励模型、免 RL,更稳更省,故成主流;追求上限再上 RLHF。

  1. "MoE 是免费的大模型" 这句话错在哪?
参考答案

错。MoE 每 token 只激活 top-k 专家,省的是算力;但显存必须装下所有专家,且路由负载均衡与通信开销都是挑战——省算力不省显存。

最近更新: 2026/9/10 11:38
Prev
大模型核心原理
Next
RAG 检索增强生成