集群计算作业资源扩展(环境)的最佳实践?
Best practice for job resource scaling (environment) on cluster computing?
我对在集群上编程还很陌生,很难找到自己的出路。我在 SGE 上使用 bash 集群并使用 OpenMPI。
我有一个任务,我想 运行 我的过程的几个变体,其中唯一的区别是不同的配置,因为我会为我的程序分配更多的资源。举个例子:
#$ -pe openmpi $process_num
在这里,我将 process_num
进程分配给我的工作环境。我希望我的环境发生变化,例如:我想为 process_num
尝试 1、2 和 3,换句话说,我有 3 个变体。我正在考虑提交一个包含这样一个简单循环的 sh
作业:
# ... other environment variable definitions
for process_num in 1 2 3
do
# ... some other environment variable definitions
#$ -pe openmpi $process_num
mpirun ./my_prog -npernode 1
done
换句话说,一个 'packed' 作业将执行我的所有变体并占用资源 allocation/scaling。我想这样我就可以在每次迭代中为我所有的 3 个工作变体分配不同的资源。我想问一下这是否可行,即工作环境是否能够按照描述的方式扩展,或者我是否必须提交 3 个单独的工作?
当然,如果答案是肯定的 - 提交单独的作业,那么当我有大约 50 个这样的配置要尝试时会发生什么?那么提交 50 个(或大量)单独作业的最佳实践方法是什么?
不幸的是,由于集群是共享资源,我无法自由地进行试验。
一项工作 'defined' 取决于它使用的资源。如果要测试三种资源配置,需要提交三个作业。
另一种选择是按顺序分配最大配置和 运行 这三个作业。这就是问题中的脚本所暗示的。但是你会通过分配而不是使用 CPU 来浪费集群资源。
最佳做法是尽可能充分地使用您分配的所有资源。
在前端节点通过脚本提交多个作业很容易。我相信 SGE 使用 qsub
,所以它会类似于 parallel "qsub -pe openmpi {} -v CPUS={} -l n_cpus={} test-job.sh" ::: 1 2 3
。 qsub 的确切语法在很大程度上取决于您的环境。在 test-job.sh
中,您将使用 $CPUS
来正确启动您的 mpi 作业(不确定是否需要这样做,也许正确初始化的 SGE 并行环境 -pe
就足够了)。我使用 parallel
而不是 bash 循环只是因为更好更紧凑的语法,它没有什么区别。
我对在集群上编程还很陌生,很难找到自己的出路。我在 SGE 上使用 bash 集群并使用 OpenMPI。
我有一个任务,我想 运行 我的过程的几个变体,其中唯一的区别是不同的配置,因为我会为我的程序分配更多的资源。举个例子:
#$ -pe openmpi $process_num
在这里,我将 process_num
进程分配给我的工作环境。我希望我的环境发生变化,例如:我想为 process_num
尝试 1、2 和 3,换句话说,我有 3 个变体。我正在考虑提交一个包含这样一个简单循环的 sh
作业:
# ... other environment variable definitions
for process_num in 1 2 3
do
# ... some other environment variable definitions
#$ -pe openmpi $process_num
mpirun ./my_prog -npernode 1
done
换句话说,一个 'packed' 作业将执行我的所有变体并占用资源 allocation/scaling。我想这样我就可以在每次迭代中为我所有的 3 个工作变体分配不同的资源。我想问一下这是否可行,即工作环境是否能够按照描述的方式扩展,或者我是否必须提交 3 个单独的工作?
当然,如果答案是肯定的 - 提交单独的作业,那么当我有大约 50 个这样的配置要尝试时会发生什么?那么提交 50 个(或大量)单独作业的最佳实践方法是什么?
不幸的是,由于集群是共享资源,我无法自由地进行试验。
一项工作 'defined' 取决于它使用的资源。如果要测试三种资源配置,需要提交三个作业。
另一种选择是按顺序分配最大配置和 运行 这三个作业。这就是问题中的脚本所暗示的。但是你会通过分配而不是使用 CPU 来浪费集群资源。
最佳做法是尽可能充分地使用您分配的所有资源。
在前端节点通过脚本提交多个作业很容易。我相信 SGE 使用 qsub
,所以它会类似于 parallel "qsub -pe openmpi {} -v CPUS={} -l n_cpus={} test-job.sh" ::: 1 2 3
。 qsub 的确切语法在很大程度上取决于您的环境。在 test-job.sh
中,您将使用 $CPUS
来正确启动您的 mpi 作业(不确定是否需要这样做,也许正确初始化的 SGE 并行环境 -pe
就足够了)。我使用 parallel
而不是 bash 循环只是因为更好更紧凑的语法,它没有什么区别。