跳至主要内容

系统指标

MLflow 允许用户在 MLflow 运行执行期间记录系统指标,包括 CPU 状态、GPU 状态、内存使用量、网络流量和磁盘使用量。在本指南中,我们将详细介绍如何使用 MLflow 管理系统指标日志记录。

额外依赖项

要在 MLflow 中记录系统指标,请安装 psutil。我们特意未将 psutil 包含在 MLflow 的依赖项中,因为 psutil 的 wheel 文件在 linux aarch64 上不可用,并且从源构建时会间歇性失败。要安装 psutil,请运行以下命令

pip install psutil

如果您想捕获 Nvidia GPU 指标,还需要安装 pynvml

pip install pynvml

如果您正在使用 AMD/HIP GPU,请安装 pyrsmi 而不是 pynvml

pip install pyrsmi

开启/关闭系统指标日志记录

有三种方法可以启用或禁用系统指标日志记录

  • 将环境变量 MLFLOW_ENABLE_SYSTEM_METRICS_LOGGING 设置为 false 以关闭系统指标日志记录,或设置为 true 以对所有 MLflow 运行启用日志记录。
  • 使用 mlflow.enable_system_metrics_logging() 启用系统指标日志记录,使用 mlflow.disable_system_metrics_logging() 禁用所有 MLflow 运行的系统指标日志记录。
  • mlflow.start_run() 中使用 log_system_metrics 参数控制当前 MLflow 运行的系统指标日志记录,例如,mlflow.start_run(log_system_metrics=True) 将启用系统指标日志记录。

使用环境变量控制系统指标日志记录

您可以将环境变量 MLFLOW_ENABLE_SYSTEM_METRICS_LOGGING 设置为 true 以全局开启系统指标日志记录,如下所示

export MLFLOW_ENABLE_SYSTEM_METRICS_LOGGING=true

然而,如果您是在 Ipython notebook(Jupyter、Databricks notebook、Google Colab)中执行上述命令,由于临时 shell 的状态隔离,export 命令将无法工作。您可以使用以下代码代替

import os

os.environ["MLFLOW_ENABLE_SYSTEM_METRICS_LOGGING"] = "true"

设置环境变量后,您将看到启动 MLflow 运行会自动收集并记录默认的系统指标。尝试在您喜欢的环境中运行以下代码,您应该会在记录的运行数据中看到系统指标。请注意,您不一定需要启动 MLflow 服务器,因为指标是本地记录的。

import mlflow
import time

with mlflow.start_run() as run:
time.sleep(15)

print(mlflow.MlflowClient().get_run(run.info.run_id).data)

您的输出应该如下所示

<RunData: metrics={'system/cpu_utilization_percentage': 12.4,
'system/disk_available_megabytes': 213744.0,
'system/disk_usage_megabytes': 28725.3,
'system/disk_usage_percentage': 11.8,
'system/network_receive_megabytes': 0.0,
'system/network_transmit_megabytes': 0.0,
'system/system_memory_usage_megabytes': 771.1,
'system/system_memory_usage_percentage': 5.7}, params={}, tags={'mlflow.runName': 'nimble-auk-61',
'mlflow.source.name': '/usr/local/lib/python3.10/dist-packages/colab_kernel_launcher.py',
'mlflow.source.type': 'LOCAL',
'mlflow.user': 'root'}>

要禁用系统指标日志记录,您可以使用以下任一命令

export MLFLOW_ENABLE_SYSTEM_METRICS_LOGGING="false"
import os

del os.environ["MLFLOW_ENABLE_SYSTEM_METRICS_LOGGING"]

重新运行上面的 MLflow 代码将不会记录系统指标。

使用 mlflow.enable_system_metrics_logging()

我们还提供了一对 API mlflow.enable_system_metrics_logging()mlflow.disable_system_metrics_logging(),用于在全球范围内开启/关闭系统指标日志记录,适用于您没有适当访问权限来设置环境变量的环境。运行以下代码将产生与将 MLFLOW_ENABLE_SYSTEM_METRICS_LOGGING 环境变量设置为 true 相同的效果

import mlflow

mlflow.enable_system_metrics_logging()

with mlflow.start_run() as run:
time.sleep(15)

print(mlflow.MlflowClient().get_run(run.info.run_id).data)

为单个运行启用系统指标日志记录

除了全局控制系统指标日志记录外,您还可以控制单个运行的日志记录。为此,请在 mlflow.start_run() 中相应地将 log_system_metrics 设置为 TrueFalse

with mlflow.start_run(log_system_metrics=True) as run:
time.sleep(15)

print(mlflow.MlflowClient().get_run(run.info.run_id).data)

请注意,使用 log_system_metrics 将忽略系统指标日志记录的全局状态。换句话说,即使您通过将 MLFLOW_ENABLE_SYSTEM_METRICS_LOGGING 设置为 false 或调用 mlflow.disable_system_metrics_logging() 禁用了系统指标日志记录,上述代码仍将为特定运行记录系统指标。

系统指标类型

默认情况下,MLflow 记录以下系统指标

  • cpu_utilization_percentage (CPU 利用率百分比)
  • system_memory_usage_megabytes (系统内存使用量,以兆字节为单位)
  • system_memory_usage_percentage (系统内存使用率百分比)
  • gpu_utilization_percentage (GPU 利用率百分比)
  • gpu_memory_usage_megabytes (GPU 内存使用量,以兆字节为单位)
  • gpu_memory_usage_percentage (GPU 内存使用率百分比)
  • gpu_power_usage_watts (GPU 功耗,以瓦特为单位)
  • gpu_power_usage_percentage (GPU 功耗百分比)
  • network_receive_megabytes (网络接收量,以兆字节为单位)
  • network_transmit_megabytes (网络发送量,以兆字节为单位)
  • disk_usage_megabytes (磁盘使用量,以兆字节为单位)
  • disk_available_megabytes (磁盘可用量,以兆字节为单位)

仅当 GPU 可用且已安装 pynvml 时,才会记录 GPU 指标。

为了便于分组,每个系统指标在记录时都有一个前缀 system/。因此,实际记录的指标名称将带有 system/ 前缀,例如,system/cpu_utilization_percentage, system/system_memory_usage_megabytes 等。

在 MLflow UI 中查看系统指标

系统指标在 MLflow UI 的指标部分中可用。为了查看它们,让我们启动 MLflow UI 服务器,并向其记录一些系统指标

mlflow ui
import mlflow
import time

mlflow.set_tracking_uri("http://127.0.0.1:5000")
with mlflow.start_run() as run:
time.sleep(15)

在浏览器中导航至 http://127.0.0.1:5000 并打开您的运行。您应该会在指标部分下看到系统指标,类似于下面的截图所示

system metrics on MLflow UI

自定义系统指标日志记录

自定义日志记录频率

默认情况下,系统指标每 10 秒采样一次,并在采样后直接记录。您可以通过设置环境变量 MLFLOW_SYSTEM_METRICS_SAMPLING_INTERVAL 为一个表示日志记录频率(秒)的整数,或使用 mlflow.set_system_metrics_sampling_interval() 来设置采样间隔,如下所示。除了设置系统指标的日志记录频率外,您还可以自定义聚合样本的数量。您还可以通过设置环境变量 MLFLOW_SYSTEM_METRICS_SAMPLES_BEFORE_LOGGING 或使用 mlflow.set_system_metrics_samples_before_logging() 来自定义在日志记录前聚合的样本数量。实际的日志记录时间窗口是 MLFLOW_SYSTEM_METRICS_SAMPLING_INTERVALMLFLOW_SYSTEM_METRICS_SAMPLES_BEFORE_LOGGING 的乘积。例如,如果您将采样间隔设置为 2 秒,将日志记录前的样本数量设置为 3,则系统指标将每 2 秒收集一次,然后在收集 3 个样本(2 * 3 = 6 秒)后,我们将聚合指标并记录到 MLflow 服务器。聚合逻辑取决于不同的系统指标。例如,对于 cpu_utilization_percentage,它是样本的平均值。

import mlflow

mlflow.set_system_metrics_sampling_interval(1)
mlflow.set_system_metrics_samples_before_logging(3)

with mlflow.start_run(log_system_metrics=True) as run:
time.sleep(15)

metric_history = mlflow.MlflowClient().get_metric_history(
run.info.run_id,
"system/cpu_utilization_percentage",
)
print(metric_history)

您将看到 system/cpu_utilization_percentage 被记录几次。