【发布时间】:2019-11-12 22:32:55
【问题描述】:
为了运行我的神经网络训练,我使用以下脚本启动不同的训练配置:
NNtrain.sh
#!/bin/bash
echo "Start 1st screen"
screen -dmS NN48001 bash -c '../NNrun.sh NN48001 hyperparam_48_001.json 0 0.5'
echo "Start 2nd screen"
screen -dmS NN480001 bash -c '../NNrun.sh NN480001 hyperparam_48_0001.json 0 0.5'
echo "Start 3rd screen"
screen -dmS NN4800001 bash -c '../NNrun.sh NN4800001 hyperparam_48_00001.json 1 0.5'
echo "Start 4th screen"
screen -dmS NN48000001 bash -c '../NNrun.sh NN48000001 hyperparam_48_000001.json 2 0.5'
NNrun.sh
#!/bin/bash
if [ -f "/opt/anaconda/etc/profile.d/conda.sh" ]; then
. "/opt/anaconda/etc/profile.d/conda.sh"
CONDA_CHANGEPS1=false conda activate PyTorchNN
echo "Activated conda env"
fi
echo $1
python main_broad_FEA.py --hyperparam-json $2 --GPU $3 --varstop $4
现在,我的机器中有 3 个 GPU,并且想批量训练更多网络,即在最后一个训练结束后开始下一次训练。因此,我想监控哪些屏幕会话已关闭(即返回),然后使用刚刚运行的屏幕会话使用的 GPU 启动一个新的屏幕会话。
如何检查我的屏幕会话是否以及哪些会话返回,以便我可以使用 bash 脚本启动下一个会话?
(注意:如果在 bash 脚本中执行此操作不必要地更复杂,那么请随时提出合适的替代方案。)
【问题讨论】:
-
你为什么要使用
screen?脚本是否需要任何手动输入?这看起来像你想使用xargs -P4或 GNUsparallel -
@KamilCuk 谢谢你的回答。我对这两者中的任何一个都没有经验,因此没有想过这样做。我会调查的。
-
@KamilCuk 问题:有没有办法让我连接到各个并行会话并监控进度?由于我正在训练神经网络,每个线程都是计算密集型的,并且可能运行 30 分钟到数天不等,因此希望能够在训练期间检查中间输出,并在出现问题时中止训练,无需中止所有训练。
-
在这种情况下,我说要使用
screen。你需要分别对每项工作做一些事情,所以就是这样。但是您必须自己编写脚本,编写所有逻辑以“检查哪个进程返回,以便您可以启动下一个进程”。如果需要几天时间,我宁愿创建一个插入式 systemd 服务文件,以便我可以轻松管理(停止/重新启动)它,并且 journald 负责日志记录。我想象你也可以在 systemd 中添加插件服务的依赖项,想知道这是否可以一次性创建整个流程树。
标签: linux bash shell gnu-screen