使用 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)
来禁用数据集自动日志记录功能。 您还可以调整特定于库的自动日志记录函数的行为:例如,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 参考