想象你经营着一家网红餐厅。每到饭点,门口排起长龙,顾客们盯着手机屏幕不断刷新、焦急地催单。你走进后厨,看到主厨——一位技艺精湛但动作偏慢的老师傅,正一勺一勺地炒菜。你心里清楚:味道再好,上菜太慢,客人也会流失。于是你开始了一场“让出餐快如闪电”的改造。 你决定从六个角度下手。第一,先搞清楚时间到底花在哪:是等位太久,还是备菜太慢,还是炒菜太慢?第二,给菜谱瘦身:菜谱里很多顶级食材换成平价替代品,味道几乎不变,备菜却快得多。第三,把几桌客人点的同一道菜放进一口锅同时炒,一次点火喂饱几桌人。第四,把最常用的高汤、酱料提前熬好备好,随取随用。第五,换更强力的炉灶、重新规划厨房动线。第六,把整套流程管起来,每天盯着“最差的那一桌”等了多久,持续优化。 这套改造思路,正是一线 AI 工程师优化推理延迟的完整方法论。本文的主角——那位老师傅——就是你的大模型;顾客的订单,就是用户的请求。读完这篇文章,你将理解:如何剖析延迟瓶颈,如何用量化、剪枝、蒸馏给模型“瘦身”,如何用批处理、缓存、计算加速让 GPU 满载飞驰,以及如何用工程手段守住毫秒级的承诺。

岗位关联

对 AI 从业者而言,推理延迟优化是让模型从“能跑”走向“好用”的临门一脚。掌握这套方法,你能用更少的算力支撑更大的流量,把响应时间从“卡顿”压到“秒回”,这是大模型落地中最核心的硬技能之一。

目录
  1. 可视化演示
  2. 延迟剖析:先找到后厨的瓶颈
  3. 模型压缩:给菜谱“瘦身”
  4. 批处理调度:一锅炒多份
  5. 缓存优化:提前备好的调料
  6. 计算加速:升级炉灶与动线
  7. 工程实践:厨房运营之道
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示模型量化精度-速度权衡、动态批处理调度窗口、KV Cache缓存机制。切换模式掌握AI推理延迟优化的核心技术。

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

模型量化:精度与速度的权衡 FP32→FP16→INT8→INT4逐级量化,每级约2倍加速,精度损失可控在1%以内 结构化剪枝移除整个注意力头或卷积核,对硬件友好可直接加速推理 speedup ∝ bits_reduction, loss ∝ quant_error 量化与剪枝是模型压缩的两大核心技术

延迟剖析:先找到后厨的瓶颈

改造餐厅的第一步,不是急着换锅换灶,而是先站在前厅掐表:顾客从落座到第一道菜上桌,到底等了多久?等待时间里,有多少是在等位,有多少是等厨房开工,又有多少是等菜一道道上齐?不把时间账算清楚,任何优化都是瞎忙。在 AI 推理的世界里,道理一模一样——优化延迟的第一步,永远是测量和分解。

一次大模型请求的完整旅程,可以分为两个阶段。首 Token 延迟(TTFT),是从用户点击发送到模型吐出第一个字的时间,就像“厨房接到单到第一道菜上桌”;逐 Token 生成延迟,则是输出后续每一个字所需的时间,就像“后续每道菜依次上桌”。生成式模型是自回归的,它必须一个字一个字地预测下一个字,不能像查表一样瞬间给出全部答案。

把这两段写成一个公式,就能一目了然地看到时间花在哪里:

回到餐厅的场景:如果你发现每桌客人都在“等第一道菜”,问题出在厨房开工慢,可能是点单流程繁琐、食材没提前备好;如果第一道菜很快、后面的菜却迟迟不上,问题出在炒菜速度本身。AI 工程师常说的“先剖析、再优化”,正是这层意思——测准了,方向才不跑偏。

T总延迟=T首Token+T每Token×(N−1)\displaystyle T_{\text{总延迟}} = T_{\text{首Token}} + T_{\text{每Token}} \times (N - 1)
一句话看懂:完整响应时间 = 等第一个字的功夫 + 后面每个字的功夫乘以剩余字数。哪个部分占比大,优化的方向就朝哪里。
  1. T_总(总延迟)从用户发出请求到完整回复全部展示的全程耗时,是最终体验的标尺。
    T总延迟T_{\text{总延迟}}
  2. T_首Token(首字等待)从请求出发到模型吐出第一个字的时间,包含排队、预处理与首次前向传播。
    T首TokenT_{\text{首Token}}
  3. T_每Token(逐字生成)模型每生成一个字的耗时,生成式模型按“自回归”方式逐字输出,每多一个字就要多算一次。
    T每TokenT_{\text{每Token}}
  4. ×(N−1)(剩余字数)第一个字已计入首 Token 延迟,其余 N−1 个字各需要一次前向传播。
    ×(N−1)\times (N - 1)

模型压缩:给菜谱“瘦身”

确定了瓶颈之后,你翻开老师的菜谱,发现里面密密麻麻写满了顶级食材:松露、鱼子酱、黑毛猪肉……这些食材烹饪难度大、备菜时间长。你灵机一动:很多菜把松露换成普通蘑菇,客人根本尝不出差别,备菜时间却能缩短一半。这就是“给菜谱瘦身”,在 AI 领域,它叫模型压缩。

模型压缩有三把常用的“刀”。第一把是量化:模型训练时用 32 位浮点数(FP32)存权重,精确到“0.01 克”的菜谱并没有实际意义。把精度压到 16 位、8 位甚至 4 位,模型体积和显存占用大幅下降,质量却几乎不变。第二把是剪枝:很多权重数值接近于零,对预测结果几乎没贡献,像菜里多余的摆盘装饰,剪掉也不影响味道。第三把是知识蒸馏:让又大又准的“老师模型”把自己的输出分布“教”给轻巧的“学生模型”,徒弟体型小,功夫却学了八九成。

量化是这三把刀里最常用的一把。它的核心问题是:怎么把连续的浮点数变成离散的整数?公式如下:

量化带来的体积收益同样清晰——位宽每降一档,模型体积就按比例缩一圈:

这些手段就像餐厅里的“食材替代方案”:量化是换用平价但口感接近的食材,剪枝是去掉可有可无的摆盘,蒸馏是让徒弟传帮带。客人吃到嘴里还是熟悉的味道,后厨的备菜速度却快了一倍。

q=round(xs)+z\displaystyle q = \text{round}\left( \frac{x}{s} \right) + z
一句话看懂:32 位降到 8 位,32÷8=4,模型体积直接变成四分之一,显存和带宽压力同步下降。
  1. b_原始(原始位宽)默认 32 位浮点(FP32),每个权重占 4 字节。
    b原始=32b_{\text{原始}} = 32
  2. b_量化(量化位宽)INT8 为 8 位占 1 字节,INT4 为 4 位占 0.5 字节。
    b量化=8b_{\text{量化}} = 8
  3. 比值(缩减倍数)位宽越小、倍数越大,模型越轻,配合剪枝和蒸馏效果更佳。
    b原始b量化\frac{b_{\text{原始}}}{b_{\text{量化}}}

批处理调度:一锅炒多份

菜谱瘦身后,备菜快了,但你发现真正拖慢节奏的是“一桌一桌炒”的模式。老师傅每炒完一道菜才接下一单,炉火的利用效率很低。你突然想到:为什么不把几桌客人点的同一道菜放进一口锅里同时炒?一次点火,四份齐出。这就是批处理。

GPU 和炒锅很像——它天生适合并行计算,同一时刻可以同时处理很多份数据,而不是一份份串行处理。如果让 GPU 一次只处理一个请求,就像用一口大锅只炒一份菜,火力严重浪费。动态批处理把窗口时间内到达的请求攒成一“锅”再一起算;连续批处理更进一步,它不以“整批”为单位,而是以 Token 为粒度调度——某个请求生成完了,立刻腾出位置给新请求,GPU 永远满载,一个空转的算力单元都没有。

批处理对吞吐量的提升,可以用一个简洁的公式刻画:

批处理不是免费的魔法,它也有代价:锅越大,炒菜时间越长,单桌客人等得更久。所以聪明的餐厅会动态决定“一锅炒几份”——排队的人多就多炒几份,没人排队就一份份炒。这正是批处理调度器在做的事:在吞吐和延迟之间寻找平衡点。

吞吐量=B×1000T批处理+T调度\displaystyle \text{吞吐量} = \frac{B \times 1000}{T_{\text{批处理}} + T_{\text{调度}}}
一句话看懂:把批大小乘以 1000(毫秒换秒),除以“算一批的时间加上组一批的开销”,就是每秒能处理的请求数。调度开销越小,吞吐越高。
  1. B(批大小)一锅同时炒几份,即一批同时处理的请求数,GPU 并行度越高可容纳越大。
    BB
  2. ×1000(单位换算)耗时的单位是毫秒,乘以 1000 换算成“每秒”的请求数。
    ×1000\times 1000
  3. T_批处理(算一批的耗时)这一锅菜在 GPU 里前向传播的总时间,是真正“干活”的部分。
    T批处理T_{\text{批处理}}
  4. T_调度(组批开销)排队、组批、分配显存等管理成本,连续批处理的核心正是摊薄它。
    T调度T_{\text{调度}}

缓存优化:提前备好的调料

你发现老师傅还有一个习惯:每道菜都要重新熬一遍高汤。明明高汤十分钟前刚熬好,他非要现熬,白白浪费大量时间。你想:把高汤、秘制酱料提前备好放在手边,做菜时直接取用,不比每次都重头开始强?

大模型也面临同样的“重复劳动”。生成式模型每生成一个新 Token,都需要“重新看一眼”整个对话历史,计算每个历史位置对当前位置的注意力权重。这段历史计算非常昂贵,尤其是在长对话场景下。KV Cache 的妙处,是把历史计算出的 Key 和 Value 中间结果缓存下来,新 Token 只需把自己加进缓存、直接复用历史结果——就像熬好的高汤,取用即可,不必每次从洗锅开始。

但高汤备多了,冰箱会放不下。KV Cache 的显存占用,有一个令人清醒的公式:

针对“冰箱不够用”,工程界想出了前缀共享——多段对话共用相同的系统提示词,只算一次即可复用;还有分页式显存管理——把缓存切成小页灵活分配,避免碎片浪费。缓存优化的本质,是用“算过的结果”换“别再算一遍”的时间,但高汤虽好、冰箱有限,合理规划才能让这条加速路径走得更远。

MKV=2×L×d×N×b\displaystyle M_{\text{KV}} = 2 \times L \times d \times N \times b
一句话看懂:缓存占用的显存 = 层数 × 维度 × 序列长度 × 每元素字节数,还要乘以 K 和 V 两份。序列越长,缓存越“吃”显存。
  1. L(层数)Transformer 的层数,每一层都要为自己计算的 Key 和 Value 各存一份缓存。
    LL
  2. d(隐藏维度)每个位置向量的维度,K 和 V 的尺寸都由它决定。
    dd
  3. N(序列长度)已生成的历史 Token 数,缓存量随对话增长,长上下文下增长得飞快。
    NN
  4. 2 与 b(双份与字节)Key 和 Value 各一份所以乘 2;b 是每元素字节数,FP16 为 2 字节。
    2×b2 \times b

计算加速:升级炉灶与动线

当你把灶台上的重复劳动消除了,再回头看硬件本身。餐厅的炉灶是老式单眼灶,一次只能放一口锅。你决定换工业级多头灶——火力猛、灶眼多。这就是计算加速:升级硬件、启用并行,让算力本身跑得更快。

GPU 并行计算是“多头灶”的硬件基础:它拥有成千上万个计算核心,能在同一时刻执行大量矩阵乘法。但光有硬件还不够,软件层面的“厨房动线”同样关键。算子融合把多个小计算步骤合并成一次大计算,减少数据在显存里的来回搬运——就像把“洗菜—切菜—焯水”三个工位合并成一个流水线,食材不用在两个房间之间搬来搬去,光是“走路的功夫”就省下了一大截。

如何衡量加速效果?用加速比这个指标:

在实际项目里,这些优化往往被封装进推理框架——TensorRT、ONNX Runtime、vLLM 等。工程师不需要手写 GPU 内核,只需在框架里打开对应开关,框架就会自动完成算子融合、显存优化和并行调度。换了大炉灶、重排了动线,老师傅的出菜速度肉眼可见地提升——硬件决定上限,软件决定利用率,计算加速的终极目标,是让每一丝算力都花在刀刃上。

加速比=T优化前T优化后\displaystyle \text{加速比} = \frac{T_{\text{优化前}}}{T_{\text{优化后}}}
一句话看懂:优化前的耗时除以优化后的耗时。比值大于 1 说明优化有效,比如 105ms 降到 33ms,加速比约 3.2 倍。
  1. T_优化前(基线耗时)未做算子融合、并行优化时的单请求延迟,是优化前的“原始菜谱速度”。
    T优化前T_{\text{优化前}}
  2. T_优化后(优化耗时)应用融合与并行技术后的延迟,关键是让数据少搬家、让核心多干活。
    T优化后T_{\text{优化后}}
  3. 比值(提速倍数)大于 1 即有效,越大越好。实际工程中还要关注显存是否吃紧。
    T优化前T优化后>1\frac{T_{\text{优化前}}}{T_{\text{优化后}}} > 1

工程实践:厨房运营之道

一切改造完成之后,你并没有就此放手。你明白:一家餐厅好不好,不只看平均出餐速度,更看高峰期最差的那一桌客人等了多久。你开始在门店装监控、记台账、每天复盘——这才是让优化成果长期稳定的关键。

在 AI 服务中,这套“运营之道”叫工程实践。首先要做性能监控:只盯平均延迟远远不够,因为最糟糕的体验往往来自长尾请求。业界常用分位延迟来衡量——P50 是半数请求的体验,P95 已经是“比较倒霉”的体验,P99 则代表“最差的那 1%”。其次要做端到端优化:延迟不只产生在模型本身,还有网络传输、请求排队、输入预处理、流式返回……任何一个环节掉链子,都会拖累整体,就像上菜慢不一定是炒菜慢,也可能是传菜通道堵了。

产品对外通常会承诺一个服务等级目标(SLO),比如“95% 的请求在 1 秒内返回”。用公式表达就是:

同时要清醒地看到,优化从来不是免费的:量化有精度损失风险,批处理会拉长单个请求,缓存占用显存,更强的硬件更烧钱。工程师的真正价值,是在延迟、吞吐、成本和体验之间做权衡,守住 SLO 的同时把账单压到最低。故事讲到这里,你的餐厅已经脱胎换骨:出餐速度从“催单”变成“秒回”,成本不升反降。而这一切的起点,不过是先掐表量时间、再逐项优化、最后持续盯着那“最慢的一桌”——AI 推理延迟优化,正是同样的朴素道理。

P99≤TSLO\displaystyle P99 \leq T_{\text{SLO}}
一句话看懂:最差的那 1% 请求也不能超过红线。这条不等式是所有优化决策的“验收标准”。
  1. P99(第99百分位)把请求延迟从低到高排序,99% 位置的那个值,代表“最差 1% 的体验”。
    P99P99
  2. T_SLO(服务等级目标)产品对外承诺的延迟红线,如“1 秒内返回”,是优化的硬约束。
    TSLOT_{\text{SLO}}
  3. ≤(达标判定)只有当长尾请求也被压在红线之内,服务才算真正达标。
    ≤\leq

AI 应用场景

大模型对话服务的并发扩容

阶段:推理服务部署与性能调优

解决的问题:朴素部署下每个请求独立排队、独立计算,GPU 利用率低,高并发时用户要等很久。通过连续批处理 + KV Cache 前缀共享,相同 GPU 支撑的并发数提升数倍,P95 延迟从数秒降到 1 秒内。

具体案例:某智能客服平台接入 7B 开源模型,高峰期每秒涌入数百条咨询。工程师先用延迟剖析定位“排队等待”是主因,再引入 vLLM 的连续批处理,叠加系统提示词前缀共享后,GPU 利用率从 35% 提升到 70%,P95 延迟从 4.2 秒降至 1.3 秒。

端侧模型压缩与隐私保护

阶段:模型压缩(量化、剪枝、蒸馏)

解决的问题:旗舰手机无法直接运行 7B 的 FP32 模型——显存和算力都不够,数据上传云端又牵扯隐私。通过 INT8 量化和结构化剪枝把模型“瘦身”,让大模型离线跑在本地,响应快且数据不出设备。

具体案例:某输入法团队把 1.3B 端侧模型从 FP32 量化为 INT8,体积缩小 4 倍,在旗舰手机上首 Token 延迟从 900ms 降到 320ms,输入法“AI 润色”功能终于可以实时跟手。

AI 服务的成本与体验权衡

阶段:性能运营与成本优化

解决的问题:延迟、吞吐与算力成本是“不可能三角”。SLO 定得太严,GPU 采购成本飙升;定得太松,用户流失。通过 P99 监控和弹性批处理调度,可以在守住体验红线的同时把单请求成本压到最低。

具体案例:某 SaaS 公司按 QPS 购买 GPU 集群,结合动态批处理和量化后,单 GPU 承载请求数提升 2.5 倍,季度算力成本下降 40%,而 P99 延迟依旧稳定在 SLO 以内。

Python 演示

python44 行
"""推理延迟优化演示:延迟分解、批处理吞吐与量化压缩的效果对比"""  def analyze_latency(seq_len, ttft_ms=40.0, per_token_ms=5.0):    """单请求延迟分解:首Token延迟 + 逐Token生成延迟"""    total_ms = ttft_ms + per_token_ms * (seq_len - 1)    ttft_ratio = ttft_ms / total_ms    return total_ms, ttft_ratio  def simulate_batch(batch_size, seq_len, gpu_capacity=400):    """模拟批处理:一锅炒多份,摊薄权重读取的固定开销"""    fixed_overhead = 15.0    compute_ms = max(gpu_capacity, batch_size * seq_len * 2.0) * 0.1    batch_ms = fixed_overhead + compute_ms    throughput = batch_size * 1000.0 / batch_ms    return batch_ms, throughput  def quantized_size(bits, original_mb=3500):    """量化压缩:32位浮点换成更低精度,模型体积按比例缩小"""    return original_mb * bits / 32.0  def main():    print("任务一:单请求延迟分解(TTFT + 逐Token生成)")    for seq_len in (32, 128, 512):        total, ratio = analyze_latency(seq_len)        print("seq_len={:3d}  总延迟={:7.1f}ms  TTFT占比={:5.1f}%".format(            seq_len, total, ratio * 100))     print("\n任务二:批处理吞吐对比")    print("batch_size | 批次耗时(ms) | 吞吐(请求/秒)")    for bs in (1, 2, 4, 8, 16):        batch_ms, throughput = simulate_batch(bs, 128)        print("{:10d} | {:12.1f} | {:14.1f}".format(bs, batch_ms, throughput))     print("\n任务三:量化压缩后模型体积(以7B模型约3.5GB为基准)")    for bits in (32, 16, 8, 4):        print("{}位精度 -> 体积 {:.0f}MB".format(bits, quantized_size(bits)))  if __name__ == "__main__":    main()
目的:用三个小任务直观演示本文的核心公式——延迟分解、批处理吞吐、量化压缩,运行即可在终端看到优化前后的数据对比。
  1. total_ms = ttft_ms + per_token_ms * (seq_len - 1)实现“首Token + 每Token×(N−1)”的总延迟公式,观察 TTFT 占比变化。
  2. ttft_ratio = ttft_ms / total_ms算出首 Token 延迟占比,占比高说明瓶颈在“第一道菜上桌”。
  3. def simulate_batch(batch_size, seq_len, gpu_capacity=400):模拟“一锅炒多份”的批处理场景。
  4. compute_ms = max(gpu_capacity, batch_size * seq_len * 2.0) * 0.1批小时 GPU 算力吃不满,批大时按计算量线性增长。
  5. throughput = batch_size * 1000.0 / batch_ms对应吞吐量公式,直观看到批处理带来的收益。
  6. def quantized_size(bits, original_mb=3500):估算不同位宽下 7B 模型的体积。
  7. return original_mb * bits / 32.0体积按位宽比例线性缩小,32 位降到 8 位就是四分之一。
  8. if __name__ == "__main__":标准程序入口,保证模块被导入时不会误执行演示逻辑。

常见误区

误区把模型从 FP32 压到 INT8,精度损失肯定很大,AI 会明显变傻,这个方案我不敢用。

正解量化更像把菜谱里的“少许盐”改成“2 克盐”——量取的精度降低了,但味道几乎不变。神经网络权重分布相对集中,对微小扰动有天然鲁棒性,INT8 量化在绝大多数任务上的精度损失通常在 1%~3% 以内;如果还不够,可以用量化感知训练(QAT)在训练阶段就让模型适应低精度。把量化想象成“换平价食材”,而不是“换掉整道菜”。

为何常见:人们直觉上把“精度”等同于“准确性”,忽略了模型权重中大量的冗余信息。事实上 4 位量化在很多场景下依然可用。

误区反正批处理能提高吞吐量,那把 batch size 调到最大,每秒处理的请求就最多,性能肯定最优。

正解批处理是“一锅炒多份”,但锅越大,单份菜出锅的时间也越长。batch 过大会拉长单个请求的延迟,超过 SLO 红线反而不可接受,还会把显存撑爆。正确做法是像有经验的调度员一样:按排队长度和显存余量动态决定批大小,在吞吐与延迟之间找平衡,而不是无脑拉满。

为何常见:只盯着“吞吐量”一个指标,忽略了对用户感知最重要的单请求延迟。吞吐和延迟本就是一对需要权衡的矛盾。

误区KV Cache 能避免重复计算历史,那当然是缓存得越多越好,全部历史都存下来,越久越划算。

正解高汤虽好,冰箱有限。KV Cache 的显存占用随序列长度线性增长,长上下文场景下非常惊人,不加管理会导致显存溢出或被迫压缩批大小。所以工程上要做前缀共享、分页式显存管理,甚至对超长历史做淘汰或摘要压缩——缓存是工具,不是无底洞。

为何常见:人们天然觉得“缓存”是纯福利,忽略了显存是稀缺资源。缓存的空间成本被低估,是这类误区高发的根源。

误区只要把模型做小、做量化、做剪枝,响应速度自然就快了,其他环节不用管。

正解端到端延迟包含网络传输、请求排队、输入预处理、自回归生成、流式返回等多个环节,模型计算只是其中一环。就像出餐快不只看厨师——点单慢、传菜通道堵、摆盘磨蹭,都会让客人干等。真正的优化必须从“用户点击发送”到“完整内容显示”全链路剖析,用监控数据找出真正的瓶颈。

为何常见:模型层技术含量高、话题热,容易吸引全部注意力;而排队、网络这些“平凡”环节往往被忽视,直到压测时才发现它们才是短板。

面试题

Q1. 用户点击“发送”到看到回复的第一个字,这段耗时在推理延迟优化中称为?

单选题 · easy

  • A.逐字生成单个字耗时
  • B.首字延迟TTFT值← 正确答案
  • C.端到端完整响应耗时
  • D.单批请求平均处理时延

答案:B。首 Token 延迟(TTFT)指从请求发出到模型吐出第一个字的时间,相当于“厨房接单到第一道菜上桌”。A 是逐 Token 延迟,C 是整体响应时间,D 是批处理摊薄后的平均延迟,都不是本题所指。

Q2. 下列哪种手段属于“给模型菜谱瘦身”的模型压缩?

单选题 · easy

  • A.扩大训练数据规模
  • B.权重INT8量化压缩← 正确答案
  • C.增加更多网络层数
  • D.提升GPU主频频率

答案:B。量化属于模型压缩三大手段之一(量化、剪枝、蒸馏),把 32 位浮点权重压到 8 位整数,像换用平价食材。扩大数据、增加层数是“变重”,提升 GPU 主频是硬件加速,都不属于压缩。

Q3. 关于 KV 缓存的作用,下列表述正确的有哪些?

多选题 · mid

  • A.缓存注意力中间变量← 正确答案
  • B.避免重复计算历史← 正确答案
  • C.显存占用随序列增长← 正确答案
  • D.自动清除所有冗余

答案:ABC。KV Cache 把历史位置的 Key 和 Value 缓存下来,新 Token 直接复用,避免重复计算整个对话历史(A、B 对);缓存量随序列长度线性增长,非常吃显存(C 对)。D 错误——缓存不会“自动清除”,必须靠前缀共享、分页管理等手段主动管理。

Q4. 模型从 FP32 量化到 INT8 后,体积缩减到原来的多少?

单选题 · mid

  • A.四分之一左右体积← 正确答案
  • B.二分之一左右体积
  • C.八分之一左右体积
  • D.十六分之一左右体积

答案:A。体积缩减倍数 = 原始位宽 ÷ 量化位宽 = 32 ÷ 8 = 4,所以 INT8 大约是原体积的四分之一。这就像把 4 字节的“豪华包装”压缩成 1 字节的“轻便包装”,内容几乎不变,搬运成本大降。

Q5. 连续批处理相比传统批处理的优势包括哪些?

多选题 · mid

  • A.请求结束立即让位← 正确答案
  • B.以Token粒度调度← 正确答案
  • C.整批任务完成才回收
  • D.提升GPU整体利用率← 正确答案

答案:ABD。连续批处理不以“整批”为单位等待所有请求结束,而是以 Token 为粒度,某个请求生成完立刻腾出位置给新请求(A、B 对),从而让 GPU 始终满载(D 对)。C 描述的是传统批处理的缺点,恰恰是连续批处理要解决的问题。

Q6. 批处理不是越大越好,batch 过大最可能带来什么后果?

单选题 · hard

  • A.网络带宽成倍增加
  • B.模型精度自动变高
  • C.显存占用不升反降
  • D.单请求延迟明显拉长← 正确答案

答案:D。锅越大,单份菜出锅越慢。batch 过大会拉长单个请求的端到端延迟,超出 SLO 红线,同时显存占用上升、可能 OOM。B、C 明显错误,A 与批处理无直接关系。

Q7. 量化公式 q=round(x/s)+z 中,缩放因子 s 的核心作用是?

单选题 · mid

  • A.提升模型原有的精度
  • B.调整批处理的队列大小
  • C.决定量化精度映射范围← 正确答案
  • D.控制剪枝稀疏程度

答案:C。s 把浮点数值范围映射到整数范围,s 越小、量化颗粒越细、精度损失越小,映射范围由它决定。A 说反了,量化不会提升精度;B、D 分别属于调度和剪枝的范畴。

Q8. 端到端推理延迟通常包含下列哪些环节?

多选题 · hard

  • A.请求排队与组合批次← 正确答案
  • B.输入预处理与Token化← 正确答案
  • C.自回归逐Token前向← 正确答案
  • D.模型离线训练的反向传播

答案:ABC。端到端延迟从用户点击发送算到内容完整显示,包括排队调度、输入 token 化、自回归生成、网络传输与流式返回等。D 是训练阶段的反向传播,与推理路径无关,不产生在线延迟。

Q9. 衡量推理服务“最差的那 1% 体验”,最合适的指标是?

单选题 · easy

  • A.所有请求平均响应耗时
  • B.训练集上的准确率数值
  • C.P99分位延迟时间← 正确答案
  • D.P50中位数延迟时间

答案:C。P99 表示把请求延迟排序后 99% 位置的延迟,代表最差 1% 用户的体验。平均耗时和中位数都会掩盖长尾问题,准确率则是模型质量而非性能指标。餐厅要看“最难等的十桌客人”等了多久,而不是只看平均上菜时间。

Q10. 在知识蒸馏中,“学生模型”的典型特征是什么?

单选题 · extreme

  • A.训练数据必须完全交换
  • B.参数量是老师模型的一倍
  • C.参数量小输出逼近老师← 正确答案
  • D.完全丢弃老师的软标签

答案:C。蒸馏的核心是让学生模型模仿老师模型的输出分布(软标签),从而以更小的参数量逼近老师的表现,像一个轻巧的徒弟学走老师的功夫。A 是训练数据的处理方式,B 说反了,D 恰恰相反——蒸馏正是要利用软标签。