Seldon Core Agent API 全解析:Scheduler 与 Agent 之间的模型生命周期管理协议 人工智能大模型MLOpsLLMOps模型推理服务云原生后端【免费下载链接】seldon-coreAn MLOps framework to package, deploy, monitor and manage thousands of production machine learning models项目地址https://gitcode.com/gh_mirrors/se/seldon-core点击查看免费下载本文基于 Seldon Core 仓库中的 Agent API 文档docs/source/contents/apis/internal/agent.md及其对应的 Protobuf 定义深入讲解 Seldon Scheduler 与部署在推理服务器旁的 Seldon Agent 之间的通信协议。读完本文你将掌握 Agent API 的四个 gRPC 服务方法Subscribe、AgentEvent、ModelScalingTrigger、AgentDrain的语义、核心消息结构、模型加载/卸载与服务器排空的完整闭环流程并能结合仓库源码理解其底层实现机制。一、Agent 在 Seldon Core 中的角色定位Seldon Core 是用于打包、部署、监控和管理大规模生产环境机器学习模型的 MLOps 框架。在其 v2 架构中Seldon Agent是部署在每个推理服务器inference server旁边的边车sidecar进程承担两项核心职责控制平面Control Plane职责管理模型在推理服务器上的加载与卸载loading and unloading of models onto the server。数据平面Data Plane职责作为反向代理reverse proxy处理发往推理服务器的请求。Agent API 正是 Seldon Scheduler 与 Agent 之间通信的桥梁。Scheduler 是 Seldon Core v2 的集中调度组件负责决定模型应被加载到哪台服务器、哪个副本上Agent 则负责把调度决策落地——从存储下载模型、加载到推理服务器、上报状态并在数据平面按需兜底加载模型。图Seldon Agent 服务架构图来自 apis/mlops/agent/README.md展示 Scheduler 与 Agent 间 load/unload 控制流。Agent 服务的定位在 apis/mlops/agent/README.md 中被概括为两点允许 Scheduler 请求 Agent 加载或卸载一个模型允许 Agent 告知 Scheduler 模型已被加载或已卸载。二、Agent API 的 Protobuf 定义Agent API 是一个 gRPC 服务使用 Protocol Buffers 定义。完整定义位于 apis/mlops/agent/agent.protopackage为seldon.mlops.agent并导入了mlops/scheduler/scheduler.proto用于复用scheduler.Model、scheduler.ModelRuntimeInfo等类型。注意agent.proto同时存在于两处文档引用中——docs/source/contents/apis/internal/agent.md 通过 literalinclude 内嵌该文件而 docs-gb/apis/internal/agent.md 通过 GitHub 代码块引用同一文件。本文以仓库中的实际 proto 源码为准。2.1 消息类型Messagesagent.proto定义了 7 个消息类型按功能可分为三类模型事件上报、缩放触发、订阅/排空握手。// 模型事件消息Agent 向 Scheduler 上报模型状态变更 message ModelEventMessage { string serverName 1; // 服务器名称 uint32 replicaIdx 2; // 服务器副本索引 string modelName 3; // 模型名称 uint32 modelVersion 4; // 模型版本 enum Event { UNKNOWN_EVENT 0; LOAD_FAIL_MEMORY 1; // 因内存不足导致加载失败 LOADED 2; // 已加载 LOAD_FAILED 3; // 加载失败 UNLOADED 4; // 已卸载 UNLOAD_FAILED 5; // 卸载失败 REMOVED 6; // 已卸载并从本地 PVC 移除 REMOVE_FAILED 7; // 移除失败 RSYNC 9; // 请求服务器提供所有需要加载的模型 } Event event 5; string message 6; // 附加说明信息如错误详情 uint64 availableMemoryBytes 7;// 当前可用内存字节数 scheduler.ModelRuntimeInfo runtimeInfo 8; // 模型运行时信息MLServer/Triton } message ModelEventResponse { // 空响应仅作 ACK } // 模型扩缩容触发消息Agent 基于数据平面统计请求 Scheduler 调整副本数 message ModelScalingTriggerMessage { string serverName 1; uint32 replicaIdx 2; string modelName 3; uint32 modelVersion 4; enum Trigger { SCALE_UP 0; SCALE_DOWN 1; } Trigger trigger 5; uint32 amount 6; // 所需副本数量 mapstring,uint32 metrics 7; // 可选暴露给 Scheduler 的指标 } message ModelScalingTriggerResponse { // 空响应 } // 服务器排空请求Scheduler 请求某副本将模型迁走并停止服务 message AgentDrainRequest { string serverName 1; uint32 replicaIdx 2; } message AgentDrainResponse { bool success 1; } // 订阅请求Agent 启动时向 Scheduler 注册服务器副本 message AgentSubscribeRequest { string serverName 1; bool shared 2; uint32 replicaIdx 3; ReplicaConfig replicaConfig 4; repeated ModelVersion loadedModels 5; // 本副本已加载的模型用于断线重连对账 uint64 availableMemoryBytes 6; // 可用内存字节数 } // 副本配置描述服务器副本的资源与能力 message ReplicaConfig { string inferenceSvc 1; // 推理 DNS 服务名 int32 inferenceHttpPort 2; // 推理 HTTP 端口 int32 inferenceGrpcPort 3; // 推理 gRPC 端口 uint64 memoryBytes 4; // 服务器副本内存容量 repeated string capabilities 5;// 服务器能力列表如 sklearn、pytorch、xgboost、mlflow uint32 overCommitPercentage 6; // 允许超卖over commit的百分比设为 0 表示禁用 } // 模型操作消息Scheduler 通过订阅流下发的加载/卸载指令 message ModelOperationMessage { enum Operation { UNKNOWN_EVENT 0; LOAD_MODEL 1; UNLOAD_MODEL 2; } Operation operation 1; ModelVersion modelVersion 2; bool autoscalingEnabled 3; // 该模型是否启用自动扩缩容 } message ModelVersion { scheduler.Model model 1; // 模型定义含 uri、需求、内存、参数等 uint32 version 2; // 版本号 }2.2 服务定义ServicesAgent API 暴露一个名为AgentService的 gRPC 服务包含 4 个 RPC 方法service AgentService { rpc AgentEvent(ModelEventMessage) returns (ModelEventResponse) {}; // 单向Agent - Scheduler rpc Subscribe(AgentSubscribeRequest) returns (stream ModelOperationMessage) {}; // 双向长连接流Agent 订阅指令 rpc ModelScalingTrigger(stream ModelScalingTriggerMessage) returns (ModelScalingTriggerResponse) {}; // 客户端流缩放事件 rpc AgentDrain(AgentDrainRequest) returns (AgentDrainResponse) {}; // 单向Scheduler - Agent }四个方法的方向与用途可归纳为下表RPC 方法调用方向类型用途SubscribeAgent → Scheduler服务端流式返回服务器端流式Agent 启动/重连时注册自身并持续接收ModelOperationMessageLOAD/UNLOAD 指令AgentEventAgent → Scheduler一元上报模型加载/卸载/失败等状态事件ModelScalingTriggerAgent → Scheduler客户端流式客户端流式推送模型扩缩容触发事件基于数据平面统计AgentDrainScheduler → Agent一元命令某服务器副本进入排空drain流程三、服务端实现Scheduler 侧的 AgentServerAgentService的服务端由 Scheduler 进程承载实现在 scheduler/pkg/agent/server.go 的Server结构中。该结构嵌入了pb.UnimplementedAgentServiceServer和health.UnimplementedHealthCheckServiceServer同时提供 gRPC 健康检查接口HealthCheck恒返回Ok: true。3.1 Subscribe注册服务器副本并下发指令Subscribe是 Agent 与 Scheduler 之间的核心长连接。其服务端逻辑scheduler/pkg/agent/server.go 的Subscribe方法要点如下以(serverName, replicaIdx)为键注册AgentSubscriber保存流对象每个 agent 键对应一个互斥锁强制同一副本串行连接——确保旧连接完全断开后新连接才被允许建立调用store.AddServerReplica(request)将副本及其ReplicaConfig加入模型存储调用scheduleModelsFromRequest重新调度由于网络抖动可能导致通信中断、Scheduler 已把模型安排到其他服务器因此 Agent 上报的LoadedModels会触发对应模型的重新调度reconcile并顺带重试此前失败调度的模型ScheduleFailedModels当流关闭Agent 断开时从agents映射中删除该副本并调用removeServerReplicaImpl重新调度该副本承载的模型到其他副本。3.2 AgentEvent状态机推进AgentEvent负责把 Agent 上报的事件翻译为模型副本状态迁移。其映射关系见AgentEvent方法中的 switch 逻辑为Agent 上报事件期望前置状态expectedState目标状态desiredStateLOADEDLoadingLoadedUNLOADEDUnloadingUnloadedLOAD_FAILED/LOAD_FAIL_MEMORYLoadingLoadFailedUNLOAD_FAILEDUnloadingUnloadFailed状态的完整枚举定义在 apis/mlops/scheduler/scheduler.proto 的ModelReplicaStatus.ModelReplicaState中包括LoadRequested、Loading、Loaded、LoadFailed、UnloadRequested、Unloading、Unloaded、UnloadFailed、Available、Draining等。AgentEvent还会把AvailableMemoryBytes更新到 store供后续调度决策使用。3.3 ModelScalingTrigger模型级自动扩缩容ModelScalingTrigger是客户端流式RPCAgent 侧通过流持续推送SCALE_UP/SCALE_DOWN事件。服务端处理要点scheduler/pkg/agent/server.go 的ModelScalingTrigger与applyModelScaling若全局模型自动扩缩容未启用直接返回Unimplemented错误autoscaling models is disabled收到消息后异步调用applyModelScaling通过createScalingPseudoRequest构造伪请求以模型最新版本为基础SCALE_UP使Replicas 1SCALE_DOWN使Replicas - 1扩缩容必须满足checkModelScalingWithinRange约束仅当DeploymentSpec设置了minReplicas/maxReplicas才允许自动扩缩容仅设replicas不会触发且目标副本数不得低于minReplicas、不得低于 1、不得高于maxReplicasmaxReplicas为 0 时不做上限检查缩容前还需检查模型状态稳定isModelStable即距上次状态变更超过 60 秒冷却期modelScalingCoolingDownSeconds避免状态频繁变动期间误缩容。3.4 AgentDrain优雅排空服务器副本AgentDrain是排空流程的起点。drainServerReplicaImplscheduler/pkg/agent/server.go执行如下闭环store.DrainServerReplica将该副本上的模型标记为待迁移注册modelRelocatedWaiter等待这些模型在其他副本上变为 Available防止把模型调度到正在排空的副本上导致永远加载不上的竞态排空请求之间还有 500ms 的冷却期逐个调用scheduler.Schedule(modelName)将模型重新调度到其他副本waiter.wait阻塞直到所有模型迁移完成再等待 Envoy 集群更新的默认批量等待时间EnvoyUpdateDefaultBatchWait外加 3 秒serverDrainingExtraWaitMillis确保 Envoy 最终一致地完成流量切换返回后排空副本即可安全下线。四、客户端实现Agent 侧的服务管理器Agent 进程的入口位于 scheduler/cmd/agent/main.go核心控制逻辑在AgentServiceManagerscheduler/pkg/agent/agent_svc_manager.go。4.1 启动流程与依赖服务Agent 启动时按序完成以下工作解析 CLI 参数与环境变量cli.UpdateArgs()创建控制平面 TLS 配置tls.CreateControlPlaneTLSOptions支持 mTLS尽早启动 readiness 服务端口默认 9008保证探针在 Agent 完全就绪前也能响应创建模型仓库目录与 rclone 配置目录agent_folder/models与agent_folder/rclone按SELDON_SERVER_TYPE选择模型仓库处理器mlserver或triton默认 mlserver对应实现位于 scheduler/pkg/agent/repository/mlserver/mlserver.go 与 scheduler/pkg/agent/repository/triton/triton.go创建模型服务器控制平面客户端CreateModelServerControlPlane基于 OIP v2 协议见 scheduler/pkg/agent/modelserver_controlplane/factory/factory.go启动 HTTP/gRPC 反向代理、调试服务、排空服务drainer service创建AgentServiceManager并启动控制循环连接 Scheduler → 订阅 → 循环处理指令。Agent 的就绪判定依赖若干子服务模型仓库rclone、推理服务器、HTTP/gRPC 反向代理、调试服务、排空服务等。WaitReadySubServices会按maxElapsedTimeReadySubServiceBeforeStart默认 15 分钟等超时等待所有子服务就绪启动阶段任何非可选子服务失败都会使 Agent 标记为不就绪而正常运行阶段只有关键数据平面/控制平面服务失败才标记为不就绪见isCriticalSubserviceFailure。值得注意的是在 Agent 成功连接 SchedulerisStartup变为 false之前永远不会返回就绪。4.2 订阅与指令处理handleSchedulerSubscriptionscheduler/pkg/agent/agent_svc_manager.go构造AgentSubscribeRequest其中ReplicaConfig由createReplicaConfig生成scheduler/cmd/agent/main.go默认指向反向代理端口作为推理端口rc.InferenceHttpPort ReverseProxyHttpPort即数据平面流量先经过 Agent 代理LoadedModels上报当前已加载的所有模型版本modelVersions.getVersionsForAllModels()用于断线重连后的对账AvailableMemoryBytes上报包含超卖额度在内的可用内存GetAvailableMemoryBytesWithOverCommitShared固定为true服务器副本共享。在 Kubernetes 环境下订阅成功后还会等待 Pod 的 IP 被发布到 EndpointsHasPublishedIP超时 1 分钟以确保 Envoy 路由到新 Pod 前不会对外提供推理。进入循环后Agent 对ModelOperationMessage按Operation分发LOAD_MODEL→LoadModel先检查消息乱序ignoreIfOutOfOrder基于单调时钟时间戳再通过getArtifactConfig获取存储凭据rclone 内嵌配置或 Kubernetes Secret随后ModelRepository.DownloadModelVersion下载模型工件再调用LocalStateManager.LoadModelVersion真正加载最后通过AgentEvent上报LOADED失败则上报LOAD_FAILEDUNLOAD_MODEL→UnloadModel先 sleepunloadGraceTime默认 2 秒等待 Envoy 排空连接因其最终一致性再UnloadModelVersion从服务器卸载并从本地仓库删除最后上报UNLOADED失败则UNLOAD_FAILED。4.3 反向代理与懒加载lazy loadAgent 的反向代理实现位于 scheduler/pkg/agent/rproxy.goHTTP与 scheduler/pkg/agent/rproxy_grpc.gogRPC。HTTP 代理核心是一个lazyModelLoadTransport从请求头SeldonInternalModelHeader解析内部模型名每次请求先经stateManager.EnsureLoadModel确保模型已加载在内存若被换出则立即换入见下文 §4.4支持将 OpenAI 风格的/chat/completions、/embeddings、/images/generations路径请求翻译为 OIP 格式再转发apiTranslators响应再翻译回来当后端返回 404/400 时先尝试加载模型再重放请求一次这是 Triton 对未找到模型的典型响应虽然会增加误请求的延迟但能覆盖模型未加载的场景为每个请求生成/透传Request-Id并采集推理指标延迟、HTTP 状态码。4.4 内存管理与 LRU 换出LocalStateManagerscheduler/pkg/agent/state_manager.go负责 Agent 侧的内存记账模型内存不足时按乐观记账策略先扣减availableMainMemoryBytes再调用 v2 客户端加载失败则回滚makeRoomIfNeeded通过 LRU 缓存cache.NewLRUCacheTransactionManager逐出最久未使用的模型直到腾出足够内存逐出失败如并发竞态会把模型放回缓存支持内存超卖over commitGetAvailableMemoryBytesWithOverCommit把overCommitPercentage对应的额外额度计入可用内存调度器因此可在有限内存上装载更多小模型每个模型有默认内存估算DefaultModelMemoryBytes 1MB未显式声明时。这种按需换入/换出LRU eviction lazy load机制使 Agent 可以在单台服务器上动态承载远超物理内存的模型集合配合ReplicaConfig.overCommitPercentage实现内存超卖。4.5 排空Drain触发链路排空由 Agent 侧DrainerServicescheduler/pkg/agent/drainservice/server.go驱动它是 Pod 生命周期与 Scheduler 之间的桥kubelet 在 Pod 终止前调用GET /terminateDrainerService要求在 200ms 窗口内收到至少 3 次事件eventsTarget对应 Pod 内多个容器同时终止才确认是真正的 Pod 终止确认后解除WaitOnTrigger阻塞AgentServiceManager.drainOnRequest将isDraining置为 true并向 Scheduler 发送AgentDraingRPC 消息Scheduler 执行 §3.4 描述的模型迁移流程完成后返回AgentDrainResponse{success: true}DrainerService解除drainingFinishedWg/terminate返回Pod 完成优雅下线。五、Agent 的命令行参数与环境变量Agent 的可配置项全部定义在 scheduler/cmd/agent/cli/cli.go遵循命令行参数优先、环境变量次之的解析策略UpdateArgs→parseFlags→updateFlagsFromEnv。常用项如下CLI 参数环境变量默认值说明--scheduler-hostSELDON_SCHEDULER_HOST—Scheduler 主机名--scheduler-portSELDON_SCHEDULER_PORT9005Scheduler 明文端口--scheduler-tls-portSELDON_SCHEDULER_TLS_PORT9055Scheduler mTLS 端口--inference-http-portSELDON_SERVER_HTTP_PORT8080推理服务器 HTTP 端口--inference-grpc-portSELDON_SERVER_GRPC_PORT9500推理服务器 gRPC 端口--reverse-proxy-http-portSELDON_REVERSE_PROXY_HTTP_PORT—反向代理 HTTP 监听端口--reverse-proxy-grpc-portSELDON_REVERSE_PROXY_GRPC_PORT—反向代理 gRPC 监听端口--metrics-portSELDON_METRICS_PORT9006Prometheus 指标端口--drainer-portSELDON_DRAINER_PORT9007排空服务端口--readiness-portSELDON_READINESS_PORT9008就绪服务端口--server-typeSELDON_SERVER_TYPEmlserver服务器类型mlserver/triton--capabilitiesSELDON_SERVER_CAPABILITIES—能力列表逗号分隔如 sklearn,pytorch--memory-bytesMEMORY_REQUEST—副本内存容量字节--over-commit-percentageSELDON_OVERCOMMIT_PERCENTAGE0内存超卖百分比--log-levelSELDON_LOG_LEVEL—日志级别--max-load-elapsed-time-minutesSELDON_MAX_LOAD_ELAPSED_TIME_MINUTES120单次加载最长耗时超时--max-unload-elapsed-time-minutesSELDON_MAX_UNLOAD_ELAPSED_TIME_MINUTES15单次卸载最长耗时--max-load-retry-countSELDON_MAX_LOAD_RETRY_COUNT5加载最大重试次数--max-unload-retry-countSELDON_MAX_UNLOAD_RETRY_COUNT1卸载最大重试次数--unload-grace-period-secondsSELDON_UNLOAD_GRACE_PERIOD_SECONDS2卸载前等待 Envoy 排空连接的宽限时间--use-deployments-for-serversSELDON_USE_DEPLOYMENTS_FOR_SERVERSfalse用 Deployment 而非 StatefulSet 承载服务器--envoy-host/--envoy-portSELDON_ENVOY_HOST/SELDON_ENVOY_PORT0.0.0.0 / 9000Envoy 地址模型下载完成后通知其更新集群--model-inference-lag-thresholdSELDON_MODEL_INFERENCE_LAG_THRESHOLD30推断延迟阈值模型自动扩缩容用--model-inactive-seconds-thresholdSELDON_MODEL_INACTIVE_SECONDS_THRESHOLD30模型不活跃秒数阈值缩容判定用--scaling-stats-period-secondsSELDON_SCALING_STATS_PERIOD_SECONDS5扩缩容统计周期--replica-configSELDON_REPLICA_CONFIG—JSON 形式的完整ReplicaConfig优先级最高另外两个与环境相关的重要行为服务器名称与副本索引默认从POD_NAME解析——StatefulSet 模式取最后一个-后的数字作为replicaIdx如server-0→ server 名server、索引0Deployment 模式按deploymentName-replicaSetHash-randomTermination格式解析。也可通过--server-name、--server-idx显式指定。命名空间优先从 Kubernetes 服务账号文件/var/run/secrets/kubernetes.io/serviceaccount/namespace读取否则回退到命令行参数。模型自动扩缩容功能ModelScalingTrigger相关链路在 scheduler/cmd/agent/main.go 中当前被强制关闭autoScalingEnabled : false其统计采集与判定逻辑推断延迟、最后使用时间、周期统计见 scheduler/pkg/agent/modelscaling 目录下的stats_collector.go、model_lag.go、model_last_used.go与stats_analyser.go。六、Agent API 的典型交互时序综合上述服务端与客户端实现一次完整的模型部署与控制面交互可概括为以下时序注册Agent 启动完成所有子服务就绪检查后向 Scheduler 发起Subscribe携带ReplicaConfig、已加载模型列表与可用内存Scheduler 将副本纳入调度候选并下发已积压的LOAD_MODEL/UNLOAD_MODEL指令。加载Scheduler 依据模型内存需求与各副本ReplicaConfig选出一个副本通过订阅流下发LOAD_MODELAgent 经 rclone 下载工件支持存储 Secret 认证、调用推理服务器 v2 控制平面接口加载模型、通知 Envoy 更新集群最后回传AgentEvent(LOADED)Scheduler 据此将副本状态推进为Loaded → Available。推理数据平面请求经 Envoy 路由到 Agent 反向代理代理确保模型在内存必要时 lazy load将请求必要时经 OpenAI 翻译转发给推理服务器并采集指标。卸载/替换模型下架或版本替换时Scheduler 下发UNLOAD_MODELAgent 等待 Envoy 宽限排空后卸载模型、清理本地工件并回传AgentEvent(UNLOADED)。排空/下线Pod 终止时 kubelet 触发/terminateAgent 向 Scheduler 发送AgentDrainScheduler 将模型迁移至其他副本并等待全部 Available 后才返回成功随后 Pod 安全终止。七、扩展阅读Agent API 的 gRPC 服务端测试覆盖见 scheduler/pkg/agent/server_test.go 与 scheduler/pkg/agent/agent_svc_manager_test.go可用于理解各 RPC 的边界行为模型仓库处理器MLServer/Triton与模型配置解析见 scheduler/pkg/agent/repository与 Agent 交互的 Scheduler 侧 proto 类型Model、ModelRuntimeInfo、DeploymentSpec等见 apis/mlops/scheduler/scheduler.protoScheduler 与 Agent 的整体架构说明可参考 docs-gb/architecture/README.md 与 docs/source/contents/apis/internal/README.md若存在Agent 的 Docker 镜像构建方式见 scheduler/Dockerfile.agent。结语Seldon Core 的 Agent API 以极简的 4 个 gRPC 方法支撑起了集中调度 边车执行 数据平面兜底的完整模型生命周期管理闭环。理解agent.proto中每个消息字段与 scheduler/pkg/agent 目录下实现的对应关系是深入掌握 Seldon Core v2 调度机制的关键一步——无论是排查模型加载失败、调优内存超卖还是定制服务器排空流程这份协议定义都是最重要的出发点。赞分享人工智能大模型MLOpsLLMOps模型推理服务云原生后端【免费下载链接】seldon-coreAn MLOps framework to package, deploy, monitor and manage thousands of production machine learning models项目地址https://gitcode.com/gh_mirrors/se/seldon-core点击查看免费下载相关推荐Seldon Core v2 Agent API 深度解析Scheduler 与 Agent 的模型生命周期管理 gRPC 协议Seldon Core v2 Agent API 深度解析Scheduler 与 Agent 的模型生命周期管理 gRPC 协议 导读 Agent API 是人工智能大模型MLOpsLLMOps模型推理服务云原生后端Seldon Core 2 Chainer API 深度解析Scheduler 与 Dataflow 引擎之间的管道编排 gRPC 协议Seldon Core 2 Chainer API 深度解析Scheduler 与 Dataflow 引擎之间的管道编排 gRPC 协议 Chainer AP人工智能大模型MLOpsLLMOps模型推理服务云原生后端Seldon Core 2 的 Scheduler APIgRPC 资源管理协议深度解析Seldon Core 2 的 Scheduler APIgRPC 资源管理协议深度解析 导读 Seldon Core 2 的 Scheduler API 是人工智能大模型MLOpsLLMOps模型推理服务云原生后端上一篇Metalsmith量子计算商业应用的静态网站案例研究下一篇基于 browser-act 的 Instagram 地点帖子采集 Skill从地点搜索到游标分页抓取的完整实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考