Skip to content

使用训练任务托管的 TensorBoard 服务

训练任务运行时,AIStudio 可以启动与该任务关联的 TensorBoard 服务,读取训练脚本生成的事件文件。您只需让训练脚本和 日志存储路径 指向同一个目录,无需在 Worker 中手动运行 tensorboard 命令。

如果需要自己控制 TensorBoard 的启动参数、端口和运行时间,请参阅在开发机中运行 TensorBoard 服务

选择日志读取范围

开启 任务可视化 后,每个训练任务使用与该任务关联的 TensorBoard 入口。通常让一个任务读取一个 run 目录,打开看板后即可直接查看本次运行;只有需要集中比较多次运行时,才填写共同的父目录。

查看目标日志读取路径示例打开看板后的结果
当前任务/mnt/shared/tensorboard/${RUN_ID}直接查看本次运行,推荐用于日常训练
多次运行/mnt/shared/tensorboard/TensorBoard 递归发现子目录中的 runs,需在看板中筛选或比较

父目录下的 run 发现和对比由 TensorBoard 提供。AIStudio 不会根据当前任务自动选中父目录中的某个 run,因此不要为了保留历史记录而把每个任务都指向同一个父目录;让每次运行写入独立子目录即可保留历史数据。

注意

也可以使用固定路径

日志存储路径 支持固定绝对路径,例如 /mnt/shared/tensorboard/exp-001。训练代码或 logger 也需要写入同一个目录。本文使用 ${RUN_ID} 是为了在克隆或重跑时只修改一个环境变量,并非平台要求。如果使用固定路径,下一次运行时需要同时修改训练写入路径和 TensorBoard 读取路径。

同一个 run 目录中有多个事件文件仍在写入时,训练任务托管的 TensorBoard 服务会持续读取这些文件。这个行为由平台管理,启动命令不需要添加 TensorBoard 参数。

重要

日志目录必须位于任务挂载的可写共享存储中。训练进程需要能够写入该目录,训练任务托管的 TensorBoard 服务需要能够读取同一路径。写入容器临时目录的日志不会随 Worker 释放而保留。

开始前准备

开始前,请确认:

  • 训练任务已挂载一块可写共享存储,例如挂载到 /mnt/shared
  • 训练环境可以生成 TensorBoard 事件文件;下文的 PyTorch 示例需要 torchtensorboard
  • 每次创建、克隆或重跑任务时使用新的 run 标识,例如 exp-001exp-002

配置并打开 TensorBoard

下面的步骤让训练脚本和 AIStudio 始终从同一个环境变量取得 run 标识,避免克隆或重跑任务后只修改了其中一处路径。

Step 1 让训练脚本写入独立目录

在训练代码中读取 RUN_ID,并把事件文件写入本次运行的目录。环境变量缺失时让脚本直接报错,可以避免多次运行意外写入同一个默认目录。

language-python
import os
from torch.utils.tensorboard import SummaryWriter

run_id = os.environ["RUN_ID"]
log_dir = f"/mnt/shared/tensorboard/{run_id}"

with SummaryWriter(log_dir=log_dir) as writer:
    for step in range(10):
        writer.add_scalar("train/loss", 1 / (step + 1), step)

如果训练框架已经提供 TensorBoard logger,请在框架配置中设置同一个绝对路径,无需另外创建 SummaryWriter

Step 2 使用环境变量同步写入和读取路径

创建训练任务时,完成以下配置:

  1. 挂载训练脚本使用的共享存储,并确保 Worker 中的挂载路径为 /mnt/shared
  2. 环境变量 中添加 RUN_ID=exp-001
  3. 开启 任务可视化
  4. 日志存储路径 中填写 /mnt/shared/tensorboard/${RUN_ID}

AIStudio 会在启动 TensorBoard 服务时替换路径中的 ${RUN_ID}。任务详情中可能仍显示变量写法;打开 TensorBoard 后,可以在页面底部查看服务实际读取的目录。

克隆或重跑任务时,只需把 RUN_ID 改为新的值。训练脚本的写入目录和 TensorBoard 的读取目录会一起变化。

Step 3 从训练任务打开看板

任务进入 运行中 后,可以通过任一入口打开 TensorBoard:

  • 在训练任务列表的操作区域中点击 可视化
  • 在任务详情的 任务可视化 区域中点击 点击跳转

TensorBoard 出现训练脚本写入的指标和 step 后,说明日志写入路径与服务读取路径已经对齐。刚启动训练时如果还没有事件文件或指标,页面可能暂时为空,稍后刷新即可。

比较多次运行

需要在一个看板中比较多次运行时,可以让各次运行继续写入独立子目录,再把 日志存储路径 设置为共同的父目录:

language-text
/mnt/shared/tensorboard/
├── exp-001/
│   └── events.out.tfevents.*
├── exp-002/
│   └── events.out.tfevents.*
└── exp-003/
    └── events.out.tfevents.*

TensorBoard 会递归发现这些 runs。打开看板后,请根据 run 名称筛选需要比较的曲线。父目录中包含大量无关运行时,发现和加载数据可能需要更长时间;此时应缩小到一个实验组的父目录。

修改运行中任务的日志读取路径

运行中的任务如果读取了错误目录,可以在任务详情的 任务可视化 区域修改 日志存储路径。提交后,AIStudio 会重启该任务的 TensorBoard 服务并读取新目录。

修改这里的路径不会改变训练脚本的写入位置。提交前,请确认新路径就是训练脚本正在写入的目录。

任务处于 删除中运行成功运行失败清理中 时,页面不提供修改日志读取路径的操作。

任务结束后查看历史日志

训练任务结束后,训练任务托管的 TensorBoard 服务不再用于查看日志。只要事件文件仍保存在共享存储中,就可以在挂载同一存储的开发机中启动用户自行运行的 TensorBoard 服务。具体步骤见在开发机中运行 TensorBoard 服务

排查日志未显示问题

确认写入路径和读取路径一致

在训练任务中检查 RUN_ID日志存储路径,再到共享存储中查找事件文件:

language-shell
find /mnt/shared/tensorboard -type f -name 'events.out.tfevents.*'

如果事件文件出现在另一个目录,请修改训练脚本的写入路径;任务仍在运行时,也可以按修改运行中任务的日志读取路径调整读取位置。

确认事件文件已经写入

训练刚开始时,writer 可能还没有写出首批指标。正常结束训练时应关闭 writer;使用 with SummaryWriter(...) 可以在代码块结束时自动关闭并刷新事件文件。

避免多个训练进程写入同一个 run

分布式训练中,让一个指定进程写入 TensorBoard 日志。多个进程向同一个 run 目录重复写入相同指标,会产生重复或难以区分的曲线。

进一步了解