ClearML 实验管理 — 开源全栈 MLOps 平台:实验追踪 + 数据管理 + 任务调度
一句话说明
ClearML 是开源的全栈 MLOps 平台,提供实验追踪、数据集版本管理、模型仓库、远程任务调度(ClearML Agent)五大功能,可以理解为自部署版的 W&B + DVC + 任务队列,支持本地私有化部署。
安装与配置
# 安装 ClearML 客户端
pip install clearml # 基础安装
pip install clearml-agent # 任务调度 Agent(可选)
# 初始化配置(连接到 ClearML 服务器)
clearml-init # 交互式配置向导
# 如果使用免费的公共服务器(app.clear.ml)
# 按提示输入 API 凭证即可
# 本地自部署服务器(使用 Docker Compose)
git clone https://github.com/allegroai/clearml-server.git
cd clearml-server
docker-compose up -d # 启动本地服务
# 验证连接
python -c "from clearml import Task; Task.init(project_name='test', task_name='test')"
核心用法
from clearml import Task, Logger, Dataset # 三个核心类
# === 实验追踪(最常用)===
# 在训练代码最开头添加这两行,就能自动追踪所有内容
task = Task.init(
project_name="宏基因组分析", # 项目名(会自动创建)
task_name="随机森林-特征选择-v1", # 实验名
task_type=Task.TaskTypes.training, # 任务类型
)
# 记录超参数(支持字典)
task.connect({
"n_estimators": 100, # 随机森林树数量
"max_depth": 10,
"learning_rate": 0.01,
})
# 记录指标(实时显示在 Web 界面)
logger = task.get_logger()
for epoch in range(100):
train_loss = 0.5 - epoch * 0.003 # 示例值
val_acc = 0.7 + epoch * 0.002
logger.report_scalar( # 记录标量指标
title="Loss", # 图表标题
series="train_loss", # 系列名(一张图可以有多个系列)
value=train_loss,
iteration=epoch, # X 轴(通常是 epoch 或 step)
)
logger.report_scalar(
title="Accuracy",
series="val_accuracy",
value=val_acc,
iteration=epoch,
)
# 记录混淆矩阵(自动生成热图)
import numpy as np
confusion = np.array([[50, 10], [5, 35]])
logger.report_confusion_matrix(
"Confusion Matrix", "train",
matrix=confusion,
iteration=100,
xlabels=["健康", "T2D"], # X 轴标签
ylabels=["健康", "T2D"], # Y 轴标签
)
task.close() # 关闭任务(标记为完成)
参数详解
from clearml import Dataset
# === 数据集管理(版本控制数据)===
# 创建新数据集版本
dataset = Dataset.create(
dataset_name="宏基因组16S数据", # 数据集名称
dataset_project="宏基因组分析", # 所属项目
dataset_version="1.0", # 版本号
)
dataset.add_files("/data/16S_fastq/") # 添加数据文件(支持目录)
dataset.upload() # 上传到 ClearML 服务器
dataset.finalize() # 完成版本(之后不能修改)
# 在训练代码中加载数据集(自动缓存)
dataset = Dataset.get(
dataset_name="宏基因组16S数据",
dataset_version="1.0",
)
local_path = dataset.get_local_copy() # 下载到本地并返回路径
print(f"数据集路径:{local_path}")
# === 模型自动记录 ===
from clearml import OutputModel
output_model = OutputModel(task=task, label_enumeration={"健康": 0, "T2D": 1})
output_model.update_weights("model.pkl") # 上传模型文件
output_model.update_design(config_dict={"model": "RandomForest", "n_estimators": 100})
实战案例
# 完整的 sklearn 模型训练追踪示例
from clearml import Task, Logger
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
import numpy as np
import joblib
# 初始化 ClearML 任务(一行代码搞定追踪)
task = Task.init(
project_name="T2D菌群分类",
task_name="随机森林_baseline",
)
# 记录超参数(修改这里的值,Web 界面会自动显示)
params = task.connect({
"n_estimators": 200,
"max_depth": 15,
"min_samples_split": 5,
"random_state": 42,
})
# 加载数据(示例)
X = np.random.randn(100, 50) # 示例:100个样本,50个特征
y = np.random.randint(0, 2, 100) # 示例:二分类标签
# 训练模型
rf = RandomForestClassifier(
n_estimators=params["n_estimators"], # 使用 ClearML 管理的超参数
max_depth=params["max_depth"],
random_state=params["random_state"],
)
rf.fit(X, y)
# 交叉验证评估
cv_scores = cross_val_score(rf, X, y, cv=5, scoring="roc_auc")
logger = task.get_logger()
logger.report_scalar("AUC", "mean", cv_scores.mean(), 0)
logger.report_scalar("AUC", "std", cv_scores.std(), 0)
# 保存并上传模型
joblib.dump(rf, "random_forest.pkl")
task.upload_artifact("random_forest_model", "random_forest.pkl")
print(f"交叉验证 AUC: {cv_scores.mean():.4f} ± {cv_scores.std():.4f}")
task.close()
常见报错与解决
| 报错信息 | 原因 | 解决方法 |
|---|
ClearML not configured | 未初始化配置 | 运行 clearml-init |
| 实验不显示在界面 | 任务未关闭 | 调用 task.close() 或等待程序结束 |
| 数据集上传失败 | 网络或权限问题 | 检查服务器连接和 API Key |
finalize() 报错 | 数据集已被 finalize | 创建新版本 |
| 本地部署502错误 | Docker 服务未就绪 | 等待 1-2 分钟或检查容器状态 |
速查表
| 功能 | 代码/命令 |
|---|
| 初始化追踪 | Task.init(project_name="...", task_name="...") |
| 记录指标 | logger.report_scalar(title, series, value, iteration) |
| 记录超参 | task.connect({"lr": 0.001}) |
| 上传文件 | task.upload_artifact("name", "path") |
| 数据集版本 | Dataset.create(dataset_name, dataset_project) |
| Web 界面 | https://app.clear.ml 或本地 http://localhost |
| 官方文档 | https://clear.ml/docs |