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
相关产品推荐
相关产品推荐

