ClearML 集成
关于 ClearML
ClearML 是一个旨在节省您时间的 开源 工具箱 ⏱️。
🔨 在 实验管理器 中跟踪每一次 YOLOv5 训练运行
🔧 使用集成的 ClearML 数据版本控制工具 版本化并轻松访问您的自定义 训练数据
🔦 使用 ClearML Agent 远程训练和监控 您的 YOLOv5 训练运行
🔬 使用 ClearML 超参数优化 获得最佳 mAP
🔭 使用 ClearML Serving 只需几条命令即可将新训练的 YOLOv5 模型转换为 API
还有更多功能。您可以选择使用这些工具中的多少,可以只使用实验管理器,也可以将它们全部串联成一个令人印象深刻的管道!
🦾 设置
为了跟踪您的实验和/或数据,ClearML 需要与服务器通信。您有两种选择来获取一个:
要么免费注册 ClearML 托管服务,或者您可以设置自己的服务器,请参见 此处。即使是服务器也是开源的,因此即使您处理的是敏感数据,也应该没问题!
-
安装
clearml
Python 包: -
通过 创建凭据(转到右上角的设置 -> 工作区 -> 创建新凭据)将 ClearML SDK 连接到服务器,然后执行以下命令并按照说明操作:
就是这样!您完成了 😎
🚀 使用 ClearML 训练 YOLOv5
要启用 ClearML 实验跟踪,只需安装 ClearML pip 包。
这将启用与 YOLOv5 训练脚本的集成。从现在开始,每一次训练运行都将被 ClearML 实验管理器捕获并存储。
如果您想更改 project_name
或 task_name
,请使用 train.py
脚本的 --project
和 --name
参数,默认情况下项目将被称为 YOLOv5
,任务将被称为 Training
。请注意:ClearML 使用 /
作为子项目的分隔符,因此在项目名称中使用 /
时要小心!
或使用自定义项目和任务名称:
python train.py --project my_project --name my_training --img 640 --batch 16 --epochs 3 --data coco8.yaml --weights yolov5s.pt --cache
这将捕获:
- 源代码 + 未提交的更改
- 已安装的包
- (超)参数
- 模型文件(使用
--save-period n
每 n 个 epoch 保存一个检查点) - 控制台输出
- 标量(mAP_0.5, mAP_0.5:0.95, 精度, 召回率, 损失, 学习率, ...)
- 一般信息,如机器详细信息、运行时间、创建日期等
- 所有生成的图表,如标签互相关图和 混淆矩阵
- 每个 epoch 的带边界框的图像
- 每个 epoch 的马赛克
- 每个 epoch 的验证图像
这很多对吧?🤯 现在,我们可以在 ClearML UI 中可视化所有这些信息,以了解我们的训练进度。添加自定义列到表格视图(例如 mAP_0.5),以便您可以轻松地对最佳表现的模型进行排序。或者选择多个实验并直接比较它们!
我们还可以用这些信息做更多的事情,比如超参数优化和远程执行,所以如果您想了解这些是如何工作的,请继续阅读!
🔗 数据集版本管理
将数据与代码分开版本化通常是一个好主意,并且可以轻松获取最新版本。此仓库支持提供数据集版本 ID,并且如果数据尚未存在,它将确保获取数据。除此之外,此工作流程还将使用的数据集 ID 保存为任务参数的一部分,因此您将始终确切知道哪个实验使用了哪些数据!
准备您的数据集
YOLOv5仓库通过使用包含其信息的YAML文件支持多种不同的数据集。默认情况下,数据集会下载到相对于仓库根目录的../datasets
文件夹中。因此,如果您使用YAML中的链接或yolov5提供的脚本下载了coco128
数据集,您将得到以下文件夹结构:
但这可以是您希望的任何数据集。只要您保持这种文件夹结构,就可以随意使用您自己的数据集。
接下来,⚠️将相应的YAML文件复制到数据集文件夹的根目录⚠️。这个YAML文件包含了ClearML正确使用数据集所需的信息。当然,您也可以自己制作,只需遵循示例YAML的结构即可。
基本上,我们需要以下键:path
、train
、test
、val
、nc
、names
。
..
|_ yolov5
|_ datasets
|_ coco128
|_ images
|_ labels
|_ coco128.yaml # <---- 这里!
|_ LICENSE
|_ README.txt
上传您的数据集
要将此数据集作为版本化数据集上传到ClearML,请进入数据集根目录并运行以下命令:
clearml-data sync
命令实际上是一个简写命令。您也可以依次运行以下命令:
# 如果希望基于另一个数据集版本,可选添加 --parent <parent_dataset_id>,这样不会上传重复文件!
clearml-data create --name coco128 --project YOLOv5
clearml-data add --files .
clearml-data close
使用ClearML数据集进行训练
现在您有了一个ClearML数据集,可以非常简单地使用它来训练自定义的YOLOv5 🚀 模型!
python train.py --img 640 --batch 16 --epochs 3 --data clearml://<your_dataset_id> --weights yolov5s.pt --cache
👀 超参数优化
现在我们已经对实验和数据进行了版本控制,是时候看看我们可以在其基础上构建什么了!
利用代码信息、已安装的包和环境细节,实验本身现在是完全可复现的。事实上,ClearML允许您克隆一个实验,甚至更改其参数。然后,我们可以使用这些新参数自动重新运行它,这基本上就是HPO所做的!
要在本地运行超参数优化,我们为您准备了一个预制的脚本。只需确保至少运行了一次训练任务,以便它在ClearML实验管理器中,我们将基本上克隆它并更改其超参数。
您需要在utils/loggers/clearml/hpo.py
中找到的脚本中填写此模板任务
的ID,然后只需运行它即可 :) 您可以将task.execute_locally()
更改为task.execute()
,以将其放入ClearML队列中,并让远程代理处理它。
# 要使用optuna,请先安装它,否则您可以将优化器更改为仅使用RandomSearch
pip install optuna
python utils/loggers/clearml/hpo.py
🤯 远程执行(高级)
在本地运行HPO非常方便,但如果我们想在远程机器上运行实验呢?也许您可以访问现场非常强大的GPU机器,或者您有一些预算可以使用云GPU。这就是ClearML Agent发挥作用的地方。查看代理可以做什么:
简而言之:实验管理器跟踪的每个实验都包含足够的信息,以便在不同的机器上重现它(已安装的包、未提交的更改等)。因此,ClearML代理正是这样做的:它监听队列中的传入任务,当它找到一个任务时,它会重新创建环境并在仍然向实验管理器报告标量、图表等的情况下运行它。
您可以通过简单地运行以下命令,将任何机器(云VM、本地GPU机器、您自己的笔记本电脑...)变成ClearML代理:
克隆、编辑和排队
有了正在运行的代理,我们可以给它一些工作。还记得在HPO部分中,我们可以克隆一个任务并编辑超参数吗?我们也可以从界面中做到这一点!
🪄 右键单击实验进行克隆
🎯 编辑超参数为您希望的值
⏳ 右键单击任务将其排队到任何队列中
远程执行任务
现在,您可以像我们上面解释的那样克隆一个任务,或者只需在当前脚本中添加task.execute_remotely()
,在执行时它将被放入队列中,代理将开始处理它!
要远程运行 YOLOv5 训练脚本,只需在 training.py
脚本中实例化 clearml 记录器后添加以下代码行:
# ...
# 记录器
data_dict = None
if RANK in {-1, 0}:
loggers = Loggers(save_dir, weights, opt, hyp, LOGGER) # 记录器实例
if loggers.clearml:
loggers.clearml.task.execute_remotely(queue="my_queue") # <------ 添加此行
# Data_dict 要么为 None(如果用户未选择 ClearML 数据集),要么由 ClearML 填充
data_dict = loggers.clearml.data_dict
# ...
在此更改后运行训练脚本时,Python 将运行脚本直到该行,之后它将打包代码并将其发送到队列中!
自动扩展工作器
ClearML 还自带自动扩展器!该工具会在检测到队列中有实验时,自动在您选择的云(AWS、GCP、Azure)中启动新的远程机器,并将其转换为 ClearML 代理。一旦任务处理完毕,自动扩展器将自动关闭远程机器,您也就不再付费!
请查看下面的自动扩展器入门视频。