1. 训练成功以后,模型还不能直接上线
训练任务完成时,平台得到一个模型产物。它可能在离线评估中达到预期,也可能已经通过人工检查。真正对外提供推理,还要补齐运行镜像、预处理、资源、网络和发布策略。
Training Job
→ Model Artifact
→ Model Version
→ Release Approval
→ KServe InferenceService
→ Predictor Pod
→ Request / Response
→ Trace / Metrics
→ Evaluation因此,“训练成功”“模型可发布”“推理实例 Ready”“业务流量已经切换”应该是不同状态。
2. 模型版本需要包含完整运行契约
只保存一个权重路径不够。推理结果还取决于:
权重和配置
模型格式与框架版本
Tokenizer 或图像预处理
输入输出 Schema
运行镜像摘要
CPU / GPU / 内存需求
批处理与超时配置
来源训练任务和数据版本可以让 ModelVersion 保存这些内容的引用和校验值,让 DeploymentRevision 表达一次具体发布:
ModelVersion v12
├─ artifact_uri
├─ runtime_image_digest
├─ input_schema_version
└─ evaluation_id
DeploymentRevision r31
├─ environment: staging
├─ model_version: v12
├─ resource_profile: gpu-small
└─ status: READY同一模型版本可以发布到测试和生产环境,两个环境的资源和流量状态分别记录。
3. KServe 把推理服务变成 Kubernetes 资源
KServe 使用 CRD 描述模型推理工作负载。控制面根据 InferenceService 创建 Kubernetes Deployment、Service 和网络资源,数据面负责接收推理请求。
下面是省略大量配置后的示例:
apiVersion: serving.kserve.io/v1beta1
kind: InferenceService
metadata:
name: vision-model-v12
spec:
predictor:
model:
modelFormat:
name: onnx
storageUri: s3://model-registry/vision/v12/
resources:
limits:
nvidia.com/gpu: "1"URI、格式和 GPU 数量仅用于说明资源关系。实际清单要匹配 KServe 版本、ServingRuntime、存储凭据和模型需求。
Java 平台不必自己创建所有 Deployment 细节。它可以根据经过校验的模板生成或更新 InferenceService,再同步 CRD 状态到发布记录。
4. Ready 必须等模型真正可用
大型模型容器启动后还要下载或挂载模型、分配显存并加载权重。进程已经监听端口时,模型可能仍不能处理请求。
Kubernetes 的探针解决不同问题:
| 探针 | 推理服务中要回答的问题 |
|---|---|
| startupProbe | 较长的模型加载阶段是否结束 |
| readinessProbe | 当前实例能否接受新请求 |
| livenessProbe | 进程是否进入需要重启的状态 |
Readiness 应覆盖模型加载和必要依赖。Liveness 不宜因为短时高负载就频繁杀死实例,否则可能形成反复加载模型的故障循环。
平台还要区分:
资源已创建
Pod 已调度
容器已启动
模型已加载
路由已生效
验证请求已通过只有完成约定的发布门槛,业务状态才进入 SERVING。
5. 灰度发布需要绑定明确版本
直接替换全部实例,一旦新模型或新运行镜像出现问题,影响范围会迅速扩大。灰度发布让一部分流量进入候选版本:
stable v11 ── 90% traffic
canary v12 ── 10% traffic比例只是示意。KServe 0.20 的 API 包含 Canary 配置和流量比例,实际使用要核对部署模式与版本能力。
每个请求需要留下服务版本、模型版本和运行修订号,才能比较两组结果:
request_id
deployment_revision
model_version
latency
result_status
evaluation_feedback不能只比较平均延迟。错误率、超时、尾延迟、资源占用和业务效果需要分别观察,并绑定相同的流量条件。
6. 回滚对象要提前定义
发布问题可能来自不同层:
| 问题 | 可能的回滚对象 |
|---|---|
| 模型效果下降 | 模型版本或流量路由 |
| 预处理错误 | 运行镜像和配置 |
| 资源不足 | 资源规格与副本配置 |
| 网络路由错误 | Gateway、Service 或路由规则 |
| 上游请求不兼容 | API Schema 或调用方版本 |
“回滚模型”如果只修改 storageUri,却保留不兼容的预处理镜像,服务仍然可能失败。一个 DeploymentRevision 应把模型、镜像、配置和接口版本固定在一起。
回滚也要作为新动作留下操作者、原因和目标版本,避免平台只显示最后状态。
7. 自动扩缩不能只看 CPU
推理服务的瓶颈可能来自 GPU 显存、并发序列、队列等待、批处理或模型加载时间。CPU 使用率未必能代表容量。
扩缩容策略至少要考虑:
- 请求速率和并发数。
- 排队时间与超时率。
- GPU 利用率和显存。
- 单实例安全并发。
- 新实例从创建到 Ready 的时间。
缩容时还要处理正在执行的请求。Scale-to-zero 适合能够接受冷启动的场景,不应默认用于所有在线服务。
8. Java 控制面怎样管理发布
Spring Boot 可以提供面向业务的发布流程:
提交发布申请
→ 校验模型与评估状态
→ 创建 DeploymentRevision
→ 调用 Kubernetes / KServe Adapter
→ 等待 Ready
→ 执行验证请求
→ 调整流量
→ 完成或回滚接口提交使用幂等键,发布状态通过条件更新推进。KServe 负责集群中的资源协调,Java 平台保存项目、权限、审批、模型和发布历史。
KServe 提供模型服务的声明式资源和控制器,但平台仍然需要自己判断某个模型是否符合业务上线标准,并保存版本、验证、观测和回滚记录。在发布链路里,谁负责编排资源、谁负责业务把关,要分得清楚。
相关阅读
- 机器人训练数据怎样送到 GPU:Kubernetes、JuiceFS 与 Lance 的分工
- 为什么训练任务不应该直接塞进 Spring Boot 请求里
- AI 数据平台部署前,先看懂一台 Kubernetes 节点