☰
seldon-core CLI 实验管理:seldon experiment list 命令深度解析
2026/10/6 1:54:02 网站建设 项目流程
  • 人工智能
  • 大模型
  • MLOps
  • LLMOps
  • 模型推理服务
  • 云原生
  • 后端

【免费下载链接】seldon-core

An MLOps framework to package, deploy, monitor and manage thousands of production machine learning models

项目地址:https://gitcode.com/gh_mirrors/se/seldon-core
点击查看免费下载

导读

seldon experiment list是 seldon-core v2 命令行工具(seldon)中用于列出当前集群内所有实验(Experiment)及其活跃状态的核心命令。本文以官方命令参考 docs-gb/cli/seldon_experiment_list.md 为骨架,结合operator/目录下的 Cobra 命令源码与 gRPC 调度器协议,深入讲解该命令的语法、参数、输出格式、底层调用链与配套配置方式,并给出从实验创建到查询的完整实操示例,帮助你在模型 A/B 测试与流量切分场景中快速掌握实验的巡检能力。


一、命令概览:实验管理子命令族

在 seldon-core v2 中,seldon experiment是一个管理实验(Experiment)的子命令族。实验允许通过在候选模型或流水线之间切分流量来测试模型新版本。从 root.go 的命令注册代码可以看到:

cmdExperiment.AddCommand(cmdExperimentStart, cmdExperimentStop, cmdExperimentStatus, cmdExperimentList)

即experiment下共挂载 4 个子命令:

子命令用途参考文档
experiment start启动一个实验seldon_experiment_start.md
experiment stop停止一个实验seldon_experiment_stop.md
experiment status查询指定实验的状态seldon_experiment_status.md
experiment list获取实验列表及活跃状态seldon_experiment_list.md

其中list不接收位置参数(Args: cobra.MinimumNArgs(0),见 experiment_list.go),一次性返回全部实验的概览,适合作为实验生命周期的"巡检入口"。

背景知识:在 seldon-core 中,一个 Experiment 定义一个 Model 或 Pipeline 之间的 HTTP 流量切分,还可以配置镜像(mirror)模型/流水线,将部分流量复制到镜像目标但不返回其结果。详见 docs-gb/experiments.md 与 kubernetes/resources/experiment.md。


二、命令语法与参数说明

2.1 Synopsis(命令用法)

seldon experiment list [flags]

2.2 Options(选项)

选项类型说明
--authority stringstringauthority(HTTP/2)或 virtual host(HTTP/1),用于覆盖 gRPC 连接中的 authority 字段
-h, --helpbool显示 list 子命令帮助信息
--scheduler-host stringstringseldon scheduler 主机地址,默认值"0.0.0.0:9004"
-v, --verbosebool输出详细日志(输出请求 proto 内容)。该选项在命令参考文档中未单列,但源码 flags.go 与 experiment_list.go 中均已注册:flags.BoolP(flagVerbose, "v", false, "verbose output")

2.3 参数优先级:环境变量与配置文件

--scheduler-host的取值遵循"命令行 > 配置文件 > 默认值"的解析逻辑,见 experiment_list.go 与 scheduler.go:

  1. 命令行显式指定:--scheduler-host,此时schedulerHostIsSet = flags.Changed(flagSchedulerHost)为true。
  2. 环境变量:默认值来自环境变量SELDON_SCHEDULE_HOST(envScheduler),最终回落到defaultSchedulerHost = "0.0.0.0:9004"。
  3. 配置文件兜底:若命令行未指定(schedulerHostIsSet == false)且配置文件~/.config/seldon/cli/config.json中controlplane.schedulerHost非空,则使用该值覆盖(见 scheduler.go 的NewSchedulerClient与 config.go 的ControlPlane结构):
// Overwrite host if set in config if !schedulerHostIsSet && config.Controlplane != nil && config.Controlplane.SchedulerHost != "" { schedulerHost = config.Controlplane.SchedulerHost }

配置文件结构如下(config.go):

{ "dataplane": { "inferHost": "...", "tls": false }, "controlplane": { "schedulerHost": "0.0.0.0:9004", "tls": false } }

此外,CLI 与调度器之间的 gRPC 连接支持双向 TLS:当配置中controlplane.keyPath非空时,客户端会加载 key/crt 与 CA 证书建立 mTLS 通道,否则使用明文连接(scheduler.go 的loadKeyPair/newConnection)。


三、底层原理:list 的完整调用链

3.1 从命令到 RPC 调用

seldon experiment list的执行链路分三层:

cobra 命令 (createExperimentList) └─ SchedulerClient.ListExperiments() [operator/pkg/cli/scheduler.go] └─ gRPC stream: ExperimentStatus(ExperimentStatusRequest) [apis/mlops/scheduler/scheduler.proto]

在 experiment_list.go 中,命令读取 flags 后构造SchedulerClient并调用schedulerClient.ListExperiments();真正的工作在 scheduler.go 的ListExperiments()完成:

func (sc *SchedulerClient) ListExperiments() error { req := &scheduler.ExperimentStatusRequest{ SubscriberName: subscriberName, // "seldon CLI" } stream, err := grpcClient.ExperimentStatus(ctx, req) // 服务端流式 RPC ... writer := tabwriter.NewWriter(os.Stdout, 0, 8, 1, '\t', tabwriter.AlignRight) fmt.Fprintln(writer, "experiment\tactive\t") fmt.Fprintln(writer, "----------\t------\t") for { res, err := stream.Recv() ... fmt.Fprintf(writer, "%s\t%v\n", res.ExperimentName, res.Active) } writer.Flush() }

值得注意的三个实现细节:

  • 请求中只携带subscriberName,不带name:proto 定义中ExperimentStatusRequest.name注释为 "Leave empty for all experiments"(scheduler.proto),因此list天然就是全量列举。
  • 使用服务端流式 RPC:rpc ExperimentStatus(ExperimentStatusRequest) returns (stream ExperimentStatusResponse),客户端持续stream.Recv()直到io.EOF,适合一次订阅多条记录。
  • 表格输出:通过text/tabwriter生成右对齐的两列表格experiment / active,便于人工阅读。

3.2 响应消息结构

每个实验返回一条ExperimentStatusResponse(scheduler.proto):

message ExperimentStatusResponse { string experimentName = 1; bool active = 2; bool candidatesReady = 3; bool mirrorReady = 4; string statusDescription = 5; optional KubernetesMeta kubernetesMeta = 6; }

list命令目前只取experimentName与active两列;更完整的candidatesReady、mirrorReady、statusDescription字段可通过seldon experiment status <name>查询,参考 seldon_experiment_status.md。

3.3 活跃状态的语义

"active" 并非简单的是/否标记,它反映实验是否真正处于可服务状态。从调度器侧实现 operator/scheduler/experiment.go 的订阅逻辑可见:

// An experiment is not active if it is being deleted or some models are not ready if !event.Active { // 处理删除 finalizer / 状态更新 }

即一个实验只有在底层模型或流水线全部就绪(Ready)且未被删除时才是活跃的。关于候选模型就绪判定的细节,可参考实验 CRD 的状态机实现 operator/apis/mlops/v1alpha1/experiment_types.go 与调度器模型管理代码 scheduler/pkg/scheduler/experiment.go。


四、实操示例:从创建实验到 list 巡检

4.1 准备模型并启动实验

以 Iris 分类模型为例(完整流程见 docs-gb/examples/local-experiments.md)。先加载两个候选模型并等待就绪:

seldon model load -f ./models/sklearn1.yaml # 模型 iris seldon model load -f ./models/sklearn2.yaml # 模型 iris2 seldon model status iris -w ModelAvailable seldon model status iris2 -w ModelAvailable

创建 50/50 流量切分的实验(示例文件 samples/experiments/ab-default-model.yaml):

apiVersion: mlops.seldon.io/v1alpha1 kind: Experiment metadata: name: experiment-sample spec: default: iris candidates: - name: iris weight: 50 - name: iris2 weight: 50

启动实验:

seldon experiment start -f ./experiments/ab-default-model.yaml seldon experiment status experiment-sample -w # 等待 active=true

4.2 使用 list 巡检实验

seldon experiment list

输出示例(两列表格,右对齐):

experiment active ---------- ------ experiment-sample true
  • 第一列experiment:实验名称(对应 YAML 中metadata.name);
  • 第二列active:布尔值,true表示实验正在生效、流量切分已按权重路由;false表示实验已停止或候选模型未就绪。

停止实验后再次list,该实验的active将变为false:

seldon experiment stop experiment-sample seldon experiment list

4.3 带 verbose 排查

当需要确认 CLI 实际发送的 gRPC 请求内容时,可加上-v:

seldon experiment list -v

该选项会在 scheduler.go 的ListExperiments()中打印请求 proto(if sc.verbose { printProto(req) }),输出形如:

{"subscriberName":"seldon CLI"}

4.4 对接自定义调度器地址

本地非默认部署(例如 scheduler 监听在其它端口)时:

seldon experiment list --scheduler-host 127.0.0.1:9004 # 或通过环境变量 SELDON_SCHEDULE_HOST=127.0.0.1:9004 seldon experiment list

五、实验结果验证:list 与流量切分的配合

list虽只展示概览,但结合实验特性可完成完整的验证闭环:

  1. 创建实验:seldon experiment start -f xxx.yaml;
  2. 确认生效:seldon experiment list中active=true,或seldon experiment status <name> -w;
  3. 验证切分:向入口发送批量推理请求,观察路由分布。例如本地模式:
seldon model infer iris -i 50 \ '{"inputs": [{"name": "predict", "shape": [1, 4], "datatype": "FP32", "data": [[1, 2, 3, 4]]}]}' # Success: map[:iris2_1::27 :iris_1::23] ← 约 50/50
  1. 验证 sticky session:每次推理响应头x-seldon-route记录了实际路由,配合-s(sticky session)参数可让后续请求走同一路由,保证实验组的视图一致性(详见 kubernetes/resources/experiment.md 的 Sticky Sessions 小节);
  2. 清理:seldon experiment stop <name>后再次list确认active=false。

实验的其它形态(无default字段的新端点实验、mirror镜像实验、resourceType: pipeline的流水线实验)均可复用上述巡检模式,对应示例文件位于 samples/experiments/ 目录。


六、常见问题与排查建议

现象可能原因排查方法
list输出为空集群中没有任何实验,或 scheduler 地址不对先seldon experiment start -f xxx.yaml创建实验;用-v检查请求是否发出
连接超时/拒绝scheduler 未监听在0.0.0.0:9004,或启用了 mTLS 但未配置证书使用--scheduler-host指定正确地址;检查~/.config/seldon/cli/config.json的controlplane段
active一直为false候选模型未就绪(如仍处于ModelCreating),或实验正在被删除执行seldon model status <model> -w ModelAvailable确认候选就绪;用seldon experiment status <name>查看candidatesReady/mirrorReady/statusDescription
authority 报错(HTTP/2)集群启用了 service mesh 或 host-based 路由按需传入--authority覆盖虚拟主机名

七、参考资源

  • 命令参考:seldon_experiment_list.md、seldon_experiment.md、seldon_experiment_status.md
  • 命令源码:experiment_list.go、root.go、flags.go
  • 核心实现:scheduler.go(ListExperiments与连接管理)、config.go(CLI 配置)
  • 协议定义:scheduler.proto(ExperimentStatusRequest/ExperimentStatusResponse)
  • 调度器侧状态订阅:operator/scheduler/experiment.go
  • 实验概念与示例:docs-gb/experiments.md、kubernetes/resources/experiment.md、samples/experiments/、docs-gb/examples/local-experiments.md
  • 人工智能
  • 大模型
  • MLOps
  • LLMOps
  • 模型推理服务
  • 云原生
  • 后端

【免费下载链接】seldon-core

An MLOps framework to package, deploy, monitor and manage thousands of production machine learning models

项目地址:https://gitcode.com/gh_mirrors/se/seldon-core
点击查看免费下载

相关推荐

上一篇:Django for Professionals 4.0数据库设计最佳实践:模型与迁移详解
下一篇:SLIM容器健康检查成功率监控面板:从0到1的实现指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询