使用训练任务托管的 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 示例需要
torch和tensorboard; - 每次创建、克隆或重跑任务时使用新的 run 标识,例如
exp-001、exp-002。
配置并打开 TensorBoard
下面的步骤让训练脚本和 AIStudio 始终从同一个环境变量取得 run 标识,避免克隆或重跑任务后只修改了其中一处路径。
Step 1 让训练脚本写入独立目录
在训练代码中读取 RUN_ID,并把事件文件写入本次运行的目录。环境变量缺失时让脚本直接报错,可以避免多次运行意外写入同一个默认目录。
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 使用环境变量同步写入和读取路径
创建训练任务时,完成以下配置:
- 挂载训练脚本使用的共享存储,并确保 Worker 中的挂载路径为
/mnt/shared。 - 在 环境变量 中添加
RUN_ID=exp-001。 - 开启 任务可视化。
- 在 日志存储路径 中填写
/mnt/shared/tensorboard/${RUN_ID}。
AIStudio 会在启动 TensorBoard 服务时替换路径中的 ${RUN_ID}。任务详情中可能仍显示变量写法;打开 TensorBoard 后,可以在页面底部查看服务实际读取的目录。
克隆或重跑任务时,只需把 RUN_ID 改为新的值。训练脚本的写入目录和 TensorBoard 的读取目录会一起变化。
Step 3 从训练任务打开看板
任务进入 运行中 后,可以通过任一入口打开 TensorBoard:
- 在训练任务列表的操作区域中点击 可视化;
- 在任务详情的 任务可视化 区域中点击 点击跳转。
TensorBoard 出现训练脚本写入的指标和 step 后,说明日志写入路径与服务读取路径已经对齐。刚启动训练时如果还没有事件文件或指标,页面可能暂时为空,稍后刷新即可。
比较多次运行
需要在一个看板中比较多次运行时,可以让各次运行继续写入独立子目录,再把 日志存储路径 设置为共同的父目录:
/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 和 日志存储路径,再到共享存储中查找事件文件:
find /mnt/shared/tensorboard -type f -name 'events.out.tfevents.*'如果事件文件出现在另一个目录,请修改训练脚本的写入路径;任务仍在运行时,也可以按修改运行中任务的日志读取路径调整读取位置。
确认事件文件已经写入
训练刚开始时,writer 可能还没有写出首批指标。正常结束训练时应关闭 writer;使用 with SummaryWriter(...) 可以在代码块结束时自动关闭并刷新事件文件。
避免多个训练进程写入同一个 run
分布式训练中,让一个指定进程写入 TensorBoard 日志。多个进程向同一个 run 目录重复写入相同指标,会产生重复或难以区分的曲线。