如何让SageMaker日志在CloudWatch可见并实现单单元格使用追踪
SageMaker 笔记本日志输出到CloudWatch及单元格追踪方案
一、让print/logging日志正常显示在CloudWatch的方法
- 首先确认SageMaker Notebook实例的IAM角色权限:必须附加CloudWatch日志相关权限,可手动给角色新增允许
logs:CreateLogStream、logs:PutLogEvents的权限策略,SageMaker默认的日志组路径为/aws/sagemaker/NotebookInstances,对应实例名下的jupyter.log就是Jupyter内核的输出流采集日志。 - logging模块配置调整:logging默认日志级别为WARNING,info/debug级别的日志不会输出,需要显式指定日志级别并绑定输出流到stdout,参考配置:
import logging import sys logging.basicConfig( level=logging.INFO, stream=sys.stdout, format='%(asctime)s - %(levelname)s - %(message)s' )
- print输出特殊处理:Jupyter内核默认会缓存stdout输出,要实现日志即时上报可以给print加上
flush=True参数,示例:print("当前单元格执行开始", flush=True);如果需要全 notebook 关闭输出缓存,可以在任意单元格执行%autoflush 1魔法命令。 - 日志验证:执行输出操作后,进入CloudWatch控制台打开对应日志组下的
jupyter.log流,即可查询到打印和logging输出的内容。
二、无需print/logging的单元格使用情况追踪方案
- 自定义Jupyter单元格魔法函数:可以写一个全局的单元格执行装饰器,自动在单元格执行前后采集耗时、执行状态、内容哈希等元数据上报到CloudWatch,不需要在每个单元格手动加打印代码,简易实现示例:
from IPython.core.magic import register_cell_magic import boto3 import time from datetime import datetime cw_logs = boto3.client('logs') LOG_GROUP = '/aws/sagemaker/NotebookInstances/<替换为你的实例名>' LOG_STREAM = 'cell-tracking.log' # 可自定义日志流名称 @register_cell_magic def track_cell(line, cell): start_time = time.time() timestamp = int(datetime.now().timestamp() * 1000) status = "success" try: exec(cell) except Exception as e: status = f"failed: {str(e)}" raise finally: duration = round(time.time() - start_time, 2) # 上报追踪日志到CloudWatch cw_logs.put_log_events( logGroupName=LOG_GROUP, logStreamName=LOG_STREAM, logEvents=[ { 'timestamp': timestamp, 'message': f"单元格执行完成 | 耗时: {duration}s | 状态: {status} | 内容哈希: {hash(cell)}" } ] )
后续需要追踪的单元格开头加上%%track_cell即可自动上报执行数据。
- 配置SageMaker Notebook生命周期脚本:可以在实例的生命周期配置的启动脚本中安装Jupyter全局扩展,hook所有单元格的执行事件,无需用户在单元格内加任何代码,即可自动收集全实例所有单元格的执行元数据上报到CloudWatch,适合团队共享实例的统一管控场景。
- 直接使用CloudTrail审计日志:SageMaker默认会把所有Notebook的单元格执行、修改操作上报到CloudTrail,如果只需要追踪执行用户、执行时间、操作行为,不需要自定义输出内容,直接查询CloudTrail对应的事件即可,无需额外开发。
内容的提问来源于stack exchange,提问作者Nour
相关产品推荐
相关产品推荐

