Seldon Core一个运行在 Kubernetes 上的机器学习模型服务平台,用来把训练好的模型部署成可访问、可扩缩、可观测的在线推理服务。这里学习的是1版本。
它解决的不是“怎么训练模型”,而是:
- 模型训练好了,怎么部署上线?
- 怎么暴露 REST / gRPC 接口?
- 怎么做版本切换、流量分配?
- 怎么同时管理大量模型?
- 怎么监控延迟、错误率和资源使用?
- 怎么把多个模型、预处理和后处理串成推理流水线?
当前官方重点已经转向 Seldon Core 2。Core 2 被定位为 Kubernetes 上的 MLOps/LLMOps 框架,可以管理单模型、多个模型以及模块化推理应用。
# 架构
Seldon Core 1 在K8s 上增加了一个更高层的抽象:SeldonDeployment。
这里描述的是模型推理服务,Seldon Operator 再将它转换成 k8s 能运行的资源。
# 认识 SeldonDeployment
官方将 SeldonDeployment 定义为 Kubernetes 自定义资源,用户通过它描述模型组件和推理图。
一个简单示例如下:
apiVersion: machinelearning.seldon.io/v1
kind: SeldonDeployment
metadata:
name: iris-model
namespace: seldon
spec:
name: iris
predictors:
- name: default
replicas: 1
graph:
name: classifier
type: MODEL
implementation: SKLEARN_SERVER
modelUri: gs://seldon-models/sklearn/iris
componentSpecs:
- spec:
containers:
- name: classifier
resources:
requests:
cpu: 100m
memory: 256Mi
limits:
cpu: 1
memory: 1Gi
这一份 YAML 里混合了两类信息:
模型语义
+
Kubernetes 运行配置
-
spec.predictorspredictors: - name: default一个 predictors 可以理解为:一套可以独立接收推理请求的模型服务配置。
其中可以包含:
模型; 输入转换器; 输出转换器; 路由器; 组合器; 副本数量; Pod 配置。 -
replicasrepicas: 1描述该 predictor 的副本数量。但实际生成资源时,可能根据图结构和组件配置创建一个或多个 Deployment,因此不要机械认为一个 predictor 永远只对应一个 Deployment。
-
graphgraph: name: classifier type: MODEL implementation: SKLEARN_SERVER modelUri: gs://seldon-models/sklearn/iris是 Seldon 相比普通 Deployment 最核心的能力之一,描述的是推理组件之间的调用关系。
只有一个模型时:
request ↓ classifier ↓ response稍微复杂一点:
request ↓ input-transformer ↓ classifier ↓ output-transformer ↓ response还可以存在:
request ↓ router ┌─┴─────────┐ ↓ ↓ model-a model-b └────┬──────┘ ↓ combiner ↓ responseSeldon Core 1 官方文档说明,推理图可以由模型以及 router、combiner、输入和输出 transformer 等组件构成。
普通 Kubernetes Deployment 只知道:
运行哪些容器SeldonDeployment 还知道:
这些模型组件之间应该如何调用graph是根节点,children表示连接的下一层节点,多个-表示多个并列节点,implementation选择预打包服务器,modelUri指向模型目录。 -
implementationimplementation: SKLEARN_SERVER意思是:
使用 Seldon 已经准备好的 sklearn 推理服务器运行模型。
Seldon Core 1 提供了多种预打包推理服务器,例如:
- SKLearn Server;
- XGBoost Server;
- TensorFlow Serving;
- MLflow Server;
- 自定义服务器。
因此你不一定要自己完整实现:
HTTP Server 请求反序列化 模型加载 predict 调用 响应序列化这是 Seldon 比“直接写 Deployment”多做的一层标准化。
什么是预打包服务器?
预:提前准备好
打包:把代码、依赖库、运行环境放进一个容器镜像里
“服务器”则表示它不是普通脚本,而是一个会持续运行、接收网络请求并返回预测结果的程序。
所以预打包服务器指:提前打包好的,用于运行模型的服务器程序。之所以叫这个名字,核心原因就是:服务器代码和运行环境已经由 Seldon 提前封装好了,你不需要自己再写和配置。
-
modelUrimodelUri: gs://seldon-models/sklearn/iris描述模型文件的位置,而不是容器镜像的位置。
Seldon 可以使用预打包模型服务器,然后根据
modelUri加载模型。官方 SKLearn 示例就是通过implementation和modelUri描述模型服务。 -
conponentSpeccomponentSpecs: - spec: containers: - name: classifier resources: requests: cpu: 100m memory: 256Mi非常接近 Kubernetes 的:
PodTemplateSpec它用于描述:
- 容器;
- 环境变量;
- CPU、内存;
- Volume;
- VolumeMount;
- 安全上下文;
- 节点选择;
- GPU 资源;
- 其他 Pod 配置。
因此可以这样理解:
graph描述模型推理逻辑。
componentSpecs描述模型组件如何在 Kubernetes 中运行。
# Sldon Operator
核心循环抽象:
func Reconcile(request Request) {
// 1. 获取 SeldonDeployment
sdep := getSeldonDeployment(request)
// 2. 根据 spec 计算期望资源
desiredDeployments := buildDeployments(sdep)
desiredServices := buildServices(sdep)
// 3. 查询当前资源
currentDeployments := getDeployments(sdep)
currentServices := getServices(sdep)
// 4. 对比期望状态与当前状态
diff := compare(
desiredDeployments,
currentDeployments,
)
// 5. 创建、更新或删除资源
apply(diff)
// 6. 更新状态
updateStatus(sdep)
}
# 与直接写 Deployment 相比
-
模型语义 Deployment 只知道运行镜像,SeldonDeployment 能表达:
这是 MODEL 这是 ROUTER 这是 TRANSFORMER 这是 COMBINER -
推理图
Deployment 本身不能直接表达:
请求 → 预处理 → 模型 → 后处理SeldonDeployment 可以通过
graph描述这种关系。 -
标准推理服务器
普通 Deployment 通常需要你自己准备完整模型服务镜像。
Seldon 可以使用预打包服务器运行 sklearn、XGBoost、MLflow 等模型。