gpt4 book ai didi

python-3.x - 集群上的 SLURM 和 Python 多处理池

转载 作者:行者123 更新时间:2023-12-04 07:30:16 28 4
gpt4 key购买 nike

我正在尝试在 SLURM 集群(4x raspberry Pi 3)上运行一个简单的并行程序,但没有成功。我一直在阅读它,但我无法让它发挥作用。问题如下:
我有一个名为 的 Python 程序remove_duplicates_in_scraped_data.py .该程序在单个节点(node=1xraspberry pi)上执行,程序内部有一个多处理循环部分,如下所示:

pool = multiprocessing.Pool()
input_iter= product(FeaturesArray_1, FeaturesArray_2, repeat=1)
results = pool.starmap(refact_featureMatch, input_iter)
这个想法是,当它到达程序的那个部分时,它应该分配计算,迭代器中的每个元素一个线程并最终组合结果。
所以,程序 remove_duplicates_in_scraped_data.py 运行一次(不是多次),它在池计算期间产生不同的线程。
在单台机器上(不使用 SLURM)它工作得很好,对于树莓派的特殊情况,它产生 4 个线程,进行计算,将其保存在结果中并作为单线程继续程序。
我想利用 SLURM 集群的所有 16 个线程,但我似乎无法让它工作。而且我确信集群已正确配置,因为它可以在集群的所有 16 个线程中使用 SLURM 运行所有多处理示例(例如计算 pi 的位数)。
现在,查看带有 sinfo -N -l 的 SLURM 配置我们有:
NODELIST   NODES  PARTITION       STATE CPUS    S:C:T MEMORY TMP_DISK WEIGHT AVAIL_FE REASON
node01 1 picluster* idle 4 4:1:1 1 0 1 (null) none
node02 1 picluster* idle 4 4:1:1 1 0 1 (null) none
node03 1 picluster* idle 4 4:1:1 1 0 1 (null) none
node04 1 picluster* idle 4 4:1:1 1 0 1 (null) none
每个集群报告 4 个套接字,1 个核心和 1 个线程,就 SLURM 而言,有 4 个 CPU。
我希望利用所有 16 个 CPU,如果我将我的程序运行为:
srun -N 4 -n 16  python3 remove_duplicates_in_scraped_data.py
它只会在每个节点中运行 4 个主程序副本,从而产生 16 个线程。但这不是我想要的。我想要一个程序实例,然后在集群中生成 16 个线程。至少我们知道使用 srun -N -n 16 集群可以工作。
因此,我尝试按如下方式更改程序:

#!/usr/bin/python3

#SBATCH -p picluster
#SBATCH --nodes=4
#SBATCH --ntasks=16
#SBATCH --cpus-per-task=1
#SBATCH --ntasks-per-node=4
#SBATCH --ntasks-per-socket=1
#SBATCH --sockets-per-node=4

sys.path.append(os.getcwd())

...
...
...
pool = multiprocessing.Pool()
input_iter= product(FeaturesArray_1, FeaturesArray_2, repeat=1)
results = pool.starmap(refact_featureMatch, input_iter)
...
...
并执行它
sbatch remove_duplicates_in_scraped_data.py
slurm作业创建成功,我看到集群上所有节点都分配好了
PARTITION  AVAIL  TIMELIMIT  NODES  STATE NODELIST
picluster* up infinite 4 alloc node[01-04]
该程序开始在 node01 上作为单个线程运行,但是当它遇到并行部分时,它只在 node01 上产生 4 个线程,而在所有其他节点上什么都没有。
我尝试了不同的设置组合,甚至尝试通过脚本运行它
#!/bin/bash


#SBATCH -p picluster
#SBATCH --nodes=4
#SBATCH --ntasks=16
#SBATCH --cpus-per-task=1
#SBATCH --ntasks-per-node=4
#SBATCH --ntasks-per-socket=1
#SBATCH --ntasks-per-core=1
#SBATCH --sockets-per-node=4

python3 remove_duplicates_in_scraped_data.py
但我就是无法让它在其他节点上产生。
你能帮我么?
甚至有可能做到这一点吗?即在集群的不同节点上使用python的多处理池?
如果没有,我还有什么其他选择?
集群还配置了 dask。那能更好地工作吗?
请帮忙,因为我真的坚持这一点。
谢谢

最佳答案

Python 的多处理包仅限于共享内存并行化。它产生了新的进程,这些进程都可以访问单台机器的主内存。
您不能简单地将这样的软件扩展到多个节点上。由于不同的机器没有可以访问的共享内存。
要一次在多个节点上运行您的程序,您应该查看 MPI(消息传递接口(interface))。还有一个python package为了那个原因。
根据您的任务,它也可能适合运行程序 4 次(因此每个节点一个作业)并让它在数据子集上工作。这通常是更简单的方法,但并非总是可行。

关于python-3.x - 集群上的 SLURM 和 Python 多处理池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67975328/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com