CloudWatch仅捕获SageMaker训练任务最后一个输出指标如何解决
问题修复方案
核心原因
- 训练脚本使用了覆盖式动态输出(比如tqdm进度条内刷新、
\r回车符回退行首),所有损失值输出在同一日志行,SageMaker仅会捕获该行最后一次刷新的内容 - Python打印缓冲未主动刷新,多个输出被合并为单条日志
- 正则表达式未兼容打印行前后的其他内容(如epoch、step编号、时间戳等),导致只有完全匹配的行被捕获
修复步骤
- 修改训练脚本的损失打印逻辑,禁用覆盖式输出,确保每一条损失记录单独占一行。打印时主动刷新输出缓冲,示例写法:
# 训练阶段损失打印 print(f"Train Loss:{train_loss:.6f}", flush=True) # 验证阶段损失打印 print(f"Val Loss:{val_loss:.6f}", flush=True)
- 更新评估器中的
metric_definitions正则规则,兼容打印行前后的任意字符:
from sagemaker.pytorch import PyTorch estimator = PyTorch( entry_point="train.py", source_dir=source_dir, role=role, framework_version=framework_version, py_version="py3", train_instance_count=1, train_instance_type=instance_type, hyperparameters=hyperparameters, metric_definitions=[ {"Name": "train:loss", "Regex": ".*Train Loss:([0-9\\.]+).*"}, {"Name": "val:loss", "Regex": ".*Val Loss:([0-9\\.]+).*"}, ], enable_sagemaker_metrics=True )
- 重新提交训练任务,即可在CloudWatch指标和
TrainingJobAnalytics查询结果中看到所有历史损失值记录,对应时间戳也会正常显示。
内容的提问来源于stack exchange,提问作者user16485802
相关产品推荐
相关产品推荐

