Skip to content

约 5 分钟阅读

大模型推理优化 ​

把一个训练好的大模型搬上线、让很多人同时使用,和把它训练出来是两件目标不同的事。训练要把海量数据喂进去,让模型学会;推理要在延迟和成本的约束下,尽可能快、尽可能多地生成回答。同一个模型,换一种部署方式,速度可以差好几倍,一张显卡能服务的人数也可以差一个数量级。

这个系列从“模型怎样一个字一个字地写出回答”讲起,一直讲到推理引擎的源码、量化、投机解码、多卡与 P/D 分离部署,以及压测和生产运维。读完以后,你应该能看着一个推理服务回答三个问题:时间花在哪里,显存花在哪里,某项优化在改善哪一段、又付出了什么代价。

先读哪里 ​

不需要会写 CUDA,也不需要先学 Transformer。前五篇只要求你用过聊天助手,知道“模型”“显卡”大概是什么;公式出现时都会给出一组可以手算的数字。第 6 篇开始需要一点硬件常识,文中会从 GPU 的基本结构讲起。

系列的五个部分:从一次推理怎样发生,到瓶颈原理、引擎技术、压缩加速和规模化工程

全系列用同一个例子贯穿:公司内部的资料助手。员工小林问它“年假怎么申请?”,它读取制度、生成回答。一开始只有小林一个人用,后来上传了整本员工手册,再后来全公司同时在用,还要求能用语音提问。每一次规模变化,都会引出一类新的推理问题。

为了让数字可以手算,模型统一用 Llama-3.1-8B(约 80 亿参数,32 层,8 个 KV 头),硬件统一用一张 80 GB 显存的 NVIDIA H100 SXM。换成别的模型和显卡,公式不变,代入各自的配置即可。

五个部分 ​

第一部分:一次推理怎样发生。 先建立整套坐标系:模型怎样逐个生成 token,为什么要分成 Prefill 和 Decode 两个阶段,KV Cache 存了什么,显存花在哪里,以及用哪些指标衡量“快”。

文章回答的问题
01. 推理系统的分工模型、应用、推理引擎和 GPU 各做什么?推理优化在优化什么?
02. 自回归生成:Prefill 与 Decode回答为什么一个字一个字地出现?读题和答题为什么是两种计算?
03. KV Cache:用显存换计算算过的东西为什么要存?为什么只存 K 和 V?
04. 显存账本一张 80 GB 的卡,能同时服务多少个长对话?GQA 省在哪里?
05. 衡量快慢:TTFT、TPOT 与 Goodput“快”有几种?平均值为什么会骗人?

第二部分:瓶颈在哪里。 用 GPU 的算力和带宽解释第一部分里的现象,这是看懂后面所有优化的“透视镜”。

文章回答的问题
06. GPU 与 Roofline为什么花大价钱买的 GPU,生成文字时算力大部分在闲置?
07. 一个请求的全链路从收到 HTTP 请求到返回最后一个字,经过哪些环节?采样参数在哪里起作用?

第三部分:推理引擎的核心技术。 vLLM、SGLang 这类引擎靠哪些机制把同一张卡用得更满。最后读一个一千多行的最小引擎,把机制和代码对上。

文章回答的问题
08. PagedAttentionKV Cache 为什么会浪费大量显存?分页怎样解决?
09. 连续批处理与调度多人同时用时,谁先算?短请求结束后空位怎么补?显存不够时怎么办?
10. 前缀缓存与 RadixAttention大家都读同一份制度,算过的部分能不能共用?
11. 分块预填充一份很长的输入,为什么会让别人的回答卡住?
12. 注意力算子与 CUDA GraphFlashAttention 快在哪里?CPU 为什么也会拖慢 GPU?
13. 读一个最小推理引擎:nano-vllm上面这些机制,在代码里长什么样?

第四部分:压缩与加速。 换一个方向:让每一步要搬的数据更少,或者让一步推进更多 token。

文章回答的问题
14. 量化INT4、FP8、W4A16 分别压缩了什么?为什么文件小了不一定更快?
15. 投机解码先猜几个字再一起检查,为什么能加速,又在什么时候反而更慢?

第五部分:规模化与工程。 一张卡不够时怎样拆,怎样选引擎,怎样证明优化真的有效,以及怎样让服务长期稳定运行。

文章回答的问题
16. 分布式推理TP、PP、DP、EP 分别拆了什么?加一张卡为什么不一定更快?
17. P/D 分离读题和答题为什么要放到不同的机器上?KV 怎样交接?
18. vLLM 与 SGLang两个主流引擎怎样组织前面这些技术?怎样选型?
19. 语音与多模态推理从开口说话到听见回答,还要经过哪些推理环节?
20. 性能测试与分析怎样做一次有解释力的压测?怎样定位瓶颈?
21. 生产部署与运维上线需要哪些配套?怎样监控、扩容和升级?
22. 端侧推理在手机和笔记本上跑模型,约束有什么不同?

两种读法 ​

第一次接触推理,按顺序读第 1—7 篇,再挑第三部分中你关心的机制。这七篇读完,你已经能解释“为什么首字慢”“为什么人一多就卡”“为什么显存总是不够”。

已经部署过模型、想解决具体问题,可以按现象直接跳:首字慢看第 5、10、11 篇;人多就慢看第 9、16 篇;显存不够看第 4、8、14 篇;想证明某项优化有效看第 20 篇。

FP16、BF16、FP8 这些数值格式本身的原理,在独立的模型数值精度专题里从零讲起,第 14 篇只讲它们用在推理里的取舍。

接下来从第 1 篇:推理系统的分工开始,看看你在聊天窗口按下发送以后,应用、推理引擎、模型和 GPU 分别接手哪一部分工作。

别急,先让缓存热一下。