MLflow 跟踪
MLflow Tracking 是一个用于记录参数、代码版本、指标和输出文件的API和UI,当运行你的机器学习代码时,以及用于后续可视化结果。MLflow Tracking 提供了 Python、REST、R 和 Java API。
快速入门
如果你之前没有使用过 MLflow Tracking,我们强烈建议你完成以下快速入门教程。
概念
运行
MLflow Tracking 围绕 运行 的概念组织,这些运行是某些数据科学代码的执行,例如,单个 python train.py
执行。每次运行都会记录元数据(关于您的运行的各种信息,例如指标、参数、开始和结束时间)和工件(来自运行的输出文件,例如模型权重、图像等)。
实验
一个实验将特定任务的运行组合在一起。你可以使用CLI、API或UI创建实验。MLflow API和UI还允许你创建和搜索实验。有关如何将运行组织到实验中的更多详细信息,请参阅 将运行组织到实验中。
跟踪
MLflow Tracing 是 MLflow Tracking API 的一个集成部分,允许您为您的 GenAI 应用程序进行仪器化。无论您是使用 LangChain
与 MLflow Tracing 的集成,还是使用 Fluent API 进行追踪,或是使用较低级别的 Client API,MLflow 追踪都会记录您的追踪数据以供未来审查、调试或分析。更多详情请参阅 MLflow Tracing 指南。
跟踪运行
MLflow Tracking APIs 提供了一组用于跟踪运行的函数。例如,您可以调用 mlflow.start_run()
来启动一个新的运行,然后调用 Logging Functions 如 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 跟踪的超快速设置。这个强大的功能允许你在不需要显式日志语句的情况下记录指标、参数和模型——你只需要在训练代码之前调用 mlflow.autolog()
。自动记录支持流行的库,如 Scikit-learn、XGBoost、PyTorch、Keras、Spark 等。请参阅 自动记录文档 以了解支持的库以及如何使用每个库的自动记录 API。
import mlflow
mlflow.autolog()
# Your training code...
备注
默认情况下,如果没有特定的服务器/数据库配置,MLflow Tracking 会将数据记录到本地的 mlruns 目录中。如果你想将运行记录到不同的位置,例如远程数据库和云存储,以便与团队共享你的结果,请按照 设置 MLflow Tracking 环境 部分的说明进行操作。
跟踪数据集
MLflow 提供了跟踪与模型训练事件相关联的数据集的能力。与数据集相关的这些元数据可以通过使用 mlflow.log_input()
API 进行存储。要了解更多信息,请访问 MLflow 数据文档 以查看此 API 中可用的功能。
探索运行和结果
跟踪用户界面
跟踪用户界面允许您直观地探索您的实验和运行,如本页顶部所示。
基于实验的运行列表和比较(包括跨多个实验的运行比较)
按参数或指标值搜索运行
可视化运行指标
下载运行结果(工件和元数据)
如果你将运行日志记录到本地的 mlruns
目录,请在上级目录中运行以下命令,然后在浏览器中访问 http://127.0.0.1:5000。
mlflow ui --port 5000
或者,MLflow 跟踪服务器 提供相同的用户界面,并支持远程存储运行工件。在这种情况下,您可以从任何能够连接到跟踪服务器的机器上通过 http://<您的 MLflow 跟踪服务器的 IP 地址>:5000
查看用户界面。
以编程方式查询运行
你也可以通过 MlflowClient
以编程方式访问跟踪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 跟踪环境
备注
如果你只想将实验数据和模型记录到本地文件,可以跳过本节。
MLflow Tracking 支持许多不同的开发工作流程场景。本节将指导您如何为您的特定用例设置 MLflow Tracking 环境。从鸟瞰的角度来看,MLflow Tracking 环境由以下组件组成。
组件
MLflow 追踪 API
你可以在你的机器学习代码中调用 MLflow Tracking API 来记录运行,并在必要时与 MLflow Tracking 服务器通信。
后端存储
后端存储为每个 运行 持久化各种元数据,例如运行ID、开始和结束时间、参数、指标等。MLflow支持两种类型的后端存储:基于文件系统 如本地文件和 基于数据库 如PostgreSQL。
Artifact Store 是一个用于跟踪和管理项目中产生的各种工件(如模型、数据集等)的存储系统。
工件存储为每次运行持久化(通常是大型)工件,例如模型权重(例如,一个pickled的scikit-learn模型)、图像(例如,PNG文件)、模型和数据文件(例如,Parquet 文件)。MLflow默认将工件存储在本地文件(mlruns)中,但也支持不同的存储选项,如Amazon S3和Azure Blob存储。
MLflow 跟踪服务器 (可选)
MLflow Tracking Server 是一个独立的HTTP服务器,提供用于访问后端和/或工件存储的REST API。Tracking Server 还提供了灵活性,以配置要提供的数据、管理访问控制、版本控制等。更多详情请阅读 MLflow Tracking Server 文档。
常见设置
通过正确配置这些组件,您可以创建一个适合团队开发工作流程的 MLflow Tracking 环境。下图和下表展示了几种常见的 MLflow Tracking 环境设置。
1. 本地主机 (默认) |
2. 使用本地数据库进行本地跟踪 |
3. 使用 MLflow 跟踪服务器 进行远程跟踪 |
|
---|---|---|---|
场景 |
独立开发 |
独立开发 |
团队开发 |
用例 |
默认情况下,MLflow 会将每次运行的元数据和工件记录到本地目录 |
MLflow 客户端可以与兼容 SQLAlchemy 的数据库(例如 SQLite、PostgreSQL、MySQL)进行接口,用于 后端。将元数据保存到数据库中,可以让你更干净地管理实验数据,同时省去了设置服务器的努力。 |
MLflow 跟踪服务器可以通过配置一个工件 HTTP 代理来实现,通过跟踪服务器传递工件请求,以便在不与底层对象存储服务交互的情况下存储和检索工件。这对于团队开发场景特别有用,您希望在具有适当访问控制的共享位置存储工件和实验元数据。 |
教程 |
其他配置与 MLflow 跟踪服务器
MLflow Tracking Server 为其他特殊用例提供了可定制性。请按照 使用 MLflow Tracking Server 进行远程实验跟踪 学习基本设置,并继续阅读以下材料以进行高级配置以满足您的需求。
Running MLflow Tracking Server in Artifacts-only Mode
MLflow Tracking Server has --artifacts-only
option, which lets the server to serve (proxy) only artifacts
and not metadata. This is particularly useful when you are in a large organization or training huge models, you might have high artifact
transfer volumes and want to split out the traffic for serving artifacts to not impact tracking functionality. Please read
Optionally using a Tracking Server instance exclusively for artifact handling for more details on how to use this mode.
Disable Artifact Proxying to Allow Direct Access to Artifacts
MLflow Tracking Server, by default, serves both artifacts and only metadata. However, in some cases, you may want
to allow direct access to the remote artifacts storage to avoid the overhead of a proxy while preserving the functionality
of metadata tracking. This can be done by disabling artifact proxying by starting server with --no-serve-artifacts
option.
Refer to Use Tracking Server without Proxying Artifacts Access for how to set this up.
常见问题解答
我可以并行启动多个运行吗?
是的,MLflow 支持并行启动多个运行,例如多进程/线程。更多详情请参见 在一个程序中启动多个运行。
如何整齐地组织许多 MLflow 运行?
MLflow 提供了几种组织运行的方式:
我可以直接访问远程存储而不运行跟踪服务器吗?
是的,虽然最佳实践是将 MLflow 跟踪服务器作为团队开发工作流程中访问工件的代理,但如果您将其用于个人项目或测试,则可能不需要这样做。您可以通过以下解决方法实现这一点:
设置工件配置,如凭据和端点,就像为 MLflow 跟踪服务器所做的那样。有关更多详细信息,请参阅 配置工件存储。
创建一个具有显式工件位置的实验,
experiment_name = "your_experiment_name"
mlflow.create_experiment(experiment_name, artifact_location="s3://your-bucket")
mlflow.set_experiment(experiment_name)
在此实验下运行的任务将直接将工件记录到远程存储中。
如何将 MLflow Tracking 与 模型注册表 集成?
要使用 MLflow 跟踪的模型注册功能,您 必须使用数据库支持的存储 ,例如 PostgresQL,并使用相应模型风格的 log_model
方法记录模型。一旦模型被记录,您可以通过 UI 或 API 在模型注册表中添加、修改、更新或删除模型。有关如何为您的流程正确配置后端存储,请参见 后端存储 和 常见设置。
如何包含关于运行的额外描述文本?
系统标签 mlflow.note.content
可以用来添加关于此次运行的描述性注释。虽然其他 系统标签 是自动设置的,但此标签**默认不设置**,用户可以覆盖它以包含有关运行的附加信息。内容将在运行页面的“注释”部分显示。