KServe 是一个基于 Kubernetes 的机器学习模型服务框架,支持以 Kubernetes CRD 的形式将单个或多个经过训练的模型(例如 TFServing、TorchServe、Triton 等推理服务器)部署到模型服务运行时,使得模型的部署、更新和扩展变得更加简单快捷。
KServe 介绍
KServe 是一个基于 Kubernetes 的机器学习模型服务框架,提供简单的 Kubernetes CRD,可用于将单个或多个经过训练的模型(例如 TFServing、TorchServe、Triton 等推理服务器)部署到模型服务运行时。
- ModelServer 和 MLServer 是 KServe 中两个模型服务运行时,用于在 KServe 中部署和管理机器学习模型。
- KServe 内置了 ModelServer 和 MLServer 两种预定义模型服务运行时,它们能够提供开箱即用的模型服务:
- ModelServer 使用预测 v1 协议在 KServe 本身中实现 Python 模型服务运行时,MLServer 使用 REST 和 gRPC 实现预测 v2 协议。
- 如果需要更复杂的用例,您也可以选择构建自己的自定义模型服务器。
- 此外,KServe 还提供基本 API 原语,可轻松构建自定义模型服务运行时。
- 您也可以使用其他工具(例如 BentoML)来构建您自己的自定义模型服务镜像。
基于 Knative 使用 InferenceService 部署模型后,您将获得以下 Serverless 能力:
- 缩容到 0
- 基于 RPS、并发数、CPU/GPU 指标自动弹性
- 多版本管理
- 流量管理
- 安全认证
- 开箱即用可观测性
KServe Controller
KServe Controller 是 KServe 的核心组件之一,它负责管理 InferenceService 自定义资源,并通过创建 Knative 服务部署实现自动化的扩缩容,即该服务部署能根据请求流量进行自动扩缩容,并在未收到流量时将服务的 Pod 缩容到 0。这种自动化的扩缩容可以有效地管理模型服务的资源使用,并确保只有在需要时才会使用资源。
Hugging Face Runtime Overview
┌───────────────────────────────────────────────┐
│ KServe InferenceService │
└───────────────────────────────────────────────┘
│
▼
┌───────────────────────────────────────────────┐
│ Hugging Face Runtime Server │
├───────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ vLLM │◄───┐ ┌──► Hugging │ │
│ │ Backend │ │ │ │ Face │ │
│ └─────────────┘ │ │ │ Backend │ │
│ │ │ └─────────────┘ │
│ ┌─────────────────────────────────────┐ │
│ │ Backend Selection & Fallback │ │
│ └─────────────────────────────────────┘ │
│ │
└───────────────────────────────────────────────┘
│
▼
┌───────────────────────────────────────────────┐
│ OpenAI-Compatible APIs │
│ │
│ • Completions │
│ • Chat Completions │
│ • Embeddings │
│ • Scoring │
└───────────────────────────────────────────────┘
部署 kserve
前提条件
已在集群中部署 Knative
部署
curl -s "https://raw.githubusercontent.com/kserve/kserve/release-0.15/hack/quick_install.sh" | bash -r
# 或
curl -s "https://raw.githubusercontent.com/kserve/kserve/release-0.15/hack/quick_install.sh" | bash
查看
$ kubectl get pods -n kserve
NAME READY STATUS RESTARTS AGE
kserve-controller-manager-7f5b6c4d8f-abcde 1/1 Running 0 2m
kserve-localmodel-controller-manager-5b8b6574c7-jz42m 1/1 Running 0 2m
部署 GenAI 服务
kubectl create namespace kserve-test
- Create an InferenceService
apiVersion: "serving.kserve.io/v1beta1"
kind: "InferenceService"
metadata:
name: "qwen-llm"
namespace: kserve-test
spec:
predictor:
model:
modelFormat:
name: huggingface
args:
- --model_name=qwen
storageUri: "hf://Qwen/Qwen2.5-0.5B-Instruct"
resources:
limits:
cpu: "2"
memory: 6Gi
nvidia.com/gpu: "1"
requests:
cpu: "1"
memory: 4Gi
nvidia.com/gpu: "1"
- Create Hugging Face secret
kubectl create secret generic hf-secret \
--from-literal=HF_TOKEN=your_hf_token_here \
-n kserve-test
- create a clusterstoragecontainer resource
apiVersion: "serving.kserve.io/v1alpha1"
kind: ClusterStorageContainer
metadata:
name: hf-hub
spec:
container:
name: storage-initializer
image: kserve/storage-initializer:latest
env:
- name: HF_TOKEN
valueFrom:
secretKeyRef:
name: hf-secret
key: HF_TOKEN
optional: false
resources:
requests:
memory: 2Gi
cpu: "1"
limits:
memory: 4Gi
cpu: "1"
supportedUriFormats:
- prefix: hf://
- Check InferenceService status
$ kubectl get inferenceservices qwen-llm -n kserve-test
NAME URL READY PREV LATEST PREVROLLEDOUTREVISION LATESTREADYREVISION AGE
qwen-llm http://qwen-llm.kserve-test.example.com True 100 qwen-llm-predictor-default-47q2g 7d23h