如何在Python中以并行子进程启动Tensorboard dev用于Slurm训练监控
问题根因
你之前的所有尝试失败核心是三个共性问题:
- 传参错误:
subprocess.Popen列表传参模式下,每个命令参数必须单独作为列表元素,不需要手动加单引号做转义,额外的引号会被识别为路径/参数的一部分,直接导致TensorBoard找不到对应的日志目录 - 输出未重定向:非交互式Slurm环境没有终端挂载,子进程如果持续输出日志到stdout/stderr,缓冲区满后会被系统挂起,甚至触发Slurm的资源限制规则被直接取消
subprocess.run本身是同步阻塞调用,会等待子进程结束才返回,必然会阻塞后续训练逻辑执行
可行实现方案
import subprocess import os from pathlib import Path mod = "SomeModelType" logdir = "/some/directory/used/in/Tensorboard/callback" PARAMETERS = "Some line of text describing the training settings" # 提前创建日志目录,避免TensorBoard启动失败 Path(logdir).mkdir(parents=True, exist_ok=True) # 把子进程输出重定向到/dev/null,避免缓冲区溢出 with open(os.devnull, 'w') as devnull: tb_process = subprocess.Popen( [ "/pfs/data5/home/kit/ifgg/mp3890/.local/bin/tensorboard", "dev", "upload", "--logdir", logdir, "--name", f"Myname_{mod}", "--description", PARAMETERS, # 可选配置:调整上传间隔,默认是10秒,可按需修改降低资源占用 "--upload_interval", "30" ], stdout=devnull, stderr=devnull, # 子进程和主进程会话分离,避免Slurm会话结束时直接清理上传进程 start_new_session=True ) # ---------------------- # 此处放你原本的CNN训练代码 # ---------------------- # 训练结束后主动停止TensorBoard进程,避免产生僵尸进程占用集群资源 tb_process.terminate() try: tb_process.wait(timeout=10) except subprocess.TimeoutExpired: tb_process.kill()
可选Slurm作业配置优化
如果调整后仍然出现作业被取消的情况,可以在你的Slurm提交脚本中增加少量资源配额:
- 给作业多分配1核CPU、200M内存,TensorBoard上传进程本身资源占用极低,避免被集群的资源超限规则误杀
- 不要添加过于严格的IO限制,避免日志上传被阻塞
内容的提问来源于stack exchange,提问作者Manuel Popp
相关产品推荐
相关产品推荐

