使用 ClearML 远程训练和监控 Ultralytics YOLOv5
了解如何使用 ClearML 跟踪实验、管理数据集版本、调整超参数,并在远程机器上训练 Ultralytics YOLOv5 模型。
Nuvola Ladi5 分钟阅读
在 Ultralytics,我们与其他初创公司开展商业合作,帮助为 YOLOv5 等开源工具的研发提供资金,让所有人都能免费使用这些工具。本文可能包含指向合作伙伴的联盟链接。
ClearML 是我们的最新合作伙伴:一套旨在为你节省时间的开源工具箱。
ClearML 以加速 ML 应用为使命,让 ML 易于集成到任何软件或硬件产品中。
这项集成让训练 YOLOv5 模型变得更加简单,还可以使用 ClearML 实验管理器自动跟踪模型。你只需指定 ClearML 数据集版本 ID 作为数据输入,系统就会自动用它来训练模型。
让你的实验跟踪更进一步#
- 在实验管理器中跟踪每次 YOLOv5 训练运行。
- 使用集成的 ClearML 数据版本控制工具对自定义训练数据进行版本管理,并轻松访问。
- 使用 ClearML 超参数优化获取最佳 mAP。
- 只需几个命令,即可通过 ClearML Serving 将新训练的 YOLOv5 模型转换为 API。
这些工具要用多少由你决定:你可以只使用实验管理器,也可以将所有工具串联起来,构建一条强大的流水线。
设置#
为了跟踪实验和数据,ClearML 需要与服务器通信。你有两个选择:免费注册 ClearML 托管服务,或者自行搭建服务器。
服务器本身也是开源的,所以即使你要处理敏感数据,也完全没有问题!
- 安装 ClearML Python 软件包:
pip install clearml - 通过创建凭据(在右上角依次选择 Settings → Workspace → Create new credentials)将 ClearML SDK 连接到服务器,然后执行以下命令并按照提示操作:
clearml-init
现在,你可以开始使用了。
使用 ClearML 训练 YOLOv5#
要启用 ClearML 实验跟踪,只需安装 ClearML pip 软件包。
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 保存一次检查点)
- 控制台输出
- 标量(mAP50、mAP50-95、精确率、召回率、损失、学习率等)
- 常规信息,例如机器详情、运行时、创建日期等
- 所有生成的图表,例如标签相关图和混淆矩阵
- 每个 epoch 的带边界框图像
- 每个 epoch 的马赛克图像
- 每个 epoch 的验证图像
现在,我们可以在 ClearML UI 中可视化所有这些信息,全面了解训练进度。向表格视图添加自定义列(例如 mAP50),这样你就可以轻松按性能最佳的模型排序。或者选择多个实验并直接进行比较!
利用所有这些信息,我们还能做更多事情,例如超参数优化和远程执行。继续阅读,了解具体方法!
数据集版本管理#
将数据与代码分开进行版本管理通常是个好主意,也便于获取最新版本。此代码库支持提供数据集版本 ID,并会确保在数据尚未就绪时获取数据。此外,此工作流还会将所用的数据集 ID 保存为任务参数的一部分,这样你就能准确知道每个实验使用了哪些数据!
准备数据集#
YOLOv5 代码仓库通过使用包含数据集信息的 YAML 文件支持多种不同的数据集。默认情况下,数据集会下载到相对于代码仓库根目录的 ../datasets 文件夹中。因此,如果你通过 YAML 中的链接或 YOLOv5 提供的脚本下载 COCO128 数据集,就会得到以下文件夹结构:
..
|_ yolov5
|_ datasets
|_ coco128
|_ images
|_ labels
|_ LICENSE
|_ README.txt不过,你可以使用任何想要的数据集。只要保持这种文件夹结构,就可以使用自己的数据集。
接下来,将对应的 YAML 文件复制到数据集文件夹的根目录。这些 YAML 文件包含 ClearML 正确使用数据集所需的信息。当然,你也可以自行创建 YAML 文件,只需遵循示例 YAML 文件的结构即可。
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 QUEUES_TO_LISTEN_TO [--docker]克隆、编辑并加入队列#
代理运行后,我们就可以给它分配任务了。还记得 HPO 部分提到过,我们可以克隆任务并编辑超参数吗?我们也可以直接在界面中完成这些操作!
- 右键单击实验即可克隆。
- 将超参数编辑为你需要的值。
- 右键单击任务,将其加入任意队列。
远程执行任务#
现在,你可以像上面介绍的那样克隆任务,也可以只需在当前脚本中添加 task.execute_remotely()。执行时,任务就会进入队列,等待代理开始处理!
要远程运行 YOLOv5 训练脚本,只需在 ClearML logger 实例化之后,将这一行添加到 train.py 脚本中:
# ...
# Loggers
data_dict = None
if RANK in {-1, 0}:
loggers = Loggers(save_dir, weights, opt, hyp, LOGGER) # loggers 实例
if loggers.clearml:
loggers.clearml.task.execute_remotely(queue="my_queue") # <------ 添加此行有问题吗?加入我们的社区,今天就来提出你的问题吧!
作者
评论
提出问题、分享你的结果,或帮助其他人。










