使用QSUB和Bash脚本运行Keras训练时无法查看进度的问题
解决PBS环境下Keras/TensorFlow训练进度与指标监控问题
在PBS集群环境里跑训练脚本没法直接可视化确实挺头疼的,我给你几个实用的方案,帮你搞定训练监控的问题:
1. 用TensorBoard实时监控(最推荐)
TensorBoard是TensorFlow官方的可视化工具,能完美展示训练损失、准确率、验证指标这些数据,而且支持远程访问,非常适合集群环境。
具体操作:
- 先在你的
U-NET.py里添加TensorBoard回调:
from tensorflow.keras.callbacks import TensorBoard import datetime # 创建带时间戳的日志目录,避免重复覆盖 log_dir = "logs/fit/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S") tensorboard_callback = TensorBoard( log_dir=log_dir, histogram_freq=1, # 定期记录权重直方图 write_graph=True, write_images=True ) # 把回调加入训练流程 history = model.fit( train_B, train_A, epochs=200, batch_size=20, validation_split=0.052631578, shuffle=True, callbacks=[tensorboard_callback] # 新增这一行 )
- 修改Bash脚本,把训练输出重定向到日志文件(方便后续排查问题):
#!/bin/bash #PBS -N Tarea_UNET #PBS -l nodes=1:ppn=4:gpus=1 cd $PBS_O_WORKDIR source $ANACONDA3/activate inictel_uni # 把标准输出和错误输出都写入日志文件 python U-NET.py > training_logs.txt 2>&1
- 训练启动后,在本地机器通过SSH端口转发连接到集群节点:
# 替换成你的集群用户名和节点名称(比如node02) ssh -L 6006:localhost:6006 your_username@cluster_node_name
之后在本地浏览器打开http://localhost:6006,就能看到实时的训练监控界面了。
2. 输出日志到文件,实时查看简单指标
如果暂时不想用TensorBoard,也可以让Keras把训练过程的详细指标打印到文件,然后实时追踪:
操作步骤:
- 调整
model.fit的verbose参数,开启详细输出:
history = model.fit( train_B, train_A, epochs=200, batch_size=20, validation_split=0.052631578, shuffle=True, verbose=1 # verbose=1会打印每个epoch的进度条和指标,verbose=2是简化版输出 )
- 同样用Bash脚本重定向输出到文件(和上面的脚本一样),然后在集群上用
tail命令实时查看:
tail -f training_logs.txt
这样就能看到每个epoch的训练损失、验证损失等指标的实时更新了。
3. 自定义回调函数,监控专属指标
如果是分割任务,你可能需要监控IoU、Dice系数这类自定义指标,这时候可以写一个自定义回调函数:
from tensorflow.keras.callbacks import Callback class CustomMetricsLogger(Callback): def on_epoch_end(self, epoch, logs=None): logs = logs or {} # 按你需要的格式打印指标 print(f"=== Epoch {epoch+1} 结束 ===") print(f"训练损失: {logs.get('loss'):.4f}") print(f"验证损失: {logs.get('val_loss'):.4f}") # 如果有自定义训练指标,比如dice_coeff,也可以打印 # print(f"验证Dice系数: {logs.get('val_dice_coeff'):.4f}") # 把自定义回调加入训练 history = model.fit( train_B, train_A, epochs=200, batch_size=20, validation_split=0.052631578, shuffle=True, callbacks=[CustomMetricsLogger()] )
这个方法能让你灵活控制要监控的内容,输出的信息会直接写入之前的日志文件。
PBS环境小提醒
- 确认集群节点允许SSH端口转发,如果有防火墙限制,可能需要联系管理员开通TensorBoard默认的6006端口。
- 日志文件尽量保存在
$PBS_O_WORKDIR目录下,也就是你提交脚本的目录,方便后续查找。 - 如果训练周期很长,可以直接用PBS自带的日志配置:
#PBS -o output.log、#PBS -e error.log,把输出和错误分别保存,避免断开连接后日志丢失。
内容的提问来源于stack exchange,提问作者Giorgio Luigi Morales Luna
相关产品推荐
相关产品推荐

