启用任务功能内置的 TensorBoard 服务
本指南将帮助您了解如何在平台「任务」功能中使用内置的 TensorBoard 功能来监控模型训练过程。
您将了解以下内容:
- 如何在训练脚本中指定写入日志路径
- 在平台创建训练任务时如何填写 TensorBoard 日志可视化路径
- 在训练过程中如何使用内置的 TensorBoard 服务查看训练日志
概述
我们的平台支持用户通过以下步骤使用 TensorBoard 来可视化模型训练的日志:
- 创建训练脚本:在脚本中指定 TensorBoard 日志目录(logdir),训练过程中会将日志写入该目录。
- 提交训练任务:通过平台控制台网页提交训练任务,并在任务可视化的「日志存储路径」中填写 TensorBoard 日志目录。
- 启动 TensorBoard 服务:在任务运行中,平台会自动启动一个 TensorBoard 服务,读取用户指定的日志目录,并提供可视化界面。
以下是详细步骤。
步骤 1:创建训练脚本
请在您自己的训练脚本中指定 TensorBoard 日志目录(logdir)。训练过程中,模型的日志(如损失、准确率等)将写入该目录。
以下是一个使用 PyTorch 的简单 Python 训练脚本示例,展示如何配置 TensorBoard 日志目录:
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.tensorboard import SummaryWriter
import datetime
# 定义 TensorBoard 日志目录,这个路径需要提供给平台,作为**任务可视化**的「日志存储路径」
log_dir = "/path/to/your/tensorboard/logs/"
# 定义基础日志目录并追加环境变量 VAR_DIR
# base_log_dir = "/path/to/your/tensorboard/logs/"
# var_dir = os.getenv('VAR_DIR', 'default_run') # 默认值作为备用
# log_dir = os.path.join(base_log_dir, var_dir)
writer = SummaryWriter(log_dir=log_dir)
# 示例模型
class SimpleNet(nn.Module):
def __init__(self):
super(SimpleNet, self).__init__()
self.fc1 = nn.Linear(10, 16)
self.fc2 = nn.Linear(16, 1)
self.relu = nn.ReLU()
self.sigmoid = nn.Sigmoid()
def forward(self, x):
x = self.relu(self.fc1(x))
x = self.sigmoid(self.fc2(x))
return x
model = SimpleNet()
criterion = nn.BCELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
# 模拟数据
x_train = torch.rand(1000, 10)
y_train = torch.randint(0, 2, (1000, 1)).float()
# 训练循环
epochs = 5
for epoch in range(epochs):
model.train()
optimizer.zero_grad()
outputs = model(x_train)
loss = criterion(outputs, y_train)
loss.backward()
optimizer.step()
# 记录日志到 TensorBoard
writer.add_scalar('Loss/train', loss.item(), epoch)
writer.add_scalar('Accuracy/train', (outputs.round() == y_train).float().mean().item(), epoch)
# 关闭 writer
writer.close()
以下是关键点:
- 日志目录(log_dir):确保您在脚本中明确指定日志目录的路径(例如
/path/to/your/tensorboard/logs/
)。此路径必须是容器内的有效路径。建议在日志目录中加入环境变量,以避免日志冲突。详见下文「使用环境变量避免日志路径冲突」。 - SummaryWriter:使用 PyTorch 的
SummaryWriter
来记录日志到 TensorBoard。您可以记录标量(如损失、准确率)、计算图等。 - 关闭 writer:训练完成后调用
writer.close()
以确保日志正确写入。
步骤 2:提交训练任务
在完成训练脚本后,您需要通过平台的控制台网页提交训练任务,并指定 TensorBoard 日志目录。请在任务可视化的「日志存储路径」中填写 TensorBoard 日志目录(例如 /path/to/your/tensorboard/logs/
)。
注意
- 日志目录一致性:确保提交的日志目录路径与训练脚本中指定的
log_dir
完全一致,否则 TensorBoard 服务将无法找到日志文件。 - 日志目录冲突/重复:尽量避免在不同的任务中使用相同的日志路径。在克隆/重跑任务时,可视情况修改代码中的日志写入路径。建议在日志目录中加入环境变量(如示例中的
VAR_DIR
,平台支持从网页端控制和注入环境变量),以避免日志冲突。详见下文「使用环境变量避免日志路径冲突」。
步骤 3:查看 TensorBoard 可视化
一旦训练任务启动,平台会自动为您的任务启动一个 TensorBoard 服务。该服务会读取您指定的日志目录,并提供一个可视化界面,让您可以实时监控训练进度。
您可在任务列表页的右侧操作栏中找到可视化按钮,直接跳转 TensorBoard 看板。也可以在任务详情页找到可视化按钮。
注意
- 任务结束后,任务可视化按钮失效。如果任务日志持久化保存在共享存储上,您可以自行运行 TensorBoard 看板服务查看日志。例如,可以使用开发机运行 TensorBoard 服务,并指定日志路径为当前训练任务的日志。
- 如果您提交了多个训练任务,每个任务的 TensorBoard 服务是独立的,互不干扰。
使用环境变量避免日志路径冲突
重新运行或克隆训练任务时,可能会遇到日志路径冲突的问题。如果使用固定的 TensorBoard 日志目录(logdir),多次运行的任务会将日志写入同一路径,导致日志混淆,难以区分不同任务的训练数据。为解决这一问题,我们引入了通过环境变量动态设置日志目录的功能,让平台可以更灵活地读取日志路径,避免冲突。
功能介绍
平台支持用户在提交训练任务时,通过控制台网页界面定义和修改环境变量。这些环境变量会被注入到训练任务的容器中。通过在日志目录路径中追加一个可变部分(例如,通过环境变量 VAR_DIR
指定),每次运行任务时都可以生成唯一的日志目录,从而避免日志覆盖和混淆。
此功能的优势包括:
- 避免日志冲突:通过为每次任务运行设置唯一的日志目录路径,确保不同任务的日志互不干扰。
- 灵活性:用户可以在平台控制台网页界面中轻松定义或更改环境变量,无需修改训练脚本。
- 简化任务管理:重新运行或克隆任务时,通过修改环境变量的值可生成新的日志目录,便于跟踪和比较多次运行的结果。平台可以更灵活地读取日志路径。
使用方法
以下是如何使用环境变量 VAR_DIR
来动态设置 TensorBoard 日志目录的步骤:
在训练脚本中使用环境变量,请参考前文代码示例中的注释部分(环境变量名可自行定义):
python# base_log_dir = "/path/to/your/tensorboard/logs/" # var_dir = os.getenv('VAR_DIR', 'default_run') # log_dir = os.path.join(base_log_dir, var_dir)
在控制台设置环境变量。
- 在创建页面,找到任务可视化的「日志存储路径」,填写 TensorBoard 日志目录时引用环境变量:
/path/to/your/tensorboard/logs/${VAR_DIR}/
- 在创建页面,找到环境变量设置,添加
VAR_DIR
,输入唯一值(如experiment_v2
)。
- 在创建页面,找到任务可视化的「日志存储路径」,填写 TensorBoard 日志目录时引用环境变量:
通过在每次运行时修改网页上的环境变量(如 VAR_DIR
),您可以动态设置日志目录,避免日志冲突和覆盖,且无需修改脚本。