如何监控 运行 屏幕会话并在上一个会话结束后开始新会话?
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
为了 运行 我的神经网络训练,我使用以下脚本开始不同的训练配置:
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