想象你就是一家“AI 面馆”的老板。你花重金请来一位米其林大厨——他的厨艺全城顶尖,但时薪贵得惊人。更头疼的是,这位大厨坚持每碗面都从和面、熬汤开始现做,客人点一碗,他忙活半天。你发现一个残酷的事实:每卖出一碗面,你不仅不赚钱,还要倒贴两块钱。卖得越多,亏得越多。 要扭转局面,你得学会“精打细算”:能不能把顶级食材换成浓缩调料?能不能提前熬一大锅高汤,而不是每碗面都重新熬?能不能把“等人齐才上菜”的圆桌改成“随到随吃”的回转寿司?能不能让传菜员提前猜出客人要点的菜,让大厨只管掌勺?这四招,正是推理优化服务的秘密。 推理优化,就是让 AI 面馆在同样的厨房成本下,做出更多碗面,而且味道不打折。它不是玄学,而是一套看得见、摸得着的“省钱兵法”。

岗位关联

掌握推理优化,你能把 GPU 账单砍掉一半以上,让 MaaS 业务从烧钱走向盈利——这是 AI 商业化最硬核的护城河。

目录
  1. 可视化演示
  2. 成本困局:每碗面都在亏钱
  3. 量化压缩:浓缩调味料
  4. KV缓存复用:提前熬好的高汤
  5. 连续批处理:圆桌改回转寿司
  6. 投机解码:传菜员的秒级预判
  7. 吞吐度量:翻台率说了算
  8. 成本核算:算清盈亏这本账
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

通过优化技术管道、KV Cache复用和连续批处理三个模式,展示推理服务如何提升吞吐量并降低每token成本。

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

推理优化技术管道 量化压缩:FP16→INT8/INT4,减少显存占用和计算量 KV Cache复用:避免重复计算历史token的注意力 吞吐 = tokens / (GPU时间 × 显存) 四种技术协同提升单卡吞吐量,降低每token成本

成本困局:每碗面都在亏钱

想象你投资开了一家“AI 面馆”。你请来一位米其林大厨,他做面手艺一绝,但出场费极其昂贵。更麻烦的是,大厨做每一碗面都坚持从和面、熬汤开始,绝不用提前备好的半成品。你算了笔账:一碗面卖 10 块,但原料加厨师工时加房租水电摊下来,成本是 12 块。每卖出一碗面,你倒贴 2 块。

MaaS(模型即服务)正是这样一家“AI 面馆”。服务商租来 GPU 服务器,把大模型跑在上面,按 token 数量向用户收费。你每问一句,模型吐出一段文字,每个 token 都是钱。可 GPU 太贵了:一张 H100 显卡时租上百元,大模型生成一段回答要用掉大量算力。如果按自然效率服务,所有请求消耗的成本加起来,远超用户支付的费用。

推理成本可以浓缩成一个公式:每 token 成本 = GPU 总成本 ÷ token 总产量。GPU 成本是最大的“分子”,token 产量是“分母”。要降低每 token 成本,只有两条路:降低分子,或增大分母。推理优化服务的核心方法论,就是围绕“增大分母”做文章——让每张 GPU 卡每秒都尽可能多地吐出 token。

如果面馆每月开销 12 万元,卖出 1 万碗面,每碗成本就是 12 元;卖出 2 万碗,就降到 6 元。推理优化服务的所有技术,本质上都是在帮面馆“多卖面”——在同样的 GPU 资源下,榨出更多 token。

每 token 成本=CGPUTtoken\displaystyle \text{每 token 成本} = \frac{C_{\text{GPU}}}{T_{\text{token}}}
把 GPU 月度总账单除以当月产出的 token 总数,就得到每个 token 的平均成本——这就像把面馆的房租、工资、食材全部摊到每一碗面上。
  1. 分子 C_GPUGPU 集群月度总成本,包括采购摊销、电力、机房租金。在 MaaS 账本里它是最大单项开支。
    CGPUC_{\text{GPU}}
  2. 分母 T_token一个月里所有用户请求生成的所有 token 总数,代表“面馆卖出多少碗面”。
    TtokenT_{\text{token}}
  3. 相除摊薄把总账单除以总产量,得到单个 token 的平均成本。分子越少、分母越大,结果越小。
    CGPUTtoken\frac{C_{\text{GPU}}}{T_{\text{token}}}

量化压缩:浓缩调味料

你发现大厨有个习惯:他坚持用最好的顶级调味料,每罐 5 公斤,做一碗面只用一小勺。储藏室被大罐子塞满,每月调味料开销吓人。你悄悄做了个实验:把调料换成浓缩小包装,用量减半,做出来的面顾客根本吃不出差别。

大模型里的“调味料”就是权重参数。一个 700 亿参数的模型,用 FP16(16 位浮点数)格式存储要占 140GB 显存,一张 A100 都装不下。但研究发现,这些参数数值的精确度要求没有想象中那么高——把 3.14159265 变成 3.14,对最终结果的影响微乎其微。于是量化技术出现了:用更少的比特数来存放每个参数。

FP16 用 16 个比特表示一个参数,INT8 用 8 个比特,INT4 用 4 个比特。参数数量不变,每个参数占用的“空间”变小了,模型整体内存直接减半、再减半。模型内存变小,原本放不下的模型能放进单卡,原本单卡能同时服务 10 个请求,现在能服务 20 个。常见的量化策略有训练后量化(PTQ)和量化感知训练(QAT):前者直接转换,后者在训练时就模拟低比特误差,精度损失更小。

就像大罐调味料换成浓缩小袋,5 公斤变 500 克,味道几乎不变,储藏空间却大幅缩水。当然,浓缩过头也会翻车:INT4 有时会出现“味道发苦”(精度明显下降),需要配合校准数据集等补救手段。

模型内存=N×b8\displaystyle \text{模型内存} = \frac{N \times b}{8}
模型占用的字节数等于参数量乘以每个参数的比特数,再除以 8(1 字节 = 8 比特)。比特数越低,模型越“轻”。
  1. N 参数量模型里的权重个数,比如 70 亿。
    NN
  2. b 位宽每个参数用多少比特表示,FP16=16,INT8=8,INT4=4。
    bb
  3. 除以 8 换字节把比特数换算成字节数,得到最终占用内存。
    N×b8\frac{N \times b}{8}

KV缓存复用:提前熬好的高汤

面馆的招牌高汤需要凌晨 3 点开始熬,一锅汤足足 6 小时。你发现大厨有个执念:每做一碗面,都要重新熬一锅汤!这不是疯了嘛。你立刻定下规矩:每天早起只熬一锅大高汤,之后每碗面只需要舀一勺汤、煮一份面。

大模型生成文字是一个接一个蹦出来的。在生成第 100 个 token 时,模型必须重新“回顾”前面 99 个 token 的内容,计算它们之间的注意力关系。如果不做任何缓存,每一次生成都要把前面所有 token 的注意力计算全部重来一遍——这正是“每碗面重新熬汤”的算力版。

注意力机制里,每个 token 会被映射为 Query(Q)、Key(K)、Value(V)三个向量。K 和 V 负责“存档”这个 token 的信息。既然之前的 token 不会再变化,它们的 K、V 完全可以存下来,下次生成新 token 时直接复用。这个缓存就是 KV Cache。它的代价是显存占用随序列长度线性增长:序列越长,需要的“储藏室”越多。

高汤提前熬好后,之后每碗面只花煮面的成本。KV Cache 就是那锅高汤——牺牲一些“储藏室”(显存),换来了生成速度的大幅提升。这也是为什么长对话的显存开销会逐轮上涨。

KV Cache 大小=2×L×H×d×S×b\displaystyle \text{KV Cache 大小} = 2 \times L \times H \times d \times S \times b
KV Cache 的显存开销由层数、注意力头数、头维度、序列长度共同决定,还乘上 2 是因为 K 和 V 都要缓存。
  1. L 层数Transformer 网络的深度,比如 32 层。
    LL
  2. H 头数每层注意力机制的头数,例如 32 个头。
    HH
  3. d 头维度每个注意力头的向量维度,比如 128。
    dd
  4. S 序列长度当前已生成的 token 数量,随对话进行不断变长。
    SS
  5. b 字节数与乘 2每个数值占的字节数(FP16 为 2 字节),且 K 和 V 两份都要存。
    2×b2 \times b

连续批处理:圆桌改回转寿司

面馆刚开始是“圆桌制”:凑齐一桌 6 人才开始上菜。问题是,有人 5 分钟吃完走了,有人 50 分钟还在慢慢聊。整桌人必须等最慢的人,4 张桌子永远不够用,翻台率惨不忍睹。

传统静态批处理(static batching)就是这种“圆桌制”:请求必须凑满一批才开始推理,整个 batch 要等全部请求生成完毕才一起结束。但每条请求天差地别——有的只需要“嗯”一个字,有的要生成 500 字的论文。短请求早就完成了,却被困在 batch 里干等,GPU 算力白白浪费。

连续批处理(continuous batching)改变了规则:请求结束立刻离席,空出的位置马上让新请求补进来,GPU 永远满载。为了让显存调度更高效,vLLM 框架提出了 PagedAttention 技术,像操作系统的虚拟内存一样,把 KV Cache 按页管理、按需分配,避免显存碎片化。这一套组合拳可以把单卡吞吐量提升数倍。

把“圆桌制”改成“回转寿司”,每位顾客随到随吃、吃完就走,同样的店面可以接待远超之前的客流。连续批处理正是这样让 GPU 这张“桌子”永不空置。

吞吐量=N完成请求Δt\displaystyle \text{吞吐量} = \frac{N_{\text{完成请求}}}{\Delta t}
吞吐量就是单位时间内完成的请求数——面馆的翻台率。同样的桌子,翻台越快,接待的客人越多。
  1. N_完成请求一段时间内处理完毕的请求总数。
    N完成请求N_{\text{完成请求}}
  2. Δt 时间窗口用户视角的真实经过时间。
    Δt\Delta t
  3. 相除得翻台率单位时间内能翻多少次台,这是衡量 GPU 效率的核心指标。
    N完成请求Δt\frac{N_{\text{完成请求}}}{\Delta t}

投机解码:传菜员的秒级预判

传菜员小李非常机灵。客人刚落座,他看一眼就猜出对方会点什么菜,提前通知后厨备料。大厨出场后只需要点头确认或摇头纠正。猜中的菜直接省掉了备料时间——出菜速度快了一大截。

自回归生成是逐 token 进行的:生成第 t 个 token,需要先有第 t-1 个 token。这是大模型推理的基本瓶颈,每一步都需要一次完整的前向传播。投机解码(speculative decoding)的巧思在于:先让一个小而快的“草稿模型”一口气猜出接下来 γ 个 token,再由大模型一次前向传播并行验证这些候选——猜对的地方全部“免单”。

草稿模型通常比主模型小一个数量级,成本极低。大模型验证 γ 个候选 token 只需要一次前向传播,与生成 1 个 token 的计算量几乎一样。如果草稿的接受率为 α,那么每轮平均产出的 token 数约为 (1-α^{γ+1})/(1-α)。当 α=0.8、γ=3 时,每轮产出约 2.95 个 token,接近原生速度的 3 倍。关键保障:被拒绝的位置用主模型自己的输出替代,最终结果与主模型独自生成保持一致。

小李猜得越准、一次备菜越多,翻台速度越快。而大厨拥有最终拍板权——猜错的地方以他为准。所以这道菜永远保持大厨水准,顾客绝不会吃到“传菜员掌勺”的味道。

每轮 token 数=1−αγ+11−α\displaystyle \text{每轮 token 数} = \frac{1 - \alpha^{\gamma+1}}{1 - \alpha}
这个公式算出“每轮前向传播平均能白赚几个 token”。猜得越准(α 高)、一次猜越多(γ 大),赚得越多。
  1. α 接受率草稿 token 被主模型认可的概率,越高越好。
    α\alpha
  2. γ 草稿数量草稿模型每轮猜几个 token,越大单轮收益越大。
    γ\gamma
  3. α^(γ+1)一连猜中 γ+1 个的概率,随着次数增加迅速变小。
    αγ+1\alpha^{\gamma+1}
  4. 分母 1-α把“直到首次猜错为止”的期望步数算出来,得到最终加速倍数。
    1−α1 - \alpha

吞吐度量:翻台率说了算

生意上了正轨,你开始认真记账:面馆一天能接多少客?每桌客人平均坐多久?这些数字决定营收的天花板。你决定装一个计数器,记录每天的翻台数。

推理服务也有自己的“计数器”。业界常用两个关键指标衡量推理速度:

  • TTFT(Time to First Token):用户发出请求到收到第一个 token 的延迟,直接影响“首字响应”体验;
  • 吞吐量(throughput):单位时间内完成的 token 总数,决定 GPU 的“赚钱能力”。

两者往往此消彼长,服务商需要在延迟和吞吐之间寻找平衡。单卡吞吐量衡量单张 GPU 的产出能力,是推理优化最重要的“翻台率”指标。量化、KV Cache、连续批处理、投机解码四招组合后,单卡吞吐量可能从几百 token/s 提升到几千 token/s。压测时,通常设定一个可接受的 P99 延迟上限,然后不断加大并发,测出系统在延迟约束下的最大吞吐量。

翻台率是所有优化手段的最终裁判。无论厨房改得多么花哨,最终要看每张桌子一天接待了几拨客人。同理,所有推理优化技术的成败,都落在“单卡每秒产出多少 token”这一硬数字上。

单卡吞吐量=T输出 token 数NGPU×Δt\displaystyle \text{单卡吞吐量} = \frac{T_{\text{输出 token 数}}}{N_{\text{GPU}} \times \Delta t}
一张 GPU 卡在一秒钟内能吐出多少 token。四招优化效果如何,最终都由这个“翻台率”数字来裁判。
  1. T_输出 token 数统计窗口内所有请求生成内容的 token 总和。
    T输出 token 数T_{\text{输出 token 数}}
  2. N_GPU 卡数参与服务的 GPU 数量,除以它是为了得到“单卡”水平。
    NGPUN_{\text{GPU}}
  3. Δt 时长统计窗口的物理时长。
    Δt\Delta t
  4. 相除一张卡一秒钟能产出多少 token,这就是优化效果的终极标尺。
    T输出 token 数NGPU×Δt\frac{T_{\text{输出 token 数}}}{N_{\text{GPU}} \times \Delta t}

成本核算:算清盈亏这本账

三个月过去,你把账本摊开:房租、水电、食材、厨师工资、传菜员工资……所有开销加总,除以卖出的总碗数,得到每碗面的真实成本。你还要算清楚:一碗面卖多少钱能回本?多卖一碗能多赚多少?

MaaS 的商业模式同样要做这道除法。服务商的收入按 token 计费:用户每消耗一个输入 token、每生成一个输出 token,都要支付一定费用。而成本端最大的变量是 GPU:模型越大、服务越繁忙,GPU 账单越惊人。只有当“每 token 成本”小于“每 token 售价”,业务才有毛利。推理优化服务的全部价值,就是把这个成本不断压低,让利润空间变大。

计算盈亏平衡价很简单:月度 GPU 总成本除以月度 token 总产出。产出由吞吐量直接决定:单卡吞吐量越高,同样 GPU 资源下每月能卖的 token 总数越大,摊到每个 token 上的固定成本越低。优化前,某 70B 模型服务可能每百万 token 成本高达 30 元;优化后(量化 + 连续批处理 + KV Cache),可以降到 10 元以内——而市场售价可能只有 15 元。这一步之差,就是亏钱和赚钱的分水岭。

浓缩调料、提前熬汤、回转寿司、机灵传菜员——四招全用上后,每碗面成本从 12 元降到 8 元。面馆终于从“卖一碗亏一碗”变成“卖 10 元净赚 2 元”。这就是推理优化服务的终极意义:让 AI 面馆活下去,并且活得漂亮。

盈亏平衡单价=CGPU 月成本T月 token 产出\displaystyle \text{盈亏平衡单价} = \frac{C_{\text{GPU 月成本}}}{T_{\text{月 token 产出}}}
把 GPU 集群的月度总成本除以月度 token 总产量,得到不亏本的最低单价。卖价高于它,就有毛利。
  1. C_GPU 月成本GPU 集群月度总成本,含硬件摊销、电力、机房。
    CGPU 月成本C_{\text{GPU 月成本}}
  2. T_月 token 产出月度总 token 数,由“单卡吞吐量 × 卡数 × 月运行时长”算出。
    T月 token 产出T_{\text{月 token 产出}}
  3. 相除得盈亏点把固定成本摊到每个 token 上,得到不亏本的最低售价,这是商业模型的生死线。
    CGPU 月成本T月 token 产出\frac{C_{\text{GPU 月成本}}}{T_{\text{月 token 产出}}}

AI 应用场景

云厂商 MaaS 平台的大规模降本

阶段:推理服务部署与优化

解决的问题:某云厂商提供大模型对话 API,日请求量千万级。传统静态批处理下 GPU 利用率仅 30%,每百万 token 成本 25 元,高于 20 元的市场售价,业务持续亏损。

具体案例:推理平台团队引入 vLLM 连续批处理 + KV Cache 复用,配合 INT8 量化把模型内存减半。单卡并发从 12 路提升到 48 路,吞吐量从 800 token/s 提升到 2800 token/s,每百万 token 成本从 25 元降到 9 元,利润率由负转正。

AI 编程助手 SaaS 的低延迟改造

阶段:在线推理服务

解决的问题:代码补全对首 token 延迟极其敏感,用户打字停顿 0.5 秒就能感觉到“卡顿”。原始模型 TTFT 约 1.2 秒,体验不可接受。

具体案例:客户端先由一个轻量代码模型快速预测用户可能要补全的片段(草稿模型),再将候选交给云端大模型验证。TTFT 下降到 700ms,用户感知变成“边打字边补全”,次日留存率提升 15%,付费转化率同步上升。

金融企业私有化部署的算力紧缩

阶段:模型部署与推理服务

解决的问题:某券商因合规要求数据不出内网,必须在自有服务器上跑 70B 模型做研报分析,但预算只够买 2 张 A100。

具体案例:70B 模型 FP16 需要 140GB 显存,2 张 A100(每张 80GB)也紧张。使用 INT8 量化后模型内存降到 70GB,配合 KV Cache 复用和连续批处理,2 卡稳定服务 20 个并发用户,单月成本比云上租用下降 60%。

Python 演示

python47 行
"""对比静态批处理与连续批处理的翻台率(吞吐量)"""import random  class Request:    """一位顾客:speed 表示 ta 的吃饭速度,progress 表示已吃完的比例"""     def __init__(self, speed):        self.progress = 0.0        self.speed = speed     def advance(self, amount):        self.progress += amount        return self.progress >= 1.0  def simulate(batch_size, rounds, continuous):    """模拟两种服务模式,返回完成的请求数"""    done = 0    queue = [Request(random.uniform(0.4, 1.2)) for _ in range(batch_size)]    for _ in range(rounds):        if continuous:            # 连续批处理:每位顾客按自己速度吃,吃完立刻补位            for req in queue[:]:                if req.advance(req.speed * 0.1):                    done += 1                    queue.remove(req)                    queue.append(Request(random.uniform(0.4, 1.2)))        else:            # 静态批处理:整桌齐步走,速度被最慢的顾客拖住            slowest = min(req.speed for req in queue)            for req in queue:                req.advance(slowest * 0.1)            if all(req.progress >= 1.0 for req in queue):                done += len(queue)                queue = [Request(random.uniform(0.4, 1.2)) for _ in range(batch_size)]    return done  if __name__ == '__main__':    batch = 6    steps = 500    static_done = simulate(batch, steps, continuous=False)    dynamic_done = simulate(batch, steps, continuous=True)    print(f"静态批处理完成: {static_done} 单")    print(f"连续批处理完成: {dynamic_done} 单")    print(f"翻台率提升: {dynamic_done / max(static_done, 1) * 100 - 100:.1f}%")
目的:用两个模拟器分别跑“圆桌制”(静态批处理)和“回转寿司”(连续批处理),直观看出翻台率差异。
  1. class Request:把一位“顾客”建模成带吃饭速度和吃完进度的对象。
  2. def advance(self, amount):让顾客吃一口,返回是否已经吃完离席。
  3. simulate(batch_size, rounds, continuous)主模拟函数,一个函数两种模式。
  4. min(req.speed for req in queue)静态批处理的“最慢顾客”拖住了整桌人的速度。
  5. queue.remove(req); queue.append(...)连续批处理吃完即补位,桌子永不空置。
  6. if __name__ == '__main__':脚本入口,同时跑两种模式并输出对比结论。

常见误区

误区我试过 INT8 量化,模型回答明显变笨了。量化就是有损压缩,模型能力一定会大幅下降,只能用在简单任务上。

正解现代量化技术(尤其是量化感知训练 QAT 和混合精度量化)在 INT8 下能保持 99% 以上的效果。损失大的场景往往是没有做适当校准,或者直接量到 INT4 且不做任何补偿。就像浓缩高汤,配方得当味道几乎不变;但直接把整锅汤晒成盐块再兑水,那肯定翻车。关键在于“怎么浓缩”。

为何常见:很多教程直接跑一个量化脚本就上线,缺少校准数据集和精度评估,“盲量化”导致效果崩坏,于是以讹传讹。

误区KV Cache 就是把模型权重提前缓存到显存里,减少 IO 加载时间吧?

正解不对。KV Cache 缓存的是推理过程中同一条请求已经生成 token 的 Key 和 Value 向量,避免每次生成时重复计算前面所有 token 的注意力。模型权重是静态的,属于“调料配方”;KV Cache 是每次服务的“高汤”,跟请求内容相关,会随对话增长。

为何常见:名字里带“Cache“就容易联想到”缓存权重”,加上权重也确实常被缓存到显存,概念混淆很自然。

误区既然连续批处理好,那把并发直接拉满,batch size 开得越大,GPU 利用率越高,吞吐量一定越高!

正解吞吐量、延迟、显存三者存在平衡。batch 太大会导致显存溢出,或整体延迟飙升、P99 不可接受;批内请求互相争抢计算资源,单请求响应被拖慢。最优 batch size 是在延迟预算内尽量大,而非无限大。就像自助餐厅座位越多越好,但坐满会堵住过道、排队取餐,反而翻台更慢。

为何常见:直觉上“满载 = 高效”,但忽略了延迟约束和显存上限这两个硬边界。

误区投机解码用草稿模型生成,那输出结果就是“草稿模型 + 主模型混合”的产物,跟主模型自己生成的结果不一样吧?

正解投机解码的拒绝机制保证:当主模型不认可草稿 token 时,会用主模型自己计算的分布重新采样,替代草稿的预测。因此最终输出与主模型单独生成在概率分布上完全一致(某些实现甚至可证明等价)。加速的是过程,不是内容。传菜员可以猜菜,但上桌的菜必须是大厨亲手掂过勺的。

为何常见:看到“草稿模型”就以为是“小模型在代劳”,忽略了“验证”这一步是主模型亲自完成的。

面试题

Q1. 量化压缩的核心原理是什么?

单选题 · easy

  • A.把模型文件压缩成 zip 再加载
  • B.用更低比特数表示参数减少内存← 正确答案
  • C.删掉模型中不重要的网络层
  • D.用 CPU 替代 GPU 进行推理

答案:B。量化是用更少的比特存参数,就像把大罐调味料换成浓缩小袋。zip 是文件压缩,删层是剪枝,换 CPU 是换硬件,都与量化原理不符。

Q2. 连续批处理相比静态批处理,最大的改进是什么?

单选题 · easy

  • A.完全取消批处理机制
  • B.每个批次必须等最慢请求
  • C.请求完成即离席无需等整批← 正确答案
  • D.一次性把并发开到无穷大

答案:C。连续批处理让完成的请求立刻离席、新请求随时补位,像回转寿司随到随吃。取消批处理、无限并发都不现实,等最慢请求是静态批处理的缺点而非改进。

Q3. KV Cache 中缓存的 K 和 V 分别指什么?

单选题 · mid

  • A.模型权重和偏置参数
  • B.注意力 Key 和 Value 矩阵← 正确答案
  • C.词表和位置编码向量
  • D.梯度和学习率超参数

答案:B。注意力机制中每个 token 生成 Key 和 Value 向量用于信息存档,KV Cache 缓存的就是它们。权重、词表、梯度都不是推理时需要按请求缓存的对象。

Q4. 关于 KV Cache 的大小,下列说法正确的是?

单选题 · mid

  • A.只与模型的层数有关
  • B.只与序列长度和批大小有关
  • C.与层数头数维度序列长度都有关← 正确答案
  • D.与训练时的 batch size 有关

答案:C。KV Cache 大小 = 2 × 层数 × 头数 × 头维度 × 序列长度 × 字节数,四者共同决定。只取其中一两个的说法都不完整,训练 batch size 与推理缓存无关。

Q5. 投机解码中“草稿模型”的核心作用是什么?

单选题 · mid

  • A.完全替代主模型生成答案
  • B.快速提出候选 token 由主模型验证← 正确答案
  • C.压缩主模型的 KV 缓存大小
  • D.显著降低主模型的显存占用

答案:B。草稿模型的作用是快速猜出候选 token,主模型一次前向传播验证多个候选,猜中即免单。它不替代主模型、不压缩 KV Cache、不降低显存,只是“传菜员先猜菜”。

Q6. TTFT(Time to First Token)衡量的是什么?

单选题 · mid

  • A.首个 token 到达前的等待时间← 正确答案
  • B.每个 token 的平均生成耗时
  • C.模型一次完整训练的总时长
  • D.请求在队列中的排队耗时

答案:A。TTFT 是用户发出请求到收到第一个 token 的延迟,直接决定“首字响应”体验。每 token 生成耗时是 TPOT,训练时长和排队耗时都与 TTFT 定义不符。

Q7. 某模型 L=32 层、H=32 头、d=128 维,KV Cache 中每个值占 2 字节,序列长度 S=2048,KV Cache 总大小约为多少?

单选题 · hard

  • A.约 1GB← 正确答案
  • B.约 512MB
  • C.约 128MB
  • D.约 64MB

答案:A。按公式 2 × 32 × 32 × 128 × 2048 × 2 = 1,073,741,824 字节 ≈ 1GB。关键在于不要漏掉“×2“(K、V 两份)和”×2 字节”。其他选项都是漏乘某个因子得到的错误结果。

Q8. 推理成本高的主要来源包括哪些?

多选题 · hard

  • A.GPU 采购与租赁成本← 正确答案
  • B.批处理等待的算力浪费← 正确答案
  • C.推理过程中的电力功耗← 正确答案
  • D.训练数据的标注与清洗

答案:ABC。推理成本由 GPU 硬件、电力和算力浪费构成。D 属于训练阶段的数据成本,与推理服务无关。优化手段正是针对这三项分别降本。

Q9. 下面哪些手段能有效提升单卡吞吐量?

多选题 · extreme

  • A.INT8 量化给模型瘦身← 正确答案
  • B.KV 缓存复用减少重复计算← 正确答案
  • C.连续批处理填满算力空隙← 正确答案
  • D.投机解码一次验证多个 token← 正确答案

答案:ABCD。四招分别减少内存占用、避免重复计算、消除等待空闲、并行产出多 token,都能提升单卡单位时间的 token 产出量。它们正是推理优化服务的四大核心手段。

Q10. 关于推理优化服务,下列说法正确的是?

多选题 · easy

  • A.在保证质量前提下降低每 token 成本← 正确答案
  • B.量化一定会让模型完全失去能力
  • C.KV 缓存减少请求内的重复计算← 正确答案
  • D.投机解码的输出与主模型基本一致← 正确答案

答案:ACD。推理优化服务的目标就是质量不变、成本下降。量化若校准得当精度损失很小;KV Cache 避免重复计算;投机解码有主模型验证兜底,输出与主模型一致。B 说法过于绝对,是常见误区。