如何访问运行中的已提交Kaggle kernel以实时监控Python代码执行
Kaggle运行中Kernel单进程下实时监控解决方案
方案1:主线程内置日志捕获(无额外开销)
直接在现有Python进程的主线程中嵌入日志采集逻辑,无需启动新进程。通过重定向sys.stdout/sys.stderr实现所有运行输出的实时落盘,完全符合Kaggle单进程运行限制:
import sys from datetime import datetime class RealTimeLogger: def __init__(self, original_stream, log_path="/kaggle/working/runtime.log"): self.original_stream = original_stream # 开启行缓冲,输出内容立刻写入磁盘 self.log_file = open(log_path, "a", buffering=1) def write(self, text): # 保留原控制台输出,不影响Kernel原生显示逻辑 self.original_stream.write(text) if text.strip(): self.log_file.write(f"[{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}] {text}") def flush(self): self.original_stream.flush() self.log_file.flush() # 替换标准输出、错误输出流 sys.stdout = RealTimeLogger(sys.stdout) sys.stderr = RealTimeLogger(sys.stderr)
所有print输出、异常栈、第三方库打印信息都会自动同步写入/kaggle/working/runtime.log,可随时打开该文件查看运行进度。
方案2:协程异步指标采集(兼容业务逻辑)
如果需要同步采集内存、GPU使用率、训练迭代进度等监控指标,可使用asyncio协程在单进程内并行运行监控逻辑,不会触发多进程限制:
import asyncio import psutil import GPUtil from datetime import datetime # 全局变量存储业务运行状态,业务代码中实时更新 current_epoch = 0 current_loss = 0.0 async def monitor_task(): while True: # 采集系统资源指标 mem_usage = psutil.virtual_memory().percent gpu_usage = GPUtil.getGPUs()[0].load * 100 if GPUtil.getGPUs() else 0 # 写入监控日志 with open("/kaggle/working/metrics.log", "a", buffering=1) as f: f.write(f"{datetime.now().isoformat()}, Epoch:{current_epoch}, Loss:{current_loss:.4f}, MEM:{mem_usage}%, GPU:{gpu_usage}%\n") # 自定义采集间隔,单位秒 await asyncio.sleep(30) # 启动协程监控任务,不会阻塞主线程业务代码 loop = asyncio.get_event_loop() loop.create_task(monitor_task())
在业务代码的迭代间隙(比如每训练完一个epoch)添加await asyncio.sleep(0)主动让出CPU时间片,即可保证监控协程正常运行。
方案3:信号触发状态快照(轻量按需查询)
仅需要临时查看运行状态时,可自定义信号处理函数,触发后自动导出当前运行的关键信息,全程无额外常驻逻辑:
import signal import os # 全局变量存储业务运行状态,业务代码中实时更新 current_step = 0 avg_loss = 0.0 def export_runtime_state(signum, frame): with open("/kaggle/working/current_state.txt", "w") as f: f.write(f"当前迭代步数: {current_step}\n平均损失值: {avg_loss:.4f}\n") print("运行状态已导出到working目录") # 注册用户自定义信号处理逻辑 signal.signal(signal.SIGUSR1, export_runtime_state)
需要查看状态时,在Kernel的控制台执行os.kill(os.getpid(), signal.SIGUSR1)即可触发状态导出,无需中断业务代码运行。
注意:所有日志、状态文件需存储在
/kaggle/working目录下,仅该目录具备写入权限。
内容的提问来源于stack exchange,提问作者Rumesh Madhusanka
相关产品推荐
相关产品推荐

