帮你快速理解、总结文档立即下载

记录训练指标

最近更新时间:2026-09-11 20:42:31
我的收藏
在 DataBuddy 数据科学模块中,训练指标的记录基于 MLflow 协议。您在 Notebook 中调用 MLflow API 记录的参数、指标、工件,会自动汇聚到对应实验的运行中,供后续查看与对比。
本文介绍如何在 Notebook 中通过 MLflow API 记录这三类信息,并在实验详情页查看记录结果。

前提条件

在开始记录前,请确保:
已创建目标实验(参见 创建实验),并获取实验 ID 或实验名称。
当前账号在该实验上拥有编辑或管理权限。
已在 Notebook 中安装 MLflow 客户端(DataBuddy 默认环境已预置 MLflow,无需额外安装)。
MLflow 协议中可记录的三类信息为:参数(Parameter)、指标(Metric)、工件(Artifact)。各类型的含义与典型示例请参见 什么是模型实验 > 关键概念

记录方式选择

DataBuddy 支持两种记录方式,可按场景灵活选择:
方式
适用场景
自动记录
使用 sklearn / xgboost / lightgbm / pytorch / tensorflow 等主流框架,无需手写 log_*,框架训练时自动捕获参数、指标与模型
手动记录
自定义训练流程;需要记录非框架默认捕获的指标,完全控制记录时机与内容

自动记录

mlflow.start_run() 之前调用 mlflow.autolog(),框架训练时会自动捕获参数、指标、模型与训练数据集:
import mlflow
from sklearn.datasets import load_diabetes
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split

mlflow.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 mlflow

with 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 mlflow

with 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 mlflow

with 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-learn
mlflow.sklearn.log_model(
sk_model=model,
name="sklearn-model",
input_example=X_train, # 提供输入样例,自动生成签名
)

# PyTorch
mlflow.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 mlflow
import mlflow.sklearn
from sklearn.datasets import make_regression
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split

mlflow.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 mlflow

with 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。

相关文档