Seldon Core v2 Agent API 深度解析:Scheduler 与 Agent 的模型生命周期管理 gRPC 协议 人工智能大模型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点击查看免费下载导读Agent API 是 Seldon Core v2 中 Scheduler调度器与 Agent与每个推理服务器同 Pod 部署的代理组件之间的控制平面 gRPC 通信协议负责模型在推理服务器上的加载与卸载、模型事件上报、服务器排空drain以及模型副本自动伸缩。读完本文你将完整掌握AgentService的四个 RPC 及其消息语义、模型的加载/卸载生命周期状态机、排空与重调度机制以及 Agent 作为数据平面反向代理的实现原理并了解如何通过 CLI 参数部署与调优 Agent。1. Agent API 定位与架构背景在 Seldon Core v2 的架构中Scheduler 是控制平面的核心负责全局的模型调度决策而 Agent 则运行在每个推理服务器旁边承担两项职责控制平面代表服务器向 Scheduler 注册自身服务器名、副本索引、内存容量、能力清单接收 Scheduler 下发的模型加载/卸载指令并上报模型事件与可用内存数据平面作为反向代理reverse proxy将来自 Envoy 的推理请求转发到本地推理服务器并支持懒加载请求到达时模型未在内存则现场加载后重试。Agent API 正是连接这两条平面、打通调度决策与落地执行的契约。它在仓库中的权威定义位于 apis/mlops/agent/agent.proto生成代码位于 apis/go/mlops/agent。上图展示了 Seldon Core v2 的整体架构Agent 位于 Envoy 与推理服务器MLServer、Triton 等之间通过 gRPC 与 Scheduler 双向通信同时承载数据面的推理请求落地执行。2. 协议定义AgentService 与四个 RPC 概览AgentService是一个包含四个 RPC 的 gRPC 服务agent.protoservice AgentService { rpc AgentEvent(ModelEventMessage) returns (ModelEventResponse) {}; rpc Subscribe(AgentSubscribeRequest) returns (stream ModelOperationMessage) {}; rpc ModelScalingTrigger(stream ModelScalingTriggerMessage) returns (ModelScalingTriggerResponse) {}; rpc AgentDrain(AgentDrainRequest) returns (AgentDrainResponse) {}; }RPC流模式方向用途Subscribe服务端流式server streamingAgent → Scheduler 发起Scheduler → Agent 持续下发Agent 注册服务器副本并接收模型操作指令加载/卸载AgentEvent一元unaryAgent → SchedulerAgent 上报模型事件加载成功/失败、卸载成功/失败、内存信息AgentDrain一元unaryAgent → Scheduler请求排空某个服务器副本触发模型迁移ModelScalingTrigger客户端流式client streamingAgent → Scheduler上报模型伸缩触发事件扩容/缩容服务端实现位于 scheduler/pkg/agent/server.gogRPC 服务同时注册了健康检查接口HealthCheckService并可通过StartGrpcServer(allowPlainTxt, agentPort, agentTlsPort)同时启动明文与 mTLS 两个端口server.go与components/tls模块协同实现传输层安全。3. 订阅注册Subscribe 与 ReplicaConfigAgent 启动后由 agent_svc_manager.go 中的handleSchedulerSubscription发起Subscribe携带如下信息message AgentSubscribeRequest { string serverName 1; bool shared 2; uint32 replicaIdx 3; ReplicaConfig replicaConfig 4; repeated ModelVersion loadedModels 5; uint64 availableMemoryBytes 6; }其中ReplicaConfig描述了该服务器副本的完整能力画像agent.proto字段类型含义inferenceSvcstring推理服务的 DNS 名称inferenceHttpPortint32推理 HTTP 端口inferenceGrpcPortint32推理 gRPC 端口memoryBytesuint64服务器副本的内存容量capabilitiesrepeated string服务器能力清单如sklearn、pytorch、xgboost、mlflowoverCommitPercentageuint32允许的超卖内存百分比设为 0%表示禁止超卖loadedModels是 Agent 启动时已加载模型的快照availableMemoryBytes是考虑超卖后的可用内存。这两项用于网络抖动后的状态对账Scheduler 端在Subscribe处理中会调用scheduleModelsFromRequestserver.go把 Agent 上报的已加载模型重新纳入调度并重试此前失败的模型ScheduleFailedModels从而避免网络闪断导致模型被调度到其他服务器而本机其实还加载着的重复加载。服务端Subscribe实现的几个关键细节server.go按副本串行化使用agentMutexsync.Map对同一(serverName, replicaIdx)强制串行——保证旧 Agent 完全断开后新 Agent 才能接入注册副本将请求存入store.AddServerReplica纳入全局调度视图流式长连接阻塞在select上等待fin通道或上下文取消一旦 Agent 断开立即删除注册并通过removeServerReplicaImplserver.go将该副本上的模型重新调度到其他可用副本同时再次重试LoadFailed状态的模型。客户端侧连接失败时使用指数退避重连boff.RetryNotifyutil.GetClientExponentialBackoff并在成功建立连接后若运行在 K8s 中会先等待 Pod 的 IP 发布到EndpointsHasPublishedIP再宣告就绪避免 Envoy 将请求路由到尚未就绪的旧 Pod IP 而出现 503agent_svc_manager.go。4. 模型操作指令ModelOperationMessageSubscribe建立的服务端流持续向 Agent 下发ModelOperationMessagemessage ModelOperationMessage { enum Operation { UNKNOWN_EVENT 0; LOAD_MODEL 1; UNLOAD_MODEL 2; } Operation operation 1; ModelVersion modelVersion 2; bool autoscalingEnabled 3; }其中ModelVersion内嵌了完整的scheduler.Model来自 apis/mlops/scheduler/scheduler.proto包含模型元数据、ModelSpec存储配置、运行时信息、内存占用与DeploymentSpec副本数、min/max replicas。autoscalingEnabled标记该模型是否启用了基于指标的副本伸缩供 Agent 侧决定是否挂接伸缩统计。Scheduler 端通过Sync(modelName)方法server.go决定下发何种指令对最新版本中处于LoadRequested状态的副本发送LOAD_MODEL并同步将状态推进到Loading对任意版本中处于UnloadRequested状态的副本发送UNLOAD_MODEL并推进到Unloading发送失败时会把状态置为LoadFailed/UnloadFailed并记录错误信息。Agent 客户端收到指令后在handleSchedulerSubscription的switch operation.Operation中分发到LoadModel与UnloadModelagent_svc_manager.go。4.1 加载模型LoadModelLoadModel的完整流水线agent_svc_manager.go乱序防护基于单调时钟的时间戳记录modelTimestamps忽略乱序到达的过期指令获取存储配置从ModelSpec.StorageConfig中解析 rclone 配置或 K8s SecretgetArtifactConfig支持StorageRcloneConfig与StorageSecretName两种形态下载模型工件通过ModelRepository.DownloadModelVersion基于 rclone将模型拉取到本地/mnt/agent/models加载到推理服务器调用模型服务器控制面客户端v2Client.LoadModelVersion支持 MLServer 与 Triton工厂实现见 modelserver_controlplane/factory失败时按maxLoadRetryCount/maxLoadElapsedTime退避重试可选挂接伸缩统计若AutoscalingEnabled且 Agent 启用了伸缩则把模型加入StatsAnalyserService上报成功发送LOADED事件。4.2 卸载模型UnloadModelUnloadModelagent_svc_manager.go与加载对称但多了一个关键的前置步骤卸载宽限unloadGraceTime。由于 Envoy 是最终一致eventually consistent的立即卸载会导致在途请求打到已卸载的模型上因此 Agent 先睡眠宽限期让 Envoy 收敛集群变化再执行卸载、从 rclone 仓库清理模型、发送UNLOADED事件。5. 事件上报AgentEvent 与 ModelEventMessageAgent 通过AgentEvent一元 RPC 把模型状态变化告知 Scheduler消息体为ModelEventMessagemessage 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; // unloaded and removed from local PVC REMOVE_FAILED 7; RSYNC 9; // Ask server for all models that need to be loaded } Event event 5; string message 6; uint64 availableMemoryBytes 7; scheduler.ModelRuntimeInfo runtimeInfo 8; }事件枚举中LOAD_FAIL_MEMORY专门表示因内存不足导致的加载失败REMOVED/REMOVE_FAILED表示从本地 PVC 中移除之后的终态RSYNC用于请求服务器全量同步。runtimeInfo携带模型在服务器上的实际运行时信息如 MLServer 的parallelWorkers、Triton 的实例数这些信息在 model_state.go 中用于计算模型占用的真实内存。服务端AgentEvent的状态映射server.go构成了模型副本状态机的核心转移上报事件期望前置状态expected目标状态desiredLOADEDLoadingLoadedUNLOADEDUnloadingUnloadedLOAD_FAILED/LOAD_FAIL_MEMORYLoadingLoadFailedUNLOAD_FAILEDUnloadingUnloadFailedScheduler 使用乐观期望状态校验防止状态乱序回跳同时将availableMemoryBytes与runtimeInfo一并写入 store供后续调度决策如内存感知的模型放置、副本扩展使用。6. 排空机制AgentDrain当服务器副本需要下线如节点驱逐、滚动更新时Agent 调用AgentDrain(AgentDrainRequest{serverName, replicaIdx})请求 Scheduler 排空该副本。Scheduler 端drainServerReplicaImplserver.go的执行序列store.DrainServerReplica将副本上所有模型标记为待迁移用modelRelocatedWaiter为这些模型注册等待组——模型在其他副本上变为Available时被signalModel释放睡眠agentDrainCoolDownPeriod500ms作为冷却期避免多个 Agent 并发排空时调度器把模型调度到同样在排空的服务器上逐个scheduler.Schedule(modelName)把模型重新调度到健康副本阻塞等待所有模型迁移完成waiter.wait再额外等待EnvoyUpdateDefaultBatchWait serverDrainingExtraWaitMillis(3000ms)让 Envoy 分批更新最终收敛之后才认为排空完成。客户端侧drainOnRequestagent_svc_manager.go由 drainservice 的触发信号驱动一旦触发Agent 置isDrainingtrue此后Ready()返回 falsePod 从负载均衡摘除、发送AgentDrain并释放/terminate的等待。Agent 排空期间若模型加载成功会被sendAgentEvent主动取消为LOAD_FAILED原因是 server replica is draining防止状态不一致agent_svc_manager.go。7. 模型自动伸缩ModelScalingTriggerModelScalingTrigger是客户端流式 RPCAgent 通过它向 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; // number of replicas required mapstring,uint32 metrics 7; // optional metrics to expose to the scheduler }触发来源是 Agent 内的模型伸缩统计服务 modelscaling基于推理延迟滞后的ScaleUpEvent阈值由ModelInferenceLagThreshold配置与基于模型最近使用时间的ScaleDownEvent阈值由ModelInactiveSecondsThreshold配置。modelScalingEventsConsumer从事件通道读取并转发到客户端流agent_svc_manager.go。Scheduler 端处理server.go 与createScalingPseudoRequest/calculateDesiredNumReplicas要点仅当autoscalingModelEnabled时受理否则返回Unimplemented通过createScalingPseudoRequest构造一个伪加载请求校验模型存在、事件版本与最新版本一致扩容副本数 1缩容副本数 −1但缩容前要求模型状态稳定最近modelScalingCoolingDownSeconds60s 内没有状态变化避免在加载/卸载震荡期收缩checkModelScalingWithinRange强制约束只有设置了minReplicas/maxReplicas才允许伸缩目标副本数不得低于minReplicas且不低于 1不得高于maxReplicasserver.go校验通过后写入 store 并重新触发调度。需要注意仓库中 cmd/agent/main.go 当前将autoScalingEnabled硬编码为false注释说明在扩容问题解决前强制禁用因此上述伸缩链路在默认构建下处于关闭状态相关 CLI 阈值参数仅作预留。8. 数据平面Agent 反向代理Agent 的数据平面职责由两个反向代理子服务承担它们都注册为CriticalDataPlaneService任一失败都会导致 Agent 不可就绪agent_svc_manager.go。8.1 HTTP/REST 反向代理实现见 rproxy.go基于httputil.ReverseProxy并自定义lazyModelLoadTransport懒加载请求经addHandlers先调用stateManager.EnsureLoadModel确保模型在内存随后通过rewritePath把 URL 中的外部模型名改写为内部模型名去掉/versions/ver段404/400 重试当后端返回404 Not Found或 Triton 将未加载模型视为400 Bad Request时先触发loader加载模型再用缓存的原请求体重放一次请求rproxy.goOpenAI API 翻译内置了/chat/completions、/embeddings、/images/generations三条路径的 OpenAI 格式翻译器OpenAIChatCompletionsTranslator等把 OpenAI 风格的请求/响应在反向代理边界翻译为 Open Inference ProtocolOIP格式rproxy.go可观测性通过otelhttp.NewHandler注入 OpenTelemetry 追踪并统计推理耗时、HTTP 状态码等指标AddModelInferMetrics同时透传/生成requestId头用于端到端关联。8.2 gRPC 反向代理实现见 rproxy_grpc.go对外暴露v2_dataplane.GRPCInferenceService默认监听端口为ReverseGRPCProxyPort 9998rproxy_grpc.go。支持的方法ModelInfer一元推理从 gRPC 元数据中提取SeldonInternalModelHeader/SeldonModelHeader定位模型EnsureLoadModel后转发NotFound/Unavailable时懒加载重试对后端维护 10 连接连接池随机取用ModelStreamInfer双向流推理通过两个forwardStreamgoroutine 分别转发客户端→后端与后端→客户端两个方向的消息任一方向出错即取消整体流并释放资源rproxy_grpc.goModelMetadata/ModelReady同样执行EnsureLoadModel与懒加载重试。代理还会将请求/响应 Trailer 中透传的requestId写回客户端setTrailer并记录 gRPC 状态码指标。9. Agent 本地状态与缓存管理Agent 的本地状态由LocalStateManager统一管理state_manager.go配套ModelStatemodel_state.go维护已加载模型 → 内存占用映射并用 LRU 事务缓存CacheTransactionManager实现最近最少使用驱逐加载LoadModelVersion校验版本、计算内存增量、makeRoomIfNeeded驱逐足够多的 LRU 模型腾出空间、乐观扣减可用内存、调用 v2 控制面加载、加入缓存卸载UnloadModelVersion从缓存删除、回补内存若模型已不在缓存已被驱逐则只更新记账数据面兜底EnsureLoadModel推理请求到达时若模型被驱逐出内存现场重新加载并重放请求内存与超卖availableMainMemoryBytes反映主内存剩余GetOverCommitMemoryBytes()返回overCommitPercentage/100 × totalMainMemoryBytes的超卖额度GetAvailableMemoryBytesWithOverCommit在订阅与事件上报中作为可承诺内存提供给 Scheduler使调度器可以按超卖后的容量放置模型state_manager.go。10. Agent 运行配置与 CLI 参数Agent 进程入口为 scheduler/cmd/agent/main.go启动序列包括创建模型仓库与 rclone 目录、启动就绪服务readyservice、创建 K8s 客户端K8s 环境、初始化 OpenTelemetry tracer、启动 rclone 客户端与模型仓库、创建推理服务器控制面客户端、启动 Prometheus 指标服务、创建 HTTP/gRPC 反向代理、调试服务与排空服务最后等待子服务就绪后进入StartControlLoop带退避重连的订阅循环。全部启动参数定义于 scheduler/cmd/agent/cli/flags.go关键参数如下参数默认值说明--server-namemlserver服务器名称用于在 Scheduler 中唯一标识--server-idx0服务器副本索引ReplicaIdx--scheduler-host/--scheduler-port/--scheduler-tls-port0.0.0.0/ 默认端口Scheduler 地址与明文/mTLS 端口--rclone-host/--rclone-port0.0.0.0/ 默认端口rclone 下载服务地址--inference-host/--inference-http-port/--inference-grpc-port0.0.0.0/ 默认端口推理服务器地址与 HTTP/gRPC 端口--reverse-proxy-http-port/--reverse-proxy-grpc-port默认 HTTP 端口 /9998数据平面反向代理监听端口--server-typemlserver模型服务器类型mlserver或triton决定仓库处理器与控制面客户端工厂--memory-bytes1000000服务器可用内存字节--capabilitiessklearn,xgboost服务器能力清单逗号分隔如 sklearn、pytorch、xgboost、mlflow--overcommit-percentage0内存超卖百分比0 表示关闭--replica-config空直接以 JSON 传入完整ReplicaConfig优先于上述散列参数--agent-folder/mnt/agent模型仓库根目录其下含models/与rclone/--config-path/mnt/config配置文件目录agent.yaml / agent.json见 scheduler/config/agent.yaml--namespace空K8s 命名空间非空即视为运行在 K8s 中--max-load-elapsed-time-minutes/--max-load-retry-count默认值模型加载的超时上限与重试次数--max-unload-elapsed-time-minutes/--max-unload-retry-count默认值模型卸载的超时上限与重试次数--unload-grace-seconds默认值卸载前等待 Envoy 收敛的宽限秒数--log-leveldebug日志级别--metrics-port/--debug-grpc-port/--drainer-service-port默认端口指标、调试、排空服务端口当--replica-config未提供时createReplicaConfigmain.go会从上述散列参数组装ReplicaConfig并将InferenceHttpPort/InferenceGrpcPort覆盖为反向代理端口——即 Scheduler 视角中服务器的推理地址是 Agent 的代理端口。11. 测试与验证仓库为 Agent API 的各个关键路径提供了完善的单元测试可作为行为契约参考scheduler/pkg/agent/server_test.go覆盖Subscribe注册/断开重调度、AgentEvent状态机映射、Sync加载/卸载下发、AgentDrain排空与ModelScalingTrigger伸缩校验等服务端行为scheduler/pkg/agent/agent_svc_manager_test.go验证订阅握手、LoadModel/UnloadModel全流程含乱序防护、重试、事件上报scheduler/pkg/agent/rproxy_test.go 与 rproxy_grpc_test.go验证 HTTP 懒加载重试、路径改写、gRPC 流式转发与元数据透传scheduler/pkg/agent/state_manager_test.go 与 model_state_test.go验证内存记账、LRU 驱逐、超卖额度计算与版本管理。结语Agent API 是 Seldon Core v2 控制平面与数据平面协同的枢纽协议Subscribe建立双向通道并完成状态对账ModelOperationMessage驱动模型的加载与卸载AgentEvent以事件驱动方式推进模型副本状态机AgentDrain保障服务器下线时的平滑迁移ModelScalingTrigger为基于运行时指标的副本伸缩提供数据通道。理解这套协议是深入 Seldon Core v2 调度、多模型管理MMS与数据面路由的关键一步。更完整的系统级说明可继续阅读 docs-gb/apis/internal 下的其他 API 文档与 scheduler/README.md。赞分享人工智能大模型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 2 Chainer API 深度解析Scheduler 与 Dataflow 引擎之间的管道编排 gRPC 协议Seldon Core 2 Chainer API 深度解析Scheduler 与 Dataflow 引擎之间的管道编排 gRPC 协议 Chainer AP人工智能大模型MLOpsLLMOps模型推理服务云原生后端Khoj 代码执行Code Execution能力解析基于 Terrarium 与 E2B 沙箱的本地自托管指南Khoj 代码执行Code Execution能力解析基于 Terrarium 与 E2B 沙箱的本地自托管指南 Khoj 的代码执行特性允许 AI 在受人工智能大模型MLOpsLLMOps模型推理服务云原生后端AutoGen Agent 身份Agent ID与生命周期管理深度解析AutoGen Agent 身份Agent ID与生命周期管理深度解析 Agent Runtime运行时是整个 AutoGen Core 框架的心脏它人工智能AI AgentAgent 框架多智能体大模型工具调用上一篇一键找回消失的QQ空间记忆GetQzonehistory帮你完整备份青春时光下一篇Handsontable 仓库 MCP 环境配置实战ClickUp 任务集成与 code-review-graph 知识图谱创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考