当前位置: 首页 > 知识库问答 >
问题:

如何使用slurm使用worker/master概念在不同的节点上运行不同的独立并行作业?

陶高扬
2023-03-14

我有一个使用master/salve概念进行并行化的程序。有一个主目录和多个辅助目录。我应该首先在主目录中运行执行文件,然后转到工作目录并在每个目录中运行工作执行文件。主控器等待工人完成他们的工作,并将结果发送给主控器以进行进一步的计算。工作目录的作业是相互独立的,因此它们可以在不同的机器(节点)上运行。主程序和工作程序使用TCP/IP communications Protoco相互通信。
我在一个有16个节点的集群上工作,每个节点有28个内核,带有slurm job Manager。我可以运行我的工作与20个工人在一个节点上总共罚款。目前,我的slurm脚本如下所示:

#!/bin/bash
#SBATCH -n 1               # total number of tasks requested
#SBATCH --cpus-per-task=18 # cpus to allocate per task
#SBATCH -p shortq            # queue (partition) -- defq, eduq, gpuq.
#SBATCH -t 12:00:00        # run time (hh:mm:ss) - 12.0 hours in this.

cd /To-master-directory
master.exe /h :4004 &
MASTER_PID=$!

cd /To-Parent 
# This is the directory that contains all worker (wrk)directories

parallel -i bash -c "cd {} ; worker.exe /h 127.0.0.1:4004" -- 
wrk1 wrk2 wrk3 wrk4 wrk5 wrk6 wrk7 wrk8 wrk9 wrk10 wrk11 wrk12 wrk13 wrk14 
wrk15 wrk16 wrk17 wrk18 wrk19 wrk20
kill ${MASTER_PID}

我想知道如何修改这个脚本,以便在多个节点之间划分在workers上运行的作业。例如,与wrk1到wrk5相关联的作业在节点1上运行,与wrk6到wrk10相关联的作业在节点2上运行,等等?

共有1个答案

薛弘壮
2023-03-14

首先,您需要让Slurm为您的作业分配不同的节点,因此您需要删除--cpus-per-task选项,而是请求18个任务。

其次,您需要获得主程序运行的主机名,因为127.0.0.1在多节点设置中不再有效。

第三,只需在调用paralle中的bash之前添加srun。使用--exclusion-n1-c1,它将把parallel生成的worker的每个实例分派给分配中的每个CPU。它们可能在同一个节点上,也可能在其他节点上。

#!/bin/bash
#SBATCH -n 18               # total number of tasks requested
#SBATCH -p shortq            # queue (partition) -- defq, eduq, gpuq.
#SBATCH -t 12:00:00        # run time (hh:mm:ss) - 12.0 hours in this.

cd /To-master-directory
master.exe /h :4004 &
MASTER_PID=$!
MASTER_HOSTNAME=$(hostname)

cd /To-Parent 
# This is the directory that contains all worker (wrk)directories

parallel -i srun --exclusive -n 1 -c 1 bash -c "cd {} ; worker.exe /h $MASTER_HOSTNAME:4004" -- 
wrk1 wrk2 wrk3 wrk4 wrk5 wrk6 wrk7 wrk8 wrk9 wrk10 wrk11 wrk12 wrk13 wrk14 
wrk15 wrk16 wrk17 wrk18 wrk19 wrk20
kill ${MASTER_PID}
 类似资料:
  • 当将master设置为local[*]时,我已经能够在IntelliJ Idea中成功运行Spark应用程序。然而,当我将master设置为Spark的单独实例时,会发生异常。 下面是我尝试执行的SparkPi应用程序。 这是我的身材。sbt内容: 以下是我的plugins.sbt内容: 通过在同一台机器上的不同命令提示中使用以下命令,我执行了Spark Master和worker。 [主人和工人

  • 我有一个多分支管道架构的以下Jenkinsfile 我试图在Ubuntu和Red Hat节点上并行运行“构建”阶段,而仅在Ubuntu节点上运行“测试”阶段。 任何人都可以帮助我指定如何选择在哪些节点上运行哪些阶段。我在网上找到的解决方案很少,但他们建议重写构建阶段两次:一次用于Red Hat节点,另一次用于Ubuntu节点。难道没有办法在没有代码重复的情况下做到这一点吗? 非常感谢

  • 我们在银行有100个账户和两个办事员,作为线程实现,他们使用同步方法transferMoney将每1000倍的资金从accountNumberFrom账户转移到accountNumberTo账户。由于所有账户都以余额0开头,并且从一个账户取回的资金被转移到另一个账户,因此在所有交易之后,余额应该为零。大多数时候都是这样,但并不总是这样。虽然很少发生,但有时交易后的余额不等于0。怎么了?

  • 我不想允许相同类型(相同存储库)的两个作业在同一节点上并行运行。 如何在Jenkinsfile中使用groovy做到这一点?

  • 问题内容: 我已经研究了很多关于Java线程的教程,但是找不到答案。 我的问题是:如何同时运行两个独立的线程? 我的情况是:我有两个任务; 保存一些数据到数据库 在移动设备上发送推送通知。 由于这两个任务是独立的,因此我想同时执行它们。 我尝试使用具有两个线程的线程池,但是问题是数据库任务很快完成,但是发送推送通知需要一些时间。 因此,当一个任务完成而另一个任务仍未完成时,它将引发异常。 我的代码

  • 我搜索过相同的内容,但面临失败。是否有其他工具可以有效地用于在多个节点上运行脚本?