如何在Amazon SageMaker运行代码时向Amazon S3存储桶写入调试日志
SageMaker运行循环代码并将调试日志存储到S3的操作方案
1. 前置权限配置
- 找到你运行SageMaker作业所使用的IAM角色,为其附加允许
s3:PutObject、s3:ListBucket操作的权限策略,目标资源指定你用于存储日志的S3存储桶ARN即可。
2. 日志实现方案(二选一即可)
方案A:代码内置日志逻辑,运行中实时同步到S3
适合需要自定义日志格式、循环过程中灵活控制日志同步频率的场景,不需要额外配置其他服务,直接在原有代码中修改即可:
import logging import boto3 from datetime import datetime import os # 初始化日志配置 LOG_FILE = "debug_loop.log" logging.basicConfig( level=logging.DEBUG, format="%(asctime)s - %(levelname)s - %(message)s", handlers=[ logging.FileHandler(LOG_FILE), logging.StreamHandler() # 同时输出到控制台,SageMaker原生运行日志也会留存 ] ) s3_client = boto3.client("s3") S3_BUCKET = "替换为你的S3存储桶名" S3_LOG_PATH = "sagemaker/run_logs/" # 替换为你想要存储的S3路径前缀 # 你的原有复杂循环逻辑 total_step = 10000 # 替换为你的实际循环总步数 for step in range(total_step): try: # 原有循环业务代码写在这里 logging.debug(f"第{step}步处理完成,当前中间结果:xxx") # 替换为你需要打印的调试信息 # 每N步同步一次日志到S3,可根据循环时长调整步长,避免频繁调用S3接口 if step % 200 == 0 or step == total_step - 1: s3_client.upload_file( LOG_FILE, S3_BUCKET, os.path.join(S3_LOG_PATH, f"run_{datetime.now().strftime('%Y%m%d%H%M%S')}.log") ) except Exception as e: logging.error(f"第{step}步处理失败,错误信息:{str(e)}", exc_info=True) # 出错时立即同步最新日志到S3,避免日志丢失 s3_client.upload_file( LOG_FILE, S3_BUCKET, os.path.join(S3_LOG_PATH, f"crash_{datetime.now().strftime('%Y%m%d%H%M%S')}.log") ) raise e
方案B:使用SageMaker原生日志自动转储S3
如果你不想修改原有业务代码,可以直接使用SageMaker自带的日志能力,所有控制台输出会自动同步到CloudWatch Logs,再配置导出规则转储到S3即可:
- 创建SageMaker训练/处理作业时,保持日志相关默认配置开启即可,作业运行期间所有print、控制台输出内容都会自动同步到对应CloudWatch日志组
- 打开CloudWatch控制台,找到对应SageMaker作业的日志组,创建导出任务,设置导出目标为你的S3存储桶即可,也可以配置定期自动导出规则实现自动同步。
3. 注意事项
- 如果循环运行时长超过12小时,建议按小时/固定步长拆分日志文件,避免单日志文件过大导致上传失败
- 调试日志建议打印循环关键参数、中间结果校验值,方便后续问题定位
- 如果在SageMaker Studio交互式环境中运行,需要提前关闭会话自动休眠功能,避免运行中断导致日志丢失
内容的提问来源于stack exchange,提问作者Shashank
相关产品推荐
相关产品推荐

