人工智能大模型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 官方 CIFAR10 生产部署示例为主线完整讲解如何用一个Pipeline将 TensorFlow 图像分类模型、VAE 异常检测器outlier detector与 KS 漂移检测器drift detector串联成一个可对外服务的推理链路。读完本文你将掌握 Seldon Core 2 中Model与Pipeline资源的 YAML 定义方式、seldonCLI 的加载/状态查询/中间张量检视操作以及如何通过 v2 推理协议对正常、漂移、异常三类输入做端到端验证。示例概览一个 Pipeline 集成三类模型本示例的完整原始文档位于 docs/source/contents/examples/cifar10.md其正文通过include引入了 samples/examples/image_classifier/infer.md所有命令都需要在示例目录samples/examples/image_classifier下运行。示例由三个核心组件构成图像分类模型基于 TensorFlow 的 CIFAR10 图像分类器官方以 Triton 推理服务器tf_cifar10的形式托管异常检测器参照 Alibi Detect 的 CIFAR10 VAE Outlier 示例构建用于识别“训练分布之外”的输入样本漂移检测器参照 Alibi Detect 的 CIFAR10 KS Drift 示例构建用于检测数据分布随时间发生的漂移。三个模型通过一个Pipeline串联分类结果与异常检测结果直接作为输出返回给调用方漂移检测器则以batch批大小为 20的形式消费数据流用于批量统计判断漂移。环境准备与训练可选准备 Python 环境示例的训练与推理脚本依赖 TensorFlow 与 Alibi Detect。仓库在 requirements.txt 中锁定了alibi-detect0.11.1并在 Makefile 中提供了env目标用于创建虚拟环境并安装 MLServer 的 alibi-detect 运行时make env # 等价于 python3 -m venv .env .env/bin/pip install mlserver-alibi-detect${MLSERVER_VERSION}训练目标统一为make trainupload_artifacts目标则负责把训练好的drift-detector与outlier-detector目录上传到 Google Storage对应示例中gs://seldon-models/scv2/examples/...的模型地址。分类器训练可选如果你希望在本地重新训练模型可以运行训练笔记本 train.ipynb。核心流程如下加载 CIFAR10 数据集并归一化同时准备好三类测试输入——正常样本训练集、漂移样本CIFAR-10-C 亮度扰动与异常样本掩码扰动import requests import json import numpy as np import tensorflow as tf from alibi_detect.utils.perturbation import apply_mask from alibi_detect.datasets import fetch_cifar10c import matplotlib.pyplot as plt tf.keras.backend.clear_session()train, test tf.keras.datasets.cifar10.load_data() X_train, y_train train X_test, y_test test X_train X_train.astype(float32) / 255 X_test X_test.astype(float32) / 255 classes (plane, car, bird, cat, deer, dog, frog, horse, ship, truck)用apply_mask生成异常样本14×14 掩码、1 个掩码、作用于 RGB 三个通道用fetch_cifar10c拉取 brightness 类型、severity5 的 CIFAR-10-C 损坏数据作为漂移样本outliers [] for idx in range(X_train.shape[0]): X_mask, mask apply_mask(X_train[idx].reshape(1, 32, 32, 3), mask_size(14, 14), n_masks1, channels[0, 1, 2], mask_typenormal, noise_distr(0, 1), clip_rng(0, 1)) outliers.append(X_mask) X_outliers np.vstack(outliers) corruption [brightness] X_corr, y_corr fetch_cifar10c(corruptioncorruption, severity5, return_X_yTrue) X_corr X_corr.astype(float32) / 255上述操作得到X_outliers50000, 32, 32, 3与X_corr两组干扰样本用于后续验证 Pipeline 的异常检测与漂移检测能力。需要说明的是训练过程中如果本机没有 GPUTensorFlow 会输出libcudart.so.11.0/libcuda.so.1无法加载之类的警告这属于正常现象CPU 即可完成示例运行。异常检测器训练OutlierVAE异常检测器基于 Alibi Detect 的 VAE 模型训练定义在 train.md 中。其核心是一个 1024 维隐空间的卷积 VAE编码器为三层卷积下采样解码器为反卷积上采样latent_dim 1024 encoder_net tf.keras.Sequential([ InputLayer(input_shape(32, 32, 3)), Conv2D(64, 4, strides2, paddingsame, activationtf.nn.relu), Conv2D(128, 4, strides2, paddingsame, activationtf.nn.relu), Conv2D(512, 4, strides2, paddingsame, activationtf.nn.relu) ]) decoder_net tf.keras.Sequential([ InputLayer(input_shape(latent_dim,)), Dense(4*4*128), Reshape(target_shape(4, 4, 128)), Conv2DTranspose(256, 4, strides2, paddingsame, activationtf.nn.relu), Conv2DTranspose(64, 4, strides2, paddingsame, activationtf.nn.relu), Conv2DTranspose(3, 4, strides2, paddingsame, activationsigmoid) ]) od OutlierVAE(threshold.015, # 异常得分阈值 score_typemse, # 以重构误差的 MSE 作为异常得分 encoder_netencoder_net, decoder_netdecoder_net, latent_dimlatent_dim, samples2) od.fit(X_train, loss_fnelbo, cov_elbodict(sim.05), epochs50, verboseTrue) save_detector(od, ./outlier-detector)训练完成后检测器目录内包含OutlierVAE.dill、meta.dill以及model/下的encoder_net.h5、decoder_net.h5、VAE checkpoint 等文件。漂移检测器训练KSDrift漂移检测器基于 Alibi Detect 的 KSKolmogorov-Smirnov检验实现。先用 CIFAR10 测试集构建参考集X_ref再用一个编码器网络把图像压缩到 32 维再执行 KS 检验cd KSDrift(X_ref, p_val.05, preprocess_fnpreprocess_fn) save_detector(cd, ./drift-detector)其中preprocess_fn由preprocess_drift与编码器网络组合而来encoding_dim32。检测器目录包含KSDrift.dill、meta.dill与model/encoder.h5。导出为 MLServer 模型两个检测器都需要配一个 MLServer 的model-settings.json才能被 Seldon Core 2 加载例如异常检测器的配置见 outlier-detector/model-settings.json{ name: cifar10-outlier-detect, implementation: mlserver_alibi_detect.AlibiDetectRuntime, parameters: { uri: ./, version: v0.1.0 } }关键点在于implementation指定为mlserver_alibi_detect.AlibiDetectRuntime——正是这个运行时让 MLServer 能够加载并调用 Alibi Detect 保存的检测器。漂移检测器的配置同构drift-detector/model-settings.json只是name换成cifar10-drift。整个目录结构随后上传到对象存储gsutil ls -R gs://seldon-models/mlserver/alibi-detect/cifar10-outlier # OutlierVAE.dill / meta.dill / model-settings.json / model/(checkpoint, encoder_net.h5, decoder_net.h5, vae.ckpt.*)定义模型三个 Model 资源示例把分类器与两个检测器分别声明为三个Model自定义资源定义文件在 samples/models 目录下apiVersion: mlops.seldon.io/v1alpha1 kind: Model metadata: name: cifar10 spec: storageUri: gs://seldon-models/triton/tf_cifar10 requirements: - tensorflow --- apiVersion: mlops.seldon.io/v1alpha1 kind: Model metadata: name: cifar10-outlier spec: storageUri: gs://seldon-models/scv2/examples/mlserver_1.3.5/cifar10/outlier-detector requirements: - mlserver - alibi-detect --- apiVersion: mlops.seldon.io/v1alpha1 kind: Model metadata: name: cifar10-drift spec: storageUri: gs://seldon-models/scv2/examples/mlserver_1.3.5/cifar10/drift-detector requirements: - mlserver - alibi-detect三个 YAML 的完整源文件分别为 cifar10.yaml、cifar10-outlier-detect.yaml 与 cifar10-drift-detect.yaml。其中storageUri指向托管在 Google Storage 上的模型/检测器目录Seldon Core 2 的调度器会据此拉取工件requirements列表用于声明模型所需的推理服务器能力tensorflow让调度器把cifar10调度到 Triton 服务器上运行Triton 直接解析 TensorFlow SavedModel输出张量fc10的 shape 为[batch, 10]mlserveralibi-detect则让两个检测器调度到带 AlibiDetectRuntime 的 MLServer 上。加载模型并等待可用使用seldonCLI 依次加载三个模型-f指定 YAML 清单文件该参数在 CLI 源码 model_load.go 中被标记为必填seldon model load -f ../../models/cifar10.yaml seldon model load -f ../../models/cifar10-outlier-detect.yaml seldon model load -f ../../models/cifar10-drift-detect.yaml随后用-w ModelAvailable等待每个模型进入可用状态seldon model status cifar10 -w ModelAvailable | jq . seldon model status cifar10-outlier -w ModelAvailable | jq . seldon model status cifar10-drift -w ModelAvailable | jq .-w--wait是状态命令的等待条件参数见 model_status.go它会阻塞直到模型达到指定状态。从 modelstate_string.go 可以看到调度器内部维护的完整状态机ModelStateUnknown→ModelProgressing→ModelAvailable失败时为ModelFailed卸载后进入ModelTerminating/ModelTerminated。ModelAvailable即模型副本已经就绪、可以接收推理请求的状态。定义并加载 Pipeline将三个模型串联成一条生产链路的是 samples/pipelines/cifar10.yamlapiVersion: mlops.seldon.io/v1alpha1 kind: Pipeline metadata: name: cifar10-production spec: steps: - name: cifar10 - name: cifar10-outlier - name: cifar10-drift batch: size: 20 output: steps: - cifar10 - cifar10-outlier.outputs.is_outlierPipeline 语义要点stepscifar10、cifar10-outlier、cifar10-drift三个步骤按声明顺序连接。每个步骤名即上一步声明的Model名称batch为cifar10-drift步骤声明size: 20的批处理漂移检测器按 20 条请求聚合后再执行检测output.steps声明对外输出cifar10的全部输出以及cifar10-outlier步骤的输出张量is_outlieris_outlier1表示当前输入被判为异常。加载并等待就绪seldon pipeline load -f ../../pipelines/cifar10.yaml seldon pipeline status cifar10-production -w PipelineReady | jq -M .官方文档给出的就绪状态返回如下uid 与时间戳为实际运行值{ pipelineName: cifar10-production, versions: [ { pipeline: { name: cifar10-production, uid: cifeii2ufmbc73e5insg, version: 1, steps: [ {name: cifar10}, {name: cifar10-drift, batch: {size: 20}}, {name: cifar10-outlier} ], output: { steps: [ cifar10.outputs, cifar10-outlier.outputs.is_outlier ] }, kubernetesMeta: {} }, state: { pipelineVersion: 1, status: PipelineReady, reason: created pipeline, lastChangeTimestamp: 2023-06-30T14:40:09.047429817Z, modelsReady: true } } ] }PipelineReady状态表示所有步骤对应的模型均已可用modelsReady: true。Pipeline 与 Batch 的数据模型可以在 apis/mlops/scheduler/scheduler.proto 中看到PipelineStep携带Batch batch字段Batch除size外还支持windowMs时间窗口即“攒够 N 条或等待 M 毫秒”二选一的批聚合策略。批聚合的底层实现位于数据流模块 BatchProcessor.ktKafka 流处理器按固定 key 把请求暂存在状态存储中把多个ModelInferRequest的输入张量沿 batch 维度拼接mergeStandardTensors只有当首维shape[0] threshold时才向下游转发否则继续累积。端到端推理验证正常 / 漂移 / 异常三类输入示例提供了一段基于 v2 推理协议的 Python 调用封装完整实现见 infer.md。请求先构造{inputs:[{name:input_1,data:[],datatype:FP32,shape:[]}]}再通过seldon-model请求头指定目标模型或 Pipelinedef infer(resourceName: str, batchSz: int, requestType: str): if requestType outlier: rows X_outliers[0:0batchSz] elif requestType drift: rows X_corr[0:0batchSz] else: rows X_train[0:0batchSz] for i in range(batchSz): show(rows[i]) reqJson[inputs][0][data] rows.flatten().tolist() reqJson[inputs][0][shape] [batchSz, 32, 32, 3] headers {Content-Type: application/json, seldon-model: resourceName} response_raw requests.post(url, jsonreqJson, headersheaders) print(response_raw) print(response_raw.json())其中url http://0.0.0.0:9000/v2/models/model/inferseldon-model头的取值可以是模型名如cifar10也可以是 Pipeline 地址cifar10-production.pipeline。场景一正常样本infer(cifar10-production.pipeline, 20, normal)返回200 OK输出包含两个张量分类器输出fc10shape[20, 10]对应 20 张图片 × 10 个类别概率与异常检测输出is_outliershape[1, 20]20 个样本全部为 0即均判为正常{model_name: , outputs: [ {data: [1.45001495e-08, ..., 2.8514464e-07], name: fc10, shape: [20, 10], datatype: FP32}, {data: [0, 0, ..., 0], name: is_outlier, shape: [1, 20], datatype: INT64, parameters: {content_type: np}} ]}场景二漂移样本infer(cifar10-production.pipeline, 20, drift)用seldon pipeline inspect检视漂移检测器步骤的输出张量is_driftseldon pipeline inspect cifar10-production.cifar10-drift.outputs.is_driftseldon.default.model.cifar10-drift.outputs cifeij8fh5ss738i5bp0 {name:is_drift, datatype:INT64, shape:[1, 1], parameters:{content_type:{stringParam:np}}, contents:{int64Contents:[0]}}此时is_drift为 0随后再次推理并检视is_drift变为 1说明亮度扰动后的批次触发了漂移告警seldon.default.model.cifar10-drift.outputs cifeimgfh5ss738i5bpg {name:is_drift, datatype:INT64, shape:[1, 1], parameters:{content_type:{stringParam:np}}, contents:{int64Contents:[1]}}场景三异常样本infer(cifar10-production.pipeline, 1, outlier)返回的分类概率fc10集中在cat0.65与frog0.34之间且is_outlier为 1成功识别出掩码扰动样本对照正常样本is_outlier为 0{model_name: , outputs: [ {data: [6.36e-06, 0.0006, 0.0054, 0.6536, 1.47e-05, 2.61e-06, 0.3398, 1.35e-05, 0.0004, 4.81e-05], name: fc10, shape: [1, 10], datatype: FP32}, {data: [1], name: is_outlier, shape: [1, 1], datatype: INT64, parameters: {content_type: np}} ]}用 seldon pipeline inspect 查看中间张量seldon pipeline inspect是排查数据流问题的核心工具它可以直接读取 Kafka 数据流中的中间张量并替我们解码 Triton 的二进制输出。其表达式语法见 pipeline_inspect.go 的帮助文本支持四级寻址pipelineName pipelineName.(inputs|outputs) pipelineName.stepName pipelineName.stepName.(inputs|outputs) pipelineName.stepName.(inputs|outputs).tensorName例如查看分类器cifar10步骤在 Pipeline 中的全部输出seldon pipeline inspect cifar10-production.cifar10.outputsseldon.default.model.cifar10.outputs cifeiq8fh5ss738i5bqg {modelName:cifar10_1, modelVersion:1, outputs:[{name:fc10, datatype:FP32, shape:[1, 10], contents:{fp32Contents:[1.45001495e-8, 1.2525752e-9, 1.6298458e-7, 0.11529388, 1.7431412e-7, 0.0000061856604, 0.8846994, 6.0739285e-9, 7.43792e-8, 4.7317337e-9]}}]}注意这里contents使用的是解码后的fp32Contents数组而seldon-model直接推理返回的是data数组两条路径的数据是完全一致的inspect更利于观察 Pipeline 内部的中间状态。清理资源验证完成后按顺序卸载 Pipeline 与模型seldon pipeline unload cifar10-production seldon model unload cifar10 seldon model unload cifar10-outlier seldon model unload cifar10-drift小结这个 CIFAR10 示例展示了 Seldon Core 2 面向生产环境的核心模式以声明式ModelPipeline资源把“推理 可观测性”组合为一条统一服务链路。从本示例可以提炼出三条可直接复用的经验模型即资源分类器、异常检测器、漂移检测器都被统一建模为Model由requirements自动匹配 Triton 或 MLServer 运行时无需手工编排 Pod批处理可配置Pipeline步骤的batch.size与 proto 中的windowMs让高频检测器如漂移监控可以按批量聚合消费避免逐请求开销可观测内建seldon pipeline inspect让中间张量is_outlier、is_drift可随时检视配合-w ModelAvailable/-w PipelineReady等待机制可以构建可靠的自动化验证流程。如需复现请在仓库的samples/examples/image_classifier目录下依次执行make env安装依赖、按需make train训练检测器然后使用三个ModelYAMLcifar10.yaml、cifar10-outlier-detect.yaml、cifar10-drift-detect.yaml与 cifar10.yaml 的 Pipeline 完成加载与验证。赞分享人工智能大模型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 漂移检测实战用 Alibi-Detect 在 Pipeline 中搭建异步模型监控Seldon Core 2 漂移检测实战用 Alibi Detect 在 Pipeline 中搭建异步模型监控 本篇技术指南围绕 Seldon Core 2人工智能大模型MLOpsLLMOps模型推理服务云原生后端Seldon Core 收入分类器生产级部署实战漂移检测、异常检测与 Anchor 可解释性流水线Seldon Core 收入分类器生产级部署实战漂移检测、异常检测与 Anchor 可解释性流水线 本文基于 Seldon Core v2 的官方示例 in人工智能大模型MLOpsLLMOps模型推理服务云原生后端Seldon Core 异常检测Outlier Detection实战用 Alibi-Detect 模型监控生产模型Seldon Core 异常检测Outlier Detection实战用 Alibi Detect 模型监控生产模型 本文介绍 Seldon Core 2人工智能大模型MLOpsLLMOps模型推理服务云原生后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考