人工智能大模型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当前仓库mlops.seldon.io/v1alpha1API的官方示例讲解如何利用 Model 自定义资源的artifactVersion字段从同一storageUri指向的 Triton 模型仓库中按数字版本目录精确加载并切换模型。完成阅读后你将掌握多版本工件仓库的标准目录结构、kubectl与 Seldon CLI 两种推理验证方式以及版本目录被选中的底层实现原理。示例全文可参考仓库中的 samples/k8s-multi-version.md。1. 多版本工件背景与核心思路在 MLOps 实践中模型工件artifact往往会随训练迭代产生多个版本。Triton Inference Server 约定一个模型仓库model repository下用纯数字命名的子目录表示模型的不同版本如1/、2/、3/每个版本目录内放置该版本对应的模型文件与配置。Seldon Core 2 在此基础上提供了更灵活的加载策略通过 Model 资源中的artifactVersion字段指定要加载的版本目录若不指定则由 Agent 自动选择仓库内的最高版本。本示例用一个 math 模型演示这一能力版本 1对输入执行加 101/model.py版本 2对输入执行乘 102/model.py。工件仓库结构如下config.pbtxt 1/model.py add 10 2/model.py mul 10该结构的完整定义见本文第 6 节其背后的目录查找逻辑由 Triton 仓库处理器TritonRepositoryHandler实现scheduler/pkg/agent/repository/triton/triton.go。2. 环境准备与入口地址获取本示例来自 samples/k8s-multi-version.md请在samples目录下执行相关命令。2.1 前置条件已安装 Seldon Core 2并部署在命名空间seldon-mesh中已下载仓库的samples目录其中包含示例 Model 配置与配套 notebook集群入口可通过LoadBalancer类型的seldon-meshService 访问。2.2 设置命名空间环境变量import os os.environ[NAMESPACE] seldon-mesh2.3 获取 Mesh 入口 IPMESH_IP!kubectl get svc seldon-mesh -n ${NAMESPACE} -o jsonpath{.status.loadBalancer.ingress[0].ip} MESH_IPMESH_IP[0] import os os.environ[MESH_IP] MESH_IP MESH_IP典型输出172.19.255.1MESH_IP将用于后续seldon model infer --inference-host ${MESH_IP}:80推理命令。若你的集群使用 Istio 等服务网格作为入口也可按 docs-gb/getting-started/cli.md 中的方式获取入口 IP 并替换。3. Model 资源与 artifactVersion 字段3.1 两个版本的定义版本 1 的 Model 定义仓库中的 samples/models/multi-version-1.yamlapiVersion: mlops.seldon.io/v1alpha1 kind: Model metadata: name: math spec: storageUri: gs://seldon-models/scv2/samples/triton_23-03/multi-version artifactVersion: 1 requirements: - triton - python版本 2 的 Model 定义仓库中的 samples/models/multi-version-2.yamlapiVersion: mlops.seldon.io/v1alpha1 kind: Model metadata: name: math spec: storageUri: gs://seldon-models/scv2/samples/triton_23-03/multi-version artifactVersion: 2 requirements: - triton - python关键点两份配置的metadata.name都是mathstorageUri也完全相同唯一差异是artifactVersion1与2。这意味着可以原地更新同一个 Model 资源来切换版本而不是为每个版本创建不同的模型。3.2 字段语义与 CRD 定义从源码看artifactVersion属于InferenceArtifactSpecoperator/apis/mlops/v1alpha1/model_types.gotype InferenceArtifactSpec struct { // Model type ModelType *string json:modelType,omitempty // Storage URI for the model repository StorageURI string json:storageUri // Artifact Version // A v2 version folder to select from storage bucket // optional ArtifactVersion *uint32 json:artifactVersion,omitempty // Schema URI SchemaURI *string json:schemaUri,omitempty // Secret name SecretName *string json:secretName,omitempty }其字段含义为字段类型说明storageUristring必填模型仓库的存储 URI如 GCS、S3 等指向包含数字版本目录的仓库根artifactVersionuint32可选要加载的版本目录号即从存储桶中选择的 v2 版本文件夹requirementsstring[]加载该模型所需的能力本例为triton与python用于调度到兼容的 ServersecretNamestring可选访问存储所需的 Secret对应 CRDoperator/config/crd/bases/mlops.seldon.io_models.yaml中同样标注A v2 version folder to select from storage bucket类型为integerint32。当 Model 被创建/更新后Operator 会通过AsSchedulerModel()方法operator/apis/mlops/v1alpha1/model_types.go把资源转换为 Scheduler 的 proto 消息其中ArtifactVersion: m.Spec.ArtifactVersion会被原样传递驱动后续的版本目录解析。4. 部署版本 1 并验证推理4.1 创建 Model 并等待就绪kubectl apply -f ./models/multi-version-1.yaml -n ${NAMESPACE}输出model.mlops.seldon.io/math created等待模型变为 ready 状态kubectl wait --for conditionready --timeout300s model --all -n ${NAMESPACE}输出model.mlops.seldon.io/math condition met4.2 通过 Seldon CLI 发起推理使用 gRPC 推理模式向 Mesh 入口发送一条形状为[4]的 FP32 输入[1,2,3,4]seldon model infer math --inference-mode grpc --inference-host ${MESH_IP}:80 \ {model_name:math,inputs:[{name:INPUT,contents:{fp32_contents:[1,2,3,4]},datatype:FP32,shape:[4]}]} | jq -M .返回结果版本 1 执行加 10{ modelName: math_1, modelVersion: 1, outputs: [ { name: OUTPUT, datatype: FP32, shape: [ 4 ], contents: { fp32Contents: [ 11, 12, 13, 14 ] } } ] }注意响应中的modelName为math_1、modelVersion为1说明当前路由到的是版本 1输入[1,2,3,4]经加 10 后得到[11,12,13,14]。4.3 通过 curl 发起推理HTTP 方式若使用 REST 推理接口等价请求为入口 IP 需替换为你的实际值并携带虚拟主机头curl -k http://INGRESS_IP:80/v2/models/math/infer \ -H Host: seldon-mesh.inference.seldon \ -H Content-Type: application/json \ -H Seldon-Model: math \ -d { model_name: math, inputs: [ { name: INPUT, datatype: FP32, shape: [4], data: [1, 2, 3, 4] } ] } | jq返回{ model_name: math_1, model_version: 1, outputs: [ { name: OUTPUT, datatype: FP32, shape: [4], data: [11.0, 12.0, 13.0, 14.0] } ] }seldon model infer支持的常用选项可查阅 docs-gb/cli/seldon_model_infer.md包括--inference-moderest/grpc默认 rest、--inference-host默认0.0.0.0:9000、--iterations、--seconds、--show-request/--show-response等。5. 原地切换部署版本 25.1 更新 Model 并等待就绪kubectl apply -f ./models/multi-version-2.yaml -n ${NAMESPACE}输出model.mlops.seldon.io/math configured注意此处输出为configured而非created印证了同一 Model 资源原地更新的语义。kubectl wait --for conditionready --timeout300s model --all -n ${NAMESPACE}model.mlops.seldon.io/math condition met5.2 验证版本 2 的推理结果同样使用 Seldon CLIseldon model infer math --inference-mode grpc --inference-host ${MESH_IP}:80 \ {model_name:math,inputs:[{name:INPUT,contents:{fp32_contents:[1,2,3,4]},datatype:FP32,shape:[4]}]} | jq -M .返回结果版本 2 执行乘 10{ modelName: math_2, modelVersion: 1, outputs: [ { name: OUTPUT, datatype: FP32, shape: [ 4 ], contents: { fp32Contents: [ 10, 20, 30, 40 ] } } ] }REST 等价请求curl -k http://INGRESS_IP:80/v2/models/math/infer \ -H Host: seldon-mesh.inference.seldon \ -H Content-Type: application/json \ -H Seldon-Model: math \ -d { model_name: math, inputs: [ { name: INPUT, datatype: FP32, shape: [4], data: [1, 2, 3, 4] } ] } | jq{ model_name: math_2, model_version: 1, outputs: [ { name: OUTPUT, datatype: FP32, shape: [4], data: [10.0, 20.0, 30.0, 40.0] } ] }输入仍为[1,2,3,4]输出变为[10,20,30,40]且modelName变为math_2——模型行为随artifactVersion的切换而改变验证了版本选择生效。6. 源码原理版本目录是如何被选中的6.1 下载与版本解析的整体流程当 Scheduler 下发加载指令后Agent 的V2ModelRepository.DownloadModelVersion()scheduler/pkg/agent/repository/model_repository.go负责执行通过 rclone 将modelSpec.Uri指向的仓库同步到本地带指数退避重试调用FindModelVersionFolder(modelName, artifactVersion, rclonePath)解析要加载的版本目录将该目录复制到推理服务器模型仓库中的modelName/version路径调用UpdateModelRepository()等回调更新config.pbtxt中的模型名与仓库配置。其中选择哪个版本目录完全由第二步决定。6.2 指定版本与最高版本两种模式Triton 仓库处理器的入口scheduler/pkg/agent/repository/triton/triton.gofunc (t *TritonRepositoryHandler) FindModelVersionFolder(_ string, version *uint32, path string) (string, bool, error) { if version ! nil { return t.findModelVersionInPath(path, *version) } else { return t.findHighestVersionInPath(path) } }可见存在两条路径显式指定版本findModelVersionInPath()在仓库根目录下查找与版本号完全同名的第一层子目录找不到时报错Failed to find requested version %d in path %s找到多个同名目录时报Found multiple folders with version %d未指定版本artifactVersion为空findHighestVersionInPath()遍历所有纯数字命名的第一层子目录取数值最大者若仓库根目录下没有任何数字版本目录如工件直接放在顶层则回退为把仓库根目录本身当作模型路径foundfalse。测试用例scheduler/pkg/agent/repository/triton/triton_test.go覆盖了Simple精确命中、MidVersion中间版本、HighestVersion默认取最高、NoVersionFolders无版本目录时回退根目录以及NoVersionFoldersArtifactVersion指定了版本但仓库中没有对应目录时报错等场景。6.3 推理响应中的 math_1 / math_2 命名从何而来响应中modelName为math_1、math_2来源于模型命名工具函数scheduler/pkg/util/model.gofunc GetVersionedModelName(model string, version uint32) string { return fmt.Sprintf(%s%s%d, model, separator, version) }即以_拼接模型名与加载版本号形成带版本的内部模型名反过来GetOrignalModelNameAndVersion()可以从math_2还原出原始模型名math与版本2。因此math这个 Model 资源实际承载了math_1与math_2两个可寻址版本。7. 清理示例资源删除版本 1 的 Model 定义即可移除该模型kubectl delete -f ./models/multi-version-1.yaml -n ${NAMESPACE}输出model.mlops.seldon.io math deleted由于multi-version-1.yaml与multi-version-2.yaml操作的是同一个名为math的资源删除任一都会将该 Model 从集群中移除。若你希望保留部署可跳过此步。8. 注意事项与最佳实践Kubernetes 环境下请用 kubectl 管理资源Seldon CLI 允许在非 Kubernetes 环境中查看底层 Seldon 资源并通过 Scheduler 执行变更但它无法修改 Kubernetes 集群内的底层 manifest。因此在 Kubernetes 环境中进行控制面操作时建议直接使用kubectl apply/delete详见 docs-gb/getting-started/cli.md。版本号约定目录必须是纯数字命名Triton 约定版本号大于 0若显式指定了artifactVersion但仓库中不存在该目录Agent 会返回错误模型无法就绪。未指定版本时的行为artifactVersion为空时默认加载最高版本这与 Triton 的版本策略一致适合始终使用最新的场景显式指定则适合灰度、回滚等需要精确控制版本的场景。原地切换的成本更新同一 Model 的artifactVersion会触发重新加载流程Agent 会为新版本重建modelName/version目录并更新config.pbtxt期间请通过kubectl wait --for conditionready等待就绪后再发起推理。可继续深入的材料仓库中的 notebook docs-gb/examples/notebooks/k8s-multi-version.ipynb 提供了可逐步执行的交互式版本Model 资源的完整 spec 定义见 operator/apis/mlops/v1alpha1/model_types.go 与 CRD operator/config/crd/bases/mlops.seldon.io_models.yaml。赞分享人工智能大模型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 Kubernetes 多版本模型工件实战artifactVersion 的选型、部署与推理验证Seldon Core V2 Kubernetes 多版本模型工件实战artifactVersion 的选型、部署与推理验证 在 Seldon Core 2人工智能大模型MLOpsLLMOps模型推理服务云原生后端seldon-core CLI 实战用 seldon server list 查看服务器、副本数与已加载模型seldon core CLI 实战用 seldon server list 查看服务器、副本数与已加载模型 本篇指南聚焦 seldon core 的 sel人工智能大模型MLOpsLLMOps模型推理服务云原生后端Seldon Core 本地环境实战模型加载、REST/gRPC 推理与 A/B 实验Seldon Core 本地环境实战模型加载、REST/gRPC 推理与 A/B 实验 本文基于 Seldon Core 仓库中 本地示例文档 https:/人工智能大模型MLOpsLLMOps模型推理服务云原生后端上一篇Awesome Codex Skills中的抽奖获奖者选择器公平随机选择的审计友好工具下一篇5分钟上手OpenCodexmacOS/Linux/Windows安装、启动与配置保姆级教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考