想象你是一家川菜馆的老板。今晚大厅坐了三十桌客人,后厨锅铲翻飞:备菜的张师傅把几十份食材一次性切好码齐,这叫“备菜”;掌勺的老王只能一锅一锅地炒,这叫“出菜”。你关心三件事:第一道菜多久能上桌(客人等得不耐烦)、整桌菜多久上齐(决定翻台率)、一晚上总共能出多少道菜(决定营业额)。AI 芯片上跑大模型推理,和这家后厨惊人地相似——模型要先“备菜”,把整个问题一次性并行读完(prefill 阶段);再“出菜”,一个字一个字往外蹦(decode 阶段)。而“第一道菜上桌时间”正是 TTFT,“整桌菜上齐的时间”是端到端延迟,“一晚的出菜量”是吞吐量。想比较两家餐厅的后厨谁更强,不能靠嘴说,得请专业评审按统一菜谱打分——这就是 MLPerf 基准测试存在的意义。这篇文章就带你从“餐厅后厨”的视角,把大模型推理的性能指标、评测方法和选型决策一次看懂。

岗位关联

对 AI 从业者而言,读不懂推理基准数据,就无法为业务选对硬件、定好服务等级目标;掌握吞吐、延迟、TTFT 三件套,是芯片选型、容量规划、成本优化的基本功。

目录
  1. 可视化演示
  2. 基准测试入门
  3. 吞吐量指标
  4. 延迟指标
  5. 首Token时间
  6. 两阶段性能
  7. 并发场景影响
  8. 硬件对比选型
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

讲的是怎么评测大模型推理硬件的性能,重点看吞吐量、延迟和首token时间这几个核心指标。你会学到MLPerf基... 切换模式查看不同维度。

本节配有交互动效(进入视口后自动加载,约 3KB)。

LLM推理性:核心原理 动态展示关键流程与数据流动 交互控件调节参数实时渲染 f(x) = transform(x) 核心概念的可视化呈现

基准测试入门

你的餐厅想证明后厨实力,不能请自家伙计打分,得请独立的米其林评审员。评审员会定规矩:同一道菜、同一份菜谱、同一种验收标准。MLPerf 就是 AI 推理界的“米其林评审”——一个由 MLCommons 组织维护的权威基准测试体系,专门用来衡量不同 AI 芯片跑大模型推理时的真实水平。

MLPerf Inference 的“规矩”包括:跑什么模型(比如 GPT-3、GPT-J 这类公开模型)、用什么数据集、batch size 设多少、精度用 FP16 还是 INT8。所有参测硬件都必须在同一套规则下比赛。就像米其林评审指定“做一道麻婆豆腐”,不管你是三星餐厅还是街边小馆,豆腐、肉末、花椒都得按同一份标准来。这样得出的分数才有横向可比性。

MLPerf 推理测试主要有三种场景,对应不同的“营业模式”:

  • Offline(离线):把整个测试集一次性喂给芯片,看它火力全开时的最大吞吐——好比后厨全力出菜,一小时最多出多少道。
  • Server(服务器):请求按现实中的随机节奏到达,看系统在并发压力下的综合表现——好比晚高峰客人随机涌入的餐厅。
  • Single Stream(单流):一次只处理一个请求,测纯粹的延迟——好比只服务一桌客人时上菜有多快。

解读测试结果最忌讳只盯一个数字。同一款芯片,Offline 吞吐可能很漂亮,但 Server 场景下可能因排队导致延迟爆表;换了精度,成绩天差地别。看评测报告要像看米其林评分一样:菜品、环境、服务综合看,还要确认“评审用的菜谱”是否贴近你的业务。

吞吐量=N生成的 token 总数T总耗时(秒)\displaystyle \text{吞吐量} = \frac{N_{\text{生成的 token 总数}}}{T_{\text{总耗时(秒)}}}

1. N 的分子(生成的 token 总数):所有被评测的请求加起来,模型一共输出了多少个 token。一个 token 可以粗略理解为一个“词”,8 个 token 大约等于一句中文短句。

Ntokens=∑i=1RLiN_{\text{tokens}} = \sum_{i=1}^{R} L_i

2. T 的分母(总耗时):从第一个请求开始处理,到最后一个请求完成的秒数。排队等待、prefill、decode 的时间全算在里面,相当于餐厅从开工到打烊的整个营业时段。

T=T结束−T开始T = T_{\text{结束}} - T_{\text{开始}}

3. 两者的比值(每秒产出率):用总 token 数除以总秒数,得到“平均每秒吐出多少 token”。数字越大,说明芯片在给定工作负载下的“产能”越高。

Throughput=NtokensT\text{Throughput} = \frac{N_{\text{tokens}}}{T}

米其林评审给出的不是“好吃”这种主观评价,而是一套可复现的分数。MLPerf 也一样:有了统一规则和明确的吞吐公式,不同芯片、不同厂商才能真正坐到同一张桌子上比试。下一节我们深入看看吞吐量这个“出菜产能”还有哪些门道。

吞吐量指标

一家餐厅好不好,厨师长最关心的是“高峰期一小时能出多少道菜”。这个数字决定了餐厅能接多少桌客人、能赚多少钱。在推理服务里,对应的指标就是吞吐量——单位时间内模型能处理的请求数或生成的 token 数。一句话:吞吐量衡量“产能”,延迟衡量“体验”。

技术定义上,吞吐量通常写作 tokens/s(每秒生成 token 数)。要读懂这个数字,必须理解 batch size(批次大小)的作用。GPU 是个“大团队”:处理 1 个请求时它开全员大会,处理 64 个请求时它还是开全员大会——会议时间几乎不变,但产出翻了 64 倍。这就是为什么把 batch 从 1 提到 64,吞吐量可能提升好几倍。

吞吐量=B×L每请求输出长度T每批耗时\displaystyle \text{吞吐量} = \frac{B \times L_{\text{每请求输出长度}}}{T_{\text{每批耗时}}}

1. B(批次大小):一次送进 GPU 一起处理的请求数量。离线评测中,测试方会把成千上万个请求打包成大 batch 一次性塞进去,模拟“厨房一次接 100 桌的菜”。

B=Requests per batchB = \text{Requests per batch}

2. 每请求输出长度:这批里每个请求平均生成多少 token。输出越长,整批产出的 token 总数越多。

Lbatch=∑j=1BLjL_{\text{batch}} = \sum_{j=1}^{B} L_j

3. 每批耗时:GPU 处理完整批请求的时间。它包含 prefill(备菜)和 decode(出菜)两个阶段。batch 变大时耗时增加,但远没有请求数增加得快——这就是吞吐能大幅提升的原因。

Tbatch=Tprefill+TdecodeT_{\text{batch}} = T_{\text{prefill}} + T_{\text{decode}}

天下没有免费的午餐。batch 越大,排在这一批里的每个请求等待时间越长,单个请求的延迟跟着变差。这就是推理领域最经典的“吞吐-延迟权衡”:想把产能拉满,就得让客人多等;想让每桌都快,就得牺牲产能。现实中服务商通过调节并发数寻找平衡点,下一节的延迟指标将展开讲这个矛盾。

延迟指标

吞吐量是老板视角的指标,客人的视角完全不同。客人坐下后只关心一件事:我的菜什么时候上齐?有的店是“大食堂”——产能惊人但每桌等得久;有的店是“私房菜”——一桌一桌慢慢做。评价推理服务两者都得看:吞吐量决定成本,延迟决定口碑。

端到端延迟(end-to-end latency)指用户发出请求到收到完整回复的总时间。它由两部分构成:等待第一个 token 的时间(TTFT)加上后续每个 token 之间间隔(ITL,inter-token latency)的累加。大模型回答是“流式”吐出来的,用户先看到第一个词,再看着回答慢慢变长,所以整体延迟 = 首 token 时间 + 剩余所有 token 的生成时间之和。

L端到端=TTTFT+∑i=1N−1ITLi\displaystyle L_{\text{端到端}} = T_{\text{TTFT}} + \sum_{i=1}^{N-1} \text{ITL}_i

1. T_TTFT(首 token 等待):从请求发出到第一个 token 返回的耗时。用户对“系统有没有反应”的判断几乎完全来自这段时间,类比客人点完菜后等第一道菜上桌的时间。

TTTFT=t首token到达−t请求发出T_{\text{TTFT}} = t_{\text{首token到达}} - t_{\text{请求发出}}

2. ITL_i(相邻 token 间隔):第 i 个 token 与第 i+1 个 token 之间的时间差。decode 阶段每生成一个 token 都要完整跑一遍神经网络前向,所以这个间隔基本等于“单步解码耗时”。

ITLi=ti+1−ti\text{ITL}_i = t_{i+1} - t_i

3. 累加 N-1 次:第一个 token 由 TTFT 覆盖,后续 N-1 个 token 各有一个间隔,全部加起来才是整段回答的时长。回答越长,decode 部分占的比重越大。

∑i=1N−1ITLi=tN−t1\sum_{i=1}^{N-1} \text{ITL}_i = t_N - t_1

评测延迟时还有个大陷阱:平均值会骗人。100 个请求里 99 个 1 秒完成,1 个卡了 60 秒,平均才 1.59 秒,看起来很美,但那位等了 60 秒的客人早就投诉了。所以专业的评测报告看百分位:P50 代表“一半请求比它快”,P95 代表“95% 的请求比它快”。服务商定 SLO(服务水平目标)时通常写“P95 延迟小于 X 秒”——意思是只有 5% 的客人可以忍受等待超过红线。这就像餐厅承诺“95% 的桌次在 30 分钟内上齐”而不是吹“平均 15 分钟”。

首Token时间

客人等菜时最焦虑的是哪一段?是点完菜之后盯着厨房的那几分钟。第一道菜上得快的餐厅,哪怕后面匀速上菜,客人也会觉得“这家店利索”。大模型交互同样如此:用户按下回车,如果 0.5 秒内看到第一个字,就会觉得系统“很跟手”;如果 3 秒还没动静,就会怀疑是不是卡死了——哪怕后续生成飞快。

TTFT(Time To First Token,首 token 时间)衡量的正是“从请求发出到收到第一个 token”的耗时。它与模型的 prefill 阶段直接相关:prefill 要先把用户输入的整个 prompt 从头到尾处理一遍,才能生成第一个输出 token。输入越长,prefill 时间越长;并发越高,排队时间越长。这两个因素叠加,构成了 TTFT 的主体。

TTFT=T排队+Lpromptvprefill\displaystyle \text{TTFT} = T_{\text{排队}} + \frac{L_{\text{prompt}}}{v_{\text{prefill}}}

1. T_排队(排队等待):请求到达后,在 GPU 调度队列里等待被处理的时长。并发高时 GPU 全被占着,新请求只能排队,好比晚高峰店里没空桌,客人先在大堂等着。

T排队=t开始处理−t请求到达T_{\text{排队}} = t_{\text{开始处理}} - t_{\text{请求到达}}

2. L_prompt(prompt 长度):用户输入的提示词包含多少个 token。prompt 越长,prefill 需要读的内容越多,“备菜的食材”越多。

Lprompt=输入文本的 token 数L_{\text{prompt}} = \text{输入文本的 token 数}

3. v_prefill(prefill 速度):每秒能并行处理多少 prompt token,由芯片的计算能力决定。prefill 高度并行,就像几十个师傅同时切菜,人多手快。

vprefill=LpromptTprefillv_{\text{prefill}} = \frac{L_{\text{prompt}}}{T_{\text{prefill}}}

优化 TTFT 是推理服务的头号工程目标。常见手段包括:把 prefill 和 decode 拆到不同 GPU 池运行,避免 decode 阶段的长请求堵住新请求的 prefill;用流式输出让第一个 token 一生成就立刻返回,而不是等整段回答完成;用 KV cache 预分配等手段缩短 prefill 耗时。对聊天、搜索、Copilot 这类交互式应用来说,TTFT 就是用户留存的生命线。

两阶段性能

前几节反复提到 prefill 和 decode,这两个阶段就像餐厅后厨的“备菜”和“出菜”,是整场推理的两幕好戏。理解它们的差异,是看懂一切推理性能数据的钥匙。

prefill(备菜):拿到用户整个 prompt 后,模型对其进行一次完整的并行前向计算。这个阶段的特点是“一次处理全部输入”——就像后厨拿到菜谱,几十个帮厨同时把几十道菜的食材切好码齐。它吃的是计算力,是典型的计算密集型任务,GPU 的算力可以充分跑满。

decode(出菜):从第一个 token 开始逐字生成后续输出。每个 token 的生成都依赖之前所有 token 的结果,所以无法并行,只能一步一个 token 串行推进。更关键的是,每走一步都要把大模型的全部权重从内存里搬运一遍——真正卡住进度的是内存带宽,而不是纯算力。这就是常说的“访存密集”或“带宽受限”。

Ttotal=Tprefill+(Noutput−1)×Tdecode_step\displaystyle T_{\text{total}} = T_{\text{prefill}} + (N_{\text{output}} - 1) \times T_{\text{decode\_step}}

1. T_prefill(备菜耗时):一次性并行处理整个 prompt 的时间。因为并行度高,输入长度对耗时的贡献被“多个工人同时干活”摊薄了。

Tprefill=LpromptvprefillT_{\text{prefill}} = \frac{L_{\text{prompt}}}{v_{\text{prefill}}}

2. N_output - 1(还需生成的个数):第一个输出 token 在 prefill 的末尾就顺带产出了,所以剩下的 N-1 个 token 要逐个 decode。输出 50 个 token,就要串行走 49 步。

Ndecode=Noutput−1N_{\text{decode}} = N_{\text{output}} - 1

3. T_decode_step(单步耗时):每生成一个 token 需要的时间。它主要受内存带宽限制:权重越大、带宽越窄,这一步就越慢,与算力强弱关系不大。

Tdecode_step=模型权重规模内存带宽T_{\text{decode\_step}} = \frac{\text{模型权重规模}}{\text{内存带宽}}

正是这种“prefill 吃算力、decode 吃带宽”的差异,造就了推理评测中一个反直觉的现象:号称峰值算力很高的芯片,跑 decode 阶段未必快。一些高端 AI 芯片专门设计 prefill/decode 分离架构或超大显存带宽,就是为了同时喂饱这两幕戏。反过来你也能理解,为什么单纯看“TFLOPS 算力”选芯片会踩坑——那是备菜的速度,不是出菜的速度。

并发场景影响

把时间拨到晚上七点,你的川菜馆迎来晚高峰:三十桌客人同时举杯,门口还有十桌排队。这时后厨的行为模式跟平时完全不同——这正是并发对推理性能的塑造。并发数(concurrency)就是同时处于处理状态的请求数量,它是评测中最容易被误读的变量。

低并发下,GPU 处于“饥饿”状态:一两个请求占不满算力,吞吐量很低,但每个请求独享资源,延迟很漂亮。随着并发升高,更多请求把 GPU 喂饱,吞吐量快速上升——这是“多接客”带来的收益。但好景不长,当并发超过某个临界点,GPU 算力和显存带宽都被占满,新请求只能排队,吞吐量趋于饱和,而延迟和 TTFT 开始急剧恶化。这就是经典的“吞吐饱和、延迟爆炸”曲线。

C=λ×L\displaystyle C = \lambda \times L

1. C(并发请求数):系统里同时处于“排队或处理中”状态的请求总数。类比餐厅里等待和正在用餐的桌数之和。

C=系统内在途请求数C = \text{系统内在途请求数}

2. λ(到达率):每秒新到达的请求数量。晚高峰 λ 猛增,就像推门进店的客人一波接一波。

λ=新请求数时间间隔(秒)\lambda = \frac{\text{新请求数}}{\text{时间间隔(秒)}}

3. L(平均延迟):每个请求从进入系统到处理完成的平均耗时。餐厅里就是客人从落座到结账的时长。

L=∑各请求延迟RL = \frac{\sum \text{各请求延迟}}{R}

4. 乘积联动:三者不是独立的。假设延迟翻倍而到达率不变,系统里积压的在途请求就会翻倍;如果系统容量有限,积压最终会变成排队和超时。

C∝λ×LC \propto \lambda \times L

理解并发下的指标变化,对评测和选型有直接指导意义:任何“吞吐 X tokens/s”或“延迟 Y 毫秒”的数字都隐含了前提——在什么并发下测的。专业的评测报告会画出“吞吐-并发”曲线和“延迟-并发”曲线,并标出满足 SLO 的最大并发点。这个点就是容量规划的基准:超过它服务就雪崩,低于它硬件又在浪费。

硬件对比选型

逛完评测报告,终于要回答那个实际问题:该买哪款芯片?这就像餐厅打算升级厨房设备——不能光看设备多贵、功率多大,得让厂商按你的菜单试菜。硬件选型是推理性能评测的终极应用场景。

MLPerf 榜单相当于“米其林指南”,但读榜单有三条铁律。第一,看测试条件:榜单上每一行都注明模型版本、精度、batch 大小、卡数。用 8 张卡跑出来的成绩和 1 张卡直接对比,等于拿 8 个厨师的后厨跟 1 个厨师比出菜量。第二,看场景匹配:你的业务是聊天机器人还是离线批量任务?前者要盯 Server 场景的 TTFT 和 P99,后者直接看 Offline 吞吐。第三,算性价比:最贵的芯片不一定最划算,要把性能换算成成本。

每千 token 成本=每小时总拥有成本每小时吞吐量(token)×1000\displaystyle \text{每千 token 成本} = \frac{\text{每小时总拥有成本}}{\text{每小时吞吐量(token)}} \times 1000

1. 每小时总拥有成本:硬件采购价按折旧年限摊到小时,加上电费、散热、机房租金。好比一套厨房设备的“每小时租金”。

TCOhour=采购价365×24×折旧年限+每小时电费\text{TCO}_{\text{hour}} = \frac{\text{采购价}}{365 \times 24 \times \text{折旧年限}} + \text{每小时电费}

2. 每小时吞吐量:芯片在目标模型和 batch 条件下实测的吞吐,换算成每小时产出的 token 数。

Tokenshour=Throughput(tok/s)×3600\text{Tokens}_{\text{hour}} = \text{Throughput(tok/s)} \times 3600

3. 比值与放大:每小时成本除以每小时产出,得到单个 token 的成本,再乘以 1000 就是“每千 token 成本”。A 卡比 B 卡贵一倍,但吞吐高 2.5 倍,每千 token 成本反而更低。

每千token成本=TCOhourTokenshour×1000\text{每千token成本} = \frac{\text{TCO}_{\text{hour}}}{\text{Tokens}_{\text{hour}}} \times 1000

选芯片就像选厨房设备:米其林榜单(MLPerf)告诉你各家后厨在统一菜谱下的表现,但最终决定权在你——你的菜单(业务场景)是什么?翻台目标(SLO)是多少?预算(TCO)有多少?理解了吞吐、延迟、TTFT 三件套,看懂了 prefill 与 decode 的两幕戏,掌握了并发曲线的拐点,你就拥有了从“看热闹”到“看门道”的完整能力。下次再看到一张推理性能榜单,你已经能从数据里读出那家“后厨”的备菜速度、出菜节奏和晚高峰的真实表现了。

AI 应用场景

场景1:芯片厂商发布 MLPerf 跑分成绩

阶段:硬件评测与市场推广

解决的问题:市面上的 AI 芯片少说几十款,客户无法逐款实测。芯片厂商按 MLPerf 统一规则跑分,给出同一模型、同一精度下的吞吐和延迟数据,让买家能横向对比,把“自吹自擂”变成“公开考试”。

具体案例:某国产 AI 芯片公司公布 GPT-3 175B 模型在 Server 场景下的 MLPerf 成绩:吞吐 1250 tokens/s,P95 TTFT 1.8 秒。销售工程师拿着报告向云厂商展示,并附上同条件对比表,说明自家芯片在长 prompt prefill 上的优势,最终进入客户选型池。

场景2:云厂商为聊天助手选型推理卡

阶段:基础架构选型与容量规划

解决的问题:聊天助手是强交互应用,TTFT 直接决定用户留存,端到端延迟决定体验评分。若只按峰值算力选卡,可能买到“prefill 飞快但 decode 拉胯”的芯片;若只按吞吐选卡,又可能让 P95 延迟超标。

具体案例:某云厂商用 100 并发压测两款候选卡:A 卡平均吞吐高 15%,但 P95 TTFT 达 3.2 秒;B 卡吞吐稍低,P95 TTFT 稳定在 0.9 秒。考虑到客服机器人对响应速度敏感,团队最终选 B 卡,并把 SLO 定为“P95 TTFT < 1.2 秒、P95 解码速率 > 15 token/s”。

场景3:线上大模型服务的 SLO 监控与扩容

阶段:线上服务运维

解决的问题:模型上线后性能会随并发波动,长 prompt 请求、促销流量高峰都可能让延迟劣化。没有量化指标就无法触发告警和扩容,服务会在用户投诉中悄悄崩坏。

具体案例:某智能客服团队用 Prometheus 采集 TTFT、吞吐、P99 延迟等指标,设置告警规则:当 P95 TTFT 连续 5 分钟超过 1.5 秒时自动扩容推理实例。晚高峰促销活动触发告警后,平台自动从 8 卡扩到 16 卡,P95 TTFT 回落至 0.8 秒,活动期间零事故。

Python 演示

python44 行
"""大模型推理性能模拟器: 演示TTFT/延迟/吞吐与并发的关系"""  class InferenceEngine:    """简化推理引擎: prefill并行快, decode串行慢"""     def __init__(self, prefill_tok_per_ms=100, decode_tok_per_ms=20):        # prefill: 每毫秒可并行处理100个prompt token        # decode: 串行模式, 每毫秒只能产出20个token        self.prefill_speed = prefill_tok_per_ms        self.decode_speed = decode_tok_per_ms     def run_one(self, prompt_len, output_len):        """单请求: 返回(TTFT毫秒, 端到端延迟毫秒)"""        prefill_ms = prompt_len / self.prefill_speed        decode_ms = output_len / self.decode_speed        ttft = prefill_ms        latency = prefill_ms + decode_ms        return ttft, latency     def run_concurrent(self, conc, prompt_len, output_len):        """并发场景: 排队与带宽争抢让延迟上升, 吞吐趋于饱和"""        prefill_ms = prompt_len / self.prefill_speed        # decode是共享瓶颈, 并发越高每个请求的decode越慢        decode_ms = output_len / self.decode_speed * conc        total_ms = prefill_ms + decode_ms        throughput = conc * output_len / (total_ms / 1000)        # 排队导致TTFT随并发恶化        ttft = prefill_ms * (1 + 0.5 * (conc - 1))        latency = prefill_ms + decode_ms        return ttft, latency, throughput  if __name__ == "__main__":    eng = InferenceEngine()    p, o = 200, 50  # prompt 200 token, 输出 50 token    print("=== 单请求基准 ===")    t, lat = eng.run_one(p, o)    print(f"TTFT={t:.1f}ms, 端到端延迟={lat:.1f}ms")    print("\n=== 并发扩展测试 ===")    print(f"{'并发':>4} | {'TTFT(ms)':>9} | {'延迟(ms)':>9} | {'吞吐(tok/s)':>12}")    for c in [1, 2, 4, 8, 16, 32]:        tt, lt, tp = eng.run_concurrent(c, p, o)        print(f"{c:>4} | {tt:>9.1f} | {lt:>9.1f} | {tp:>12.0f}")
目的:用简化模型模拟大模型推理的 prefill/decode 两阶段,打印不同并发下的 TTFT、端到端延迟和吞吐量,复现“吞吐饱和、延迟上升”现象。
  1. self.prefill_speed = prefill_tok_per_ms记录 prefill 阶段每毫秒能并行处理多少 prompt token。
  2. prefill_ms = prompt_len / self.prefill_speed整个 prompt 一次性并行处理,耗时只算一次。
  3. ttft = prefill_ms首 token 时间近似等于 prefill 耗时,因为第一个 token 在“备菜”完成后立即产出。
  4. decode_ms = output_len / self.decode_speed * concdecode 串行且共享带宽,并发越高每个请求生成越慢。
  5. throughput = conc * output_len / (total_ms / 1000)并发请求的总输出除以总耗时,得到每秒 token 数。
  6. for c in [1, 2, 4, 8, 16, 32]:遍历不同并发数,观察指标随并发升高如何变化。

常见误区

误区用平均延迟评估推理服务。线上监控显示“平均延迟 800ms”,就觉得服务很快很健康,从不看长尾分布。

正解平均延迟会被极少数慢请求掩盖真相。想象餐厅统计出菜时间:99 桌 5 分钟上齐,1 桌等了 1 小时,平均才约 8.8 分钟,但那位等了 1 小时的客人已经投诉了。服务商要盯 P95/P99 甚至 P999,SLO 通常按百分位定义,因为最慢的那批请求才决定用户口碑。

为何常见:平均值直观好算,监控面板默认展示;大多数人没经历过长尾请求拖垮整个服务容量的场景。

误区看到 A 芯片 Offline 吞吐 3000 token/s、B 芯片 2500 token/s,直接下结论“A 比 B 快 20%”。

正解如果 A 是 INT8 + batch 256,B 是 FP16 + batch 32,两者完全不可比。精度低、batch 大必然跑分高。好比 A 餐厅的麻婆豆腐用便宜食材、B 用雪花和牛,菜谱都不一样,评审分数没法比。对比必须同模型、同精度、同 batch、同并发。

为何常见:榜单只显示结果数字,测试条件藏在详情页,读榜人图省事只看最显眼的数字。

误区选硬件只认 TTFT。试了一下“打字出得挺快”,就草率下单采购,忽略了后续生成速度。

正解TTFT 只是第一道菜上桌的时间。后续每个 token 的生成速度(decode 速率/ITL)决定整段回答的流畅度,吞吐则决定总成本。可能出现 TTFT 很快但 decode 慢到 30 秒才答完的情况——用户照样流失。性能要三维看:TTFT + 解码速率 + 并发吞吐。

为何常见:交互演示时第一印象最重要,“首 token 快”最容易被感知,而长回答的拖沓容易被忽略。

误区把并发从 8 调到 64,吞吐只涨了 10%,延迟翻了 3 倍,还觉得“反正是服务端多扛一点”。

正解吞吐-并发曲线上存在饱和点。超过饱和点后系统排队严重,吞吐不再增长,延迟持续恶化,TTFT 可能从几百毫秒飙到数秒。做容量规划要找到“满足 SLO 的最大并发”,而不是盲目拉并发。Little 定律告诉我们:并发、到达率、延迟三者联动,延迟恶化会让在途请求越积越多。

为何常见:直觉上“人多力量大”,没意识到 GPU 资源是共享的、队列容量有上限。

面试题

Q1. 大模型推理指标 TTFT 衡量的是什么?

单选题 · easy

  • A.模型加载到显存所需的总时长
  • B.从请求发出到首个token返回← 正确答案
  • C.相邻两个token之间的产出间隔
  • D.模型输出全部文本的完整耗时

答案:B。TTFT(Time To First Token)是“首 token 时间”,从请求发出到收到首个 token 的时长,对应餐厅里第一道菜上桌的时间,决定用户对系统响应速度的第一感知。选项 B 是它的定义;A 是模型加载时间,C 是 ITL,D 是端到端延迟。

Q2. 下列哪个单位最适合用来表示大模型推理吞吐量?

单选题 · easy

  • A.FLOPs,每秒浮点运算次数
  • B.tokens/s,每秒生成的token数← 正确答案
  • C.FPS,每秒处理的图像帧数
  • D.GB/s,每秒传输的数据量

答案:B。推理吞吐量衡量单位时间内模型生成 token 的数量,标准单位是 tokens/s。FLOPs 衡量算力而非产出,FPS 用于视觉任务,GB/s 是带宽单位。就像餐厅的产能要用“每小时出菜数”衡量,而不是用“灶台功率”。

Q3. 大模型推理的 prefill 阶段具有什么特征?

单选题 · mid

  • A.逐字串行生成,受内存带宽限制
  • B.并行处理整个prompt,计算密集← 正确答案
  • C.只负责加载模型权重到显存
  • D.每生成一个token执行一次前向

答案:B。prefill 阶段一次性并行处理整个 prompt,像后厨同时备好所有食材,属于计算密集型任务,GPU 算力能跑满。A 描述的是 decode 阶段,C 是模型加载,D 是 decode 逐字生成的特征。

Q4. decode 阶段生成每个 token 的耗时主要受什么限制?

单选题 · mid

  • A.网络传输带宽的大小
  • B.显存容量的充足程度
  • C.内存带宽而非纯算力← 正确答案
  • D.GPU 核心的时钟频率

答案:C。decode 阶段每生成一个 token 都要把模型全部权重从内存搬到计算单元,内存带宽成为瓶颈。GPU 算力再高,带宽不够也快不起来——好比出菜速度取决于传菜通道的宽度,而不只是厨师颠勺的速度。

Q5. 当并发请求持续升高并超过饱和点后,通常会发生什么?

单选题 · mid

  • A.吞吐和延迟都同步持续增长
  • B.吞吐停止增长而延迟持续上升← 正确答案
  • C.吞吐继续增长而延迟保持稳定
  • D.吞吐和延迟都出现明显下降

答案:B。超过饱和点后,GPU 算力和带宽都被占满,吞吐量不再增长甚至下降,而排队时间不断累积,导致延迟和 TTFT 持续上升。这是并发评测中最关键的拐点,SLO 和容量规划都要以它为依据。

Q6. 为什么评测推理延迟要重点看 P95/P99 而不是平均值?

单选题 · mid

  • A.平均值计算复杂不如百分位方便
  • B.平均值无法反映最差情况体验← 正确答案
  • C.百分位数值一定比平均值更小
  • D.平均值只能用于吞吐量评估

答案:B。平均延迟会被长尾请求掩盖问题——99 个请求 1 秒、1 个请求 60 秒,平均才约 1.59 秒,但 P99 是 60 秒。服务体验看的是最慢的客人,P95/P99 才能暴露长尾风险,所以 SLO 按百分位定义而不是平均值。

Q7. 根据 Little 定律,稳定系统中 C = λ × L 表示什么?

单选题 · mid

  • A.并发数等于到达率与平均延迟之积← 正确答案
  • B.吞吐量等于并发数与延迟的乘积
  • C.延迟等于并发数与到达率的商
  • D.到达率等于并发数与延迟之差

答案:A。Little 定律是排队论基本结论:稳定系统内在途请求数 = 平均到达率 × 平均延迟。它揭示了并发、到达率(吞吐)和延迟三者的联动关系:延迟上升会直接抬高在途请求积压,选 A。

Q8. 哪些因素会直接拉高用户请求的 TTFT?(多选)

多选题 · mid

  • A.输入 prompt 的 token 数变多← 正确答案
  • B.服务端并发请求排队加重← 正确答案
  • C.期望输出的 token 数变多
  • D.prefill 阶段的并行算力增强

答案:AB。TTFT ≈ 排队时间 + prompt 处理时间。prompt 变长让 prefill 更久(A 对),并发高让排队更久(B 对)。输出长度影响的是 decode 阶段,与首 token 无关(C 错);prefill 算力增强反而会缩短 TTFT(D 错)。

Q9. 横向对比两款推理芯片的 MLPerf 成绩时,必须保证什么条件一致?(多选)

多选题 · hard

  • A.模型版本与参数量完全一致← 正确答案
  • B.推理精度FP16或INT8一致← 正确答案
  • C.两款芯片峰值算力参数一致
  • D.测试并发数与batch大小一致← 正确答案

答案:ABD。横向对比必须保证模型、精度、并发和 batch 一致,只有被测硬件不同,跑分才有意义。C 错在“峰值算力参数一致”——恰恰相反,参测芯片本来就是不同规格,这正是被测的变量。就像米其林评审要求同一菜谱,但允许各家用自己的灶。

Q10. 以下哪些属于 MLPerf Inference 的经典测试场景?(多选)

多选题 · easy

  • A.Offline 离线全量吞吐测试← 正确答案
  • B.Server 随机到达请求测试← 正确答案
  • C.Decode 单步访存带宽测试
  • D.Single Stream 单流时延测试← 正确答案

答案:ABD。MLPerf Inference 三大经典场景:Offline(离线批量吞吐)、Server(模拟随机到达)、Single Stream(单流延迟)。选项 C 是 decode 阶段的微观指标测试,不属于 MLPerf 的基准场景分类。