MLflow Tracking
MLflow Tracking 是一个 API 和用户界面,用于在运行机器学习代码时记录参数、代码版本、指标和输出文件,并用于后续可视化结果。MLflow Tracking 提供了 Python 、 REST 、 R 和 Java API。
快速入门
如果您之前未使用过 MLflow Tracking,我们强烈建议您阅读以下快速入门教程。
概念
运行
MLflow Tracking 围绕运行 (runs) 的概念组织,运行是指执行某段数据科学代码的过程,例如,单个 python train.py
执行。每次运行都记录元数据(有关您运行的各种信息,例如指标、参数、开始和结束时间)和工件(运行的输出文件,例如模型权重、图像等)。
实验
实验将特定任务的运行分组在一起。您可以使用 CLI、API 或 UI 创建实验。MLflow API 和 UI 也允许您创建和搜索实验。有关如何将运行组织到实验中的更多详细信息,请参阅将运行组织到实验中。
跟踪
MLflow Tracing 是 MLflow Tracking API 的集成部分,允许您检测您的生成式 AI 应用。无论您是使用 LangChain
集成 MLflow Tracing,还是使用 Fluent API 进行跟踪,或是使用更底层的客户端 API,MLflow tracking 都会记录您的跟踪数据,以便将来审查、调试或分析。有关更多详细信息,请参阅MLflow Tracing 指南。
Tracking Runs
MLflow Tracking API 提供了一组函数来跟踪您的运行。例如,您可以调用 mlflow.start_run()
来开始一个新的运行,然后调用日志记录函数(例如 mlflow.log_param()
和 mlflow.log_metric()
)分别记录参数和指标。请访问 Tracking API 文档了解有关使用这些 API 的更多详细信息。
import mlflow
with mlflow.start_run():
mlflow.log_param("lr", 0.001)
# Your ml code
...
mlflow.log_metric("val_loss", val_loss)
或者,自动日志记录提供了超快速的设置来启动 MLflow tracking。这个强大的功能让您无需显式日志语句即可记录指标、参数和模型——您所要做的就是在训练代码之前调用 mlflow.autolog()
。自动日志记录支持流行的库,例如 Scikit-learn、XGBoost、PyTorch、Keras、Spark 等。有关支持的库以及如何将自动日志记录 API 与每个库一起使用的信息,请参阅自动日志记录文档。
import mlflow
mlflow.autolog()
# Your training code...
默认情况下,在没有任何特定服务器/数据库配置的情况下,MLflow Tracking 将数据记录到本地 mlruns
目录。如果您想将运行记录到其他位置,例如远程数据库和云存储,以便与您的团队共享结果,请遵循设置 MLflow Tracking 环境部分中的说明。
Tracking Datasets
MLflow 提供了跟踪与模型训练事件关联的数据集的功能。与数据集相关的这些元数据可以通过使用 mlflow.log_input()
API 进行存储。要了解更多信息,请访问 MLflow 数据文档查看此 API 中可用的功能。
探索运行和结果
Tracking UI
Tracking UI 允许您以可视化方式探索您的实验和运行,如本页顶部所示。
- 基于实验的运行列表和比较(包括跨多个实验的运行比较)
- 按参数或指标值搜索运行
- 可视化运行指标
- 下载运行结果(工件和元数据)
如果您将运行记录到本地 mlruns
目录,请在其上级目录中运行以下命令,然后在浏览器中访问 http://127.0.0.1:5000。
mlflow ui --port 5000
或者,MLflow Tracking Server 提供相同的 UI 并支持运行工件的远程存储。在这种情况下,您可以从任何可以连接到您的 tracking server 的机器上,在 http://<MLflow tracking server 的 IP 地址>:5000
查看 UI。
通过编程方式查询运行
您还可以使用 MlflowClient
通过编程方式访问 Tracking UI 中的所有功能。
例如,以下代码片段搜索实验中所有运行中验证损失最佳的运行。
client = mlflow.tracking.MlflowClient()
experiment_id = "0"
best_run = client.search_runs(
experiment_id, order_by=["metrics.val_loss ASC"], max_results=1
)[0]
print(best_run.info)
# {'run_id': '...', 'metrics': {'val_loss': 0.123}, ...}
设置 MLflow Tracking 环境
如果您只想将实验数据和模型记录到本地文件,可以跳过本节。
MLflow Tracking 支持您的开发工作流程中的许多不同场景。本节将指导您如何为您的特定用例设置 MLflow Tracking 环境。从宏观角度看,MLflow Tracking 环境由以下组件组成。
组件
MLflow Tracking API
您可以在机器学习代码中调用 MLflow Tracking API 来记录运行,并在需要时与 MLflow Tracking Server 进行通信。
后端存储
后端存储持久化每个运行的各种元数据,例如运行 ID、开始和结束时间、参数、指标等。MLflow 支持两种后端存储类型:基于文件系统(如本地文件)和基于数据库(如 PostgreSQL)。
工件存储
工件存储持久化每个运行的(通常较大的)工件,例如模型权重(例如 pickled 的 scikit-learn 模型)、图像(例如 PNG 文件)、模型和数据文件(例如 Parquet 文件)。MLflow 默认将工件存储在本地文件(mlruns
)中,但也支持不同的存储选项,例如 Amazon S3 和 Azure Blob Storage。
MLflow Tracking Server(可选)
MLflow Tracking Server 是一个独立的 HTTP 服务器,提供用于访问后端和/或工件存储的 REST API。Tracking server 还提供了配置要服务的数据、管理访问控制、版本控制等的灵活性。请阅读 MLflow Tracking Server 文档了解更多详细信息。
常见设置
通过正确配置这些组件,您可以创建一个适合团队开发工作流程的 MLflow Tracking 环境。以下图表和表格展示了几种常见的 MLflow Tracking 环境设置。
1. 本地主机(默认) | 2. 使用本地数据库进行本地跟踪 | 3. 使用 MLflow Tracking Server 进行远程跟踪 | |
---|---|---|---|
场景 | 个人开发 | 个人开发 | 团队开发 |
用例 | 默认情况下,MLflow 将每个运行的元数据和工件记录到本地目录 mlruns 中。这是开始使用 MLflow Tracking 的最简单方法,无需设置任何外部服务器、数据库和存储。 | MLflow 客户端可以与 SQLAlchemy 兼容的数据库(例如 SQLite、PostgreSQL、MySQL)对接作为后端。将元数据保存到数据库可以更清晰地管理您的实验数据,同时省去设置服务器的精力。 | MLflow Tracking Server 可以配置工件 HTTP 代理,将工件请求通过 tracking server 传递以存储和检索工件,而无需与底层对象存储服务交互。这对于希望将工件和实验元数据存储在具有适当访问控制的共享位置的团队开发场景特别有用。 |
教程 | 快速入门 | 使用本地数据库跟踪实验 | 使用 MLflow Tracking Server 进行远程实验跟踪 |
MLflow Tracking Server 的其他配置
MLflow Tracking Server 为其他特殊用例提供了可定制性。请按照使用 MLflow Tracking Server 进行远程实验跟踪学习基本设置,并继续学习以下材料以获取满足您需求的高级配置。
- 本地 Tracking Server
- 仅工件模式
- 直接访问工件
在本地使用 MLflow Tracking Server
您当然可以在本地运行 MLflow Tracking Server。虽然这相对于直接使用本地文件或数据库没有太多额外的好处,但对于在本地测试您的团队开发工作流程或在容器环境中运行您的机器学习代码可能很有用。
在仅工件模式下运行 MLflow Tracking Server
MLflow Tracking Server 具有 --artifacts-only
选项,该选项让服务器只服务(代理)工件而不服务元数据。当您在大型组织中或训练大型模型时,工件传输量可能很高,并且您希望将用于服务工件的流量分开,以免影响跟踪功能,这时这个选项就特别有用。请阅读可选地专门使用 Tracking Server 实例处理工件以了解有关如何使用此模式的更多详细信息。
禁用工件代理以允许直接访问工件
MLflow Tracking Server 默认同时服务工件和元数据。然而,在某些情况下,您可能希望允许直接访问远程工件存储,以避免代理的开销,同时保留元数据跟踪的功能。这可以通过使用 --no-serve-artifacts
选项启动服务器来禁用工件代理来实现。请参阅不使用代理访问工件的方式使用 Tracking Server,了解如何进行设置。
常见问题
我可以并行启动多个运行吗?
是的,MLflow 支持并行启动多个运行,例如多进程/多线程。有关更多详细信息,请参阅在一个程序中启动多个运行。
如何整齐地组织大量的 MLflow 运行?
MLflow 提供了几种组织运行的方式
- 将运行组织到实验中 - 实验是运行的逻辑容器。您可以使用 CLI、API 或 UI 创建实验。
- 创建子运行 - 您可以在单个父运行下创建子运行,以便将它们分组。例如,您可以为交叉验证实验中的每个折叠创建一个子运行。
- 为运行添加标签 - 您可以为每个运行关联任意标签,从而允许您根据标签筛选和搜索运行。
不运行 Tracking Server 可以直接访问远程存储吗?
是的,虽然在团队开发工作流程中,将 MLflow Tracking Server 作为工件访问的代理是最佳实践,但如果您用于个人项目或测试,则可能不需要这样做。您可以通过遵循以下变通方法来实现这一点
- 设置工件配置,例如凭据和端点,就像您为 MLflow Tracking Server 所做的那样。有关更多详细信息,请参阅配置工件存储。
- 创建一个具有显式工件位置的实验,
experiment_name = "your_experiment_name"
mlflow.create_experiment(experiment_name, artifact_location="s3://your-bucket")
mlflow.set_experiment(experiment_name)
此实验下的运行将直接将工件记录到远程存储。
如何将 MLflow Tracking 与模型注册表集成?
要将模型注册表功能与 MLflow tracking 一起使用,您必须使用数据库支持的存储(例如 PostgresQL),并使用相应的模型风格的 log_model
方法记录模型。记录模型后,您可以通过 UI 或 API 在模型注册表中添加、修改、更新或删除模型。有关如何为您的工作流程正确配置后端存储,请参阅后端存储和常见设置。
如何为运行添加额外的描述文本?
系统标签 mlflow.note.content
可用于添加有关此运行的描述性说明。虽然其他系统标签是自动设置的,但此标签默认不设置,用户可以覆盖它以包含有关运行的额外信息。内容将显示在运行页面上的“备注”部分。