你有没有想过,一家餐厅如何应对“饭点爆满、下午冷清”的客流波动?如果不管什么时候都开满 20 个厨师,下午就会浪费大量人力;如果只在客人进门后才叫厨师起床,又可能等上半小时。聪明的餐厅会装一个“客流感应器”:门口排队超过 5 人,就立刻从备用厨房叫醒厨师;排队清空,就让多余厨师继续休息。 在 AI 的世界里,模型推理服务就是“餐厅”,GPU 就是“厨师”,而 KServe 和 Seldon Core 是两套不同的“餐厅运营体系”。它们都借用一个叫 Knative 的“客流感应器”来自动扩缩容——请求多了自动加机器,请求少了自动减机器,甚至减到零。本文就用这个“餐厅”比喻,带你拆解这两大 K8s 原生推理框架的架构、自动扩缩容原理、流量管理、GPU 调度与应用落地。
对 AI 工程师而言,掌握 KServe/Seldon Core 是模型上线生产环境的“最后一百米”,它决定了你的模型能否像水电一样弹性供给、稳定服务。
可视化演示
演示KServe基于Knative/Istio的架构、Seldon推理图多模型编排,以及Knative基于QPS并发数的自动扩缩容机制。
本节配有交互动效(进入视口后自动加载,约 3KB)。
KServe 架构 基于Knative Serving+Istio 声明式推理服务 原生支持scale-to-zero,适合Serverless推理
框架总览
想象你有两家餐厅要管理。第一家叫“标准快餐店”(KServe),它的特色是“一键标准化”——所有菜品按固定配方做,出餐快、流程统一,高峰期靠“客流感应器”自动多加人手。第二家叫“创意私房菜”(Seldon Core),它的特色是“厨艺自由”——可以一层层嵌套不同的烹饪流程(比如先炸后炒、先腌后烤),适合做复杂菜品。
这两家餐厅都建在同一个“商业综合体”(Kubernetes)里,并且都请了同一位“客流感应器供应商”——Knative。Knative 负责盯着餐厅门口排队人数(并发请求数),自动决定叫醒多少厨师(Pod)来上班。
KServe 脱胎于早期的 KFServing,由 Google、IBM 等公司推动,主打“标准化的 Serverless 推理”,你只需要写一个简洁的 YAML 文件,就能把 TensorFlow、PyTorch 等模型发布为可自动扩缩容的 API 服务。Seldon Core 则是 Seldon 公司的开源项目,它在推理图上做文章——支持复杂的模型路由、多模型组合、以及和 Seldon ALGO 等 MLOps 工具的深度集成。
两个框架共享 Knative 提供的自动扩缩容能力:Knative 的“感应器”通过监控并发请求数,随时调整 Pod 数量。KServe 把 Knative 做成了“发动机”直接驱动推理服务;Seldon 则把 Knative 当作“外挂空调”——主要靠自己内部的引擎调度,Knative 负责辅助伸缩。
部署架构
“标准快餐店”(KServe)的厨房设计非常讲究标准化。店长(Kubernetes 控制器)通过一张“配方卡”(CRD,即 Custom Resource Definition,自定义资源定义)告诉后厨今天要做什么菜。你只需要在 YAML 文件里写明“我要部署一个 PyTorch 模型”,KServe 控制器就会自动帮你:
1. 创建一个 Knative Service(相当于“开店申请单”)
2. 配置好 Istio 流量路由(相当于“门口排队通道”)
3. 拉取模型镜像、启动 Pod(相当于“厨师上岗”)
KServe 的访问流量先进 Istio 网关(排队取号机),再转发到对应的推理 Pod。这个过程完全是声明式的——你告诉系统“要什么”,不用管“怎么做”。
“创意私房菜馆”(Seldon Core)则走了另一条路。它也使用 CRD,但它的核心是一个内部推理引擎(Seldon Engine)。当你提交一个 SeldonDeployment YAML 时,控制器会创建一个包含“引擎+模型容器”的 Pod,所有请求由引擎统一接收,再按你定义的推理图(predictive graph)转发给不同的模型容器。
打个比方:KServe 是“每个厨师一个窗口”,Istio 在外面统一分流;Seldon 是“一个大厨(引擎)在厨房里调度多个帮厨(模型容器)”,路由逻辑在 Pod 内部完成。这意味着:
- KServe 的流量管理在服务网格层:依靠 Istio 做百分比流量拆分、金丝雀发布;
- Seldon 的流量管理在应用层:引擎内部可以按规则、按模型 ID 灵活路由,甚至可以在一个 Pod 里做多模型组合推理。
在 GPU 调度上,两者都支持通过 K8s 的 GPU 资源声明(nvidia.com/gpu)来绑定显卡,但体验不同:KServe 的 Serverless 模式天然支持“GPU 空闲时缩容到零”,Seldon 则更多依赖常驻 Pod 配合显存共享。
回到餐厅例子:KServe 的“排队通道”(Istio)在店面外分流,Seldon 的“调度大厨”(引擎)在厨房内调度。如果你需要精细到“某个用户走某个模型”,Seldon 更顺手;如果只需要“新版本切 10% 流量”,KServe 的 Istio 集成更简单。
- Ingress 入口所有外部请求首先到达集群入口,通常是 Istio Gateway 或 Ambassador,相当于餐厅的“大门迎宾处”。
- 路由层请求在此被按规则分发。KServe 用 Istio VirtualService 做流量拆分,Seldon 用引擎内路由做智能分发。
- 推理 Pod路由选中的 Pod 接收请求,加载模型并执行前向计算,最后返回预测结果。
自动扩缩容
现在重点来了——Knative 的自动扩缩容到底是怎么工作的?
假设你的餐厅门口装了“客流感应器”,它会不断测量“此刻有多少人在排队等位”(并发请求数)。Knative 里也有一个这样的组件,叫 Queue Proxy(队列代理)。每个推理 Pod 旁边都站着一个 Queue Proxy,它实时统计进入 Pod 的并发请求数。
Knative 的自动扩缩器(KPA,Knative Pod Autoscaler)会持续收集所有 Queue Proxy 上报的并发数,然后算一个“期望的 Pod 数”:
KPA 有几个关键调参项:
containerConcurrency(单 Pod 并发上限):设置每个 Pod 最多同时处理多少请求。默认 KServe 设为 0(不限),但生产环境建议设为 10~50,防止单 Pod 过载。
stable-window(稳定窗口):Knative 会观察一段时间(默认 60 秒)内的并发趋势,避免因为瞬时抖动频繁扩缩容。好比餐厅不会因为门口 5 分钟排了一下队就立刻加 10 个厨师。
- 扩容与缩容的速度不同:Knative 的扩容是“立即响应”的(通常几秒内完成),缩容则有
scale-down-delay(默认 5 分钟)的延迟——因为刚服务完一波客人的厨师,不要马上赶走,万一马上又来一波呢?
最强大的能力是 scale-to-zero(缩容到零)。当餐厅连续一段时间(默认 5 分钟)一个客人都没有,Knative 会让所有 Pod 都“下班休息”;下一个请求来临时,冷启动重新拉起 Pod。这个过程通常需要 5~10 秒。KServe 默认开启这个能力,所以“零流量零成本”;Seldon 则不默认缩容到零,更适合需要低延迟响应的场景。
关键公式在此刻变得直观:Knative 的角色,就是那个不断测量排队人数、计算“需要开几桌”、并且自动增减厨师的“智能店长”。
minScale: 1 来保底一个 Pod;如果追求成本极致,就保持 minScale: 0。- 当前并发总量所有活跃 Pod 的 Queue Proxy 上报的并发数之和,即此刻餐厅门口排队总人数。
- 单 Pod 并发上限每个 Pod 能同时处理的请求数上限(
containerConcurrency),相当于每张桌子的最大容量。 - 向上取整只要需求超过容量一点点,就要多开一桌;有余量就合并。
功能对比
我们把 KServe 和 Seldon Core 摆在“赛场”上,从三个维度PK:
维度一:推理服务抽象
KServe 的抽象是 InferenceService,它把所有东西封装成“一个服务”:模型、Transformer(预处理)、Explainer(解释器)都在一个 YAML 里声明。你像点套餐一样,一站搞定。Seldon 的抽象是 SeldonDeployment,它更强调整体推理图:你可以定义“A 模型输出送给 B 模型,B 和 C 的结果再融合”这种复杂 DAG。
维度二:流量管理
KServe 的流量管理在 Istio 层。它天然支持金丝雀发布:创建两个 InferenceService 版本,然后通过流量百分比(如 90% 走 v1,10% 走 v2)慢慢切流。Seldon 的流量管理在引擎内部,支持更细粒度的规则路由(比如按请求头、按用户 ID 分流)。
| 能力 | KServe | Seldon Core |
|------|--------|-------------|
| 部署抽象 | InferenceService(服务级) | SeldonDeployment(图级) |
| 流量路由 | Istio VirtualService | 引擎内部路由 |
| 金丝雀发布 | 原生支持(按百分比) | 支持(按规则/图) |
| 多模型组合 | 较弱 | 强(推理图嵌套) |
| 缩容到零 | 默认支持 | 需额外配置 |
维度三:GPU 调度
两者都通过 K8s 的 nvidia.com/gpu 声明 GPU。KServe 与 Serverless 结合,GPU Pod 在闲置时也可以缩容到零,节省成本;Seldon 更常搭配模型常驻内存,避免频繁加载大模型。
这个“省钱账”,请你结合自己业务的实际请求频率来算。
nvidia-smi 中的显存利用率比 GPU 利用率更能反映真实瓶颈。应用场景
场景一:Serverless 推理(低频/突发流量)
你的 RAG 客服系统里,有一个“文档问答”模型,平时只有上班时间被员工使用,晚上几乎没人调用。如果用常驻 GPU Pod,一天有 16 小时在白白烧钱。用 KServe 部署这个模型,开启 Knative 的 scale-to-zero,晚上自动缩到零,白天有人请求时自动拉起。实际项目中,这类配置可以为团队每月节省 60%~70% 的 GPU 成本。
场景二:RAG 客服系统的金丝雀发布
你升级了 RAG 系统中的 Embedding 模型,从旧版切换到新版,担心新版效果退步。用 KServe 创建 v1 和 v2 两个 InferenceService,然后通过 Istio 流量规则,先把 5% 的请求切到 v2,观察客服机器人答非所问的比例,确认没问题后再逐步切到 100%。整个过程不断服、可回滚。
场景三:A/B 测试与多模型路由
你在尝试两个不同规模的推荐模型:一个轻量版(快但精度一般)和一个重量版(慢但效果好)。用 Seldon 的推理图,在一个 SeldonDeployment 里同时部署两个模型,引擎内部根据请求参数(如用户等级)路由:VIP 用户走重量版,普通用户走轻量版。这用 KServe 做,就需要维护两套独立服务并自己写路由逻辑;Seldon 引擎内部天然支持。
落地实践
选好了框架,真正落地时还要面对“油盐酱醋”——配置调优、监控告警和生产经验。
配置调优三步走:
第一步,摸清模型性能基线。在压测环境中记录:单 Pod 能承受的 QPS、每请求平均延迟、GPU 显存占用。这相当于知道“一个厨师一小时能炒多少盘菜”。
第二步,设置 Knative 扩缩容参数。根据基线数据设置 containerConcurrency(建议从 10 开始压测)、stable-window(默认 60 秒)、scale-down-delay(默认 5 分钟)。
第三步,配置 HPA 兜底。Knative 的并发度量适合“请求量驱动”的伸缩,但某些场景下 CPU/内存才是瓶颈。可以同时启用 Kubernetes HPA(按 CPU 使用率)作为辅助,形成“并发优先 + 资源兜底”的双重策略。
监控告警四件套:
1. 每秒请求数(QPS):从 Istio 或 Seldon 引擎抓取;
2. 推理延迟 P99:不要只看平均延迟,P99 才是用户体验的真实痛点;
3. Pod 扩缩容事件:Knative 的 autoscaler 日志会记录每次扩容决策,注意观察是否有频繁抖动;
4. GPU 显存与利用率:nvidia-smi 指标 + Prometheus 采集。
生产经验教训(来自真实踩坑):
- 冷启动是最大的敌人:缩容到零虽省钱,但冷启动可能导致 5~10 秒的延迟。如果 SLO 要求 P99 < 1 秒,保底
minScale: 1比省钱更重要。减轻冷启动影响的方法包括使用imagePullPolicy: IfNotPresent缓存镜像、将queue-proxy的资源预留调小,以及通过scale-to-zero-grace-period延长缩容到零前的等待时间。
- 不要盲目调低并发上限:
containerConcurrency设太小(比如 1),会导致 QPS 上不去、频繁扩容;设太大可能导致单 Pod 被打爆。建议在压测环境用梯度测试(1/5/10/20)找到拐点。
- 版本升级先看兼容性:Knative 的 API 版本迭代快(v1alpha1 → v1beta1),K8s 集群版本、Istio 版本、KServe/Seldon 版本四者之间都可能存在兼容性矩阵,升级前务必查阅官方 Release Notes。
- GPU 显存泄漏问题:TensorFlow 等框架存在显存碎片化问题,长时间运行后显存利用率下降。定期用
nvidia-smi检查,必要时做 Pod 滚动重启。
- 监控数据别裸奔:建议将 Prometheus 的
queue-proxy指标与istio_request_duration_milliseconds组合使用,才能同时看到“排队人数”与“上菜速度”。
回到底部比喻:落地实践就是“开店后的日常经营”——光有感应器和厨师还不行,还要随时看财务报表(监控)、调整排班表(参数)、应对突发状况(冷启动)。只有把经营细节理顺,餐厅才能在高峰期赚到钱、在低谷期不亏钱。
AI 应用场景
Serverless 推理:RAG 客服系统的夜间自动休眠
阶段:模型部署与推理优化
解决的问题:某企业 RAG 客服系统的文档问答模型,工作日白天被频繁调用,但晚间与周末几乎无人使用。传统方式下 GPU 推理 Pod 7×24 小时常驻,大量 GPU 资源在空闲时段被浪费,每月推理成本居高不下。使用 KServe 部署模型并开启 Knative scale-to-zero,夜间零请求时自动缩容到零,白天首个请求到来时自动冷启动拉起,成本直降 60% 以上。
具体案例:某金融企业 RAG 客服系统,原使用 2 张 A10 GPU 常驻部署 Embedding 与问答模型,月成本约 1.2 万元。迁移到 KServe 后,配置 minScale: 0 和 containerConcurrency: 16,夜间缩容到零。按白天 8 小时高峰计算,GPU 有效使用时间减少 60%,月成本降至约 4800 元,且高峰期 QPS 不受影响。
金丝雀发布:Embedding 模型无缝升级
阶段:模型上线与版本管理
解决的问题:RAG 系统升级 Embedding 模型时,直接全量替换风险大,新模型可能改变向量分布导致检索质量回退。传统做法需要同时维护两套服务并手动切换,运维复杂且无法精细化控制放量节奏。KServe 结合 Istio 的流量管理能力,让新旧模型以 5%→50%→100% 的节奏逐步切换,实时对比检索准确率指标。
具体案例:客服系统从 BGE-small 升级到 BGE-large,通过 KServe 创建 v1、v2 两个 InferenceService,用 Istio VirtualService 将 5% 请求切到 v2。运行 2 小时后观察 answer_relevance 指标无回退,逐步提升到 50%、100%,全程零断服。
Python 演示
import requestsimport mathimport time ## 模拟 Knative 自动扩缩容核心逻辑# class KnativeAutoscaler: def __init__(self, concurrency_limit=10, stable_window=5): self.concurrency_limit = concurrency_limit self.stable_window = stable_window self.history = [] def observe(self, current_concurrency): self.history.append(current_concurrency) if len(self.history) > self.stable_window: self.history.pop(0) def desired_replicas(self): if not self.history: return 1 peak = max(self.history) replicas = math.ceil(peak / self.concurrency_limit) return max(1, replicas) def scaled_to_zero(self): return self.desired_replicas() <= 0 def query_kserve_metrics(url): resp = requests.get(url, timeout=5) return resp.json()["concurrency"] def main(): kpa = KnativeAutoscaler(concurrency_limit=10, stable_window=5) metrics_url = "http://localhost:8080/metrics" # 模拟 10 轮请求量观测 test_requests = [3, 8, 15, 25, 40, 30, 12, 5, 2, 0] for i, qps in enumerate(test_requests): concurrency = qps * 2 kpa.observe(concurrency) replicas = kpa.desired_replicas() status = "缩容到零" if concurrency == 0 else "运行中" print(f"第{i+1:2d}轮 并发={concurrency:3d} 期望Pod数={replicas:2d} 状态={status}") time.sleep(0.5) real_metrics = query_kserve_metrics(metrics_url) print(f"线上实际并发: {real_metrics}") if __name__ == "__main__": main()
class KnativeAutoscaler模拟 Knative 核心扩缩容器,封装并发观测与副本计算逻辑desired_replicas()用math.ceil(peak / concurrency_limit)实现“并发除以上限向上取整”的扩缩容公式kpa.observe(concurrency)将每次观测到的并发请求数加入滑动窗口test_requests = [...]模拟从低到高再回落的请求量变化,直观展示扩缩容过程query_kserve_metrics()示意从 KServe 暴露的指标端点拉取真实并发数据scale_to_zero()当期望副本数归零时触发缩容到零的逻辑判断
常见误区
误区很多初学者认为 KServe 和 Seldon Core 是“水火不容”的竞争对手,一个项目只能选一个,选了 KServe 就不能用 Seldon 的特性。于是做技术选型时非常纠结,仿佛选错就万劫不复。
正解它们确实是两个独立框架,但在实际生产中可以共存于同一个 K8s 集群。KServe 适合标准、统一的预测服务部署;Seldon 适合复杂推理图、多模型路由。有些团队用 KServe 部署标准的 Embedding 模型服务,用 Seldon 部署复杂的推荐模型 DAG。两者共用集群资源和 Knative 的扩缩容能力,并不冲突。甚至 Seldon 也可以作为 KServe 的推理运行时(runtime)来使用。
为何常见:因为技术博客和大会分享通常只讲“赢家通吃”的故事,很少提“混合架构”的实践;加上两边的文档都强调自家优势,容易让人觉得只能站队。
误区看到 Knative 的 scale-to-zero 宣传“零流量零成本”,初学者觉得这是百利而无一害的“魔法”,于是在所有服务上都开启 `minScale: 0`。结果线上出现请求时,用户要等 5~10 秒冷启动,直接把 P99 延迟拉到天上。
正解缩容到零是把双刃剑。它确实省 GPU 成本,但它把“冷启动延迟”这个代价转移给了第一个请求。如果你的业务 SLO 要求 P99 延迟小于 1 秒,就不能缩容到零。此外,大模型(如 7B 参数以上的 LLM)加载时间通常超过 20 秒,连 Knative 的 scale-to-zero-grace-period 都可能不够用,需要配合模型预热或 minScale: 1 兜底。正确的做法是:低频容忍延迟的服务用 scale-to-zero,高频低延迟的服务保底 1 个 Pod。同时,应对冷启动延迟的工程手段还包括:使用镜像预热(图像层预拉取)、在 queue-proxy 前加一层网关缓存等,但最直接有效的方式仍是保留最小常驻副本。
为何常见:因为“省钱”的营销故事传得快,“延迟代价”的运维细节藏在文档深处,新手不容易在一开始就看到。
误区以为配置好了 `containerConcurrency` 和 `stable-window`,Knative 就会永远自动地把 Pod 数量维持在最佳状态,不需要再人工介入。
正解自动扩缩容的参数高度依赖业务流量模型和模型本身的性能特征。流量从“工作日白天高峰”变成“全天均匀”,之前的参数就不一定最优;模型从 TensorFlow 换成 PyTorch,单 Pod 的并发上限也可能要重新压测。此外,Knative 的扩容是“反应式”的,突刺流量到来时会有短暂延迟,需要配合监控告警,在流量突增前提前扩容。建议定期(每月或每季度)审视扩缩容事件,结合压测结果调参。
为何常见:名字里带“自动”两个字,人们就默认它“全自动、免维护”。实际上它是“自动调节”,不是“自动调优”。
误区觉得 `containerConcurrency` 设得越大越好,以为单 Pod 并发上限大,就能处理更多请求,减少 Pod 数量、省钱。于是直接设成 100 甚至 0(不限)。
正解并发上限本质上是“单 Pod 能同时处理多少请求”,而每个请求都要消耗 CPU/内存/GPU 资源。设置过大会导致请求在 Pod 内排队,反而拉高延迟;设置过小则会导致 Pod 频繁扩容,造成资源浪费和冷启动开销。正确做法是对模型做压测,找出“延迟可接受且资源利用率合理”的拐点。比如一个模型单 Pod 能处理 20 并发且 P99 < 100ms,那就设 15~20 留点余量。
为何常见:直觉上“并发 = 吞吐”,忽略了单 Pod 资源的物理约束;加上云厂商的账单让人觉得 Pod 越少越省钱,容易走上极端。
误区以为 KServe 的金丝雀发布只用把 Istio 流量比例改成 5% 就万事大吉,剩下的就是等。结果灰度过程中新模型出了问题,5% 的线上用户直接受到影响,回滚也手忙脚乱。
正解金丝雀发布是一套完整流程:先定义新旧版本的评价指标(如检索准确率、问答满意度),再设置流量比例,同时要实时监控新版本的延迟、错误率,并在发现问题时快速回滚。KServe/Istio 只提供了“切流量”的机械能力,切多少、观察什么、什么时候全切,都需要你预先规划。生产实践中建议配合 Argo Rollouts 或 Flagger 这类工具,让金丝雀发布自动化、可观测化。
为何常见:把“工具能力”误当成“方法论”,忽略了灰度发布的工程本质是“可观测的渐进式验证”,而不仅仅是流量分配。
面试题
Q1. Knative 在 KServe 推理框架中主要负责什么?
- A.训练深度学习模型
- B.基于并发请求的自动扩缩容← 正确答案
- C.管理 GPU 显存分配
- D.存储训练数据集
答案:B。Knative 的核心角色是“客流感应器”——监控并发请求数并决定 Pod 的扩缩容。它不负责训练、不管理显存、不存数据。GPU 显存分配是 K8s 调度器和设备插件的事,模型训练是训练框架的事,数据集存储是存储系统的事。
Q2. KServe 的流量管理主要依赖哪个组件?
- A.Seldon 推理引擎
- B.Istio VirtualService← 正确答案
- C.Knative Queue Proxy
- D.Prometheus
答案:B。KServe 的请求路由在“店面外”完成,依赖 Istio VirtualService 做流量拆分与金丝雀发布。Seldon 引擎是 Seldon Core 的路由组件;Queue Proxy 负责并发统计而非流量路由;Prometheus 是监控系统。
Q3. 若当前并发总量为 25,单 Pod 并发上限设为 10,Knative 计算的期望副本数是多少?
- A.1
- B.2
- C.3← 正确答案
- D.4
答案:C。按公式“并发总量除以单 Pod 上限,向上取整”:25 ÷ 10 = 2.5,向上取整为 3。这就是 Knative 的扩缩容核心计算——排队 25 人、每桌坐 10 人,需要开 3 桌。
Q4. KServe 部署推理服务的核心 CRD 是什么?
- A.Deployment
- B.SeldonDeployment
- C.InferenceService← 正确答案
- D.KnativeService
答案:C。KServe 对外的抽象是 InferenceService,用户通过它声明模型类型、资源、副本策略等。SeldonDeployment 是 Seldon 的 CRD,Deployment 是 K8s 原生工作负载,KnativeService 是 Knative 的抽象。
Q5. Seldon Core 相比于 KServe 的优势体现在哪些方面?
- A.支持复杂的多模型推理图嵌套← 正确答案
- B.引擎内部的自定义路由规则← 正确答案
- C.默认支持 GPU 显存共享
- D.原生支持 scale-to-zero
答案:AB。Seldon 的核心优势是“创意私房菜”——推理图嵌套(多模型组合)和引擎内灵活路由。它不默认提供 GPU 显存共享,也不默认开启缩容到零(需要额外配置),这两项反而是 KServe 的 Serverless 特性更占优势。
Q6. Knative 扩缩容中 stable-window 参数的作用是?
- A.设置 Pod 的最小副本数
- B.观察并发趋势的时长窗口,避免抖动← 正确答案
- C.控制 Pod 启动的最大时长
- D.设置请求的超时时间
答案:B。stable-window 是 Knative 自动扩缩容器的“观察窗口”,它在窗口期内收集并发数据、计算趋势,避免因瞬时尖峰或抖动导致频繁扩缩容。它不控制最小副本数、不控制 Pod 启动时长、也不管请求超时。
Q7. KServe 的 scale-to-zero 特性会产生什么直接代价?
- A.增加 GPU 显存占用
- B.冷启动延迟← 正确答案
- C.增加网络带宽消耗
- D.丢失已持久化的模型文件
答案:B。缩容到零后,下一个请求到达时必须重新拉起 Pod、加载模型,这个过程就是冷启动延迟(通常 5~10 秒,大模型更久)。它不增加显存占用、不消耗额外带宽、更不会丢模型文件(模型在镜像或存储卷中)。
Q8. 在生产环境中,以下哪些做法有助于缓解推理服务的冷启动延迟?
- A.设置 minScale: 1 保底常驻一个 Pod← 正确答案
- B.使用 imagePullPolicy: IfNotPresent 缓存镜像← 正确答案
- C.将 cluster-autoscaler 的扩容间隔调到最小← 正确答案
- D.关闭所有服务的 scale-to-zero 功能
答案:ABC。缓解冷启动延迟的常用手段包括保留最小常驻副本(A)、镜像缓存(B)、加快节点自动扩容(C)。D 选项“全部关闭”过于极端,不符合成本优化原则。冷启动延迟的根本来源是 Pod 调度、镜像拉取和模型加载三个环节,A/B/C 分别对应这三个环节的缓解策略。
Q9. Seldon Core 接收外部请求后,由哪个组件负责转发给模型容器?
- A.Istio Ingress Gateway
- B.Seldon 推理引擎← 正确答案
- C.Queue Proxy
- D.Kubelet
答案:B。Seldon 采用“厨房内调度”模式,请求进入 Pod 后由 Seldon 推理引擎按推理图转发给各个模型容器。Istio 只是入口,Queue Proxy 是 Knative 的并发统计组件,Kubelet 是节点代理。
Q10. 关于 KServe 和 Seldon Core 在生产中的关系,说法正确的是?
- A.它们可以在同一集群中共存← 正确答案
- B.选型时只能二选一,不能混用
- C.两者共享 K8s 集群和 Knative 的扩缩容能力← 正确答案
- D.Seldon 可以作为 KServe 的推理运行时← 正确答案
答案:ACD。两个框架可以在同一集群共存,各司其职;它们共享 K8s 基础资源和 Knative 扩缩容;Seldon 确实可以作为 KServe 的 model runtime 使用。B 选项是常见误区——技术选型是“合适的工具做合适的事”,不存在只能二选一的规则。