集群计算作业资源扩展(环境)的最佳实践?

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 循环只是因为更好更紧凑的语法,它没有什么区别。