将YOLO训练进程放至后台的方法-nohup
YOLO训练的脚本文件train.py通常来说如下所示:
import warnings
warnings.filterwarnings('ignore')
from ultralytics import YOLO
from ultralytics.models import RTDETRif __name__ == '__main__':# model = YOLO(r'ultralytics/cfg/models/v8/yolov8x-p2.yaml') # model = YOLO(r"ultralytics/cfg/models/11/yolo11m.yaml")model = YOLO("runs/train/exp5/weights/last.pt")model.train(data=r'Dataset_depth.yaml',cache=False,imgsz=1280,epochs=50,single_cls=False, # 是否是单类别检测batch=4,close_mosaic=10,workers=0,device=0,optimizer='SGD',amp=True,project='runs/train',name='exp',cfg = None)
但是,由于终端意外关闭/断网掉线/电脑没电导致关机,导致训练意外中断。如何实现安全地在服务器上启动长期训练任务,无需保持终端开启,且所有运行信息完整记录?这里就用到nohup命令:
正常情况下启动训练,是在conda环境中激活YOLO环境(我这里的环境名称就是yolo11),然后运行上面的train.py文件:
/home/hairou/anaconda3/envs/yolo11/bin/python /home/hairou/ctc/ultralytics-main/train.py
这里第一部分是python解释器的路径,第二部分是train.py文件的路径。
使用nohup进行训练,只需要将以上命令更改为:
nohup /home/hairou/anaconda3/envs/yolo11/bin/python train.py > train.log 2>&1 &
详细解释如下:
组件 | 作用 | 必要性 |
---|---|---|
nohup | 忽略挂断信号(SIGHUP ),使进程在终端关闭后仍存活 | 必须 |
/home/hairou/anaconda3/envs/yolo11/bin/python | 指定Python解释器的绝对路径(确保使用conda环境的Python) | 关键 |
train.py | 要执行的Python脚本(相对路径) | 必须 |
> train.log | 将标准输出(stdout)重定向到 train.log 文件 | 可选但推荐 |
2>&1 | 将标准错误(stderr)合并到标准输出(即错误日志也写入 train.log ) | 可选但推荐 |
& | 将进程放入后台运行,释放当前终端 | 可选但推荐 |
nohup命令执行流程
-
启动进程:
-
nohup
捕获并忽略终端关闭信号。 -
使用指定conda环境中的Python解释器执行
train.py
。
-
-
日志记录:
-
所有正常输出(如训练进度)写入
train.log
。 -
所有错误信息(如报错)也写入同一日志文件。
-
-
后台运行:
-
命令末尾的
&
使进程在后台运行,终端可继续执行其他命令。
-
关键场景
1. 关闭终端后训练仍持续
即使关闭VS Code或SSH连接,程序仍继续运行。
2. 日志集中管理
所有输出和错误信息集中记录到 train.log
,便于调试:
tail -f train.log # 实时查看日志更新
输出就被全部打印到日志文件中:
3. 避免环境依赖问题
通过绝对路径指定Python解释器,确保:
-
使用正确的conda环境(如
yolo11
)。 -
避免因环境变量未继承导致的
ModuleNotFoundError
(如找不到torch
)。
操作验证
1. 检查进程是否存活
ps aux | grep "python train.py" # 查看进程ID(PID)和状态
2. 强制终止进程
kill -9 <PID> # 替换<PID>为实际进程ID
3. 日志文件监控
watch tail -n 20 train.log # 每隔2秒刷新显示日志末尾20行