AI Infra 推理工程的核心任务,是把一个已经训练好的模型变成稳定、低延迟、高吞吐、可扩展、可观测、成本可控的线上服务。
本文只讨论推理相关知识,不展开训练集群、反向传播和训练并行。目标是建立一套可以迁移到不同模型、GPU 和推理引擎上的分析方法:
业务请求-> Tokenizer-> 显存与计算估算-> Prefill / Decode-> KV Cache-> Batching 与调度-> GPU Kernel 与并行-> 监控、压测、容量和成本
推理 Infra 的知识不是孤立的。模型结构会影响 KV Cache,Tokenizer 会影响 token 数,token 数会影响 Prefill、KV、并发、延迟和成本。
1. 推理请求生命周期
一次大模型请求通常经历:
请求到达-> 网关、鉴权、限流-> 排队-> Tokenizer-> Prefill-> Decode 循环-> 流式返回-> 释放 KV Cache
| 阶段 | 主要工作 | 典型指标 | 主要瓶颈 |
| Tokenizer | 文本转 token id | tokenize time、token 数 | CPU、规则和词表 |
| Prefill | 一次处理输入 Prompt | TTFT、Input TPS | GPU 算力、Attention、KV 写入 |
| Decode | 逐 token 生成输出 | TPOT、Output TPS | HBM 带宽、KV 读取、调度 |
最重要的延迟公式:
E2E Latency= Queue Time+ TTFT+ 输出 token 数 × TPOT一个请求慢,可能有三种完全不同的原因:排队慢、首 token 慢、持续输出慢。
2. 业务负载建模
优化前至少收集:
平均 RPS、峰值 RPS、突发系数平均和 P95/P99 输入 token 数平均和 P95/P99 输出 token 数最大上下文长度流式还是非流式是否 RAG、Agent、工具调用、多轮对话是否存在共享 System PromptTTFT、TPOT、E2E 的 P95/P99 SLO单租户和多租户配额RPS 必须转换成 token 吞吐:
Input TPS = RPS × 平均输入 tokenOutput TPS = RPS × 平均输出 token例如:
RPS = 100平均输入 = 1,200 token平均输出 = 300 tokenInput TPS = 100 × 1,200 = 120,000 token/sOutput TPS = 100 × 300 = 30,000 token/s不能只看 RPS。100 RPS 的短问答和 100 RPS 的 10k 长 Prompt 服务,对 GPU 的压力完全不同。
3. Tokenizer 与序列长度
模型不直接读取字符,而是读取 token id。Tokenizer 会影响:
输入 token 数输出 token 数上下文占用Prefill FLOPsKV CacheAttention 的 N² 项计费和吞吐中文、代码、emoji 和罕见字符的表达效率BPE、WordPiece、SentencePiece、Byte-level BPE 等算法都属于 Tokenizer 生态,但实际部署必须使用与模型训练匹配的 tokenizer 文件和配置。https://aigccoding.feishu.cn/wiki/SdFawE3VyiBacyk1FIjczMsDnzg
应关注:
tokenizer.json、vocab、merges特殊 token 和 chat template中文、英文、代码、URL、emoji 的 token 效率平均 token 数以及 P95/P99 token 数[UNK] 或 byte fallback 比例如果 token 数增加 20%,线性 Prefill 主项约增加 20%,KV Cache 约增加 20%,Attention 理论平方项可能增加:
1.2² = 1.44即约 44%。
4. 模型权重显存
最基本公式:
权重显存 ≈ 参数量 × 每参数字节数| 精度 | 每参数字节数 | 70B 权重 |
| FP32 | 4 | 280GB |
| BF16 / FP16 | 2 | 140GB |
| FP8 / INT8 | 1 | 70GB |
| INT4 | 0.5 | 35GB |
实际运行显存还需要加上:
模型权重+ KV Cache+ CUDA Graph+ Attention / GEMM Workspace+ NCCL 通信 Buffer+ Runtime+ 显存碎片+ 安全余量“模型能加载”只是启动条件,不代表它能承载线上并发。

KV Cache 是动态区域,随并发和上下文增长;运行时 Buffer 与安全余量不能被忽略。
5. Attention Head、MHA、GQA、MQA
常见参数:
Hq:Query Head 数Hkv:Key / Value Head 数d_head:每个 Head 的维度三种结构:
MHA:Hkv = Hq,每个 Query Head 使用独立 K/VGQA:1 < Hkv < Hq,多组 Query Head 共享 K/VMQA:Hkv = 1,所有 Query Head 共享一组 K/V
通用 KV 公式:
KV Bytes / token= 2 × Layer 数 × Hkv × d_head × bytes_per_elementGQA/MQA 最确定的推理收益来自 KV Cache 容量和历史 K/V 访存减少。但 Query Head 数通常不变,因此不能简单理解为 Attention FLOPs 也按 Hkv/Hq 等比例减少。
6. KV Cache
KV Cache 保存历史 token 在每层 Attention 中的 Key 和 Value,供后续 Decode 读取。它不保存历史 Q。
单 token、全模型的 KV Cache:
KV Bytes / token= 2 × L × Hkv × d_head × bytesKV Cache 的增长方向:
Layer 数越多,KV 越大Hkv 越多,KV 越大上下文越长,KV 越大活跃请求越多,KV 越大KV Cache 接近上限会导致:
新请求无法准入Waiting Queue 增长TTFT 上升请求抢占或重算显存分配失败和 OOMPaged KV Cache 将缓存切成 Block,按需分配和释放,主要解决连续分配、内部浪费和显存碎片问题。它不能创造额外显存。
7. Prefill 计算
Prefill 一次处理整个输入 Prompt,并构建输入 token 的 KV Cache。
线性层主项:
Prefill FLOPs_linear ≈ 2 × P × N其中 P 是参数量,N 是输入 token 数,2 来自乘加 FLOPs 计数。
例如 70B 模型处理 4k token:
2 × 70B × 4,000= 560 TFLOPsAttention 的全矩阵上界:
FLOPs_attention_full ≈ 4 × L × N² × d_model其中 N 是序列长度(token数量,上下文长度),d_model是模型隐层维度,L 是Transformer层数。
它来自两次矩阵乘法:
Q × KᵀAttention Score × VCausal Attention 的逻辑有效区域约为下三角,理想计算量约减半,但实际是否跳过无效 Tile 要看 Kernel。
Prefill 典型特点:
输入 token 可以组成大矩阵并行处理GPU Tensor Core 利用率通常较高输入越长,TTFT 越高长上下文会放大 Attention 和 KV 写入过多 Prefill 会挤占在线 Decode8. Decode 计算与显存带宽
Decode 每次只生成一个或少量 token,但需要反复读取模型权重和历史 KV Cache。
低 Batch、权重带宽主导时:
Decode tokens/s 上限≈ HBM 带宽 / 每轮读取的权重数据70GB 权重、3TB/s HBM:
3,000GB/s / 70GB≈ 42.8 token/s这是只考虑权重读取的理想上界,不是可承诺的实际速度。完整单轮数据量还包括:
权重读取++ 历史 KV 读取++ 新 KV 写入++ 激活与 Workspace++ TP 通信++ 调度与采样Decode 常见是显存带宽受限,而不是 FLOPS 受限。增加 Batch 可以让一次权重读取服务多个活跃序列,提高聚合 Output TPS,但不一定提高单个请求的流式速度。
9. Prefill 与 Decode 对比

| 维度 | Prefill | Decode |
| 处理方式 | 一次处理 N 个输入 token | 每轮生成 1 个 token |
| 用户指标 | TTFT | TPOT |
| 主要资源 | GPU 计算、Attention | HBM 带宽、KV 读取 |
| 关键输入 | Prompt 长度 | 活跃并发、上下文长度 |
| 典型优化 | FlashAttention、Chunked Prefill、Prompt 压缩 | Continuous Batching、量化、Speculative Decoding |
| 主要风险 | 长输入独占 GPU | 输出过长占用 slot 和 KV |
在线服务必须同时保护 TTFT 和 TPOT:Prefill 太多,Decode 会卡顿;Decode 太多,新请求 TTFT 会排队。
10. Batching 与调度
Static Batching
固定数量请求一起执行,实现简单,但容易被最长请求拖住,Padding 浪费大,在线流式体验通常较差。
Dynamic Batching
在短等待窗口内合并请求,在吞吐和 TTFT 之间折中。
Continuous Batching
每轮 Decode 重新调度:完成请求释放 slot,新请求及时加入,短请求不必等待最长请求完成。

常用控制量:
max_num_seqsmax_num_batched_tokensGPU memory utilizationPrefill token budgetChunked PrefillBatch 不是越大越好。超过吞吐甜点区后,KV 读取、排队、TPOT 和 P99 可能快速恶化。
11. Chunked Prefill
Chunked Prefill 把长 Prompt 的计算拆成多个 Chunk,在 Chunk 之间穿插 Decode。
100k 输入,Chunk = 4kChunk 数 = ceil(100,000 / 4,000) = 25它切的是计算时机,不是上下文语义。后续 Chunk 仍然通过已有 KV Cache 看到前缀。
收益:
- 避免长 Prefill 一次独占 GPU
- 保护在线请求 TPOT P95/P99
- 适合 RAG、长文档、代码库和 Agent
代价:
- 调度更复杂
- 纯 Prefill 吞吐可能下降
- Chunk 太小会增加 Kernel Launch 和调度开销
- Chunk 太大仍会阻塞 Decode
12. Prefix Cache 与 Paged KV
Prefix Cache
对共享 System Prompt、工具定义、固定 RAG 前缀,Prefix Cache 可以复用已经计算好的 K/V:
共享前缀命中-> 跳过重复 Prefill-> 只计算动态后缀-> 降低 TTFT 和 Input TPS命中要求:
输入字节一致Tokenizer 配置一致特殊 token 一致前缀 token ID 一致Paged KV Cache
将 KV Cache 切成固定大小 Block,按需申请和释放:
请求增长 -> 申请新 Block请求完成 -> 释放 Block它减少显存碎片和按最大长度预分配的浪费,但不能解决真实容量不足。
13. 并行策略

Tensor Parallel,TP
按层内矩阵切分到多张 GPU:
权重本地大小 ≈ 完整权重 / TP size优点是单卡显存压力降低;代价是每层可能需要 All-Reduce 或 All-Gather。优先使用 NVLink/NVSwitch,跨节点 TP 必须压测。
Pipeline Parallel,PP
按层切分:
GPU 1:Layer 1-20GPU 2:Layer 21-40GPU 3:Layer 41-60GPU 4:Layer 61-80可以放下更大模型,但会增加流水线空泡和端到端路径长度。
Data Parallel,DP
部署多个完整模型副本,通过负载均衡分发请求。适合高 RPS 横向扩展和故障隔离。
常见组合:
单副本内部 TP多个副本之间 DP14. 量化
量化降低权重、激活或 KV Cache 的数值位宽。
| 精度 | 70B 权重粗估 | 典型取舍 |
| BF16 | 140GB | 质量和兼容性基线 |
| FP8 / INT8 | 70GB | 生产性能和质量折中 |
| INT4 | 35GB | 显存和成本优先,需验证质量 |
量化收益:
权重显存下降HBM 权重流量下降GPU 数量可能下降单位 token 成本下降量化风险:
数学、代码和长上下文能力退化结构化输出或工具调用失败率变化量化 Kernel 效率不理想scale / zero point 增加额外流量KV Cache 也可使用 FP8/INT8,但必须验证真实业务质量。
15. Speculative Decoding
小模型先猜多个 token,大模型一次验证:
Draft Model -> 预测 k 个 tokenTarget Model -> 并行验证接受正确 token适合 Decode 主导、输出较长且 Draft Acceptance Rate 较高的场景。
Acceptance Rate= 被接受的 Draft Token 数 / Draft Token 总数如果输出很短、Draft 质量差或主要瓶颈是长 Prompt Prefill,收益可能有限。
16. GPU、Kernel 与通信
推理性能不能只看理论 FLOPS。还要看:
HBM 带宽利用率Tensor Core 利用率Kernel Launch 次数Global Load / StoreL2 Cache 命中NCCL 通信时间PCIe / NVLink 拓扑CPU Tokenizer 和调度耗时Prefill 通常更容易达到高矩阵利用率;Decode 经常更接近 HBM 带宽问题。Kernel Fusion、FlashAttention、Paged Attention 和量化 Kernel 会改变实际有效性能。
17. 性能指标体系
用户体验
TTFT P50 / P95 / P99TPOT P50 / P95 / P99E2E Latency P50 / P95 / P99请求成功率流式连接中断率负载与调度
RPS / RPSInput TPSOutput TPSWaiting Queue LengthQueue TimeActive SequencesPrefill / Decode Token 数请求输入和输出长度分布GPU 与显存
GPU Compute UtilizationHBM Bandwidth UtilizationGPU Memory UsageKV Cache UsageKV Free BlocksOOM 次数Preempt / Swap / RecomputeCUDA / NCCL Error缓存与业务
Prefix Cache Hit Rate每租户 RPS每租户 token 使用量每成功请求成本每百万 Input / Output Token 成本18. 故障诊断流程

常用判断:
Queue Time 高=> 看容量、限流、实例数、请求突发、长请求和准入TTFT 高但 Queue Time 低=> 看 Prefill、输入长度、Prefix Cache、长 Prompt 调度TPOT 高=> 看 Decode 并发、显存带宽、TP 通信、Batch 策略KV Cache 接近满=> 看上下文、并发、KV 精度、Prefix Cache、显存预留如果 GPU 利用率低但延迟高,还要检查:
CPU Tokenizer网关和网络调度器空转Batch 太小Python / RPC 开销19. 容量规划

吞吐约束
实例数= 业务 Output TPS / 单实例 Output TPS并发约束
Little's Law:
并发数 ≈ RPS × 平均请求停留时间KV 约束
实例数= 业务并发 / 单实例安全并发最终:
实例数= max(吞吐约束实例数, 并发约束实例数, KV 约束实例数)× 冗余系数冗余系数需要覆盖:
单实例故障滚动发布流量突刺缓存失效GPU 性能抖动长请求比例上升20. 成本计算
每百万 token 成本:
每百万 token 成本= 每小时实例成本/ (实例吞吐 token/s × 3,600)× 1,000,000必须区分:
Input Token 成本Output Token 成本混合 Token 成本每请求成本每成功业务任务成本一个低价模型如果任务成功率更低、重试更多,真实业务成本可能反而更高。
21. 压测方法
单请求基线
测无排队时的:
TTFTTPOT单请求生成速度显存占用GPU 与 HBM 利用率并发爬坡
1 -> 2 -> 4 -> 8 -> 16 -> 32 -> 64记录:
Output TPSTTFT P95/P99TPOT P95/P99Queue TimeKV UsageOOM / Reject长短请求混合
例如:
80%:1k 输入,200 输出15%:8k 输入,500 输出5%:32k 输入,1k 输出故障压测
副本下线GPU 重启Prefix Cache 清空流量突然翻倍上游重试风暴超长请求集中进入上线工作点应该位于吞吐拐点之前,而不是单纯追求峰值吞吐。
22. 推理优化优先级
建议按以下顺序推进:
1. 明确 RPS、输入输出长度和 SLO。 2. 建立单请求与并发基线。 3. 计算权重和 KV Cache 显存边界。 4. 开启 Continuous Batching 和 Paged KV。 5. 控制最大上下文和最大输出长度。 6. 调整 max_num_seqs 与 max_num_batched_tokens。 7. 使用 Chunked Prefill 保护 Decode。 8. 优化 Prompt、RAG、历史对话和输出长度。 9. 对共享前缀启用 Prefix Cache。 10. 评估 FP8、INT8、INT4 和 KV 量化。 11. 对 Decode 主导场景评估 Speculative Decoding。 12. 用 TP 承载单模型,用 DP 扩展流量。 13. 做长短请求、租户和优先级隔离。 14. 用真实压测结果做容量和成本核算。
23. 生产上线检查清单
模型与配置
模型权重精度已确认Tokenizer 与模型严格匹配特殊 token 和 chat template 正确最大上下文已设置最大输出已设置MHA/GQA/MQA 配置已确认显存与服务
权重、KV、Workspace 已估算KV Cache 安全水位已设置Paged KV 已启用OOM 和拒绝策略已验证滚动发布仍有容量余量调度与性能
Continuous Batching 已验证max_num_seqs 已压测Prefill Budget 已设置Chunked Prefill 已压测短长请求隔离策略已确认观测与应急
TTFT / TPOT / Queue Time 有 P95/P99KV Free Blocks 可观测Prefix Cache Hit Rate 可观测OOM、拒绝、抢占有告警限流、降级、扩容、回滚可执行24. 必须记住的公式
权重显存= 参数量 × bytes_per_parameterKV Bytes / token= 2 × Layer × Hkv × d_head × bytesKV Bytes / request= KV Bytes / token × context_tokensPrefill FLOPs≈ 2 × 参数量 × 输入 token 数Attention FLOPs 全矩阵上界≈ 4 × Layer × N² × d_modelDecode 权重带宽上界≈ HBM Bandwidth / 权重字节数并发≈ RPS × 平均请求耗时Input TPS= RPS × 平均输入 tokenOutput TPS= RPS × 平均输出 tokenE2E= Queue Time + TTFT + Output Tokens × TPOT25. 最终知识地图
成为合格的 AI Infra 推理工程师,至少要能回答:
一个模型能否放进 GPU?权重之外还剩多少 KV Cache?一个 8k 请求需要多少 KV?MHA、GQA、MQA 对并发有什么影响?Prefill 和 Decode 谁是瓶颈?为什么 GPU FLOPS 不高但 HBM 带宽很高?Batch 增大为什么提高聚合吞吐?为什么长 Prompt 会拖慢在线聊天?Chunked Prefill 如何保护 TPOT?Prefix Cache 为什么能降低 TTFT?TP、PP、DP 应该如何选择?量化省下的显存是否真的转化成吞吐?实例数如何同时满足 RPS、并发、KV 和故障冗余?线上 Queue Time、TTFT、TPOT、KV 满载分别怎么排查?最终可以用一句话概括 AI Infra 推理:
把 token 变成 GPU 上可高效调度的数据流,在显存、算力、带宽、通信、延迟、吞吐、稳定性和成本之间找到可持续的工作点。
夜雨聆风