- 人工智能
- 大模型
- MLOps
- LLMOps
- 模型推理服务
- 云原生
- 后端
【免费下载链接】seldon-core
An MLOps framework to package, deploy, monitor and manage thousands of production machine learning models
导读
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 string | string | authority(HTTP/2)或 virtual host(HTTP/1),用于覆盖 gRPC 连接中的 authority 字段 |
-h, --help | bool | 显示 list 子命令帮助信息 |
--scheduler-host string | string | seldon scheduler 主机地址,默认值"0.0.0.0:9004" |
-v, --verbose | bool | 输出详细日志(输出请求 proto 内容)。该选项在命令参考文档中未单列,但源码 flags.go 与 experiment_list.go 中均已注册:flags.BoolP(flagVerbose, "v", false, "verbose output") |
2.3 参数优先级:环境变量与配置文件
--scheduler-host的取值遵循"命令行 > 配置文件 > 默认值"的解析逻辑,见 experiment_list.go 与 scheduler.go:
- 命令行显式指定:
--scheduler-host,此时schedulerHostIsSet = flags.Changed(flagSchedulerHost)为true。 - 环境变量:默认值来自环境变量
SELDON_SCHEDULE_HOST(envScheduler),最终回落到defaultSchedulerHost = "0.0.0.0:9004"。 - 配置文件兜底:若命令行未指定(
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=true4.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 list4.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虽只展示概览,但结合实验特性可完成完整的验证闭环:
- 创建实验:
seldon experiment start -f xxx.yaml; - 确认生效:
seldon experiment list中active=true,或seldon experiment status <name> -w; - 验证切分:向入口发送批量推理请求,观察路由分布。例如本地模式:
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- 验证 sticky session:每次推理响应头
x-seldon-route记录了实际路由,配合-s(sticky session)参数可让后续请求走同一路由,保证实验组的视图一致性(详见 kubernetes/resources/experiment.md 的 Sticky Sessions 小节); - 清理:
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
相关推荐
Seldon Core 2 CLI 配置管理实战:深入解析 `seldon config add` 命令
Seldon Core 2 CLI 配置管理实战:深入解析 seldon config add 命令 本文以 Seldon Core 2 官方 CLI 参考文档
人工智能大模型MLOpsLLMOps模型推理服务云原生后端BiliTools终极指南:3分钟掌握B站视频下载神器
BiliTools终极指南:3分钟掌握B站视频下载神器 还在为B站视频下载而烦恼吗?想要轻松保存喜欢的番剧、课程和音乐资源?BiliTools哔哩哔哩工具箱正是
人工智能大模型MLOpsLLMOps模型推理服务云原生后端inngest 中的 prometheus/procfs:Go 语言读取 /proc 与 /sys 系统与进程指标完整指南
inngest 中的 prometheus/procfs:Go 语言读取 /proc 与 /sys 系统与进程指标完整指南 导读 prometheus/proc
人工智能大模型MLOpsLLMOps模型推理服务云原生后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考