想象一位米其林大厨花了三个月研发出一道招牌菜——配方精确到克,火候拿捏到秒。这道菜在试菜间里完美无缺,但真正的考验在餐厅开业那天:晚高峰四十桌客人同时下单,每一桌都希望五秒内上菜。大厨必须把复杂的配方拆解成流水线上的标准动作,把珍贵的食材提前备好分区存放,甚至在客流最猛时推出简化版菜单。这就是模型 serving 的世界——一个让训练好的模型在真实世界中“接单、备菜、出餐”的系统工程。本文以深度学习推荐模型 DeepFM 与 DIN 为例,带你走进推荐引擎的深夜食堂,看看特征获取、模型推理、结果返回这三道主菜,如何在毫秒级的时限内被端上桌。
掌握模型 serving 与实时推理优化,是 AI 工程师从实验室走向生产环境的关键一跃——它决定了你的模型能服务多少用户、承受多大流量、产生多少真金白银的收益。
可视化演示
展示模型服务化多级漏斗架构、量化压缩加速推理与冷启动扩缩容的实时调度过程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
多级推荐Serving漏斗 召回→粗排→精排→重排四级漏斗逐级过滤候选集 召回用ANN向量检索(Faiss/Milvus),精排用DeepFM/DIN GPU推理 N_out=N_recall×p_coarse×p_fine×p_rerank 每级serving延迟与QPS需求差异显著,需独立扩缩容
Serving 基础认知
想象一位米其林大厨耗时三个月研发出一道招牌菜——配方精确到克,火候拿捏到秒。这道菜在试菜间里完美无缺,但真正的大考在餐厅开业那天:晚高峰四十桌客人同时下单,每一桌都希望五秒内上菜。大厨必须把复杂配方拆解成流水线的标准动作,把珍贵食材提前备好分区存放。这就是模型 serving 的本质——训练只是做出了菜谱,serving 才决定顾客能不能及时吃到这道菜。
在深度学习推荐系统中,DeepFM 和 DIN 这样的模型在离线训练时用海量样本拟合用户兴趣,训练出一个漂亮的 AUC。但模型的使命不在训练集,而在线上每时每刻的预测请求。所谓模型 serving,就是把训练好的模型部署到线上环境,持续接收用户请求、拼接特征、执行推理、返回推荐结果的一整套工程体系。它包含模型部署流程、在线离线一致性、延迟稳定性要求三大核心问题。
在线离线一致性是 serving 的第一道坎:训练时用的是已发生的历史特征,线上却只能拿到当下时刻的特征,两边的特征分布、缺失值处理、归一化参数必须完全对齐,否则模型就像戴着训练时的眼镜看世界,效果大打折扣。延迟稳定性则是 serving 的生命线:推荐请求的响应时间预算通常只有 200ms 左右,超时等于服务不可用。这段预算要分配给特征获取、模型推理、网络传输三个环节,任何一环超支都会吃掉用户的耐心。
回到深夜食堂的比喻,$T_{\text{特征}}$ 是备菜师傅切配的时间,$T_{\text{推理}}$ 是大厨颠勺炒制的时间,$T_{\text{网络}}$ 是传菜员从后厨跑到前厅的时间。三道工序各自提速,总出餐时间才能压进五秒。聪明的老板还会在菜品上桌前先想清楚菜谱的哪个部分可以标准化——这正是后面几节要讲的特征缓存、推理加速与架构设计的起点。
- P99 延迟99% 的用户请求都小于该值的延迟上界,它是服务体验的核心指标
- 特征获取耗时从缓存或远端服务拉取 embedding 与实时特征的时间
- 推理计算耗时模型前向传播、从输入到输出打分的时间
- 预算约束三个环节之和必须压在 200ms 以内,超出就会流失用户
Embedding 检索
深夜食堂的招牌菜之所以好吃,靠的是后厨角落里那面酱料墙——三百个瓶瓶罐罐,每个都装着秘制酱料,对应三百位熟客的口味档案。客人下单时,服务员不需要翻菜谱,直接从酱料墙取下对应的罐子就行。在 DeepFM 和 DIN 的 serving 中,这面酱料墙就是 Embedding 表。
DeepFM 和 DIN 的输入大量来自用户 ID、商品 ID、类目 ID 等稀疏类别特征。每个 ID 经过 embedding 查表变成一个稠密向量,相当于从“酱料墙”上取下一罐酱料。问题在于:推荐系统的 ID 数量动辄上亿,Embedding 表存储量可达几十 GB 甚至几 TB,单机根本放不下,直接查表也远不够快。于是诞生了两个关键手段——参数服务器与特征缓存。
参数服务器把巨大的 Embedding 表切分后分布在多台机器上,serving 进程按 ID 哈希到对应节点取向量,解决了容量问题,但多一次网络往返。特征缓存则是把高频 ID 的 embedding 向量放在 serving 本地内存里,用 LRU 策略管理,热 ID 直接命中,冷 ID 才回源。缓存命中率直接决定平均取特征延迟。
酱料墙的聪明之处就在这里:最受欢迎的几款酱料被放在最顺手的位置,服务员伸手就拿;冷门口味才需要去仓库翻箱倒柜。特征缓存就是那排顺手的位置,参数服务器则是仓库。把“顺手”留给高频用户,把“翻箱倒柜”留给长尾请求,整面墙的效率就上来了。
- 命中率请求的特征 ID 在本地缓存中找到的比例,介于 0 和 1 之间
- 本地命中耗时从进程内缓存读取向量,通常只有几百微秒
- 远端未命中耗时从参数服务器网络拉取向量,通常要几毫秒甚至更久
- 加权平均命中率越高,平均耗时越接近 $T_{\text{命中}}$,这就是缓存的价值
特征实时计算
客人光顾深夜食堂时,老板不光看客人是谁,还要留意他今晚的心情——是刚加班完想吃口热乎的,还是跟朋友聚餐想多聊会儿。这些当下的信息没法提前备菜,必须在客人落座那一刻现切现配。推荐模型的特征也有同样的“时令性”。
DIN 模型之所以强大,是因为它把用户最近的行为序列(点击过的商品、停留过的类目)实时组装起来,再用注意力机制对每个候选商品加权——用户刚看过球鞋,再刷到球鞋广告时,相关的那几次点击就会被放大。这类实时特征必须在请求到达时动态计算,连同用户画像和候选物品特征一起拼接成模型的输入向量。
特征实时计算的工程实现是一条流水线:请求到达后,先从特征服务拉取用户画像和物品属性,再从行为日志服务拉取近期行为序列,经过清洗、离散化、拼接等步骤组装成定长或变长的输入张量。为了不让特征计算成为瓶颈,业界常用特征预计算、增量更新和并行拉取等手段。拼接后的结果就是一个巨大的稠密向量,直接喂给 DeepFM 的 Wide 和 Deep 两侧。
现切现配听起来慢,但优秀的面馆师傅能在三分钟内完成点单、下面、浇头、上桌的全流程。特征流水线的目标同样如此:把大部分步骤并行化、模板化,让“时令特征”在毫秒级完成从日志到张量的变身,不拖累整体的出餐节奏。
- 用户特征向量用户画像 embedding 与 DIN 注意力加权后的行为序列
- 物品特征向量候选商品的 ID、类目、价格等 embedding
- 上下文特征向量时间、地点、设备、网络等实时环境特征
- 拼接操作分号表示把三段向量沿维度方向拼接成一个长向量
推理加速技术
深夜食堂的招牌菜做法繁复:三十九道工序,每道都讲究。但客流高峰期,大厨不可能每道菜都按最高规格来。老板想了个办法:把菜谱简化、把工序合并——味道打个九八折,出餐速度翻两倍。这就是推理加速技术的哲学:牺牲可接受的精度,换取宝贵的延迟。
DeepFM 和 DIN 的推理耗时主要来自两方面:Embedding 查询后的特征拼接,以及深层神经网络的矩阵乘法。针对前者已有缓存方案,针对后者,业界常用三把刀——量化、剪枝、批处理。
量化把模型权重从 FP32 降到 INT8,用 1/4 的内存存同样的参数,同时利用整数运算单元加速矩阵乘法。剪枝把训练好的网络中贡献很小的神经元或连接直接删除,让网络更稀疏、计算量更小。批处理则把多个请求的推理合并成一次前向传播,摊薄固定开销。三者可以叠加使用,已在实际推荐系统中把推理延迟从几十毫秒压到个位数毫秒。
客人可能在味觉上分辨不出“盐 3.7 克”和“盐一撮”的区别,但一定分辨得出上菜快慢的区别。量化与剪枝正是这种“口感略差、速度大增”的取舍——在推荐场景里,用户对延迟的敏感度往往比对精度的敏感度更高。
- 量化步长把浮点范围映射到 256 个整数档位所需的刻度
- 四舍五入操作把浮点数映射到最近的整数档位
- 量化后的整数值原来的浮点 $x$ 减去最小值后除以步长并取整
- 反量化还原推理时再将整数乘回步长加上最小值,得到近似浮点值
系统架构设计
深夜食堂只有一位大厨,但火爆之后开了三家分店。每家分店不能各搞一套后厨,得有统一的中央厨房、传菜动线和排号系统。模型 serving 的架构设计同样是这个道理:把能力拆成可独立扩展的服务,再用队列和调度把它们串起来。
现代 serving 架构通常把模型推理做成独立的微服务,与特征服务、召回服务解耦。DeepFM 模型更新频繁,独立部署意味着升级模型不用重启整个推荐系统。每个微服务背后挂一个请求队列,起到削峰填谷的作用——就像餐厅的取号机,客流再猛,后厨也不会被打爆。
资源弹性调度是架构层最后的拼图。基于 Kubernetes 等容器平台,serving 服务可以根据 QPS、CPU、内存指标自动扩缩容:大促流量上来时自动加副本,凌晨低谷时自动缩容省钱。批处理推理在这里再度发挥作用——当多个请求排队时,调度器把它们聚成一个 batch 一起推理。
分店虽多,动线统一;排队再长,取号有序。微服务、队列、弹性调度三者构成 serving 系统的骨架,让深夜食堂从单店变成连锁还保持同样的出餐速度——这就是架构设计的意义。
- 批量推理总耗时N 个请求合并成一次前向传播的花费
- 批大小合并的请求数量
- 摊薄延迟每个请求分摊到的平均推理耗时
- 权衡提醒N 越大摊薄效应越明显,但队列等待变长、尾延迟上升
部署与发布
深夜食堂研发出了新菜式,但老板不会直接把它写进所有分店的菜单。他先在总店推出一份试吃装,观察食客反应,满意了再全面铺开,不满意就悄悄撤下来。模型上线也是一样的谨慎。
深度学习模型的发布远比普通代码风险更高——代码错了报错即可发现,模型效果差了要等到用户行为反馈才能察觉。因此模型版本管理是 serving 的必修课:每个模型都有唯一的版本号、对应的特征配置和评估报告,线上可以随时追溯到具体某个版本。
灰度发布是新模型上线的标准姿势:把流量按 5%、20%、50% 等比例逐步切给新模型,每个阶段实时对比新旧模型的线上指标(如 CTR、转化率)。一旦新模型表现不佳,立刻回滚到旧版本,影响面被控制在最小范围。这种渐进式发布有效避免了“全量上线即事故”的悲剧。
试吃装策略让新菜式在上桌前就经过了真实食客的检验。灰度发布与回滚预案给了模型上线的“后悔药”,让每一次更新都像试菜一样从容——这也是工程系统比实验室更成熟的地方。
- 新流量占比新模型承接的请求量占总请求量的比例
- 新旧指标新模型与旧模型各自的线上业务指标
- 混合指标灰度期间观察到的整体指标是新旧两部分的加权平均
- 渐近推进$w$ 从 0 慢慢增大到 1,全程监控 $M$ 不劣化再全量
监控与容灾
深夜食堂的老板有个习惯:每晚打烊后翻一遍收银小票,看哪道菜点得最多、哪道菜被退得最多、哪一桌等得最久。这些数字就是餐厅的体检报告。serving 系统的监控与容灾,就是它的体检报告和急救箱。
监控的核心指标有三类:流量类(QPS)、性能类(平均延迟、P99 延迟)、质量类(缓存命中率、推理错误率)。其中 P99 比平均值更能暴露问题——平均延迟 50ms 的背后,可能是 99% 的请求只要 10ms,却有 1% 的请求卡了 4 秒。只看平均值的团队,就像只看平均好评的餐厅,会漏掉那一桌最愤怒的客人。
容灾机制是 serving 的安全网。熔断是指当下游服务错误率超过阈值时主动拒绝请求,保护系统不被拖垮;降级则是当模型服务过载时,退回规则排序或缓存结果的兜底方案。容量评估则是防患于未然:根据高峰期 QPS 与单机吞吐量,反推需要的机器数量,提前扩容。
体检报告让老板知道哪里该加人手,急救箱让突发状况不至于毁掉整个夜晚。监控与容灾的价值不在平日,而在那些“四十桌客人同时涌进来”的时刻——有了它们,深夜食堂才能在爆满的夜晚仍然灯火通明。
- 并发数同时处理中的请求数量
- 平均耗时单请求平均处理时长,单位毫秒
- 每秒吞吐上限一台机器每秒能处理的请求数上界
- 容量规划用预估峰值 QPS 除以单机上限,得到所需副本数
AI 应用场景
电商大促的实时排序服务
阶段:模型部署与在线推理
解决的问题:传统方法每天凌晨离线算好推荐结果存入缓存,用户当天的行为无法实时反馈,大促时用户兴趣变化快、推荐严重滞后。AI serving 架构让 DeepFM 模型在线接收实时特征,结合特征缓存与批处理推理,在 50ms 内完成千人千面的重新排序。
具体案例:某电商平台 618 大促期间,用户点击某品牌商品后,实时特征流水线在 30ms 内更新该用户的行为序列,DIN 模型的注意力机制重新加权,推荐流中同类商品占比提升 15%,整体点击率提升 8%。
广告竞价系统的毫秒级 CTR 预估
阶段:实时推理优化
解决的问题:广告 DSP 平台收到竞价请求后必须在 50ms 内完成 CTR 预估并出价,推理延迟直接决定竞拍成功率。通过 INT8 量化 + GPU 批处理,将 DIN 模型的单次推理从 45ms 压缩到 18ms,让广告主能抢到更多优质流量。
具体案例:某广告平台将模型从 FP32 量化到 INT8 后,单机 QPS 从 800 提升到 1800,P99 延迟从 60ms 降到 25ms,在同样的机器成本下广告收入提升 8%。
晚高峰的容量保障与降级
阶段:监控与容灾
解决的问题:推荐服务晚高峰流量是低谷的 6 倍,固定副本数要么浪费要么不够。基于 QPS 与 P99 延迟的监控告警,配合弹性伸缩与熔断降级,是保障服务可用性的最后防线。
具体案例:某视频 App 通过监控发现 P99 超过 200ms 时自动扩容,同时开启规则排序兜底降级,将服务可用性从 99.5% 提升到 99.95%,大促期间零事故。
Python 演示
# -*- coding: utf-8 -*-"""模拟推荐模型 Serving:特征缓存 + 批量推理的延迟优化演示两个核心优化手段:1. LRU 特征缓存:热门用户特征免去远端拉取2. 批量推理:多个请求合并一次前向传播再通过热点/冷点两组请求对比,观察缓存命中率对延迟的影响。"""import timeimport randomfrom collections import OrderedDict class FeatureCache: """带 LRU 淘汰策略的特征缓存""" def __init__(self, capacity=100): self.capacity = capacity self._store = OrderedDict() self.hit_count = 0 self.request_count = 0 def fetch(self, user_id): """返回用户特征向量,命中缓存则跳过远端拉取""" self.request_count += 1 if user_id in self._store: self._store.move_to_end(user_id) self.hit_count += 1 return self._store[user_id] time.sleep(0.003) # 模拟远端特征服务耗时 3ms vec = [random.random() for _ in range(8)] self._store[user_id] = vec self._store.move_to_end(user_id) if len(self._store) > self.capacity: self._store.popitem(last=False) return vec def hit_rate(self): return self.hit_count / self.request_count if self.request_count else 0.0 class BatchEngine: """迷你批量推理引擎:攒满 batch_size 个请求再统一推理""" def __init__(self, batch_size=4): self.batch_size = batch_size self._queue = [] self.batch_count = 0 def submit(self, feature_vec): """提交一个样本,凑满一批时返回整批预测分数""" self._queue.append(feature_vec) if len(self._queue) < self.batch_size: return None batch = self._queue self._queue = [] self.batch_count += 1 time.sleep(0.008) # 模拟一次批量前向传播耗时 8ms return [sum(v) / len(v) for v in batch] def simulate(users): cache = FeatureCache(capacity=20) engine = BatchEngine(batch_size=4) start = time.time() for uid in users: vec = cache.fetch(uid) engine.submit(vec) elapsed = (time.time() - start) * 1000 return elapsed, cache.hit_rate() def main(): # 8 个热用户循环 10 轮:制造高频重复请求 hot_users = ["user_%d" % (i % 8) for i in range(80)] # 冷用户随机 ID:大部分请求无法命中缓存 cold_users = ["user_%d" % random.randint(100, 500) for _ in range(80)] t_hot, hit_hot = simulate(hot_users) t_cold, hit_cold = simulate(cold_users) print("热点场景: 总耗时 %.1f ms, 缓存命中率 %.0f%%" % (t_hot, hit_hot * 100)) print("冷点场景: 总耗时 %.1f ms, 缓存命中率 %.0f%%" % (t_cold, hit_cold * 100)) print("结论: 命中率越高, serving 平均延迟越低") if __name__ == "__main__": main()
if user_id in self._store:命中判断,热数据直接返回,省去 3ms 的远端拉取self._store.move_to_end(user_id)每次命中把该用户挪到队尾,实现 LRU 的“最近使用优先保留”self._store.popitem(last=False)容量满时淘汰最久未使用的用户特征time.sleep(0.003)模拟远端特征服务的固定耗时,是未命中时的代价if len(self._queue) < self.batch_size:攒批条件:不满一批就挂起等待time.sleep(0.008)模拟一次批量推理耗时,4 个样本平摊后每个仅 2ms["user_%d" % (i % 8) for i in range(80)]构造 8 个热用户循环请求,制造缓存热点["user_%d" % random.randint(100, 500) for _ in range(80)]构造冷用户随机请求,验证命中率对延迟的影响
常见误区
误区模型训练完,在 Flask 里加一个 /predict 接口,输入特征输出预测值,serving 就完成了。跑起来能出结果,不就是上线了吗?
正解serving 是一个系统工程:特征获取、缓存、批处理、熔断、灰度、监控缺一不可。就像大厨的菜谱再完美,餐厅还得解决备菜、排队、食材保鲜、食安检查。只写一个接口,延迟和稳定性都无从保障,流量一上来就雪崩。
为何常见:训练时只需要跑一次前向传播,让人误以为线上也只需一次计算。实际线上的耗时大头往往在特征拉取与网络 I/O,而非模型本身。
误区离线 AUC 提升了 2%,上线后 CTR 一定跟着涨。训练集上验证过的事情,放到线上还能差到哪去?
正解离线与线上特征不一致(训练用历史标签,线上用实时猜测)、数据分布漂移、延迟导致超时降级,都可能让线上效果打折。这就是“在线离线一致性”要解决的问题——菜谱用的是超市买的牛肉,后厨却收到冷冻肉,味道自然不同。
为何常见:离线评估的便利性让人忽略了特征一致性、环境差异等工程细节,以为模型效果只看算法本身。
误区把 FP32 压成 INT8,精度损失大,线上 CTR 会崩。模型那么精细的权重,哪能随便四舍五入?
正解现代量化(如 min-max 对称量化)配合校准集,通常能把精度损失控制在 0.5% 以内,却换来 2-4 倍速度提升。相当于把菜谱从“盐 3.7 克”简化成“盐一撮”——手感略变,出锅速度翻倍。
为何常见:早期 naive 量化工具确实伤精度,加上“损失厌恶”心理,许多团队不敢尝试,宁可加机器也不愿优化模型。
误区批量推理能摊薄固定开销,那 batch size 设得越大,系统就越快。反正都要算,一次算一百个不比算一个划算?
正解批大小增大,单请求等待队列的时间变长,P99 延迟上升,还可能撑爆显存。要在吞吐与延迟之间找平衡,就像大锅饭省火,但一桌客人等菜的时间变长了。
为何常见:只看平均延迟下降,忽略了尾延迟(P99/P999)才是用户体验的关键,而平均值会掩盖那 1% 的“等疯了”的请求。
误区特征缓存命中率冲到 100% 才算健康,最好所有特征都常驻本地,一次远端都不访问。
正解命中率过高说明缓存里的特征太久没更新,用户的实时兴趣已经变了。推荐系统要的是“热数据快、冷数据新鲜”的平衡:高频用户命中高没问题,但全局 100% 命中意味着特征新鲜度出问题,推荐会越来越“油腻”。
为何常见:缓存是延迟优化的第一直觉,但新鲜度是隐形的,容易被忽略。等线上 CTR 下滑时才反应过来,特征已经“过期”很久了。
面试题
Q1. 模型 serving 与模型训练最核心的区别是什么?
- A.serving 追求低延迟高吞吐← 正确答案
- B.训练需要更多算力支撑
- C.serving 不需要特征工程
- D.训练不需要数据清洗
答案:A。serving 面对的是线上真实流量,核心目标是在百毫秒内稳定返回预测结果,追求低延迟与高吞吐;训练则更关注离线指标和算力效率。选项 C、D 都错误地否定了特征工程和数据清洗在这两个阶段的重要性。
Q2. 在线离线一致性主要指的是什么?
- A.训练与线上特征保持一致← 正确答案
- B.训练与推理的接口一致
- C.测试与上线的环境一致
- D.数据与标签分布保持一致
答案:A。在线离线一致性最核心的是特征一致性——训练时用的历史特征和线上实时拼出来的特征必须同分布、同口径,否则模型会“戴错眼镜”。环境一致、接口一致是手段而非本质,数据标签一致性属于训练阶段的问题。
Q3. 推荐模型 serving 的延迟预算通常要求在什么范围?
- A.秒级响应速度即可
- B.分钟级批量返回结果
- C.百毫秒内完成响应← 正确答案
- D.对延迟没有严格要求
答案:C。推荐系统对延迟极其敏感,业界共识是 P99 延迟控制在 200ms 以内,即“百毫秒内完成响应”,超时等于服务不可用。秒级、分钟级会让用户明显感觉到卡顿,导致流失。
Q4. DeepFM 模型中占用内存最大的部分通常是?
- A.全连接层的权重矩阵
- B.FM 二阶交叉参数矩阵
- C.稀疏特征的 Embedding 表← 正确答案
- D.激活函数缓存的张量
答案:C。DeepFM 的输入包含海量稀疏 ID 特征,每个 ID 对应一个 embedding 向量,ID 数量动辄上亿,Embedding 表可达几十 GB 甚至几 TB,是内存占用的大头。全连接层和 FM 参数相比之下小得多。
Q5. 特征缓存的最主要目的是什么?
- A.提升模型预测的精度
- B.增加模型参数量级
- C.减少重复特征拉取延迟← 正确答案
- D.替代模型推理计算过程
答案:C。特征缓存把高频 ID 的 embedding 放在 serving 本地,命中后免去一次远端参数服务器的网络往返,直接降低特征获取延迟。它不改变模型精度,也不参与推理计算,只是“把热酱料放到顺手的位置”。
Q6. INT8 量化相对于 FP32,模型体积大约缩小为原来的多少?
- A.减为原来的二分之一
- B.减为原来的四分之一← 正确答案
- C.减为原来的八分之一
- D.减为原来的十六分之一
答案:B。INT8 每个参数占 1 字节,FP32 占 4 字节,所以模型体积缩小为原来的 1/4。同时整数运算比浮点运算更快,这就是量化既能省内存又能降延迟的原因。
Q7. 灰度发布时评估新模型效果,正确的做法是什么?
- A.直接全量上线再观察效果
- B.只看新模型的离线评估指标
- C.新旧模型隔天交替运行观察
- D.按流量比例分桶对比在线指标← 正确答案
答案:D。灰度发布的核心是“同一时间、不同流量桶”的在线对比:新模型承接一小部分流量,与承接大部分流量的旧模型实时对比 CTR 等业务指标,排除时间因素干扰。全量上线风险太大,离线指标不能代表线上效果,隔天交替则引入了时间漂移变量。
Q8. 服务熔断机制的核心价值是什么?
- A.提升模型推理的响应速度
- B.提升服务吞吐量的上限
- C.防止故障级联扩散蔓延← 正确答案
- D.降低特征缓存读取的耗时
答案:C。当下游服务错误率超过阈值时,熔断主动拒绝新请求,让系统有时间恢复,防止一个服务故障像多米诺骨牌一样压垮整个调用链。它不提升速度、不增加吞吐,而是牺牲部分请求保住整体可用性。
Q9. 降低 serving 推理延迟的常用手段有哪些?
- A.模型权重低比特量化← 正确答案
- B.冗余神经元结构剪枝← 正确答案
- C.多请求聚合批量推理← 正确答案
- D.增大训练学习率参数
答案:ABC。量化降低参数精度加速矩阵运算,剪枝删掉冗余连接减少计算量,批处理摊薄固定开销,三者是 served 推理加速的“三把刀”。增大学习率是训练阶段的超参调整,与推理延迟无关。
Q10. serving 系统需要重点监控的指标包括哪些?
- A.服务每秒查询数 QPS← 正确答案
- B.P99 分位延迟指标← 正确答案
- C.特征缓存命中率指标← 正确答案
- D.离线训练集样本量
答案:ABC。QPS 反映流量水位,P99 延迟暴露尾延迟问题,缓存命中率反映特征拉取效率,三者是 serving 监控的黄金三角。离线训练集样本量属于训练阶段指标,与线上 serving 运行状态无关。