系统指标
MLflow 允许用户在 MLflow 运行过程中记录系统指标,包括 CPU 统计信息、GPU 统计信息、内存使用情况、网络流量和磁盘使用情况。在本指南中,我们将介绍如何使用 MLflow 管理系统指标记录。
额外依赖项
要在 MLflow 中记录系统指标,请安装 psutil。我们明确不将 psutil 包含在 MLflow 的依赖项中,因为 psutil wheel 在 linux aarch64 上不可用,并且从源构建会间歇性失败。要安装 psutil,请运行以下命令
pip install psutil
如果你想捕获 Nvidia GPU 指标,你还需要安装 nvidia-ml-py
pip install nvidia-ml-py
如果你使用的是 AMD/HIP GPU,请安装 pyrsmi,而不是 nvidia-ml-py
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 笔记本(Jupyter、Databricks 笔记本、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 设置为 True 或 False。
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
- system_memory_usage_megabytes
- system_memory_usage_percentage
- gpu_utilization_percentage
- gpu_memory_usage_megabytes
- gpu_memory_usage_percentage
- gpu_power_usage_watts
- gpu_power_usage_percentage
- network_receive_megabytes
- network_transmit_megabytes
- disk_usage_megabytes
- disk_available_megabytes
仅当存在可用 GPU 并且安装了 nvidia-ml-py 时,才会记录 GPU 指标。
每个系统指标在记录时都有一个 system/ 前缀,用于分组目的。因此,实际记录的指标名称前面会加上 system/,例如 system/cpu_utilization_percentage、system/system_memory_usage_megabytes 等。
在 MLflow UI 中查看系统指标
系统指标可在 MLflow UI 的指标部分下查看。为了查看它们,让我们启动 MLflow UI 服务器,并向其记录一些系统指标
mlflow server
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 并打开你的运行。你应该在指标部分下看到系统指标,如下面的截图所示

自定义系统指标记录
自定义记录频率
默认情况下,系统指标每 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_INTERVAL 和 MLFLOW_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 被记录了几次。