尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ZenML Model Control Plane 实战指南:在 Pipeline 中注册、版本化、关联与晋升机器学习模型

ZenML Model Control Plane 实战指南:在 Pipeline 中注册、版本化、关联与晋升机器学习模型 ZenML Model Control Plane 实战指南在 Pipeline 中注册、版本化、关联与晋升机器学习模型【免费下载链接】zenmlZenML : One AI Platform from Pipelines to Agents. https://zenml.io.项目地址: https://gitcode.com/GitHub_Trending/ze/zenmlZenML 的 Model Control Plane模型控制平面为传统机器学习模型与 AI Agent 系统提供统一的端到端模型管理能力注册与版本化、产物Artifact关联、跨 Pipeline 数据交换、元数据追踪与阶段晋升。本文基于 docs/book/how-to/models/models.md 展开并结合 Model 类源码、ModelStages 枚举 与 CLI 实现 进行纵深剖析。读完本文你将掌握通过 Python SDK 与zenml modelCLI 完成模型注册、版本管理、产物关联、阶段晋升、指标记录与跨 Pipeline 共享的完整实战方案。理解 ZenML 中的 Model什么是 ZenML ModelZenML Model 是一个将特定机器学习用例、业务问题或 AI Agent 系统相关的所有资源聚合在一起的逻辑容器它不仅仅是模型权重文件。一个 ZenML Model 会关联Pipeline负责训练、评估或部署该模型 / Agent 系统的流水线Artifacts产物数据集、模型权重、预测结果、Prompt 模板、Agent 配置等元数据指标、参数、评估结果与业务信息。需要特别区分的是ZenML Model 不同于技术模型带权重和参数的实际 ML 模型文件或Agent 配置Prompt 模板、工具定义等。这些技术产物只是 ZenML Model 的组成部分与训练数据、预测结果、评估结果等资源并列。从源码看Model 类 的字段设计印证了这一点除了name、version、tags外还包含license、description、audience目标受众、use_cases使用场景、limitations已知局限、trade_offs权衡取舍、ethics伦理影响等用于描述模型产品属性的字段以及save_models_to_registry是否将模型产物同步到当前 Stack 中的 Model Registry默认True。Model Control Plane 是什么Model Control Plane 是 ZenML 管理模型全生命周期的统一接口核心能力包括注册与版本化模型将 Pipeline 和 Artifacts 关联到模型追踪血缘Lineage与依赖关系通过阶段staging、production 等管理模型晋升借助模型在 Pipeline 之间交换数据。需要说明的版本边界所有 Model Control Plane 功能在开源版OSS与 Pro 版中均可通过 Python SDK 以编程方式访问但可视化的模型管理 Dashboard模型探索、指标可视化、血缘视图仅在 ZenML Pro 中提供。以下界面演示来自 ZenML Pro Dashboard注册一个模型注册模型有三种常见方式Python SDK、CLI、以及通过 Pipeline 隐式注册。使用 Python SDKfrom zenml import Model from zenml.client import Client Client().create_model( namecustomer_service_agent, licenseMIT, descriptionMulti-agent system for customer service automation, tags[agent, customer-service, llm, rag], )create_model的参数与 Model 类 字段一一对应除上述字段外还支持audience、use_cases、limitations、trade_offs、ethics与save_models_to_registry。使用 CLIzenml model register customer_service_agent --licenseMIT --descriptionMulti-agent customer service system从 CLI 实现 可以看出zenml model register底层就是对Client().create_model(...)的封装并额外暴露了--audience、--use-cases、--tradeoffs、--ethical、--limitations、--tag可多次传递与--save-models-to-registry等选项若模型已存在或参数非法会抛出并捕获EntityExistsError/ValueError。使用 Pipeline推荐最常见的做法是在定义 Pipeline 时隐式注册模型将模型配置直接挂在 Pipeline 装饰器上from zenml import pipeline, Model pipeline( modelModel( nameiris_classifier, descriptionClassification model for the Iris dataset, tags[classification, sklearn] ) ) def training_pipeline(): # Pipeline implementation...从 Model._get_or_create_model 的源码逻辑看当Client()中找不到同名模型时SDK 会基于模型配置构造ModelRequest并隐式创建模型New model ... was created implicitly.并处理好并发下的EntityExistsError竞态。这意味着你无需先注册再运行Pipeline 运行本身就会完成注册。模型版本化每次运行携带模型配置的 PipelineZenML 都会创建一个新的模型版本。版本解析规则见 Model._get_or_create_model_version如下version为None创建新版本若同一次运行中其他 Step 尚未创建version为整数或数字字符串按版本号number抓取对应版本version为字符串按版本名抓取version为ModelStages枚举值按阶段抓取对应版本。需要留意两个保留规则版本名不能与任何ModelStages值相同否则抛出RuntimeError数字版本名同样被保留防止与版本号机制冲突。显式命名版本from zenml import Model, pipeline pipeline( modelModel( nameiris_classifier, version1.0.5 ) ) def training_pipeline(): # Pipeline implementation...使用模板化命名from zenml import Model, pipeline pipeline( modelModel( nameiris_classifier, versionrun-{run.id[:8]} ) ) def training_pipeline(): # Pipeline implementation...版本名支持占位符模板机制由 format_name_template 负责渲染内置占位符{date}格式%Y_%m_%d与{time}格式%H_%M_%S_%f含微秒自定义占位符通过 Pipeline 或 Step 装饰器传入的 substitutions 提供模板渲染优先取当前 Pipeline Run 的start_time与config.substitutions在 Pipeline 上下文之外则使用 UTC 当前时间兜底。例如version2026_09_17-07_23_01_123456这类带时间戳的版本名即由此生成非常适合需要可追溯、可排序版本名的场景。将产物关联到模型Pipeline 运行产生的 Artifacts 可以关联到模型从而建立血缘关系并支持后续复用。关联方式主要有两种在 Step 上声明modelModel(...)使其处于模型上下文在 Step 输出上使用ArtifactConfig命名产物并用save_artifact(..., is_model_artifactTrue)显式保存模型产物。from zenml import step, Model from zenml.artifacts.utils import save_artifact import pandas as pd from typing import Annotated from zenml.artifacts.artifact_config import ArtifactConfig from sklearn.base import ClassifierMixin from sklearn.ensemble import RandomForestClassifier # Example: Agent configuration step linking artifacts step(modelModel(nameCustomerServiceAgent, version2.1.0)) def configure_agent( knowledge_base: pd.DataFrame, evaluation_results: dict ) - Annotated[dict, ArtifactConfig(agent_config)]: # Create agent configuration based on knowledge base and evaluations agent_config { prompt_template: generate_prompt_from_kb(knowledge_base), tools: [search, database_query, escalation], performance_threshold: evaluation_results[min_accuracy], model_params: {temperature: 0.7, max_tokens: 500} } # Save intermediate prompt variants for variant in [concise, detailed, empathetic]: prompt_variant generate_prompt_variant(knowledge_base, variant) save_artifact( fprompt_template_{variant}, prompt_variant, is_model_artifactTrue, ) return agent_configis_model_artifactTrue标记的产物会被视为模型产物Model Artifact在模型中与数据产物Data Artifact、部署产物Deployment Artifact分类管理。与此对应Model 类 提供了按类型抓取产物的 APIget_model_artifact模型产物、get_data_artifact数据产物、get_deployment_artifact部署产物以及通用的get_artifact/load_artifact直接反序列化加载产物对象。CLI 侧也有对应的查看命令zenml model version list-artifacts、zenml model version list-model-artifacts、zenml model version list-deployment-artifacts见 model.py。模型阶段与晋升模型阶段Stage表示模型在生命周期中的进展状态。ModelStages 枚举 定义了全部取值阶段含义staging准备进行上线前的最终验证production当前已部署到生产环境latest最新版本虚拟阶段指向最新创建/更新的版本archived已归档不再使用none无阶段默认初始状态通过set_stage可以将指定版本晋升到目标阶段from zenml import Model from zenml.enums import ModelStages # Promote a specific model version to production model Model(nameiris_classifier, version1.2.3) model.set_stage(stageModelStages.PRODUCTION) # Find latest model and promote to staging latest_model Model(nameiris_classifier, versionModelStages.LATEST) latest_model.set_stage(stageModelStages.STAGING)从 set_stage 实现 可以看到它还支持force参数当目标阶段已有其他版本时若forceTrue会强制归档当前阶段版本否则直接抛出异常从而保证production等关键阶段在同一时刻只有一个活跃版本。注意这里ModelStages既可以作为version传入按阶段抓取也可以作为stage传入设置目标阶段含义不同使用时需区分。跨 Pipeline 共享模型模型介导的产物交换Model Control Plane 最强大的能力之一是让不同 Pipeline 之间无需感知具体 Artifact ID 即可共享产物。这被称为模型介导的产物交换模式Model-Mediated Artifact Exchangefrom typing import Annotated from zenml import step, get_pipeline_context, pipeline, Model from zenml.enums import ModelStages import pandas as pd from sklearn.base import ClassifierMixin step def predict( model: ClassifierMixin, data: pd.DataFrame, ) - Annotated[pd.Series, predictions]: Make predictions using a trained model. predictions pd.Series(model.predict(data)) return predictions pipeline( modelModel( nameiris_classifier, # Reference the production version versionModelStages.PRODUCTION, ), ) def inference_pipeline(): Run inference using the production model. # Get the model from the pipeline context model get_pipeline_context().model # Load inference data (youd need to implement this function) inference_data load_data() # Run prediction using the trained model artifact predict( modelmodel.get_model_artifact(trained_model), datainference_data, )这个模式的要点推理 Pipeline 通过versionModelStages.PRODUCTION声明我要使用当前处于生产阶段的版本而非写死某个版本号在 Step 内通过get_pipeline_context().model拿到当前模型上下文通过model.get_model_artifact(trained_model)按名称抓取训练 Pipeline 产出的模型产物。其底层支持来自 Model.get_artifact 系列方法 的懒加载Lazy机制在 Pipeline 上下文内get_model_artifact返回的是LazyArtifactVersionResponse占位对象真正解析产物 ID 发生在 Step 执行阶段因此在 Pipeline 设计期编译阶段无需关心产物的具体版本与 ID。这实现了训练 Pipeline 与推理 Pipeline 的清晰解耦同时保持了二者之间明确的关系与血缘。追踪指标与元数据为模型附加元数据是追踪性能、理解训练条件、支撑晋升决策的关键手段。元数据记录在 OSS 与 Pro 中均可通过 Python SDK 使用但通过 Dashboard 界面可视化探索模型指标仅限 ZenML Pro。记录模型元数据在 Step 中使用log_metadata并设置infer_modelTrue即可将元数据挂载到当前 Step 上下文对应的模型版本上from zenml import step, log_metadata, get_step_context step def evaluate_model(model, test_data): Evaluate the model and log metrics. predictions model.predict(test_data) # Note: Youd need to implement these metric calculation functions accuracy calculate_accuracy(predictions, test_data.target) precision calculate_precision(predictions, test_data.target) recall calculate_recall(predictions, test_data.target) # Log metrics to the model log_metadata( metadata{ evaluation_metrics: { accuracy: accuracy, precision: precision, recall: recall } }, infer_modelTrue, # Attaches to the model in the current step context ) # Example: Evaluate agent and log metrics step def evaluate_agent(agent_config, test_queries): Evaluate the agent and log performance metrics. responses [] for query in test_queries: response agent_config.process_query(query) responses.append(response) # Note: Youd need to implement these agent evaluation functions response_quality calculate_response_quality(responses, test_queries) response_time calculate_avg_response_time(responses) user_satisfaction calculate_satisfaction_score(responses) tool_usage_efficiency calculate_tool_efficiency(agent_config.tools) # Log agent performance metrics to the model log_metadata( metadata{ agent_evaluation: { response_quality: response_quality, avg_response_time_ms: response_time, user_satisfaction_score: user_satisfaction, tool_efficiency: tool_usage_efficiency, total_queries_evaluated: len(test_queries) }, agent_configuration: { prompt_template_version: agent_config.prompt_version, tools_enabled: agent_config.tools, model_temperature: agent_config.temperature } }, infer_modelTrue, # Attaches to the agent model in the current step context )值得说明的是除了 Step 内的log_metadata(infer_modelTrue)Model 类 还提供了实例方法model.log_metadata(...)其底层通过Client().create_run_metadata(...)将元数据写入MetadataResourceTypes.MODEL_VERSION资源二者殊途同归。获取模型元数据from zenml.client import Client # Get a specific model version model Client().get_model_version(iris_classifier, 1.2.3) # Access metadata metrics model.run_metadata[evaluation_metrics].value print(fModel accuracy: {metrics[accuracy]})run_metadata以字典形式返回该模型版本的全部元数据在 Pipeline 上下文内会使用懒加载 getter 避免不必要的网络请求见 model.py配合model.id、model.number、model.stage等属性model.py可以在推理决策时动态读取某个版本的最新指标。删除模型当模型不再需要时可以整体删除或仅删除指定版本。删除模型的所有版本from zenml.client import Client # Using the Python SDK Client().delete_model(iris_classifier) # Or using the CLI # zenml model delete iris_classifier删除指定版本from zenml.client import Client # Using the Python SDK Client().delete_model_version(model_version_id) # Or using the CLI # zenml model version delete MODEL_VERSION_NAME对应的 CLI 命令分别为zenml model delete MODEL_NAME_OR_ID与zenml model version delete MODEL_VERSION_NAME见 CLI 实现 与 L547 附近。需要提示删除操作会同时移除模型版本的阶段与关联关系请谨慎执行。此外Model 类 还提供了细粒度的产物清理 APImodel.delete_artifact(name, version)与model.delete_all_artifacts(...)支持仅解除关联only_linkTrue或同时从 Artifact Store 中物理删除。最佳实践一致的命名为模型和版本制定并遵循统一的命名约定例如{domain}_{task}_{version}便于检索与排序丰富的元数据在每个版本上记录完整的评估指标、训练参数与业务上下文为晋升决策提供依据明确的晋升策略围绕staging → production → archived制定清晰的晋升规则利用force参数保证生产阶段版本的唯一性模型与 Pipeline 关联所有训练、评估、推理 Pipeline 都应声明model...以维护血缘并启用跨 Pipeline 产物共享版本化策略选择需要可复现的稳定版本时使用显式版本名如1.0.5需要自动区分每次运行时使用{date}/{time}模板或自定义占位符版本名分类管理产物训练模型用is_model_artifactTrue标记Prompt 模板等 Agent 配置按需存储配合get_model_artifact/get_data_artifact分类读取。结论ZenML 的 Model Control Plane 为传统 ML 模型与 AI Agent 系统提供了覆盖全生命周期的统一管理方案。通过注册、版本化、产物关联、阶段晋升与元数据追踪的组合使用你可以为 ML 项目与 Agent 开发建立透明、可复现的工作流。OSS 与 Pro 的能力边界如下ZenML OSS包含本文描述的全部编程式Python SDK模型功能ZenML Pro额外提供可视化模型 Dashboard、高级模型探索、完整指标可视化与集成的模型血缘视图。无论你是在构建简单的分类模型、复杂的生产级 ML 系统还是多 Agent 的 AI 应用ZenML 统一的模型管理能力都能帮助你组织资源、理清关系在整个 AI 开发生命周期中保持清晰度。更多实操示例可参考仓库中的 Agent 对比示例、Agent 外循环示例 与 MLOps 入门示例 中关于模型注册与晋升的实际用法。【免费下载链接】zenmlZenML : One AI Platform from Pipelines to Agents. https://zenml.io.项目地址: https://gitcode.com/GitHub_Trending/ze/zenml创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表