评测报告里的每一个数字都对应推理过程中的某个阶段。先讲清楚推理引擎在做什么,再逐个解释性能指标和质量指标,最后说明这套评测的局限。
vLLM 是加州伯克利 2023 年开源的大模型推理引擎,现在是开源模型部署的事实标准。名字里的 v 来自"虚拟内存":它的核心发明 PagedAttention 把操作系统的分页思想搬到了显存管理上,把 KV cache 切成小块按需分配,显存利用率从传统做法的 20% 到 40% 提高到 90% 以上。
在一次部署里它负责:把权重加载并切到多张卡上(张量并行、流水线并行、专家并行),管理 KV cache,把同时到达的请求合批送进 GPU(连续批处理),对外提供 OpenAI 兼容的 HTTP 接口。vllm serve 启动服务,vllm bench serve 是它自带的压测客户端。同类工具还有 SGLang、TensorRT-LLM、llama.cpp。
Prefill 一次性读完提示词,所有 token 并行计算,矩阵乘的规模是"token 数 × 隐藏维度",GPU 的算力被喂饱,瓶颈是算力。Decode 逐个生成输出 token,每生成一个都要把全部激活权重和 KV cache 从显存读一遍,算力大量闲置,时间花在搬数据上,瓶颈是显存带宽。两个阶段性质不同,所以性能指标也分开测。
| 指标 | 含义 | 对应阶段 | 用户感受 |
|---|---|---|---|
| Token | 模型处理文本的基本单位,约 0.7 个汉字或 0.75 个英文单词 | ||
| TTFT | 首 token 延迟:从发出请求到收到第一个字,等于 prefill 时间加排队时间,随输入长度增长 | Prefill | 等多久才开始出字 |
| TPOT | 每输出 token 耗时:decode 每步的时间。1000 ÷ TPOT 就是单流速度 tok/s | Decode | 出字快不快,20 tok/s 以上感觉流畅 |
| ITL | token 间隔的分布,和 TPOT 同源,看抖动 | Decode | 出字是否均匀 |
| 吞吐 tok/s | 所有并发请求每秒合计产出的 token。GPU 一步同时算 16 条请求和算 1 条的耗时接近,所以并发越高吞吐越高,每条请求的 TPOT 变差 | Decode 批处理 | 服务能同时伺候多少人 |
| E2EL | 端到端延迟:一条请求从发出到最后一个字 | 全程 | 一次回答总共等多久 |
| P50 / P99 | 中位数和 99 分位。P99 反映最差的那 1% 请求有多慢,做服务时比平均值更重要 | 最倒霉的用户体验 | |
| KV cache 容量 | 显存里能同时装下多少 token 的上下文,决定并发和长上下文的上限 | 显存 |
压测时用固定长度的随机输入并强制生成到指定长度(ignore_eos),是为了让不同模型的数字可比,不受它们"话多话少"的影响。并发 1 / 4 / 8 / 16 / 32 的曲线比单个数字更有信息量:曲线先陡后平的拐点就是算力墙。
| 测试 | 内容 | 样本 | 判分方式 | 测什么 |
|---|---|---|---|---|
| GSM8K | 小学应用题 | 测试集 1319 题中抽 200 | 只比最终数字是否精确一致 | 多步推理 |
| HumanEval | Python 函数补全 | 全部 164 题 | 真实执行模型写的代码跑隐藏单元测试,一次通过的比例即 pass@1 | 代码能力,无法靠"看起来对"蒙混 |
| C-Eval | 中文考试题,52 个学科 | 验证集 1346 题中每科约 6 题,共 300 | 比选项字母 | 中文知识面 |
| 大海捞针 | 长文本里埋一个 7 位密码 | 4K 到 128K 各 3 次,深度 10% / 50% / 90% | 答案含该密码即对,同时记录延迟 | 长上下文是否真的可用 |
| JSON 合规 | 从一句话抽取信息输出规定 JSON | 20 条 | 字段集合和值完全正确 | 指令遵循,能否接进程序 |
| 工具调用 | OpenAI tools 接口,两个函数 | 10 条,含 1 条不该调用 | 函数名和参数正确,不该调用时不调用 | Agent 场景的基础 |
| 图形题 | 程序生成的圆和方块 | 12 张,问数量 / 颜色 / 形状 | 关键词匹配 | 图片链路通不通,基础感知 |
附带记录平均输出长度和单题耗时,反映思考模式的开销;以及截断率,即思考太长没说完答案的比例。截断在本套评测里按答错计。
脚本都在仓库的 bench/ 目录:quality.py 跑质量,perf.sh 跑性能矩阵,report.py 汇总。