使用 mlflow.autolog 进行自动指标、参数和 artifact 日志记录
想了解更多关于 MLflow 中包含的自动记录功能吗?不妨看看这篇关于使用这一强大且节省时间的功能的基础指南!
强大的记录实践是机器学习模型迭代开发和改进的核心。在处理复杂的机器学习库或尝试使用具有不同 API 和不同对象及值跟踪选择的多个不同框架时,仔细跟踪指标、参数和构件可能具有挑战性。
MLflow 的自动记录功能提供了一个简单的解决方案,该解决方案与许多广泛使用的机器学习库兼容,例如 PyTorch、Scikit-learn 和 XGBoost。使用 mlflow.autolog() 指示 MLflow 捕获基本数据,而无需用户手动指定捕获内容。它是 MLflow 记录功能的便捷且强大的入口点。
要启用自动记录,只需在机器学习脚本/笔记本中添加以下一行,然后在开始可能包含您想要记录的信息或构件的模型训练或评估等活动之前添加。
import mlflow
mlflow.autolog()
自动记录功能
当数据科学工作流包含 mlflow.autolog() 时,MLflow 将自动记录
- 指标:标准训练和评估度量,例如准确率和 F1 分数;
- 参数:超参数,例如学习率和估计器数量;以及
- 构件:重要文件,例如训练好的模型。
MLflow 的自动记录会捕获针对所用库特定活动的详细信息:不同的库将导致不同的记录对象和数据。此外,MLflow 会记录关键元数据,例如软件版本、git 提交哈希以及从中启动运行的文件名。通过记录模型训练期间系统的状态,MLflow 旨在促进环境的可重现性并提供审计链,从而最大程度地减少因新库版本中的包回归或弃用而可能出现的推理问题。
自动记录捕获内容的具体细节取决于所使用的库。此外,MLflow 还会捕获上下文元数据,例如软件版本、git 提交哈希以及启动运行的文件名。通过尽可能多地记录训练模型的系统状态的详细信息,MLflow 可以提供环境的可重现性和审计链,从而最大程度地减少因包回归或弃用等原因导致的推理问题。
mlflow.autolog 的基本用法
您可以通过两种不同的方式访问自动记录功能
- 通过
mlflow.autolog()函数,该函数启用并配置对所有支持的库的自动记录。在处理多个库时,这提供了一种通用的方法,非常适合原型设计和机器学习管道的探索性分析。 - 通过特定于库的自动记录函数,例如
mlflow.sklearn.autolog(),该函数允许对单个库进行更细粒度的记录配置。例如,mlflow.pytorch.autolog()包含log_every_n_epoch和log_every_n_step参数,用于指定记录指标的频率。
无论您使用这两种方法中的哪一种,您都无需手动使用 start_run() 来初始化 MLflow 运行,即可创建运行并捕获模型、参数和指标到 MLflow 中。
示例
import mlflow
from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
# Generate a 3-class classification problem
X, y = datasets.make_classification(
n_samples=1000,
class_sep=0.5,
random_state=42,
n_classes=3,
n_informative=3,
)
# Split the data into training and validation sets
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)
# Enable autolog
mlflow.autolog() # or mlflow.sklearn.autolog()
# Initialize the classifier with n_estimators=200 and max_depth=10
clf = RandomForestClassifier(n_estimators=200, max_depth=10)
# Fit the classifier to the data.
# The `fit` method is patched to perform autologging. When engaged in training, a
# run is created and the parameters are logged.
# After the fit is complete, the model artifact is logged to the run.
clf.fit(X_train, y_train)
# Score the model on the data
# The current active run is retrieved during calling `score` and the loss metrics are logged
# to the active MLflow run.
clf.score(X_val, y_val)
# Visualize the automatically logged run results to validate what we recorded
mlflow.last_active_run()
上述代码会将模型参数、指标和模型记录到 MLflow 运行中。上面示例中最后一个语句 (mlflow.last_active_run()) 的输出结果(该语句将返回有关模型指标、参数和记录的构件的运行数据(结果已截断))如下所示:
<Run: data=<RunData:
metrics={'RandomForestClassifier_score_X_val': 0.72,
'training_accuracy_score': 0.99625,
'training_f1_score': 0.9962547564333545,
'training_log_loss': 0.3354604497935824,
'training_precision_score': 0.9962921348314606,
'training_recall_score': 0.99625,
'training_roc_auc': 0.9998943433719795,
'training_score': 0.99625
},
params={'bootstrap': 'True',
'ccp_alpha': '0.0',
'class_weight': 'None',
'criterion': 'gini',
'max_depth': '10',
'max_features': 'sqrt',
'max_leaf_nodes': 'None',
[...],
},
tags={'estimator_class': 'sklearn.ensemble._forest.RandomForestClassifier',
'estimator_name': 'RandomForestClassifier',
'mlflow.autologging': 'sklearn',
[...]
}, [...]>>
您还可以通过在命令行终端执行 mlflow ui 来在 mlflow ui 中访问这些内容。

MLflow UI 还允许您以图形方式比较多个运行(包括通过 mlflow.autolog 生成的运行)之间的不同指标和参数。

配置和自定义
自动记录函数接受许多参数,这些参数使您可以更灵活地控制记录行为。例如,mlflow.autolog() 包含 log_models 和 log_datasets 参数(两者默认都为 True),用于指定是否将模型和数据集信息保存到 MLflow 运行中,从而允许您指定实际记录的内容。要禁用数据集的自动记录,同时继续记录所有常规元素,只需在拟合模型之前通过将 mlflow.autolog(log_datasets=False) 设置为 False 来禁用数据集的自动记录功能。您还可以调整特定于库的自动记录函数的行为:例如,mlflow.sklearn.autolog() 函数包含一个 max_tuning_runs 参数,用于指定在执行超参数搜索时要捕获的嵌套运行数量。
mlflow.autolog() 可以与特定于库的自动记录函数结合使用,以控制特定库的记录行为。无论调用顺序如何,特定于库的自动记录调用将始终覆盖 mlflow.autolog()。例如,将 mlflow.autolog() 与 mlflow.sklearn.autolog(disable=True) 结合使用将导致除 scikit-learn 之外的所有支持的库的自动记录。
重要的是要查阅您使用的特定框架的文档,以了解自动记录的内容以及可用的配置选项。有关链接,请参阅下面的 进一步阅读部分。
结论和后续步骤
MLflow 的自动记录功能和特定于库的自动记录函数提供了一个简单的 MLflow 跟踪起点,几乎不需要或不需要配置。它们记录了许多流行机器学习库的关键指标、参数和构件,使用户无需编写自定义跟踪代码即可跟踪其机器学习工作流。
然而,它们并非适用于所有用例。如果您只需要跟踪少量特定指标,启用自动记录可能会效率低下,生成比所需数据和存储构件更多的数据。此外,自动记录并非适用于所有可能的框架以及您可能想要跟踪的自定义值。在这种情况下,可能需要 手动指定要跟踪的内容。
进一步阅读
- MLflow 关于自动记录的文档
- mlflow.autolog 的 Python API 参考
- 特定于库的自动记录函数的 Python API 参考
