我如何 运行 这个简单的并行循环 bash?
How can I run this simple for loop in parallel bash?
我正在尝试使用不同的参数多次 运行 Rscript,并且我正在使用 bash 脚本来执行此操作(我在尝试 运行 时遇到错误在 R 中与 foreach 和 doParallel 之类的东西并行,但这不是这里的问题)。
我打算用 $sbatch script.sh
(在 hpc 上)调用的脚本如下所示:
#!/usr/bin/bash
#SBATCH --time=48:00:00
#SBATCH --mem=10G
#SBATCH --mail-type=END
#SBATCH --mail-type=FAIL
#SBATCH --mail-user=my@mail.com
cd my_dir
for a in 1 2
do
for b in 1 2 3 4
do
for c in 1 2 3
do
for d in 1 2 3 4
do
for e in 5 10 15 20 30 40 50 75 100 200 300 400 500 750 1000 1250 1500 1750 2000
do
Rscript /hpc/someRscript.R $dist $rlen $trans $meta $init &
done
done
done
done
done
echo done
命令 $sbatch script.sh
使我在大约 40 秒后收到一封电子邮件,告诉我它已完成。我怀疑在这里使用 & 标志是错误的行为。我认为它试图同时做所有事情,这会使计算节点过载。
有没有简单的方法可以将其转换为数组作业?还是有更好的方法让我并行 运行?
要使您的脚本正常工作,您需要
- 使用变量名称
a
、b
、c
等或 $dist
$rlen
$trans
$meta
$init
但不是两者都
- 以
wait
结束脚本,否则 Slurm 会认为您的脚本已完成
所以:
#!/usr/bin/bash
#SBATCH --time=48:00:00
#SBATCH --mem=10G
#SBATCH --mail-type=END
#SBATCH --mail-type=FAIL
#SBATCH --mail-user=my@mail.com
cd my_dir
for dist in 1 2
do
for rlen in 1 2 3 4
do
for trans in 1 2 3
do
for meta in 1 2 3 4
do
for init in 5 10 15 20 30 40 50 75 100 200 300 400 500 750 1000 1250 1500 1750 2000
do
Rscript /hpc/someRscript.R $dist $rlen $trans $meta $init &
done
done
done
done
done
wait
echo done
现在的一个问题是这将创建 1824 个进程并尝试同时 运行 它们。这将是非常低效的。所以你应该使用 srun
在可用的 CPU 数量上“微调度”所有这些进程。请注意,您可能需要使用 --ntasks
.
显式请求一定数量的 CPU
#!/usr/bin/bash
#SBATCH --time=48:00:00
#SBATCH --mem=10G
#SBATCH --mail-type=END
#SBATCH --mail-type=FAIL
#SBATCH --mail-user=my@mail.com
#SBATCH --ntasks=<SOME NUMBER>
cd my_dir
for dist in 1 2
do
for rlen in 1 2 3 4
do
for trans in 1 2 3
do
for meta in 1 2 3 4
do
for init in 5 10 15 20 30 40 50 75 100 200 300 400 500 750 1000 1250 1500 1750 2000
do
srun -n 1 -c 1 --exclusive Rscript /hpc/someRscript.R $dist $rlen $trans $meta $init &
done
done
done
done
done
wait
echo done
此外,如果 GNU Parallel 可用,您可以将脚本简化为
#!/usr/bin/bash
#SBATCH --time=48:00:00
#SBATCH --mem=10G
#SBATCH --mail-type=END
#SBATCH --mail-type=FAIL
#SBATCH --mail-user=my@mail.com
#SBATCH --ntasks=<SOME NUMBER>
cd my_dir
parallel -P SLURM_NTASKS srun -n 1 -c 1 --exclusive Rscript /hpc/someRscript.R ::: 1 2 ::: 1 2 3 4 ::: 1 2 3 ::: 1 2 3 4 ::: 5 10 15 20 30 40 50 75 100 200 300 400 500 750 1000 1250 1500 1750 2000
echo done
将其转换为作业数组并非易事。一小步是以最内层的循环为例(最大的)和 运行 该参数上的数组
#!/usr/bin/bash
#SBATCH --time=48:00:00
#SBATCH --mem=10G
#SBATCH --mail-type=END
#SBATCH --mail-type=FAIL
#SBATCH --mail-user=my@mail.com
#SBATCH --ntasks=<SOME NUMBER>
#SBATCH --array=0-18
cd my_dir
INIT=(5 10 15 20 30 40 50 75 100 200 300 400 500 750 1000 1250 1500 1750 2000)
parallel -P SLURM_NTASKS srun -n 1 -c 1 --exclusive Rscript /hpc/someRscript.R {} ${INIT[$SLURM_ARRAY_TASK_ID]} ::: 1 2 ::: 1 2 3 4 ::: 1 2 3 ::: 1 2 3 4
echo done
您可以 运行 所有组合的数组,前提是您在 Bash 数组中创建它们并使用 $SLURM_ARRAY_TASK_ID
对其进行索引。
我正在尝试使用不同的参数多次 运行 Rscript,并且我正在使用 bash 脚本来执行此操作(我在尝试 运行 时遇到错误在 R 中与 foreach 和 doParallel 之类的东西并行,但这不是这里的问题)。
我打算用 $sbatch script.sh
(在 hpc 上)调用的脚本如下所示:
#!/usr/bin/bash
#SBATCH --time=48:00:00
#SBATCH --mem=10G
#SBATCH --mail-type=END
#SBATCH --mail-type=FAIL
#SBATCH --mail-user=my@mail.com
cd my_dir
for a in 1 2
do
for b in 1 2 3 4
do
for c in 1 2 3
do
for d in 1 2 3 4
do
for e in 5 10 15 20 30 40 50 75 100 200 300 400 500 750 1000 1250 1500 1750 2000
do
Rscript /hpc/someRscript.R $dist $rlen $trans $meta $init &
done
done
done
done
done
echo done
命令 $sbatch script.sh
使我在大约 40 秒后收到一封电子邮件,告诉我它已完成。我怀疑在这里使用 & 标志是错误的行为。我认为它试图同时做所有事情,这会使计算节点过载。
有没有简单的方法可以将其转换为数组作业?还是有更好的方法让我并行 运行?
要使您的脚本正常工作,您需要
- 使用变量名称
a
、b
、c
等或$dist
$rlen
$trans
$meta
$init
但不是两者都 - 以
wait
结束脚本,否则 Slurm 会认为您的脚本已完成
所以:
#!/usr/bin/bash
#SBATCH --time=48:00:00
#SBATCH --mem=10G
#SBATCH --mail-type=END
#SBATCH --mail-type=FAIL
#SBATCH --mail-user=my@mail.com
cd my_dir
for dist in 1 2
do
for rlen in 1 2 3 4
do
for trans in 1 2 3
do
for meta in 1 2 3 4
do
for init in 5 10 15 20 30 40 50 75 100 200 300 400 500 750 1000 1250 1500 1750 2000
do
Rscript /hpc/someRscript.R $dist $rlen $trans $meta $init &
done
done
done
done
done
wait
echo done
现在的一个问题是这将创建 1824 个进程并尝试同时 运行 它们。这将是非常低效的。所以你应该使用 srun
在可用的 CPU 数量上“微调度”所有这些进程。请注意,您可能需要使用 --ntasks
.
#!/usr/bin/bash
#SBATCH --time=48:00:00
#SBATCH --mem=10G
#SBATCH --mail-type=END
#SBATCH --mail-type=FAIL
#SBATCH --mail-user=my@mail.com
#SBATCH --ntasks=<SOME NUMBER>
cd my_dir
for dist in 1 2
do
for rlen in 1 2 3 4
do
for trans in 1 2 3
do
for meta in 1 2 3 4
do
for init in 5 10 15 20 30 40 50 75 100 200 300 400 500 750 1000 1250 1500 1750 2000
do
srun -n 1 -c 1 --exclusive Rscript /hpc/someRscript.R $dist $rlen $trans $meta $init &
done
done
done
done
done
wait
echo done
此外,如果 GNU Parallel 可用,您可以将脚本简化为
#!/usr/bin/bash
#SBATCH --time=48:00:00
#SBATCH --mem=10G
#SBATCH --mail-type=END
#SBATCH --mail-type=FAIL
#SBATCH --mail-user=my@mail.com
#SBATCH --ntasks=<SOME NUMBER>
cd my_dir
parallel -P SLURM_NTASKS srun -n 1 -c 1 --exclusive Rscript /hpc/someRscript.R ::: 1 2 ::: 1 2 3 4 ::: 1 2 3 ::: 1 2 3 4 ::: 5 10 15 20 30 40 50 75 100 200 300 400 500 750 1000 1250 1500 1750 2000
echo done
将其转换为作业数组并非易事。一小步是以最内层的循环为例(最大的)和 运行 该参数上的数组
#!/usr/bin/bash
#SBATCH --time=48:00:00
#SBATCH --mem=10G
#SBATCH --mail-type=END
#SBATCH --mail-type=FAIL
#SBATCH --mail-user=my@mail.com
#SBATCH --ntasks=<SOME NUMBER>
#SBATCH --array=0-18
cd my_dir
INIT=(5 10 15 20 30 40 50 75 100 200 300 400 500 750 1000 1250 1500 1750 2000)
parallel -P SLURM_NTASKS srun -n 1 -c 1 --exclusive Rscript /hpc/someRscript.R {} ${INIT[$SLURM_ARRAY_TASK_ID]} ::: 1 2 ::: 1 2 3 4 ::: 1 2 3 ::: 1 2 3 4
echo done
您可以 运行 所有组合的数组,前提是您在 Bash 数组中创建它们并使用 $SLURM_ARRAY_TASK_ID
对其进行索引。