想要深入了解 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.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 参考