如何监控 运行 屏幕会话并在上一个会话结束后开始新会话?

How to monitor running screen session and start a new session once last one ended?

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

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 
python main_broad_FEA.py --hyperparam-json  --GPU  --varstop 

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

的屏幕会话使用的 GPU 启动新的屏幕会话

如何检查我的屏幕会话是否返回以及哪些屏幕会话返回,以便我可以使用 bash 脚本开始下一个屏幕会话?

(注意:如果在 bash 脚本中执行此操作过于复杂,请随时提出合适的替代方案。)

当我在上面提出我的问题时,我把问题复杂化了。

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

#!/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 
    python main_broad_FEA.py --hyperparam-json  --GPU  --varstop 
}
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 第 30 页)
  • ":::" 后跟参数列表(每个作业一个)

如果你想实时监控 运行ning 作业,你可以使用 tmux:

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