KServe:云原生的无服务器模型推理平台

FreeGuideOnline 最新 2026-06-14

KServe:云原生的无服务器模型推理平台

KServe 是一个基于 Kubernetes 的标准模型推理平台,专为高扩展性、无服务器架构设计。它提供了一套统一的 API(基于 KFServing 项目演进而来),让数据科学家和 ML 工程师能够以声明式的方式部署、管理并自动扩缩容机器学习模型,无需关心底层服务器的细节。借助 KServe,你可以将训练好的模型快速转化为生产就绪的推理服务,并享受服务网格、可观测性、金丝雀发布等云原生能力。


为什么模型推理需要无服务器架构?

传统模型部署往往需要手动管理实例数量、负载均衡以及健康检查。面对突发流量时,应对能力不足,闲置时又浪费资源。无服务器模型推理的理想特性包括:

  • 按需扩缩:根据请求量自动调整副本数,包括缩容至零。
  • 资源隔离:每个模型独立部署,互不干扰。
  • 标准化协议:统一的预测 API(HTTP/gRPC),降低客户端适配成本。
  • 快速迭代:支持多版本管理、流量拆分和回滚。
  • 可观测内置:日志、监控、追踪开箱即用。

KServe 正是围绕这些目标构建的。


KServe 核心概念

在深入实操之前,先理解以下几个关键对象:

InferenceService

InferenceService 是 KServe 最高层的自定义资源(CRD),它封装了一个模型推理服务所需的所有信息。它定义了三层组件,分别对应不同的推理场景:

组件 简称 作用
Predictor (预测器) 必选 核心的模型推理逻辑,可加载 TensorFlow、PyTorch、ONNX、SKLearn 等模型。
Transformer (转换器) 可选 用于请求/响应的预处理和后处理,例如数据格式转换、特征工程。
Explainer (解释器) 可选 提供模型可解释性,如 Alibi Explain、ART 等。

一个最简的 InferenceService 只包含 Predictor 组件,KServe 会自动为其创建 Service、Deployment 等底层资源。

Serving Runtime

Serving Runtime 定义了模型运行时的环境与协议。KServe 预置了多种官方的 Serving Runtime,包括:

  • kserve-tensorflow-serving
  • kserve-torchserve
  • kserve-triton-inference-server
  • kserve-mlserver (支持多种框架)
  • 自定义 Runtime 可基于 KServe 模板实现

每种 Runtime 指定了容器镜像、支持的模型格式、环境变量等。部署时只需指定 Runtime 名称和模型存储路径即可。

Model 格式与协议

KServe 采用标准 V2 数据协议(即 KFServing V2 协议),统一了推理请求/响应的格式。其 URL 模式为:

POST http://<service>/v2/models/<model_name>/infer

请求体包含 inputs 和可选的 outputs 字段,适配不同模型框架。


安装 KServe

KServe 依赖 Kubernetes 集群(推荐 v1.22+)和 Istio(服务网格)或 Knative(灵活选择)。安装分为两步:

1. 安装 KServe CRDs 和核心组件

使用官方发布的 Manifest 文件即可:

kubectl apply -f https://github.com/kserve/kserve/releases/download/v0.10.0/kserve.yaml

此命令会安装 KServe CRD、控制器、Webhook 等。如果你需要使用 Knative 实现缩容至零,还需安装 Knative Serving。

2. 安装并配置网络层(Istio / Knative)

方案 A:使用 Istio

istioctl install -y
kubectl label namespace kserve istio-injection=enabled

KServe 默认会创建 InferenceService 对应的 Istio VirtualService 和 DestinationRule。

方案 B:使用 Knative

若需无服务器弹性、并发控制和缩容至零,可安装 Knative:

kubectl apply -f https://github.com/knative/serving/releases/latest/download/serving-crds.yaml
kubectl apply -f https://github.com/knative/serving/releases/latest/download/serving-core.yaml
kubectl apply -f https://github.com/knative/net-istio/releases/latest/download/release.yaml

然后在 InferenceService 中设置 spec.predictor.knative 相关参数。

生产建议:默认 Istio 方案已足够大部分场景,Knative 提供更精细的自动扩缩容能力。


部署第一个模型服务

我们以部署一个 Scikit-learn 训练的 iris 分类模型为例。

准备模型文件

需要将模型持久化为 SKLearn 支持的格式(如 joblib 文件),并上传到可访问的存储。此处假设模型已上传至 S3 兼容存储:s3://models-bucket/iris/model.joblib

创建 InferenceService YAML

apiVersion: "serving.kserve.io/v1beta1"
kind: "InferenceService"
metadata:
  name: "iris-classifier"
spec:
  predictor:
    sklearn:
      storageUri: "s3://models-bucket/iris"
  • spec.predictor.sklearn 表示使用内置的 SKLearn Runtime。
  • storageUri 指定模型文件所在的目录(注意需包含 model.joblib 文件,且目录路径正确)。

如果存储需要密钥认证,需预先创建 Secret 并通过 spec.predictor.sklearn.env 或 Service Account 关联,或使用 KServe 的 storageSpec 进行配置。

应用配置

kubectl apply -f iris-classifier.yaml

KServe 控制器会解析此资源并创建内部的 Deployment、Service、VirtualService 等。几秒钟后,服务就绪。

查看服务状态:

kubectl get inferenceservice iris-classifier

输出中的 READYTrue 即表示部署成功。

获取推理 URL

若使用 Istio,服务的入口 URL 可通过 Istio Ingress Gateway 获得:

kubectl get inferenceservices iris-classifier -o jsonpath='{.status.url}'

显示类似 http://iris-classifier.default.example.com。通过 DNS 解析或配置 Host 映射后便可访问。

测试请求:

curl -v -H "Host: iris-classifier.default.example.com" \
  -H "Content-Type: application/json" \
  http://$INGRESS_HOST:$INGRESS_PORT/v2/models/iris-classifier/infer \
  -d '{
    "inputs": [
      {
        "name": "input-0",
        "shape": [1, 4],
        "datatype": "FP32",
        "data": [
          [5.1, 3.5, 1.4, 0.2]
        ]
      }
    ]
  }'

返回 JSON 包含模型预测的类别概率。


无服务器特性详解

自动扩缩容

KServe 结合 Knative 或 Kubernetes HPA 可自动调整副本数。在 Knative 模式下,可设置并发数、缩容延迟等:

spec:
  predictor:
    knative:
      autoScaling:
        minReplicas: 0       # 允许缩容到 0
        maxReplicas: 10
        metric: concurrency
        target: 5

当服务长时间无流量时,副本数将缩减到 0;一旦有新请求,Knative Activator 会缓冲请求并迅速启动 Pod(冷启动)。这种模式极大节省了闲置资源的开销。

缩容至零的冷启动优化

冷启动是服务的短板,可通过以下方式优化:

  • 保持最小 Pod 数:设置 minReplicas: 1 避免完全缩容至零。
  • 使用轻量级 Runtime:如 MLServer 对多种框架有良好优化。
  • 模型预热:有些 Runtime 支持在启动时加载模型到内存,减少首次请求的延迟。
  • 集群节点预配:配合节点自动扩缩,加快 Pod 调度。

流量管理与金丝雀发布

KServe 支持按权重拆分流量到不同版本的 InferenceService:

spec:
  predictor:
    canaryTrafficPercent: 30   # 新版本接收 30% 流量

实际部署中,先创建初始版本的服务,然后创建新的 InferenceService 并通过标签选择器与流量配置实现金丝雀发布。KServe 内部利用 Istio 的流量规则实现平滑切换。


高级特性概览

Transformer 使用示例

以下配置在推理前添加一个 Transformer 组件,用于将原始图像数据预处理为模型所需的张量格式:

apiVersion: serving.kserve.io/v1beta1
kind: InferenceService
metadata:
  name: image-classifier
spec:
  predictor:
    tensorflow:
      storageUri: "s3://models/image-model"
  transformer:
    custom:
      container:
        image: my-transformer:latest
        env:
          - name: RESIZE
            value: "224,224"

Transformer 拦截请求,处理后再转发给 Predictor,实现输入输出数据管的解耦。

模型解释 (Explainer)

需要模型可解释性时,可添加 Explainer 组件,例如使用 Alibi:

spec:
  predictor:
    tensorflow:
      storageUri: "s3://models/loan-model"
  explainer:
    alibi:
      type: AnchorImage
      storageUri: "s3://models/explainer"
      config:
        num_samples: "100"

解释器会提供一个独立的端点返回解释数据,通常与模型评估、A/B 测试结合使用。

多框架支持与自定义 Runtime

如果需要部署一个尚未支持的框架,可以定义自定义 Serving Runtime。创建一个 ClusterServingRuntime 资源:

apiVersion: serving.kserve.io/v1alpha1
kind: ClusterServingRuntime
metadata:
  name: my-custom-runtime
spec:
  supportedModelFormats:
    - name: myformat
      version: "1"
      autoSelect: true
  containers:
    - image: my-inference-image:latest
      name: kserve-container
      args: ["--model_name={{.Name}}", "--model_dir=/mnt/models"]
      resources: ...

然后在 InferenceService 中引用 spec.predictor.model.runtime: my-custom-runtime 即可。


监控与日志

KServe 自动暴露 Prometheus 指标,可集成 Grafana 仪表板。关键指标包括:

  • kserve_inference_request_duration_seconds:请求延迟
  • kserve_inference_requests_total:请求计数
  • kserve_inference_errors_total:错误计数

此外,Istio 锦上添花地提供了丰富的网络层指标。日志可以通过 Kubernetes 内置日志收集或 Fluentd/EFK 栈汇聚分析。


最佳实践总结

  1. 模型存储:使用云对象存储(S3、GCS、Azure Blob),并妥善管理访问凭证。
  2. 资源分配:在 Predictor 设置合理的 CPU/内存 requests 和 limits,避免 OOM。
  3. 安全性:开启 Istio mTLS,为推理端点增加认证(如 OIDC、API Key)。
  4. 冷启动与成本:评估业务容忍度,选择合适的缩容边界,生产环境建议至少保持一个副本。
  5. CI/CD 集成:使用 KServe 的 Python SDK 或在 GitOps 流程中管理 InferenceService YAML,实现自动化部署。

参考资料

通过以上教程,你已掌握 KServe 的基本原理和操作。从快速部署到无服务器扩缩容,KServe 为生产环境中的机器学习推理提供了强大且灵活的基础设施。立即在集群中尝试部署你的第一个模型吧!