假设你是一家米其林餐厅的老板。营业高峰,客人不断催促,后厨热火朝天:有人负责炒菜,有人负责切配,冷藏柜里储备着各种食材,出餐口还堆着外卖盒。如果只靠月底看账本,你根本无法知道哪道菜卡在了哪一桌、哪口锅空了、明天该多进哪种食材。于是你装了一套“中控系统”:摄像头看后厨、点单屏看实时订单、送货单看库存,所有数据汇到一块大屏——这就是餐厅的监控大盘。 GPU推理服务也一样:GPU芯片是厨师,显存是操作台,请求是一张张订单。模型上线只是开始,真正考验人的是上线之后能不能看清“厨房”里发生了什么:算力有没有浪费?显存够不够用?用户的请求要等多久?这些问题都需要一块「GPU推理专用监控大盘」来回答。本篇文章会用这座AI餐厅的故事,带你把可观测性、核心指标、性能调优、告警治理一次看明白。

岗位关联

学会搭建GPU推理监控大盘,是AI基础设施工程师的必备技能。它能帮你快速定位性能瓶颈、守住SLO、节省GPU成本,让AI服务稳定又高效。

目录
  1. 可视化演示
  2. 大盘设计概览:餐厅的中控台
  3. 核心GPU指标:厨师的脉搏
  4. 推理性能指标:上菜速度的真实体验
  5. 批处理与并发:一次做好几道菜
  6. 资源优化:让厨房井井有条
  7. 告警与SLO:守住出餐承诺
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

三步展示GPU推理专用监控大盘:利用率/显存/温度/功耗GPU特有指标、采集→存储→展示→告警监控流程、以及实时监控与历史分析的时间维度对比。

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

GPU特有指标 利用率:SM占用率 显存:使用量/KV cache 温度/功耗:降频风险 DCGM/nvidia-smi采集 发现GPU级问题如显存泄漏。

大盘设计概览:餐厅的中控台

想象你给餐厅装中控台:一排屏幕显示订单量,一排摄像头盯着后厨,另一排显示冰箱库存。有了这些,你就能随时回答“现在生意怎样”“哪里会不会出问题”。GPU推理监控大盘就是AI服务的中控台。它把大量零散的运行数据拼成一眼能看懂的图表,让你像餐厅老板一样在几分钟内掌握全局。

在可观测性领域,这些数据被归纳为三大支柱:指标(Metric) 是定时采样的数值,比如GPU利用率、每秒请求数;日志(Log) 是记录事件细节的文本,比如某次请求超时的报错;链路追踪(Trace) 则是还原一个请求经过网关、预处理、推理引擎的完整路径。监控大盘把这三类信息汇总在一起,形成“总览—下钻—定位”的闭环。

设计大盘时,最忌讳把几百个图表堆在一起。好的大盘有三条原则:先确定一个北极星指标作为最高层的“红灯”;再按“集群—实例—请求”做分层下钻;最后用视觉颜色区分繁忙、高负载、过载三个状态。衡量整体好坏最常用的北极星指标就是服务健康度,也就是满足服务质量目标的请求占比。

回到餐厅比喻:健康度是那块最显眼的“综合满意度大屏”。如果它跌到90%以下,你不需要看细枝末节,第一反应就应该是“今天服务出了问题”,然后沿着大盘层层下钻,找到是哪张桌子、哪道菜、哪个环节掉了链子。

服务健康度=N达标N总×100%\displaystyle \text{服务健康度} = \frac{N_{\text{达标}}}{N_{\text{总}}} \times 100\%
服务健康度好比“顾客满意度”:只有按时送到且菜品合格的订单,才算达标。
  1. 统计窗口总请求数先确定在某个时间窗口里(比如最近5分钟)一共进来了多少请求,对应中控屏上的“订单总数”。
    N总=∑窗口内全部请求\displaystyle N_{\text{总}} = \sum \text{窗口内全部请求}
  2. 统计达标请求数在这些请求里,找出满足质量要求(延迟足够低、没有报错)的那部分,对应“准时上桌且无投诉的订单”。
    N达标=∑满足SLO的请求\displaystyle N_{\text{达标}} = \sum \text{满足SLO的请求}
  3. 计算百分比两者相除再乘以100%,就得到大盘顶部的健康度读数。
    N达标N总×100%\displaystyle \frac{N_{\text{达标}}}{N_{\text{总}}} \times 100\%

核心GPU指标:厨师的脉搏

如果餐厅老板想知道后厨有没有“虚度光阴”,会看厨师是否在频繁颠勺、操作台是否堆满备料、灶台火力足不足。GPU推理监控同样要看四个核心指标:SM利用率、显存占用、功耗和温度、GPU时钟频率。

SM(Streaming Multiprocessor)利用率是GPU计算核心的繁忙程度。SM相当于厨师,利用率就是他们真正在颠勺的时间比例。推理任务的特点是“每生成一个词都要串行算一次”,所以SM利用率往往只有30%—60%,远低于训练场景。看到利用率不高时别急着加负载,先看看是什么在拖后腿——可能是访存瓶颈,也可能是批次太小。显存占用则像冰箱和工作台的空间,推理时权重、KV缓存、激活值都会占地方,超了就会OOM(内存耗尽)甚至进程被杀。功耗与温度决定GPU会不会“降频保命”:温度逼近85°C甚至更高时,芯片自动降频,性能随之崩盘,就像厨师热到中暑只能放慢速度。GPU时钟频率则像厨师的速度档位,低频说明在摸鱼或散热不足,高频满载说明火力全开。

监控时要注意:SM利用率和显存占用要放在一起看。好比厨师在满负荷炒菜,但操作台已经不够用了——这时真正该优化的不是加人,而是整理空间(KV缓存管理)或者让更多菜合并下锅(批处理)。两块指标一横一纵,才能拼出后厨的真实画像。

SM利用率=∑iTbusy,iNSM×Twindow×100%\displaystyle \text{SM利用率} = \frac{\sum_{i} T_{\text{busy},i}}{N_{\text{SM}} \times T_{\text{window}}} \times 100\%
利用率 = 所有厨师实际炒菜的时间总和 ÷(厨师人数 × 营业时间)。
  1. 统计SM执行周期把采样时间内每个SM真正执行指令的时钟周期累加,如同记下每位厨师颠勺的秒数之和。
    ∑iTbusy,i\displaystyle \sum_{i} T_{\text{busy},i}
  2. 乘以SM数量与窗口时长用SM总数乘以总时长,得到“全员全时满负荷”的理论最大工作量。
    NSM×Twindow\displaystyle N_{\text{SM}} \times T_{\text{window}}
  3. 取百分比实际工作量除以理论最大工作量再乘以100%,得到利用率。
    实际工作量理论最大工作量×100%\displaystyle \frac{\text{实际工作量}}{\text{理论最大工作量}} \times 100\%

推理性能指标:上菜速度的真实体验

客人去餐厅最在意的不是厨师多辛苦,而是“第一道菜什么时候上”“整顿饭能不能在合理时间吃完”。GPU推理服务也一样,用户的真实体验由几个延迟指标定义:TTFT(首Token时延) 是从发起请求到模型吐出第一个字的时间,相当于第一道凉菜上桌的等待;TPOT 是每生成一个输出Token所花的时间,相当于每道菜的上菜节奏;端到端延迟 则是整个请求完成的总时长。它们共同回答一个问题:用户体验到底快不快?

只看平均值是远远不够的。假设餐厅平均上菜10分钟,但高峰时段有一部分客人等了40分钟——平均分会被大多数快单掩盖,而等40分钟的人早已愤怒离店。因此监控大盘必须看分位延迟:P50代表中位数体验,P99代表最差的那1%体验。对在线推理服务来说,P99才是真正的“用户耐心红线”。

监控时建议把TTFT、TPOT和P99画在同一个时间轴上。好比餐厅同时看“第一道菜时间”“上菜节奏”和“最慢客人体验”三条曲线。当P99突然飙升而P50平稳时,问题往往出在排队或资源争抢,而不是模型本身——这种“尾部恶化”是定位瓶颈的重要线索。

P99=排序后第 ⌈0.99 N⌉ 个延迟值\displaystyle P_{99} = \text{排序后第}\, \left\lceil 0.99\,N \right\rceil \text{ 个延迟值}
P99的意思是:把最近N次请求的延迟从小到大排队,排在第99%位置的那个值,就是“最差又没差到极点”的标准。
  1. 收集N个请求的延迟取最近一段时间的N次请求耗时,如同记录100桌客人的上菜用时。
    t1,t2,…,tN\displaystyle t_1, t_2, \dots, t_N
  2. 排序从小到大排成一列,对应按上菜速度给客人排序。
    t(1)≤t(2)≤⋯≤t(N)\displaystyle t_{(1)} \le t_{(2)} \le \dots \le t_{(N)}
  3. 取第99%位置找到第 \(\lceil 0.99N \rceil\) 个值,它就是P99。
    P99=t(⌈0.99N⌉)\displaystyle P_{99} = t_{(\lceil 0.99N \rceil)}

批处理与并发:一次做好几道菜

餐厅出餐口的柜台一次只能放几道菜,但如果同时要出几十份订单,聪明的后厨会用一个“大托盘”把多道菜一起端出去。GPU推理中的批处理(Batching) 就是这种思想:与其一个请求一个请求地算,不如把多个请求合并成一批,让GPU同时处理,摊薄固定开销,大幅提升吞吐量。

早期推理框架多使用静态批处理:等凑满一批再统一执行,但流量稀疏时GPU经常空转。现代推理引擎(如vLLM)升级为动态批处理和连续批处理:请求到达后立刻进入当前批次,序列生成完毕就腾出位置,让排队的请求“插队”进来。这就像服务员随时把新订单塞进同一盘托盘,而不是非要等托盘装满再送。监控大盘上要重点跟踪当前批大小和队列长度:批大小太小说明GPU“吃不饱”,队列太长说明后端已经“消化不过来”。

批处理监控的巧妙之处在于“既要又要”:批次越大,GPU吞吐越高,但单个请求可能多等几轮才能排上。大盘上同时展示批大小和P99延迟,就能找到那个“吞吐又高、尾延迟又可接受”的甜蜜点,让后厨既不闲着也不让任何客人等到发火。

Tˉdecode=Tbatch_decodeB\displaystyle \bar{T}_{\text{decode}} = \frac{T_{\text{batch\_decode}}}{B}
这是“单请求平均解码时间”公式:整个批次共同解码用了多长时间,平摊到B个请求身上。
  1. 记录批解码总耗时GPU处理一个批次里所有请求的解码时间,相当于一个大托盘送完整个区域所有菜的耗时。
    Tbatch_decode\displaystyle T_{\text{batch\_decode}}
  2. 统计批次内请求数B数一数这个批次里有多少个请求,即托盘里有几道菜。
    B=批次内请求数量\displaystyle B = \text{批次内请求数量}
  3. 相除得到平摊时间总耗时除以请求数,得到平均每个请求的分摊成本。
    Tˉdecode=Tbatch_decodeB\displaystyle \bar{T}_{\text{decode}} = \frac{T_{\text{batch\_decode}}}{B}

资源优化:让厨房井井有条

餐厅生意再好,操作台只有那么大。食材不能整箱堆在台面上,而是要分门别类放进小抽屉,随用随取。GPU推理的显存管理也是类似的难题:模型运行时要为每个请求的注意力机制保存一份KV缓存(Key-Value Cache),它会随生成长度线性膨胀,成为显存中最占空间的“食材”。

传统推理框架为每个请求预留一整块连续显存,但不同请求生成长度差异很大,很容易留下大量碎片。现代推理引擎采用分页管理(PagedAttention):把KV缓存切成大小固定的“页”,像厨房放调料的小抽屉一样按需分配,用到哪页申请哪页,极大降低碎片率。但碎片依然存在,所以大盘上要设置显存碎片率与缓存命中率指标:碎片率升高意味着很多“零散空隙”无法利用,缓存命中率则反映前缀复用是否生效。如果显存长期紧张,还可以用量化把模型权重从FP16压到INT8,或者配置自动伸缩让副本数量跟着流量涨落。

把厨房管理延伸到自动伸缩:当碎片率和显存水位双高时,系统会主动整理缓存或触发扩容;当深夜低峰时再缩容省电。数据说话,比人工拍脑袋准得多——这就像餐厅根据实时订餐量自动决定开几个窗口,而不是每天固定开全部灶台。

MKV=2×L×H×dtype×Ntokens\displaystyle M_{\text{KV}} = 2 \times L \times H \times d_{\text{type}} \times N_{\text{tokens}}
这是估算KV缓存显存占用的公式:层数 × 注意力维度 × 数据类型字节数 × 并发Token数,再乘2(Key和Value各一份)。
  1. 层数与维度相乘模型的层数L乘上注意力维度的总宽度H,决定了每层每个Token要存多少组向量。
    L×H\displaystyle L \times H
  2. 乘以数据类型字节数d_type是每个数占的字节,FP16占2字节、INT8占1字节,决定同样内容占多大空间。
    dtype\displaystyle d_{\text{type}}
  3. 乘以2表示K和V两份注意力需要同时缓存Key和Value两组数据,所以再乘2。
    2\displaystyle 2
  4. 乘以并发Token总数所有序列的Token数加在一起,实际推理中这个数往往以万计。
    Ntokens\displaystyle N_{\text{tokens}}

告警与SLO:守住出餐承诺

很多餐厅承诺“30分钟未上齐,此单免单”,这就是出餐服务质量目标。AI服务也有类似的承诺:比如“95%的请求要在200毫秒内返回”,这被称为SLO(服务等级目标)。SLO不是给用户看的虚话,而是运维决策的标尺。所有请求里允许未达标的比例,被称为错误预算。假如SLO是95%,那么错误预算就是5%——好比每天允许5%的客人催单。

错误预算用一点少一点,用得太快就要叫停风险。燃烧率(Burn Rate) 衡量的就是错误预算消耗的速度:燃烧率为1表示“恰好按预算速度消耗”,大于1说明正在透支未来预算,必须告警。燃烧率不能只看一个窗口,要在1小时、6小时、3天等多个时间尺度同时观察——1小时窗口能快速发现突发故障,6小时和3天窗口能排除偶发抖动,防止误报警。这种机制叫多窗口多维告警。

告警触发后,接下来要做的是“联动排查”:从燃烧率异常这张总览图,一路下钻到具体是哪个模型版本、哪个GPU节点、哪条网络链路出问题。就像顾客频繁催单时,你得倒查是后厨出错、传菜太慢还是收银台堵住了。监控大盘把SLO、指标、日志和追踪打通,就能让每一次告警都快速变成一次准确定位。

燃烧率=Ewindow/Nwindow1−SLO\displaystyle \text{燃烧率} = \frac{E_{\text{window}} / N_{\text{window}}}{1 - \text{SLO}}
分子是“最近窗口内实际未达标比例”,分母是“允许的未达标比例”,两者相除就是消耗速度。
  1. 统计窗口内未达标请求数E数出最近一个时间窗口里有几个请求没达到目标延迟。
    Ewindow\displaystyle E_{\text{window}}
  2. 除以窗口总请求数N得到实际未达标比例,对应“这个小时实际催单比例”。
    EwindowNwindow\displaystyle \frac{E_{\text{window}}}{N_{\text{window}}}
  3. 除以允许比例分母是1减去SLO,也就是错误预算占总流量的比例。
    1−SLO\displaystyle 1 - \text{SLO}
  4. 两者相除得到燃烧率若实际比例是10%、预算只有5%,燃烧率就是2,意味着错误预算在以2倍速度烧钱。
    0.100.05=2\displaystyle \frac{0.10}{0.05} = 2

AI 应用场景

场景一:LLM推理服务的7×24可观测与告警

阶段:推理服务运营

解决的问题:大模型服务分布在多张A100/H800 GPU上,一旦出现“用户反馈变慢”,传统手段只能一台台登录服务器看负载,耗时又低效。有了GPU推理监控大盘,就可以统一看到SM利用率、P99延迟、队列长度,并直接关联到告警。

具体案例:某公司用vLLM部署了开源大模型服务,并在Grafana中搭建大盘。某次新模型上线后P99从120ms涨到800ms,大盘显示SM利用率反而下降、队列长度激增。工程师立即定位到是并发参数配置过小,调整后恢复。整个过程没有等到用户投诉,而是由燃烧率告警提前发现。

场景二:GPU集群的弹性伸缩与成本治理

阶段:容量调度与成本优化

解决的问题:GPU按小时计费、价格昂贵,高峰期扩得慢会丢用户,低峰期不缩容则烧钱。通过大盘中的显存占用和请求队列指标,可以驱动HPA(水平自动伸缩)在负载升高时快速扩容GPU副本。

具体案例:某SaaS公司对客服机器人服务配置了基于“队列长度>50”和“显存占用>80%”的双指标伸缩策略。工作日白天自动扩容到30个GPU实例,夜间缩到10个实例,月度GPU成本下降约40%,且P99延迟保持稳定在300ms以内。

场景三:多模型共卡的成本分摊与容量规划

阶段:资源可视化与容量规划

解决的问题:多个业务模型共享同一批GPU,谁用了多少算力、多少显存成了一笔糊涂账。利用大盘中按模型维度的SM利用率、显存占用、请求量聚合数据,可以为每个业务方做成本核算。

具体案例:某中台团队在监控大盘中为每个模型打上标签(model name),按周汇总每个模型的GPU耗时和显存占用,生成绩效报告。据此将不常用的离线模型调度到低峰时段,把高峰资源让给在线推理,整体集群利用率提升20%以上。

Python 演示

python62 行
"""GPU 推理服务监控指标模拟器:统计SM利用率、P99延迟与SLO燃烧率。"""import randomfrom collections import deque  class GPUInferMonitor:    def __init__(self, slo_ratio=0.95, window=500, total_sm=132):        self.slo_ratio = slo_ratio        self.window = window        self.total_sm = total_sm        self.busy_ticks = 0        self.total_ticks = 0        self.requests = deque(maxlen=window)        self.frag_count = 0   # 显存碎片整理次数     def record(self, latency_ms, ok, busy_sm):        self.requests.append((latency_ms, ok))        self.busy_ticks += busy_sm        self.total_ticks += self.total_sm     def sm_utilization(self):        if self.total_ticks == 0:            return 0.0        return self.busy_ticks / self.total_ticks * 100     def p99(self):        vals = sorted(lat for lat, _ in self.requests)        if not vals:            return 0.0        idx = int(0.99 * len(vals)) - 1        return vals[max(0, idx)]     def success_rate(self):        if not self.requests:            return 1.0        ok = sum(1 for _, good in self.requests if good)        return ok / len(self.requests)     def burn_rate(self):        error_budget = 1 - self.slo_ratio        if error_budget <= 0:            return 0.0        error_rate = 1 - self.success_rate()        return error_rate / error_budget  if __name__ == "__main__":    random.seed(7)    mon = GPUInferMonitor(slo_ratio=0.95)     for i in range(300):        busy_sm = random.randint(30, 125)        lat = random.expovariate(0.05)        if lat > 180:            lat = 180 + random.random() * 120   # 模拟排队导致的尾延迟        ok = lat < 200        mon.record(lat, ok, busy_sm)     print("SM 利用率: {:.1f}%".format(mon.sm_utilization()))    print("P99 延迟: {:.1f} ms".format(mon.p99()))    print("成功率: {:.2f}".format(mon.success_rate()))    print("燃烧率: {:.2f} (>1 表示需要告警)".format(mon.burn_rate()))
目的:模拟一个正在运行的GPU推理服务,实时记录延迟和SM占用,并输出SM利用率、P99延迟、成功率与SLO燃烧率——正是监控大盘背后最核心的计算逻辑。
  1. self.requests = deque(maxlen=window)用双向队列保留最近500条请求,超出自动丢弃,就像大盘只展示一个滚动窗口。
  2. self.busy_ticks += busy_sm每次记录都把当前忙的SM数累加,作为利用率公式的分子。
  3. ok = lat < 200判断本次请求是否满足SLO(延迟小于200ms)。
  4. mon.record(lat, ok, busy_sm)每次推理完成时写入一条监控记录。
  5. return self.busy_ticks / self.total_ticks * 100SM利用率 = 实际忙周期 / 理论总周期。
  6. idx = int(0.99 * len(vals)) - 1用99%分位数索引直接取出P99延迟。
  7. error_rate / error_budget实际错误率除以允许错误率,得到燃烧率。

常见误区

误区看到SM利用率只有40%就怀疑GPU“浪费”了,想方设法把利用率堆到90%以上才安心。

正解推理任务本身是访存密集和延迟敏感的,SM利用率高往往意味着批次堆得很大,单个请求要排队更久,P99延迟会飙升。好比厨房所有灶台全开、厨师一刻不停,但每一桌客人都要等更久。正确做法是结合吞吐和延迟一起看,找到“利用率合理、延迟达标”的平衡点。

为何常见:大家习惯用“利用率=好”来评估硬件,忘记推理服务关注的是端到端用户体验,而不是硬件吃饱程度。

误区大盘上只要平均延迟低于100ms就认为服务健康,从不关注P99、P95这些尾部指标。

正解平均值会被大量快请求“平均掉”。哪怕99%请求只要50ms,只要有1%请求卡到2秒,平均延迟依然漂亮,但体验极差的用户已经流失。监控必须同时展示P50、P99和最大值,P99才是最有价值的那条红线。

为何常见:平均值最容易算也最直观,而分位延迟需要维护采样窗口和排序逻辑,很多新手图省事就跳过了。

误区把能查到的指标全部堆到大盘上,十几行图表密密麻麻,认为“什么都有数据”就等于可观测。

正解可观测性的核心不是数据多,而是能否快速回答“为什么会这样”。指标只能告诉你“发生了什么”,日志告诉你“细节是什么”,追踪告诉你“路径在哪里”。大盘设计要围绕排查场景做分层:总览看出问题,下钻找原因,关联日志和追踪把原因坐实。

为何常见:初学者往往把“采集”和“理解”混为一谈,以为数据上了屏就等于洞察了真相。

误区看到 `nvidia-smi` 显示显存还剩10GB,就认为缓存放得下,忽略了碎片化问题。

正解显存剩余10GB可能是几十个无法合并的小碎片拼出来的,就像仓库空出了几十条过道但放不下一整箱货。KV缓存需要连续或分页可用的空间,碎片会导致分配失败或频繁整理,拖慢推理。大盘上要监控碎片率而不仅仅是剩余量。

为何常见:nvidia-smi 只显示总剩余量,不显示碎片分布,让人误以为剩余空间都能用。

面试题

Q1. GPU推理监控大盘的首要价值是什么?

单选题 · easy

  • A.让GPU跑得更热更快
  • B.实时洞察状态定位瓶颈← 正确答案
  • C.自动编写推理代码
  • D.替代压测工具做压测

答案:B。监控大盘的核心作用是“看得见”,把GPU利用率、延迟、队列等状态汇总成可洞察的画面,帮助工程师快速定位瓶颈。它不会改代码、不会替代压测,更不是让GPU超频,所以选B。

Q2. 关于P99延迟的正确理解是?

单选题 · mid

  • A.99%请求都比它更慢
  • B.99%请求比它更快← 正确答案
  • C.99%请求的平均延迟
  • D.所有请求的方差值

答案:B。把请求延迟升序排列后,P99是第99百分位的值,意味着99%的请求低于这个耗时,只有1%比它更慢。好比100桌客人中99桌上菜比这个时间快。A说反了,C的错误在于它是分位点而非平均值,D则完全无关。

Q3. 推理服务的TTFT指标代表什么?

单选题 · easy

  • A.将提示词编码为KV
  • B.生成首个输出词元← 正确答案
  • C.释放GPU显存空间
  • D.对模型权重做量化

答案:B。TTFT(Time To First Token)指的是从请求发出到模型输出第一个Token之间的耗时。B“生成首个输出词元”正是它的核心含义。其他选项分别属于显存管理、预处理和模型压缩范畴,不是TTFT。

Q4. 下列哪些情况会导致推理服务尾延迟升高?

多选题 · mid

  • A.请求排队等待过长← 正确答案
  • B.显存碎片触发整理← 正确答案
  • C.SSD读取速度加快
  • D.动态批处理合并并发

答案:AB。请求排队过长会积累大量等待时间,显存碎片引发整理时会阻塞推理,两者都会让个别请求变慢。SSD更快是改善而非恶化因素,动态批处理通常能提升吞吐、降低延迟,所以C和D不选。

Q5. KV缓存显存总量与哪些因素成正比?

单选题 · hard

  • A.层数、注意力维度、生成长度← 正确答案
  • B.批次大小与学习率
  • C.权重衰减与词表大小
  • D.采样温度与top-p阈值

答案:A。KV缓存估算公式为 \(2 \times L \times H \times d \times N\),其中L是层数,H是注意力维度,N是并发Token总数(受生成长度影响)。学习率、权重衰减、采样温度都不影响KV缓存形态,词表大小只影响嵌入层而非KV缓存。

Q6. 关于动态批处理,下列说法正确的有?

多选题 · mid

  • A.把同时到达的请求合并成一批← 正确答案
  • B.每个请求共享一次预填充权重
  • C.批处理减少了GPU占用率
  • D.连续批处理可在解码中插入新请求← 正确答案

答案:AD。动态批处理把并发请求合成一批执行以提升吞吐;连续批处理(如vLLM)允许在解码阶段将完成序列移出、新请求插入。B错误,因为每个请求都要单独做预填充;C错误,批处理通常提高GPU利用率而不是减少。

Q7. 当燃烧率等于2时,正确的处理方式是?

单选题 · mid

  • A.立即触发告警并扩容← 正确答案
  • B.降低模型精度继续运行
  • C.关闭监控页面排查
  • D.等待SLO周期自动恢复

答案:A。燃烧率2表示错误预算消耗速度是预期的两倍,必须立刻触发告警并扩容或降级,否则预算会提前耗尽。降低精度和关监控都是回避问题,等待自动恢复更不可取,所以选A。

Q8. 为什么显存碎片化往往难以直观发现?

单选题 · hard

  • A.碎片大小小于监控粒度
  • B.显存地址分配不可见细节← 正确答案
  • C.碎片只出现在训练而非推理
  • D.驱动自动透明合并碎片

答案:B。碎片存在于显存的物理地址分配中,驱动和框架不会把每个空隙展示给用户,所以只能看到“剩余多少”却看不到“剩余是否可用”。A不准确,现代监控并非无法统计碎片大小,而是物理分配细节通常被抽象掉了。

Q9. 可观测性三大支柱是指什么?

单选题 · easy

  • A.指标、日志、链路追踪← 正确答案
  • B.代码、测试、部署
  • C.CPU、内存、磁盘
  • D.开发、运维、安全

答案:A。可观测性的三大支柱是指标(Metric)、日志(Log)和链路追踪(Trace)。它们分别回答“发生了什么”“细节是什么”“路径是什么”。B是研发流程,C是硬件资源,D是团队分工,都不属于可观测性范畴。

Q10. 多窗口燃烧率告警的好处有哪些?

多选题 · hard

  • A.短期窗口快速发现异常← 正确答案
  • B.长期窗口避免误报干扰← 正确答案
  • C.减少告警消息的数量
  • D.完全替代人工巡检工作

答案:AB。1小时窗口能快速捕捉突发故障,6小时和3天窗口能过滤偶发抖动、避免误报。多窗口组合天然平衡了“快”与“稳”。但多个规则可能产生更多告警,且任何告警都不能完全替代人的判断与巡检,所以C、D不选。