Skip to main content

PyTorch 分布式

pytorch_distributed_example.py 脚本展示了如何将ClearML集成到使用PyTorch分布式通信包 (torch.distributed)的代码中。

脚本执行以下操作:

  1. 它初始化一个主任务并生成子进程,每个子进程对应该任务的一个实例。

  2. 每个子进程中的任务在分区数据集上训练神经网络(使用torchvision内置的MNIST数据集),并向主任务报告以下内容:

    • 工件 - 从每个子流程中的任务上传到主任务的是一个包含不同键值对的字典。

    • Scalar - 在每个子进程任务中作为标量报告的损失会在主任务中记录。

    • Hyperparameters - 在每个子进程任务中创建的超参数会被添加到主任务的超参数中。

    子流程中的每个任务通过调用Task.current_task()来引用主任务,该函数总是返回主任务。

  3. 当脚本运行时,它会在ClearML Web UI中的examples项目中创建一个名为test torch distributed的实验。

工件

该示例通过调用Task.upload_artifact()在主任务中上传一个字典作为工件。该字典包含子进程的dist.rank,使每个子进程唯一。

Task.current_task().upload_artifact(
name='temp {:02d}'.format(dist.get_rank()),
artifact_object={'worker_rank': dist.get_rank()}
)

所有这些工件都出现在主任务中,ARTIFACTS > OTHER

image

标量

通过调用Logger.report_scalar()向主任务报告损失,这是在Task.current_task().get_logger上进行的,这是主任务的日志记录器。由于Logger.report_scalar使用相同的标题(loss)但不同的系列名称(包含子进程的rank)调用,所有损失标量系列都被一起记录。

Task.current_task().get_logger().report_scalar(
title='loss',
series='worker {:02d}'.format(dist.get_rank()),
value=loss.item(),
iteration=i
)

损失的单标量图出现在SCALARS中。

image

超参数

ClearML 自动记录使用 argparse 定义的命令行选项。

通过使用Task.connect()将参数字典连接到任务来记录参数字典。

param = {'worker_{}_stuff'.format(dist.get_rank()): 'some stuff ' + str(randint(0, 100))}
Task.current_task().connect(param)

命令行选项出现在配置 > 超参数 > 参数中。

image

参数字典出现在HYPERPARAMETERSGeneral部分。

param = {'worker_{}_stuff'.format(dist.get_rank()): 'some stuff ' + str(randint(0, 100))}
Task.current_task().connect(param)

image

日志

输出到控制台,包括从主任务对象和每个子进程打印的文本消息,显示在控制台中。

image