在 DataBuddy 数据科学模块中,训练指标的记录基于 MLflow 协议。您在 Notebook 中调用 MLflow API 记录的参数、指标、工件,会自动汇聚到对应实验的运行中,供后续查看与对比。
本文介绍如何在 Notebook 中通过 MLflow API 记录这三类信息,并在实验详情页查看记录结果。
前提条件
在开始记录前,请确保:
已创建目标实验(参见 创建实验),并获取实验 ID 或实验名称。
当前账号在该实验上拥有编辑或管理权限。
已在 Notebook 中安装 MLflow 客户端(DataBuddy 默认环境已预置 MLflow,无需额外安装)。
记录方式选择
DataBuddy 支持两种记录方式,可按场景灵活选择:
方式 | 适用场景 |
自动记录 | 使用 sklearn / xgboost / lightgbm / pytorch / tensorflow 等主流框架,无需手写 log_*,框架训练时自动捕获参数、指标与模型 |
手动记录 | 自定义训练流程;需要记录非框架默认捕获的指标,完全控制记录时机与内容 |
自动记录
在
mlflow.start_run() 之前调用 mlflow.autolog(),框架训练时会自动捕获参数、指标、模型与训练数据集:import mlflowfrom sklearn.datasets import load_diabetesfrom sklearn.ensemble import RandomForestRegressorfrom sklearn.model_selection import train_test_splitmlflow.set_experiment(experiment_id="3")mlflow.autolog() # 自动记录with mlflow.start_run():db = load_diabetes()X_train, X_test, y_train, y_test = train_test_split(db.data, db.target)rf = RandomForestRegressor(n_estimators=100, max_depth=6)rf.fit(X_train, y_train)# 参数(n_estimators、max_depth)、训练指标、模型工件均自动记录
提示
Autologging 是注册模型的推荐方式之一:自动记录的模型默认携带签名(Signature),可直接用于 Catalog 注册。模型签名是注册模型的强制前置条件。
手动记录
1.手动记录参数
在
with mlflow.start_run() 上下文中调用 mlflow.log_param:import mlflowwith mlflow.start_run(run_name="manual_run"):# 单个参数mlflow.log_param("learning_rate", 0.01)mlflow.log_param("batch_size", 64)mlflow.log_param("optimizer", "Adam")# 批量记录mlflow.log_params({"n_estimators": 100,"max_depth": 6,"max_features": 3,})
取值约束 :
key 为字符串,最大长度由 MLflow 协议规定。value 类型可以是字符串、整数或浮点数。同一 Run 内同名参数 只能记录一次 ,重复记录会报错。
2.手动记录指标
在
with mlflow.start_run() 上下文中调用 mlflow.log_metric,可指定 step 用于绘制曲线:import mlflowwith mlflow.start_run(run_name="manual_run"):# 单个指标mlflow.log_metric("accuracy", 0.92)mlflow.log_metric("auc", 0.88)# 训练过程中按 epoch 记录损失for epoch in range(100):loss = train_one_epoch(...)mlflow.log_metric("loss", loss, step=epoch)# 批量记录mlflow.log_metrics({"precision": 0.91,"recall": 0.89,"f1": 0.90,})
提示
指标值类型必须是数字(整数或浮点数)。
同一
key 可多次记录,按 step 串成时间序列,在实验详情图表视图中展示为折线图。系统指标如 CPU 使用率、内存占用、网络流量、磁盘 IO 等由 DataBuddy 自动采集,无需手工记录。
3.手动记录工件(Artifact)
工件包括序列化的模型、日志、配置、图片等任意文件。记录方式分为两类:
1. 记录通用工件文件
import mlflowwith mlflow.start_run():# 记录单个文件mlflow.log_artifact("output/eval_report.html")# 记录到子目录mlflow.log_artifact("config/params.yaml", artifact_path="configs")# 记录整个目录mlflow.log_artifacts("output/figures", artifact_path="figures")
1. 记录模型工件
不同 ML 框架使用对应的
log_model 方法。常用示例:# scikit-learnmlflow.sklearn.log_model(sk_model=model,name="sklearn-model",input_example=X_train, # 提供输入样例,自动生成签名)# PyTorchmlflow.pytorch.log_model(model, "model")# 自定义 Python 模型mlflow.pyfunc.log_model(artifact_path="model", python_model=my_model)
注意
注册到 Catalog 的模型必须携带签名(Signature)。建议在
log_model 时传入 input_example= 让 MLflow 自动推断签名;或在调用前显式构造 mlflow.models.signature.ModelSignature。无签名的模型在后续注册时将被拒绝。1. 在记录时直接注册模型
通过
registered_model_name= 参数可在 log_model 时同步注册到 Catalog(同一模型名首次注册为 V1,再次注册版本号自动 +1):mlflow.sklearn.log_model(sk_model=model,name="sklearn-model",input_example=X_train,registered_model_name="my_catalog.my_schema.churn_model",)
完整示例
下面是一个端到端的示例,演示在一次训练中同时记录参数、指标、模型并完成注册:
import mlflowimport mlflow.sklearnfrom sklearn.datasets import make_regressionfrom sklearn.ensemble import RandomForestRegressorfrom sklearn.metrics import mean_squared_errorfrom sklearn.model_selection import train_test_splitmlflow.set_experiment("regression_demo")with mlflow.start_run() as run:X, y = make_regression(n_features=4, n_informative=2, random_state=0, shuffle=False)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)params = {"max_depth": 2, "random_state": 42}model = RandomForestRegressor(**params)model.fit(X_train, y_train)# 记录参数mlflow.log_params(params)# 记录指标y_pred = model.predict(X_test)mlflow.log_metrics({"mse": mean_squared_error(y_test, y_pred)})# 记录并注册模型(同步注册到 Catalog)mlflow.sklearn.log_model(sk_model=model,name="sklearn-model",input_example=X_train,registered_model_name="catalog_name.schema_name.model_name",)
父子 Run 与超参搜索
在父 Run 上下文中嵌套子 Run,常用于超参数搜索场景:
import mlflowwith mlflow.start_run(run_name="Parent Run") as parent:mlflow.log_param("model_type", "RandomForest")for n in [50, 100, 200]:with mlflow.start_run(run_name=f"n_estimators={n}", nested=True):mlflow.log_param("n_estimators", n)# ... 训练并记录 metric ...
实验详情中的运行任务列表会以嵌套方式展示父 Run 与其下的子 Run,便于分层查看。
实验详情
1. 如何查看实验详情
记录完成后,进入实验详情查看:
1.1 进入数据科学 > 模型实验 ,点击目标实验名称进入详情。
1.2 默认在 运行任务 中以列表展示所有 Run。
1.3 点击运行任务名称进入 Run 详情,包含 4 个 Tab 如下:
Tab | 内容 |
概览信息 | 关于此运行任务的基本信息。支持点击跳转数据集、模型、代码文件界面。支持编辑标签,搜索参数配置、指标 |
模型指标 | 展示通过 log_metric 记录的指标的可视化图表(柱状图、折线图等) |
系统指标 | CPU 使用率、内存、网络、磁盘等系统级监控图表 |
模型文件 | 当前 Run 的所有工件文件,支持浏览、复制、下载 |
2. 添加自定义标签
在 概览信息 页面,您可以为该运行任务添加自定义键值对标签,用于分类与检索。
操作方式:在添加标签 区域输入键值对,每输入一组后点击保存按钮,系统会自动新增一行;点击行末删除按钮可移除该行。
3. 验证结果
记录完成后,您可以通过以下方式确认记录结果:
概览信息 中可看到所有记录的参数、指标、自定义标签。
模型指标 与 系统指标 中可看到对应的图表。
模型文件 中可看到记录的工件文件树状结构。
如果同步注册了模型,可在 模型管理 列表中找到对应的注册模型。
常见问题
调用 mlflow.log_param 时报错 Parameter already logged 怎么办?
同一 Run 内同名参数只能记录一次。请检查代码是否在循环中重复记录同一参数;如果确实需要按时间步记录变化的值,请改用
mlflow.log_metric(key, value, step=...)。指标曲线为什么只显示一个点?
mlflow.log_metric(key, value) 不传 step 时默认按记录顺序累加。如果只调用了一次,曲线只有一个点。在训练循环中按 epoch 调用 log_metric(key, value, step=epoch) 即可绘制完整曲线。模型注册时提示模型没有签名怎么办?
注册模型要求模型必须携带签名。请:
1. 在
log_model 调用时传入 input_example= 让 MLflow 自动推断签名;或2. 显式构造
mlflow.models.signature.ModelSignature 并通过 signature= 参数传入;或3. 启用
mlflow.autolog() 由框架自动记录带签名的模型。若模型没有签名,则模型不会被记录,模型文件 区不会显示已记录的模型文件。
手动启动的 Run 一直停留在运行中状态怎么办?
如果代码异常退出且未正确关闭 Run,可能导致 Run 状态滞留。建议始终使用
with mlflow.start_run() as run: 上下文管理器,异常退出时也会自动调用 mlflow.end_run() 关闭 Run。