如何在远程服务器Docker中使用nohup运行长期GPU训练任务并保留日志
适配你的GPU训练场景的后台运行方案
核心疑问解答
- 无需在每一步都使用nohup,nohup仅需作用于最终的训练任务即可,ssh、docker层面不需要额外添加nohup参数。
- 直接在Docker容器内用nohup启动任务后并非无法退出Docker,默认交互式启动容器的模式下,退出交互终端时容器会默认停止,才会导致内部任务中断,只需调整容器启动和任务运行的方式即可解决该问题。
具体操作步骤(含训练日志留存)
步骤1:ssh连接远程服务器
正常执行ssh连接命令即可:ssh 你的用户名@服务器公网/内网IP
步骤2:后台启动支持GPU的Docker容器
避免直接使用交互式参数启动容器,改为后台运行模式启动容器,保证容器在你断开ssh后仍持续运行:docker run -d --gpus all --name 自定义容器名称 -v 宿主机训练代码/数据目录:容器内对应目录 你的Docker镜像名称 sleep infinity
参数说明:
-d指定容器后台运行,退出ssh也不会终止容器sleep infinity让容器持续保持运行状态,不会执行完默认命令后自动退出- 挂载目录可自行按需配置,建议将训练代码、数据、日志输出目录都放在挂载路径下,避免容器异常时文件丢失。
步骤3:进入容器启动训练任务
执行命令进入运行中的容器:docker exec -it 自定义容器名称 /bin/bash
进入容器后,使用nohup启动训练任务,同时重定向输出到日志文件:nohup 你的训练启动命令 > ./training_log.log 2>&1 &
参数说明:
> ./training_log.log将训练的标准输出写入指定的日志文件,你后续可随时查看迭代准确率等信息2>&1将报错信息也同步写入同一个日志文件,避免异常信息丢失- 末尾的
&让训练任务在容器后台运行
小提示:如果将日志输出路径指定到容器和宿主机的挂载目录下,即使容器后续出现异常崩溃,日志文件也会保留在宿主机上,安全性更高。
步骤4:安全退出链路
运行完nohup命令后,先按Ctrl + C回到容器交互终端,输入exit退出容器,此时容器仍处于后台运行状态,训练任务不会中断,之后直接断开ssh连接即可,本地断网、关机都不会影响服务器上的训练进程。
特殊场景处理
如果你已经通过docker run -it的方式启动了交互式容器,且已经启动了训练任务不想中断,可直接按Ctrl + P + Q组合键,即可退出容器交互界面且不终止容器运行,之后再断开ssh即可,无需重启训练任务。
后续任务查看方式
- 查看训练日志:重新ssh连接服务器后,执行
docker exec -it 自定义容器名称 tail -f ./training_log.log即可实时查看最新的训练输出 - 查看容器运行状态:执行
docker ps即可确认训练容器是否处于正常运行状态 - 查看训练进程状态:进入容器后执行
ps aux | grep 你的训练进程名(如train.py)即可确认训练进程是否正常运行
内容的提问来源于stack exchange,提问作者akalanka
相关产品推荐
相关产品推荐

