Skip to content

约 5 分钟阅读

01. 推理系统的分工 ​

你在聊天窗口问“年假怎么申请?”,几秒后收到一段回答。这一篇从这件熟悉的事出发,先说清模型在机器里是什么、推理是什么,再看一次提问要经过应用、推理引擎和 GPU 哪几方的手,最后说明“推理优化”到底在优化什么。读完以后,后面每一篇讨论的速度、显存和调度,就都有了具体的落点。

模型在机器里是什么 ​

下载一个语言模型,你得到的主要是几个很大的参数文件。里面保存着几十亿个数字,也叫权重。配合一套固定的计算结构(Transformer),机器用这些数字处理输入,算出输出。

可以先从一笔小计算认识参数:程序用 输入 × 0.8 + 0.2 算结果,0.8 和 0.2 就是参数,它们决定输入怎样影响输出。语言模型做的是同一类事情,只是规模大得多。我们例子里的 Llama-3.1-8B 有约 80 亿个参数,名字里的 8B 就是这个意思,B 代表十亿。

这些数字是训练出来的:让模型读大量文本,根据前文预测后文,预测错了就调整参数,反复无数次。训练结束后,参数固定下来。之后每次有人提问,机器加载这些参数,结合这次的输入算出回答,这个使用模型的过程叫推理。

训练时更新参数,使用时结合参数与当前输入计算结果

训练和推理用的是同一套模型,追求的东西却不一样。训练关心的是模型最终学得好不好,花几周时间、在几千张卡上跑完一遍都可以接受。推理面对的是正在等回答的人:每个请求都要在几秒内开始回应,每秒要处理成百上千个请求,还要算清每生成一百万个字花多少钱。这个系列讨论的全部是推理这一侧。

一句提问之外,还要带上资料 ​

模型训练时没见过公司上周刚改的年假制度。要让它答对,提问时得把制度一起送进去。实际送给模型的输入可能长这样:

请根据下面的制度回答问题。

制度:员工通过内部系统提交年假申请,由直属主管审批。

问题:年假怎么申请?

模型读完,回答“在内部系统提交申请,等待直属主管审批”。这次输入里既有问题,也有资料,多轮对话时还有之前的聊天记录。模型在这一次计算里能看到的全部输入,叫作上下文。 后面说“上下文变长”,就是要处理的资料和对话记录变多了。

推理时模型参数不会改变。制度只是这一次输入的一部分,下次提问时如果应用不再提供,模型就“不记得”了。

一次提问经过谁的手 ​

小林只输入了一句话,背后有好几方在协作。

小林提问,应用准备资料,模型执行计算,回答返回聊天页面

应用是用户直接接触的那一层:聊天页面、检索、权限和业务逻辑。它找出相关制度,检查小林有没有权限看,把资料和问题拼成输入,最后把回答展示出来。

推理引擎负责让模型高效地跑起来。只有小林一个人时,加载模型、算出回答就够了;全公司同时在用时,问题就多了:谁先算,哪些请求可以一起算,显存不够时让谁等,有人关掉页面后怎样停下计算。vLLM、SGLang 就是这一层的软件。第三部分拆解这类引擎的核心机制,第 18 篇再完整介绍这两个引擎。

模型是参数文件加计算结构,决定回答的内容和质量。

GPU 执行实际的数学运算。模型计算主要是大量矩阵乘法,GPU 擅长成批做这类运算。计算用到的数据要放进 GPU 自己的内存,也就是显存。

点一点下面的各个角色,看同一个问题在每一层被怎样处理:

小林:年假怎么申请?

业务柜台
把“年假怎么申请?”和有权访问的制度片段交给模型服务;结果回来后决定如何展示、是否调用业务接口。

分清这几层,排查问题时才不会找错地方。回答引用了错误的条款,先看应用送进去的资料对不对;资料没错但回答胡说,是模型能力的问题;回答正确但等了十几秒,才轮到推理引擎和 GPU。这个系列讨论的是最后这一类问题。

推理优化在优化什么 ​

推理服务同时面对三个目标,它们经常互相牵制:

  • 延迟:单个用户等多久。发送后多久看到第一个字,后面的字出得快不快。
  • 吞吐:一套机器每秒能产出多少内容、服务多少请求。
  • 成本:每生成一百万个 token 花多少钱,归根结底是一张卡能服务多少人。

再加一个前提:质量不能变差。把模型压得更小、让它少算一些,都可能换来速度,但如果回答开始出错,就不算优化。

这三个目标为什么会冲突,后面会反复看到。比如把很多请求凑在一起算,GPU 利用率和吞吐会上去,但每个请求可能要多等一会儿;把模型从 16 位压到 4 位,显存和带宽都省了,质量却要重新验证。推理优化的大部分工作,就是在这些取舍里找到适合自己业务的那个点。

这个系列用的例子 ​

为了让每个公式都能代入真实数字,全系列统一使用:

项目取值说明
模型Llama-3.1-8B约 80.3 亿参数,32 层,32 个注意力头、8 个 KV 头,每头 128 维
精度BF16每个参数 2 字节,权重约 16 GB
GPUNVIDIA H100 SXM80 GB 显存,带宽约 3.35 TB/s,BF16 稠密算力约 989 TFLOPS
场景资料助手从一个人提问,到全公司同时使用,再到语音提问

表里的“KV 头”“带宽”“稠密算力”现在不认识没关系,KV 头在第 4 篇解释,带宽和稠密算力在第 6 篇解释。换成别的模型或显卡,只要把对应配置代进公式即可。

到这里,聊天窗口背后的几个对象已经有了落点:模型以参数和计算结构存在,应用准备输入,推理引擎组织运行,GPU 执行运算。下一篇进入模型内部,看它怎样一个 token 一个 token 地写出回答,以及为什么“读题”和“答题”是两种完全不同的计算。

别急,先让缓存热一下。