Slurm作业中同时运行TensorBoard与深度学习训练脚本的最优方案问询
问题根因
- 初始脚本中
tensorboard命令默认前台运行,会阻塞后续训练脚本执行,必须手动终止进程才会继续执行后续逻辑。 - 修改后的脚本未限制
srun的任务数,由于你配置了--ntasks-per-node=6,srun默认会为命令分配所有可用任务槽,相当于同时启动6个TensorBoard实例抢占同一端口,因此出现端口占用报错。
最优解决方案
你可以通过限制单命令任务数、后台运行、自动分配端口、进程自动清理的逻辑实现两个服务并行运行,修改后的完整脚本如下:
#!/bin/bash -l #SBATCH -N 1 #SBATCH --ntasks-per-node=6 #SBATCH --mem-per-cpu=5GB #SBATCH --gres=gpu:1 # 仅启动1个TensorBoard实例,后台运行 # --port=0 参数会让TensorBoard自动选择可用端口,避免和其他用户的服务冲突 srun --ntasks=1 tensorboard --logdir=runs --port=0 & # 记录TensorBoard进程PID,用于后续清理 TB_PID=$! # 等待3秒确保TensorBoard启动完成 sleep 3 # 输出TensorBoard运行端口,方便后续端口转发访问 echo "TensorBoard 运行端口: $(lsof -a -p $TB_PID -i 4 -P | grep LISTEN | awk '{print $9}' | cut -d: -f2)" # 启动训练脚本,分配剩余5个任务槽 srun --ntasks=5 python3 trainloop.py # 训练结束后主动终止TensorBoard进程,避免节点残留无用进程 kill $TB_PID
附加说明
- 如果你使用的集群计算节点无法直接对外访问,你可以在本地执行SSH端口转发命令访问TensorBoard:
ssh -L 本地自定义端口:计算节点IP:上述输出的TensorBoard端口 集群账号@集群登录地址,执行后在本地浏览器打开localhost:本地自定义端口即可查看训练日志。 - 注意TensorBoard的日志路径参数为
--logdir=runs,使用冒号分隔会导致参数识别错误,无法正常加载日志。
内容的提问来源于stack exchange,提问作者Jarartur
相关产品推荐
相关产品推荐

