Experiment Tracking
实验跟踪会记录每次机器学习训练运行的参数、代码和数据版本、指标及制品,以便比较和复现各次运行。
实验跟踪是记录每次机器学习训练运行全部信息的实践,包括代码版本、数据版本、设置、环境、随时间变化的指标,以及权重和图表等输出文件,并将这些信息存储在一个可搜索的位置。项目尝试数十种学习率、数据增强设置和模型尺寸时,各次运行在磁盘上的文件看起来都很相似;实验跟踪会保存每项结果背后的配置,以便日后比较、复现最佳运行并追溯其来源。TensorBoard 随 TensorFlow 于 2015 年发布,让实时训练曲线成为标准;Databricks 于 2018 年将 MLflow 开源,并将实验跟踪列为其最初的三个组件之一。Weights & Biases、Comet、ClearML 和 DVC 也是广泛使用的跟踪工具。
跟踪工具会记录什么#
每次运行都会获得一个唯一 ID,并归属于某个实验,也就是一组具有相同名称的相关运行。一次运行记录通常包含:
- 超参数:学习率、批次大小、优化器、模型架构、随机种子,以及影响训练的其他所有设置。
- 指标:按步骤或轮次记录的训练和验证损失及得分,以及 GPU 内存和利用率等系统指标。
- 工件:检查点、混淆矩阵、样本预测和配置文件。
- 溯源信息:生成这次运行所用的 Git 提交、数据集版本、软件包版本、硬件和作者。
日志记录可以通过逐个值调用客户端来完成,也可以通过自动日志集成来完成;后者能自动捕获框架的参数和指标,无需编写额外代码。共享跟踪服务器会收集团队中所有笔记本电脑、云端机器和 CI 任务的运行记录;其仪表板可以叠加所选运行的损失曲线,并按任何参数或指标筛选运行,让过拟合等问题一目了然。
Ultralytics YOLO 训练会将每次运行的参数写入 args.yaml,并将每轮的损失和指标写入 results.csv;安装相应软件包后,内置集成会立即将相同的数据发送到 MLflow、Comet、ClearML 或 DVC。通过 yolo settings 启用 TensorBoard 和 Weights & Biases。MLflow 会将 project 和 name 训练参数作为实验名称和运行名称,因此 YOLO26 参数搜索运行结束后,在跟踪工具中就已经整理妥当。
比较与复现运行#
仪表板会绘制不同运行中某个指标与参数的关系,或绘制平行坐标图,将每次运行的设置与得分连接起来,从而显示参数扫描中哪些设置最重要。在 Ultralytics Platform中,项目可以通过重叠的指标曲线和损失曲线以及并排表格比较模型;比较运行并选出最佳方案课程会将这种比较转化为脚本化的晋级门槛。复现一次运行所需的信息不止超参数:记录还必须包含代码提交、精确的数据快照、软件包版本和随机种子,因为即使其他条件完全相同,GPU 内核和数据加载顺序也可能让结果略有变化。
这个 MLflow 脚本会使用 scikit-learn 的手写数字数据集,在四种树深度下训练决策树,将每种深度记录为参数,并将验证准确率记录为指标,然后像查询表格一样查询实验:
import mlflow
from sklearn.datasets import load_digits
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
# Store runs in a local SQLite file and group them under one experiment
mlflow.set_tracking_uri("sqlite:///mlflow.db")
mlflow.set_experiment("digits-tree-depth")
X_train, X_val, y_train, y_val = train_test_split(*load_digits(return_X_y=True), random_state=0)
# One tracked run per setting: the parameter goes in, the metric comes out
for depth in [2, 4, 8, 16]:
with mlflow.start_run(run_name=f"depth-{depth}"):
model = DecisionTreeClassifier(max_depth=depth, random_state=0).fit(X_train, y_train)
mlflow.log_param("max_depth", depth)
mlflow.log_metric("val_accuracy", model.score(X_val, y_val))
# Query the experiment like a table, best run first
runs = mlflow.search_runs(order_by=["metrics.val_accuracy DESC"])
print(runs[["params.max_depth", "metrics.val_accuracy"]])在全新数据库中,表格首先列出深度为 16、验证准确率为 0.838 的结果,其次是深度为 8、准确率为 0.818;接下来是深度为 4、准确率为 0.533,以及深度为 2、准确率为 0.318。在同一文件夹中使用 --backend-store-uri sqlite:///mlflow.db 运行 mlflow ui,即可在浏览器中查看相同的运行记录。
实验跟踪与相关实践的区别#
实验跟踪是机器学习运维(MLOps)的一个阶段,另外还有三种常与其混淆的实践:










