Skip to main content

显式报告教程

在本教程中,学习如何通过显式报告扩展ClearML自动捕获输入和输出的功能。

在这个例子中,您将向ClearML的GitHub仓库中的pytorch_mnist.py示例脚本添加以下内容:

  • 设置模型检查点(快照)的输出目的地。
  • Explicitly record scalars, other (non-scalar) data, and record text.
  • 注册一个工件,该工件上传到ClearML Server,并且ClearML记录对其的更改。
  • 上传一个工件,该工件已上传,但对其的更改未记录。

先决条件

  • clearml 仓库已被克隆。
  • clearml 包已安装。

开始之前

复制pytorch_mnist.py 以添加显式报告。

cp pytorch_mnist.py pytorch_mnist_tutorial.py

步骤1:设置模型检查点的输出目标

指定一个默认的输出位置,这是实验运行时模型检查点(快照)和工件将存储的地方。一些可能的目的地包括:

  • Local Destination
  • Shared Folder
  • 云存储:
    • S3 EC2
    • Google 云存储
    • Azure 存储.

Task.init()output_uri参数中指定输出位置。 在本教程中,指定一个本地文件夹作为目标。

pytorch_mnist_tutorial.py 中,将代码从:

task = Task.init(project_name='examples', task_name='pytorch mnist train')

至:

model_snapshots_path = '/mnt/clearml'
if not os.path.exists(model_snapshots_path):
os.makedirs(model_snapshots_path)

task = Task.init(
project_name='examples',
task_name='extending automagical ClearML example',
output_uri=model_snapshots_path
)

当脚本运行时,ClearML 会创建以下目录结构:

+ - <output destination name>
| +-- <project name>
| +-- <task name>.<Task Id>
| +-- models
| +-- artifacts

并将模型检查点(快照)和工件放入该文件夹中。

例如,如果任务ID是9ed78536b91a44fbb3cc7a006128c1b0,那么目录结构将是:

+ - model_snapshots
| +-- examples
| +-- extending automagical ClearML example.9ed78536b91a44fbb3cc7a006128c1b0
| +-- models
| +-- artifacts

步骤2:Logger类报告方法

除了ClearML自动记录日志外,clearml Python包还包含用于显式报告图表、日志文本、媒体和表格的方法。这些方法包括:

获取日志记录器

首先,使用Task.get_logger()为任务创建一个日志记录器:

logger = task.get_logger()

绘制标量指标

使用Logger.report_scalar()添加标量指标来报告损失指标。

def train(args, model, device, train_loader, optimizer, epoch):

save_loss = []

model.train()
for batch_idx, (data, target) in enumerate(train_loader):
data, target = data.to(device), target.to(device)
optimizer.zero_grad()
output = model(data)
loss = F.nll_loss(output, target)
loss.backward()

save_loss.append(loss)

optimizer.step()
if batch_idx % args.log_interval == 0:
print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
epoch, batch_idx * len(data), len(train_loader.dataset),
100. * batch_idx / len(train_loader), loss.item()))
# Add manual scalar reporting for loss metrics
logger.report_scalar(title='Scalar example {} - epoch'.format(epoch),
series='Loss', value=loss.item(), iteration=batch_idx)

绘制其他(非标量)数据

脚本包含一个名为 test 的函数,该函数用于确定训练模型的损失和正确性。添加直方图和混淆矩阵以记录它们。

def test(args, model, device, test_loader):

save_test_loss = []
save_correct = []

model.eval()
test_loss = 0
correct = 0
with torch.no_grad():
for data, target in test_loader:
data, target = data.to(device), target.to(device)
output = model(data)
# sum up batch loss
test_loss += F.nll_loss(output, target, reduction='sum').item()
# get the index of the max log-probability
pred = output.argmax(dim=1, keepdim=True)
correct += pred.eq(target.view_as(pred)).sum().item()

save_test_loss.append(test_loss)
save_correct.append(correct)

test_loss /= len(test_loader.dataset)

print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
test_loss, correct, len(test_loader.dataset),
100. * correct / len(test_loader.dataset)))

logger.report_histogram(
title='Histogram example',
series='correct',
iteration=1,
values=save_correct,
xaxis='Test',
yaxis='Correct'
)

# Manually report test loss and correct as a confusion matrix
matrix = np.array([save_test_loss, save_correct])
logger.report_confusion_matrix(
title='Confusion matrix example',
series='Test loss / correct',
matrix=matrix,
iteration=1
)

日志文本

通过显式记录文本(包括错误、警告和调试语句)来扩展 ClearML。使用 Logger.report_text() 及其 level 参数来报告调试消息。

logger.report_text(
'The default output destination for model snapshots and artifacts is: {}'.format(
model_snapshots_path
),
level=logging.DEBUG
)

步骤 3: 注册工件

注册一个工件会将其上传到ClearML服务器,如果它发生变化,变化会被记录在ClearML服务器中。 目前,ClearML支持将Pandas DataFrames作为注册的工件。

注册工件

在教程脚本中,test 函数,你可以将测试损失和正确数据分配给一个 Pandas DataFrame 对象,并使用 Task.register_artifact() 注册该 Pandas DataFrame。

# Create the Pandas DataFrame
test_loss_correct = {
'test lost': save_test_loss,
'correct': save_correct
}
df = pd.DataFrame(test_loss_correct, columns=['test lost','correct'])

# Register the test loss and correct as a Pandas DataFrame artifact
task.register_artifact(
'Test_Loss_Correct',
df,
metadata={
'metadata string': 'apple',
'metadata int': 100,
'metadata dict': {'dict string': 'pear', 'dict int': 200}
}
)

引用已注册的工件

一旦工件被注册,它就可以在Python实验脚本中被引用和利用。

在教程脚本中,添加 Task.current_task()Task.get_registered_artifacts() 以获取样本。

# Once the artifact is registered, we can get it and work with it. Here, we sample it.
sample = Task.current_task().get_registered_artifacts()['Test_Loss_Correct'].sample(
frac=0.5,
replace=True,
random_state=1
)

步骤 4: 上传工件

工件可以上传到ClearML服务器,但更改不会被记录。

支持的工件包括:

  • Pandas 数据框
  • 任何类型的文件,包括图像文件
  • 文件夹 - 存储为ZIP文件
  • 图像 - 存储为PNG文件
  • 字典 - 存储为JSON格式
  • Numpy 数组 - 存储为 NPZ 文件

在教程脚本中,使用Task.upload_artifact()上传损失数据作为工件,并在metadata参数中指定元数据。

# Upload test loss as an artifact. Here, the artifact is numpy array
task.upload_artifact(
'Predictions',
artifact_object=np.array(save_test_loss),
metadata={
'metadata string': 'banana',
'metadata integer': 300,
'metadata dictionary': {'dict string': 'orange', 'dict int': 400}
}
)

附加信息

在扩展了Python实验脚本后,运行它并在ClearML Web UI中查看结果。

python pytorch_mnist_tutorial.py

要查看实验结果,请执行以下操作:

  1. ClearML Web UI中,在项目页面上,点击示例项目。
  2. 在实验表中,点击自动扩展的ClearML示例实验。
  3. ARTIFACTS标签页的DATA AUDIT部分,点击Test_Loss_Correct。注册的Pandas DataFrame会显示出来,包括文件路径、大小、哈希值、元数据和预览。
  4. 其他部分,点击损失。上传的numpy数组及其相关信息将显示出来。
  5. 点击CONSOLE选项卡,查看显示Pandas DataFrame示例的调试信息。
  6. 点击SCALARS标签,查看用于记录损失的标量图。
  7. 点击PLOTS标签,查看混淆矩阵和直方图。

下一步