You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何访问运行中的已提交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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 08:09:03