使用 ClearML 远程训练和监控 Ultralytics YOLOv5
探索我们与 ClearML 的合作,通过无缝 ML 集成、实验跟踪等功能,提升 Ultralytics YOLOv5 使用体验。

Ultralytics 会与其他初创公司开展商业合作,帮助我们为 YOLOv5 等优秀的开源工具的研发提供资金支持,让它们能够继续免费提供给所有人。本文可能包含指向这些合作伙伴的联盟链接。
ClearML 是我们最新的合作伙伴:一个旨在帮你节省时间的开源工具箱。
ClearML 的使命是加速 ML 的普及,让 ML 能够无缝集成到各种软件和硬件产品中。
这种集成让训练 YOLOv5 模型变得更加简单,并可使用 ClearML 实验管理器自动跟踪训练过程。你可以轻松指定 ClearML 数据集版本 ID 作为数据输入,它将自动用于训练模型。
将实验跟踪提升到新水平#
- 在实验管理器中跟踪每次 YOLOv5 训练运行。
- 使用集成的 ClearML 数据版本控制工具管理自定义训练数据的版本并轻松访问。
- 使用 ClearML 超参数优化获得最佳 mAP。
- 使用 ClearML Serving,只需几条命令即可将新训练的 YOLOv5 模型转换为 API。
你可以自行决定使用其中多少工具:可以只使用实验管理器,也可以将它们全部串联成一个出色的流水线。
设置环境#
为了跟踪实验和数据,ClearML 需要与服务器通信。你有两种选择:免费注册 ClearML Hosted Service,或设置自己的服务器,参见 ClearML Server 部署文档。
甚至服务器也是开源的,因此即使你要处理敏感数据,也完全没有问题!
- 安装 clearml Python 软件包:
pip install clearml - 通过创建凭据将 ClearML SDK 连接到服务器(前往右上角的 Settings → Workspace → Create new credentials),然后执行以下命令并按照说明操作:
clearml-init
好了!你已经准备好开始了……
使用 ClearML 训练 YOLOv5#
只需安装 ClearML pip 软件包,即可启用 ClearML 实验跟踪。
pip install clearml这将启用与 YOLOv5 训练脚本的集成。从现在起,每次训练运行都会由 ClearML 实验管理器捕获并存储。如果你想更改 project_name 或 task_name,请前往我们的自定义日志记录器,在那里进行修改:utils/loggers/clearml/clearml_utils.py
python train.py --img 640 --batch 16 --epochs 3 --data coco128.yaml --weights yolov5s.pt --cache这将捕获:
- 源代码 + 未提交的更改
- 已安装的软件包
- (超)参数
- 模型文件(使用 --save-period n 每 n 个 epoch 保存一个检查点)
- 控制台输出
- 标量(mAP_0.5、mAP_0.5:0.95、precision、recall、losses、learning rates,……)
- 机器详细信息、运行时、创建日期等常规信息
- 所有生成的图表,例如标签相关图和混淆矩阵
- 每个 epoch 带有边界框的图像
- 每个 epoch 的 Mosaic 图像
- 每个 epoch 的验证图像
还不错!现在,我们可以在 ClearML UI 中将所有这些信息可视化,从而了解训练进度。向表格视图添加自定义列(例如 mAP_0.5),这样你就可以轻松按性能最佳的模型进行排序。或者选择多个实验并直接比较它们!
利用这些信息,我们还能做更多事情,例如超参数优化和远程执行,继续阅读以了解具体方法!
数据集版本管理#
将数据与代码分开进行版本管理通常是个好主意,也便于获取最新版本。此仓库支持提供数据集版本 ID;如果数据尚不存在,它会确保获取数据。此外,此工作流还会将所用数据集 ID 保存为任务参数的一部分,这样你就能始终确切知道每个实验使用了哪些数据!
准备数据集#
YOLOv5 仓库通过包含数据集信息的 YAML 文件支持多个不同的数据集。默认情况下,数据集会下载到相对于仓库根目录的 ../datasets 文件夹中。因此,如果你使用 YAML 中的链接或 yolov5 提供的脚本下载了 coco128 数据集,就会得到以下文件夹结构:
..
|_ yolov5
|_ datasets
|_ coco128
|_ images
|_ labels
|_ LICENSE
|_ README.txt不过,这可以是你想要的任何数据集。只要保持此文件夹结构,你完全可以使用自己的数据集。
接下来,⚠️将相应的 YAML 文件复制到数据集文件夹的根目录⚠️。这些 YAML 文件包含 ClearML 正确使用数据集所需的信息。当然,你也可以自行创建,只需遵循示例 YAML 文件的结构即可。
基本上,我们需要以下键:path、train、test、val、nc、names。
..
|_ yolov5
|_ datasets
|_ coco128
|_ images
|_ labels
|_ coco128.yaml # ← HERE!
|_ LICENSE
|_ README.txt上传数据集#
要将此数据集作为版本化数据集导入 ClearML,请进入数据集根文件夹并运行以下命令:
cd coco128
clearml-data sync --project YOLOv5 --name coco128 --folder .命令 clearml-data sync 实际上是一个简写命令。你也可以依次运行以下命令:
# Optionally add --parent if you want to base
# this version on another dataset version, so no duplicate files are uploaded!
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:// --weights yolov5s.pt --cache超参数优化#
现在我们已经有了实验和数据版本,是时候看看可以在此基础上构建什么了!
利用代码信息、已安装的软件包和环境详细信息,实验本身现在已经完全可复现。事实上,ClearML 允许你克隆实验,甚至更改其参数。然后,我们只需使用这些新参数自动重新运行实验,这基本上就是 HPO 的工作方式!
要在本地运行超参数优化,我们已经为你准备好了一个脚本。只需确保训练任务至少运行过一次,使其出现在 ClearML 实验管理器中;我们实际上会克隆该任务并更改其超参数。
你需要在 utils/loggers/clearml/hpo.py 中找到的脚本里填入此模板任务的 ID,然后运行脚本即可。你可以将 task.execute_locally() 更改为 task.execute(),将其放入 ClearML 队列中,改由远程代理处理。
# To use optuna, install it first, otherwise you can change the optimizer to just be RandomSearch
pip install optuna
python utils/loggers/clearml/hpo.py远程执行(高级)#
在本地运行 HPO 非常方便,但如果我们想改为在远程机器上运行实验呢?也许你可以访问现场的一台高性能 GPU 机器,或者有预算使用云 GPU。这正是 ClearML Agent 发挥作用的地方。
在这里了解代理可以做什么:
简而言之:实验管理器跟踪的每个实验都包含足够的信息,可以在另一台机器上重现该实验(已安装的软件包、未提交的更改等)。因此,ClearML 代理会执行以下操作:监听队列中的传入任务,找到任务后重建环境并运行任务,同时继续将标量、图表等信息报告给实验管理器。
只需运行以下命令,你就可以将任何机器(云 VM、本地 GPU 机器或自己的笔记本电脑)变成 ClearML 代理:
clearml-agent daemon --queue [--docker]克隆、编辑并加入队列#
代理运行后,我们就可以给它分配一些工作。还记得 HPO 部分提到的内容吗?我们可以克隆任务并编辑超参数,也可以直接从界面完成这些操作!
🪄 右键单击实验以克隆它
🎯 将超参数编辑为你想要的值
⏳ 右键单击任务,将其加入任意队列
远程执行任务#
现在,你可以像上面解释的那样克隆任务,也可以只需添加 task.execute_remotely() 来标记当前脚本;执行时,它就会被放入队列,供代理开始处理!
要远程运行 YOLOv5 训练脚本,只需在 ClearML 日志记录器实例化后,将以下代码行添加到 train.py 脚本中:
# ...
# Loggers
data_dict = None
if RANK in {-1, 0}:
loggers = Loggers(save_dir, weights, opt, hyp, LOGGER) # loggers instance
if loggers.clearml:
loggers.clearml.task.execute_remotely(queue="my_queue") # <------ ADD THIS LINE有任何问题?加入我们的社区,立即提出你的问题!









