如何监控正在运行的屏幕会话,并在上次会话结束后启动新会话



为了运行我的神经网络训练,我使用以下脚本启动不同的训练配置:

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

现在,我的机器中有3GPU,我想批量训练更多的网络,即在上一次训练结束后开始下一次训练。因此,我想监控哪些屏幕会话已经关闭,即返回,然后使用刚刚运行的屏幕会话使用的GPU启动新的屏幕会话。

如何检查我的屏幕会话是否返回以及返回了哪个,以便使用bash脚本启动下一个会话

(注意:如果在bash脚本中这样做不必要地更复杂,那么请随时提出合适的替代方案。(

#!/bin/bash
doit() {
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
}
export -f doit
parallel -j 3 {1} {2} {%} {3} ::: a r g 1 ::: a r g 2 ::: a r g 4

说明:

  • "-j 3"定义作业槽的数量
  • "{1}"替换为"arg1"中的相应元素-{2}和{3}也是如此
  • {%}是作业槽号。我们使用它来确定在哪个GPU上运行https://doi.org/10.5281/zenodo.1146014)
  • "::"后面是参数列表(每个作业一个(

如果您想实时监控正在运行的作业,可以使用tmux:

parallel --tmux -j 3 {1} {2} {%} {3} ::: a r g 1 ::: a r g 2 ::: a r g 4

当我在上面提出问题时,我过于复杂了。

我最终使用的解决方案是将touch "$3.GPUFREE"添加到NNrun.sh脚本的末尾。当NNrun.sh脚本终止时,这将创建一个空文件".GPUFREE"。最后,我运行了一个循环,检查是否从我的NNtrain.sh创建了一个".GPUFREE"文件,从而知道哪个GPU被释放了。然后脚本刚刚删除了文件,并在该GPU上开始下一个作业。

最新更新