当前位置: 首页 > article >正文

08-MLOps与工程落地——模型注册表与模型服务

模型注册表与模型服务MLflow Model Registry、Seldon Core一、模型注册表概述1.1 什么是模型注册表importmatplotlib.pyplotaspltfrommatplotlib.patchesimportRectangle,FancyBboxPatchimportwarnings warnings.filterwarnings(ignore)print(*60)print(模型注册表集中管理模型版本)print(*60)# 模型注册表架构图fig,axplt.subplots(figsize(12,8))ax.axis(off)# 组件components{训练流水线:(0.2,0.7),模型注册表:(0.5,0.7),模型服务:(0.8,0.7),版本管理:(0.2,0.4),阶段转换:(0.5,0.4),监控告警:(0.8,0.4),}forname,(x,y)incomponents.items():circleplt.Circle((x,y),0.08,colorlightblue,ecblack)ax.add_patch(circle)ax.text(x,y,name,hacenter,vacenter,fontsize8)# 连接ax.annotate(,xy(0.4,0.7),xytext(0.28,0.7),arrowpropsdict(arrowstyle-,lw2))ax.annotate(,xy(0.72,0.7),xytext(0.58,0.7),arrowpropsdict(arrowstyle-,lw2))ax.annotate(,xy(0.5,0.62),xytext(0.5,0.48),arrowpropsdict(arrowstyle-,lw1))ax.annotate(,xy(0.8,0.62),xytext(0.8,0.48),arrowpropsdict(arrowstyle-,lw1))ax.set_xlim(0,1)ax.set_ylim(0,1)ax.set_title(模型注册表架构,fontsize14)plt.tight_layout()plt.show()print(\n 模型注册表核心功能:)print( - 模型版本管理)print( - 阶段转换Staging/Production/Archived)print( - 模型元数据存储)print( - 模型血缘追踪)print( - 部署集成)二、MLflow Model Registry2.1 模型注册defmlflow_registry():MLflow模型注册print(\n*60)print(MLflow Model Registry)print(*60)code import mlflow import mlflow.sklearn from mlflow.tracking import MlflowClient from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split # 1. 设置MLflow mlflow.set_tracking_uri(http://localhost:5000) mlflow.set_experiment(model_registry_demo) # 2. 训练和注册模型 with mlflow.start_run(run_namemodel_v1) as run: # 训练模型 X, y make_classification(n_samples1000, n_features20, random_state42) X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2) model RandomForestClassifier(n_estimators100, max_depth10) model.fit(X_train, y_train) # 记录参数和指标 mlflow.log_param(n_estimators, 100) mlflow.log_param(max_depth, 10) mlflow.log_metric(accuracy, model.score(X_test, y_test)) # 注册模型 mlflow.sklearn.log_model( model, model, registered_model_nameproduction_model ) run_id run.info.run_id # 3. 使用Client管理模型 client MlflowClient() # 创建注册模型 client.create_registered_model(production_model) # 添加模型版本 model_uri fruns:/{run_id}/model client.create_model_version( nameproduction_model, sourcemodel_uri, run_idrun_id, descriptionRandom Forest model v1 ) # 4. 模型版本转换 # 转换到Staging client.transition_model_version_stage( nameproduction_model, version1, stageStaging ) # 转换到Production client.transition_model_version_stage( nameproduction_model, version1, stageProduction ) # 5. 更新模型描述 client.update_model_version( nameproduction_model, version1, descriptionImproved with feature engineering ) # 6. 添加模型标签 client.set_model_version_tag( nameproduction_model, version1, keyaccuracy, value0.95 ) # 7. 获取模型版本信息 model_version client.get_model_version(production_model, 1) print(fVersion: {model_version.version}) print(fStage: {model_version.stage}) print(fDescription: {model_version.description}) # 8. 列出所有版本 versions client.search_model_versions(nameproduction_model) for v in versions: print(fVersion {v.version}: Stage {v.stage}) # 9. 加载生产模型 model mlflow.pyfunc.load_model(models:/production_model/Production) print(code)mlflow_registry()2.2 模型版本管理defmodel_version_management():模型版本管理print(\n*60)print(模型版本管理)print(*60)code from mlflow.tracking import MlflowClient import mlflow client MlflowClient() # 1. 注册多个版本 versions [ {n_estimators: 50, max_depth: 5}, {n_estimators: 100, max_depth: 10}, {n_estimators: 150, max_depth: 15}, {n_estimators: 200, max_depth: 20} ] for i, params in enumerate(versions, 1): with mlflow.start_run(run_namefmodel_v{i}): # 训练模型 model RandomForestClassifier(**params) model.fit(X_train, y_train) # 记录参数 mlflow.log_params(params) mlflow.log_metric(accuracy, model.score(X_test, y_test)) # 注册模型 mlflow.sklearn.log_model( model, model, registered_model_nameproduction_model ) # 2. 比较模型版本 def compare_models(model_name): versions client.search_model_versions(fname{model_name}) results [] for v in versions: # 获取运行ID run_id v.run_id run mlflow.get_run(run_id) results.append({ version: v.version, stage: v.stage, accuracy: run.data.metrics.get(accuracy), params: run.data.params }) # 按准确率排序 results.sort(keylambda x: x[accuracy], reverseTrue) for r in results: print(fVersion {r[version]} ({r[stage]}): accuracy{r[accuracy]:.4f}) return results # 3. 设置模型别名 client.set_registered_model_alias(production_model, champion, 3) client.set_registered_model_alias(production_model, challenger, 4) # 使用别名加载 champion_model mlflow.pyfunc.load_model(models:/production_modelchampion) challenger_model mlflow.pyfunc.load_model(models:/production_modelchallenger) # 4. A/B测试 def ab_test(champion_model, challenger_model, test_data, ratio0.1): A/B测试 import random results {champion: 0, challenger: 0} for x in test_data: if random.random() ratio: # 使用挑战者模型 pred challenger_model.predict(x) results[challenger] 1 else: # 使用冠军模型 pred champion_model.predict(x) results[champion] 1 return results # 5. 模型回滚 def rollback_model(model_name, target_version): 回滚到指定版本 # 获取当前生产版本 current client.get_latest_versions(model_name, stages[Production])[0] # 将当前版本归档 client.transition_model_version_stage( namemodel_name, versioncurrent.version, stageArchived ) # 将目标版本提升为生产 client.transition_model_version_stage( namemodel_name, versiontarget_version, stageProduction ) print(fRolled back from version {current.version} to {target_version}) print(code)model_version_management()三、Seldon Core模型服务3.1 Seldon Core部署defseldon_core():Seldon Core部署print(\n*60)print(Seldon Core模型服务)print(*60)code # 1. Seldon Deployment定义 apiVersion: machinelearning.seldon.io/v1 kind: SeldonDeployment metadata: name: sklearn-model namespace: production spec: name: sklearn-deployment predictors: - name: default graph: name: classifier type: MODEL modelUri: gs://seldon-models/sklearn/iris implementation: SKLEARN_SERVER replicas: 2 traffic: 100 # 2. 多模型部署金丝雀 apiVersion: machinelearning.seldon.io/v1 kind: SeldonDeployment metadata: name: canary-deployment spec: predictors: - name: stable graph: name: stable-model modelUri: gs://models/stable implementation: SKLEARN_SERVER replicas: 2 traffic: 90 - name: canary graph: name: canary-model modelUri: gs://models/canary implementation: SKLEARN_SERVER replicas: 1 traffic: 10 # 3. 自定义模型服务 apiVersion: machinelearning.seldon.io/v1 kind: SeldonDeployment metadata: name: custom-model spec: predictors: - name: custom graph: name: custom-model type: MODEL implementation: CUSTOM modelUri: gs://models/custom envSecretRefName: model-secrets serviceAccountName: seldon-service-account resources: requests: memory: 2Gi cpu: 1 limits: memory: 4Gi cpu: 2 replicas: 2 # 4. 推理图Pipeline apiVersion: machinelearning.seldon.io/v1 kind: SeldonDeployment metadata: name: inference-graph spec: predictors: - name: pipeline graph: name: transformer type: TRANSFORMER children: - name: model1 type: MODEL children: - name: model2 type: MODEL endpoint: type: REST print(code)seldon_core()3.2 模型服务集成defseldon_integration():Seldon Core集成print(\n*60)print(Seldon Core集成)print(*60)code # 1. Python自定义模型服务 import numpy as np import joblib from seldon_core.user_model import SeldonComponent class CustomModel(SeldonComponent): def __init__(self, model_path): self.model joblib.load(model_path) def predict(self, X, features_namesNone, **kwargs): 预测接口 predictions self.model.predict(X) return predictions def predict_proba(self, X, features_namesNone, **kwargs): 概率预测接口 probabilities self.model.predict_proba(X) return probabilities # 2. Dockerfile FROM python:3.9-slim RUN pip install seldon-core scikit-learn joblib COPY model.pkl /model.pkl COPY model_server.py /model_server.py CMD [python, /model_server.py] # 3. 服务请求示例 import requests import json # REST请求 def predict_rest(features): url http://seldon-service.production.svc.cluster.local/v1/models/default/predict payload { data: { ndarray: [features] } } response requests.post(url, jsonpayload) return response.json() # gRPC请求 import grpc from seldon_core.proto import prediction_pb2, prediction_pb2_grpc def predict_grpc(features): channel grpc.insecure_channel(seldon-service.production:8000) stub prediction_pb2_grpc.SeldonStub(channel) request prediction_pb2.SeldonMessage( dataprediction_pb2.DefaultData( ndarrayprediction_pb2.NDArray(valuesfeatures) ) ) response stub.Predict(request) return response # 4. 性能测试 def benchmark_seldon(): import time features [[1, 2, 3, 4]] n_requests 100 start time.time() for _ in range(n_requests): predict_rest(features) elapsed time.time() - start print(fAverage latency: {elapsed/n_requests*1000:.2f}ms) print(fThroughput: {n_requests/elapsed:.2f} req/s) print(code)seldon_integration()四、端到端工作流4.1 完整MLOps流程defend_to_end_workflow():端到端MLOps工作流print(\n*60)print(端到端MLOps工作流)print(*60)code import mlflow from mlflow.tracking import MlflowClient import requests import json class MLOpsPipeline: def __init__(self, model_name, tracking_urihttp://mlflow:5000): self.model_name model_name mlflow.set_tracking_uri(tracking_uri) self.client MlflowClient() def train_and_register(self, training_func, version, params): 训练并注册模型 with mlflow.start_run(run_nameftrain_v{version}): # 训练模型 model training_func(**params) # 记录参数和指标 mlflow.log_params(params) accuracy evaluate_model(model) mlflow.log_metric(accuracy, accuracy) # 注册模型 mlflow.sklearn.log_model( model, model, registered_model_nameself.model_name ) # 获取run_id run_id mlflow.active_run().info.run_id # 添加标签 self.client.set_model_version_tag( nameself.model_name, versionversion, keyaccuracy, valuestr(accuracy) ) return run_id def promote_to_staging(self, version): 提升到Staging环境 self.client.transition_model_version_stage( nameself.model_name, versionversion, stageStaging ) # 部署到Staging self._deploy_to_environment(staging, version) def promote_to_production(self, version): 提升到Production环境 # 获取当前生产版本 current self.client.get_latest_versions(self.model_name, stages[Production]) # 验证新模型性能 if not self._validate_model(version): raise Exception(Model validation failed) # 执行金丝雀部署 self._canary_deploy(version, current[0].version if current else None) # 转换阶段 self.client.transition_model_version_stage( nameself.model_name, versionversion, stageProduction ) if current: self.client.transition_model_version_stage( nameself.model_name, versioncurrent[0].version, stageArchived ) def _deploy_to_environment(self, env, version): 部署到指定环境 model_uri fmodels:/{self.model_name}/{version} # 创建Seldon部署 deployment { apiVersion: machinelearning.seldon.io/v1, kind: SeldonDeployment, metadata: { name: f{self.model_name}-{env}, namespace: env }, spec: { predictors: [{ name: default, graph: { name: classifier, implementation: SKLEARN_SERVER, modelUri: model_uri }, replicas: 2 }] } } # 应用部署 # kubectl.apply(deployment) def _validate_model(self, version): 验证模型性能 model mlflow.pyfunc.load_model(fmodels:/{self.model_name}/{version}) # 在验证集上测试 accuracy test_model(model) return accuracy 0.85 def _canary_deploy(self, new_version, old_version): 金丝雀部署 # 创建金丝雀部署配置 pass # 使用示例 pipeline MLOpsPipeline(production_model) # 训练新版本 pipeline.train_and_register(train_func, version5, params{n_estimators: 150}) # 提升到Staging pipeline.promote_to_staging(5) # 测试验证后提升到Production pipeline.promote_to_production(5) print(code)end_to_end_workflow()五、总结组件功能工具模型注册版本管理MLflow Registry阶段管理Staging/ProductionMLflow模型服务推理部署Seldon Core金丝雀灰度发布Seldon Core监控性能监控Prometheus最佳实践使用MLflow Registry管理模型版本实施阶段转换流程使用Seldon Core进行生产部署实施金丝雀发布策略集成监控和告警

相关文章:

08-MLOps与工程落地——模型注册表与模型服务

模型注册表与模型服务(MLflow Model Registry、Seldon Core) 一、模型注册表概述 1.1 什么是模型注册表? import matplotlib.pyplot as plt from matplotlib.patches import Rectangle, FancyBboxPatch import warnings warnings.filterwarni…...

3分钟手机端刷入Android内核:Horizon Kernel Flasher终极指南

3分钟手机端刷入Android内核:Horizon Kernel Flasher终极指南 【免费下载链接】HorizonKernelFlasher A simple app that can flash AnyKernel flashable zips on android 项目地址: https://gitcode.com/gh_mirrors/ho/HorizonKernelFlasher 还在为刷内核必…...

如何在XSLT中将动态字段值(如姓名)安全注入HTML链接的URL参数

...

【控制】基于使用Koopman算子识别的多面体不确定性LPV系统的鲁棒非线性模型预测控制 附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。 🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室 👇 关注我领取海量matlab电子书和数学建模资料 &…...

【无人机】基于无人机UAV和物联网IoT的奶牛健康监测系统算法实现附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室 🍊个人信条:格物致知,完整Matla…...

【雷达】基于Matlab GUI的中重频PD雷达仿真系统,根据输入参数仿真,图形界面简单

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室 🍊个人信条:格物致知,完整Matla…...

5步掌握TIDAL高品质音乐下载:tidal-dl-ng高效使用指南

5步掌握TIDAL高品质音乐下载:tidal-dl-ng高效使用指南 【免费下载链接】tidal-dl-ng TIDAL Media Downloader Next Generation! Up to HiRes / TIDAL MAX 24-bit, 192 kHz. 项目地址: https://gitcode.com/gh_mirrors/ti/tidal-dl-ng 想要永久保存TIDAL平台上…...

golang如何实现表单验证_golang表单验证实现方法

用 validator 包校验结构体最省心,需导出字段、正确打标签、调用 Validate() 并处理 error;HTTP 请求解析后立即校验,避免空格等边界问题,配合 Translations 实现多语言错误提示。用 validator 包做结构体字段校验最省心Go 没有内…...

HTML怎么标注回收估价规则_HTML估价逻辑说明折叠区【指南】

用detailssummary实现可折叠估价规则,语义清晰且原生支持键盘与屏幕阅读器;summary仅放标题,正文置于其后;禁用aria-expanded手动控制,避免破坏可访问性;主流浏览器兼容良好,但Safari旧版不支持…...

利用Taotoken多模型聚合能力为AIGC应用动态选择最佳性价比模型

利用Taotoken多模型聚合能力为AIGC应用动态选择最佳性价比模型 在开发一个内容生成应用时,我们常常面临一个现实问题:不同的生成任务对模型的要求差异很大。一段需要文采斐然的创意写作,与一段需要精准、快速的代码补全,对底层大…...

如何通过3步解锁QQ群聊天记录的隐藏价值:ChatLog完整指南

如何通过3步解锁QQ群聊天记录的隐藏价值:ChatLog完整指南 【免费下载链接】chatLog QQ群聊天记录分析 项目地址: https://gitcode.com/gh_mirrors/ch/chatLog 你是否曾经好奇,每天在QQ群里海量的聊天记录背后,究竟隐藏着怎样的社群秘密…...

Python数据分析如何填充缺失日期_Pandas的asfreq技巧

asfreq填充缺失日期前必须将索引设为DatetimeIndex,否则静默失效;需确保索引为datetime64[ns],用freqD等正确频率对齐,再链式调用ffill()等填充NaN。asfreq 填充缺失日期前必须重设索引为 DatetimeIndex直接对普通 df 调用 asfreq…...

基于改进粒子群算法的时间-冲击最优轨迹规划五次B样条【附代码】

✨ 本团队擅长数据搜集与处理、建模仿真、程序设计、仿真代码、EI、SCI写作与指导,毕业论文、期刊论文经验交流。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,查看文章底部二维码(1)五次B样条曲线构造与关节运动特性约束:…...

CLAWSPACE:专为静态前端应用打造的轻量级发布与分享平台

1. 项目概述:一个为创意而生的轻量级应用宇宙如果你是一个独立开发者、创意工作者,或者只是一个喜欢捣鼓点小玩意、做个网页小游戏自娱自乐的人,你可能经常面临一个困境:做出来的东西,除了自己电脑上的localhost&#…...

从零构建轻量级实时监控系统:WebSocket与数据可视化实践

1. 项目概述:一个名为“Aura”的代码仓库能做什么?在GitHub上,当你看到一个以开发者用户名命名的仓库,比如bryanchen3777/Project-Aura,第一反应会是什么?这很可能是一个个人项目,一个实验性的想…...

Taotoken的按token计费模式如何让实验性项目的成本更可控

Taotoken的按token计费模式如何让实验性项目的成本更可控 1. 实验性项目的成本挑战 在AI原型验证或小规模实验阶段,开发者通常面临模型选型与成本控制的双重压力。传统包月套餐要求预先支付固定费用,而实验过程中频繁切换模型、调整参数会导致实际用量…...

YOLO 系列:半监督学习落地:结合 FixMatch 范式,用少量标注数据训练 YOLOv11,降低标注成本

引言:当目标检测遇上“标注瓶颈” 计算机视觉社区有一句流传已久的调侃:“深度学习工程师的80%时间花在数据上,其中80%花在标注上。” 这句话虽然夸张,却道出了工业界和学术界共同的痛点。以目标检测为例,一张包含50个…...

实战指南:MeteoInfo开源项目中GRIB转ARL格式转换问题的完整解决方案

实战指南:MeteoInfo开源项目中GRIB转ARL格式转换问题的完整解决方案 【免费下载链接】MeteoInfo MeteoInfo: GIS, scientific computation and visualization environment. 项目地址: https://gitcode.com/gh_mirrors/me/MeteoInfo MeteoInfo作为一款强大的气…...

SPSSAU文本分析新手入门:从数据上传到生成第一个词云图的全流程指南

SPSSAU文本分析实战:零基础生成专业词云图的完整指南 第一次面对海量用户评论或问卷开放题时,很多研究者都会感到无从下手。上周帮一位市场营销专业的研究生分析电商平台2000条用户评价,她盯着Excel里密密麻麻的文字直摇头:"…...

JavaScript中Object-getOwnPropertySymbols获取方法

Object.getOwnPropertySymbols() 返回对象自身所有Symbol属性键的数组,不包括字符串键和继承属性;例如返回[Symbol(a), Symbol(b)];区别于Object.keys()和Object.getOwnPropertyNames(),它只获取Symbol键且无论是否可枚举。Object…...

Windows热键冲突终极指南:三步快速定位被占用的快捷键

Windows热键冲突终极指南:三步快速定位被占用的快捷键 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 你是否曾…...

PySide6实战:手把手教你用SQLite+QTableView打造个人数据管理工具(附源码)

PySide6实战:手把手教你用SQLiteQTableView打造个人数据管理工具(附源码) 在桌面应用开发领域,数据管理功能几乎是每个工具类软件的标配。想象一下,当你需要管理个人藏书、影碟收藏,或是记录客户联系方式时…...

3步实现视频PPT智能提取:extract-video-ppt让课件整理自动化

3步实现视频PPT智能提取:extract-video-ppt让课件整理自动化 【免费下载链接】extract-video-ppt extract the ppt in the video 项目地址: https://gitcode.com/gh_mirrors/ex/extract-video-ppt 还在为从在线课程、会议录屏中手动截取PPT而烦恼吗&#xff…...

AISMM×ISO 27001×NIST RMF三模融合实践:一位CISO亲授的72小时风险响应加速方案

更多请点击: https://intelliparadigm.com 第一章:AISMM模型与风险管理整合的理论根基 核心范式演进 AISMM(Artificial Intelligence Security Maturity Model)并非孤立的安全评估框架,而是将AI系统生命周期与传统风…...

AI 热点资讯日报-2026-05-07

文章目录AI 热点资讯日报今日核心热点总结新华网科技 (tech.news.cn)36氪 (36kr.com)虎嗅网 (huxiu.com)网易科技 (tech.163.com)雷锋网 (leiphone.com)今日关键词云编辑点评📖 延伸阅读AI 热点资讯日报 日期:2026年5月7日(星期四&#xff0…...

AISMM模型落地预算规划全流程(2024财年头部企业已验证的7大关键控制点)

更多请点击: https://intelliparadigm.com 第一章:AISMM模型与预算规划融合的底层逻辑 AISMM(Adaptive Intelligent Strategic Management Model)并非传统静态框架,而是一个以实时反馈、多源数据协同与动态权重调整为…...

D21: 周复盘 —— 流程是骨架,AI 是肌肉

文章目录 D21: 周复盘 —— 流程是骨架,AI 是肌肉 📊 Week3 效能数据对比 需求评审效率 代码审查效率 项目估算准确度 会议效率 跨部门协作响应速度 📊 Week3 流程重构全景图 🕳️ Week3 踩坑清单:5 个真实教训 踩坑 1:需求评审 AI 化后,过度依赖 AI 生成的需求分析 …...

AI Agent团队数字档案库:用工程化方法管理角色人格与长期记忆

1. 项目概述:一个为AI工程师团队设计的“数字身份档案库”最近在整理团队知识库时,我一直在思考一个问题:在一个由AI Agent组成的虚拟工程团队里,如何让每个“成员”保持稳定、一致且富有深度的“人格”与“记忆”?这不…...

2025届毕业生推荐的降重复率平台解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 时下,人工智能生成内容检测技术正日趋成熟,然而用户同样能够借助专业…...

深度解密PCL2启动器:3大核心技术优势与实战开发指南

深度解密PCL2启动器:3大核心技术优势与实战开发指南 【免费下载链接】PCL Minecraft 启动器 Plain Craft Launcher(PCL)。 项目地址: https://gitcode.com/gh_mirrors/pc/PCL Plain Craft Launcher 2(PCL2)是一…...