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

PyTorch/FastAI远程训练时model.fit()日志实时输出问题求助

解决FastAI/PyTorch训练日志实时写入文件的问题

原因分析

Python的标准输出(stdout)默认在输出到终端时采用行缓冲模式,因此每个epoch的日志能实时显示;但当重定向到文件时,会自动切换为块缓冲,只有缓冲区满或程序结束时才会写入文件,这就是你遇到的核心问题。

具体解决办法

1. 启动Python时禁用全局缓冲

直接在启动命令中添加-u参数,强制Python使用无缓冲模式,这是最简单的全局解决方案:

nohup python -u $1 >$2 2>&1 &

添加后,所有print输出和FastAI的训练日志都会实时写入目标文件。

2. 在代码中手动刷新缓冲区

如果不想全局禁用缓冲,可以在训练流程中手动触发刷新。比如在每个epoch结束后调用刷新方法:

import sys
from fastai.vision.all import *

# 示例训练代码
dls = ImageDataLoaders.from_folder(path)
learn = vision_learner(dls, resnet18, metrics=accuracy)
learn.fit_one_cycle(10)
# 每个epoch后强制刷新输出缓冲区
sys.stdout.flush()

也可以自定义FastAI回调,让刷新操作自动执行:

class FlushCallback(Callback):
    def after_epoch(self):
        import sys
        sys.stdout.flush()

learn = vision_learner(dls, resnet18, metrics=accuracy)
learn.fit_one_cycle(10, cbs=FlushCallback())

3. 修改标准输出的缓冲模式

在脚本开头添加以下代码,将stdout强制设置为行缓冲模式,无论输出到终端还是文件都能实时写入:

import sys
# 重新打开stdout文件描述符,设置为行缓冲
sys.stdout = open(sys.stdout.fileno(), 'w', buffering=1)

4. 用系统工具控制缓冲(可选)

借助stdbuf命令从系统层面控制输出缓冲,效果与Python-u参数类似:

nohup stdbuf -oL python $1 >$2 2>&1 &

-oL参数表示将stdout设置为行缓冲模式。


内容的提问来源于stack exchange,提问作者Ranger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 16:42:50