ZenML项目教程:如何查询和分析历史管道运行记录
前言
在机器学习工作流中,我们经常需要回溯历史运行记录,比如:
- 查找昨天训练的模型存放在哪里
- 比较不同参数配置下的模型性能
- 复用某个中间处理结果
本文将详细介绍如何使用ZenML项目提供的功能来查询和分析历史管道运行记录,包括完整的对象层级访问方法和实用技巧。
核心概念解析
在深入操作之前,我们需要理解ZenML中的几个核心对象层级关系:
管道(Pipeline) → 运行(Run) → 步骤(Step) → 产物(Artifact)
这种层级关系体现了:
- 一个管道可以被多次执行,产生多个运行记录
- 每个运行包含多个步骤
- 每个步骤会产生一个或多个数据产物
环境准备
开始本教程前,请确保:
- 已安装并配置好ZenML环境
- 至少运行过一个完整的管道
- 了解ZenML基础概念(管道、步骤等)
详细操作指南
1. 查询管道列表
当需要查找特定管道时,可以通过以下方式:
Python方式:
from zenml.client import Client
# 获取所有管道列表
pipelines = Client().list_pipelines()
# 打印管道基本信息
for pipeline in pipelines:
print(f"管道名称: {pipeline.name}")
print(f"创建时间: {pipeline.created}")
print("-" * 40)
命令行方式:
zenml pipeline list
2. 获取特定管道的运行记录
获取到管道后,可以查询其历史运行记录:
# 获取特定管道
pipeline = Client().get_pipeline("iris_training")
# 获取该管道的所有运行记录(按时间倒序)
runs = pipeline.runs
# 获取最近一次运行
latest_run = pipeline.last_run
# 获取最近一次成功运行
last_successful_run = pipeline.last_successful_run
3. 分析运行详情
每个运行记录包含丰富的信息:
# 运行状态(初始化/运行中/完成/失败/缓存)
status = run.status
# 运行配置参数
config = run.config
# 组件特定元数据(如Orchestrator的UI地址)
metadata = run.run_metadata
if "orchestrator_url" in metadata:
print(f"编排器UI地址: {metadata['orchestrator_url'].value}")
4. 深入步骤分析
可以进一步查看运行中的各个步骤:
# 获取所有步骤
steps = run.steps
# 获取特定步骤
train_step = run.steps["trainer_step"]
# 查看步骤信息
print(f"步骤状态: {train_step.status}")
print(f"开始时间: {train_step.start_time}")
print(f"结束时间: {train_step.end_time}")
print(f"使用参数: {train_step.config.parameters}")
5. 访问数据产物
步骤产生的数据产物是最重要的资产:
# 获取步骤输出
output = train_step.outputs["model"]
# 加载产物到内存
model = output.load()
# 查看产物元数据
print(f"产物类型: {output.type}")
print(f"存储大小: {output.run_metadata['storage_size'].value}")
# 可视化产物(支持Jupyter环境)
output.visualize()
实用技巧
在运行中获取历史信息
可以在当前运行中获取之前运行的信息:
from zenml import get_step_context
@step
def compare_with_previous():
current_run = get_step_context().pipeline_run
previous_run = current_run.pipeline.runs[1] # 索引0是当前运行
# 比较指标
prev_metrics = previous_run.steps["evaluator"].output.load()
print(f"上次运行指标: {prev_metrics}")
直接获取产物
如果知道产物ID或名称,可以直接获取:
# 通过名称和版本获取
artifact = Client().get_artifact_version('iris_dataset', 'v1')
data = artifact.load()
# 通过UUID获取
artifact = Client().get_artifact_version('f429f94c-fb15-43b5-961d-dbea287507c5')
完整示例
以下是一个完整的训练管道及查询示例:
from zenml import pipeline, step
from zenml.client import Client
import pandas as pd
from sklearn.svm import SVC
@step
def data_loader() -> pd.DataFrame:
# 数据加载逻辑
return data
@step
def trainer(data: pd.DataFrame) -> SVC:
# 训练逻辑
return model
@pipeline
def training_pipeline():
data = data_loader()
trainer(data)
if __name__ == "__main__":
# 执行管道
training_pipeline()
# 查询运行记录
pipeline = Client().get_pipeline("training_pipeline")
last_run = pipeline.last_run
# 获取训练好的模型
model = last_run.steps["trainer"].output.load()
print(f"模型参数: {model.get_params()}")
常见问题解决
问题1:找不到运行记录
- 确认运行ID格式是否正确(通常是管道名-时间戳格式)
- 检查是否使用了正确的管道名称
问题2:产物加载失败
- 确认产物是否已成功保存
- 检查当前环境是否有产物所需的依赖库
问题3:可视化不显示
- 确保在Jupyter环境中执行visualize()
- 或通过ZenML仪表板查看可视化结果
总结
通过本教程,您应该已经掌握:
- ZenML中管道运行的层级关系
- 如何查询历史运行记录
- 如何深入分析步骤和产物
- 多种实用技巧和问题解决方法
这些技能将帮助您更好地管理和复用机器学习工作流中的各种资产。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考