python中mpi的数据级并行性
dlp-mpi的Python项目详细描述
dlp_mpi—python的数据级并行mpi
# python script.pyimporttimeexamples=list(range(10))results=[]forexampleinexamples:# Some heavy workload:# CPU or IOtime.sleep(0.2)result=example# Remember the resultsresults.append(result)# Summarize your experimentprint(sum(results))^{pr2}$
# mpiexec -np 8 python script.pyimporttimeimportdlp_mpiexamples=list(range(10))results=[]defwork_load(example):# Some heavy workload:# CPU or IOtime.sleep(0.2)result=exampleforresultindlp_mpi.map_unordered(work_load,examples):# Remember the resultsresults.append(result)ifdlp_mpi.IS_MASTER:# Summarize your experimentprint(results)
这个包使用mpi4py
来提供实用程序来并行化应用于多个示例的算法。在
核心思想是:启动N
进程,每个进程都在所有示例的子集上工作。
要启动进程,可以使用mpiexec
。大多数HPC系统支持MPI来将工作负载分散到多个主机上。对于该命令,请查看HPC系统的文档并搜索MPI启动。在
由于每个进程应该在不同的示例上运行,MPI提供了变量RANK
和SIZE
,其中SIZE
是工人的数量,RANK
是从0
到{examples[RANK::SIZE]
。
这是循环负载平衡(dlp_mpi.split_round_robin
)。
更高级的负载平衡是dlp_mpi.split_managed
,其中一个进程管理负载,并在工人完成最后一个任务后向其分配新任务。在
当一个程序结束时,所有的结果都应该被汇总或写在一个文件中,所有过程之间的通信是必要的。
为此,可以使用dlp_mpi.gather
(mpi4py.MPI.COMM_WORLD.gather
)。此函数将所有数据发送到根进程(这里,pickle
用于序列化)。在
作为分割数据的另一种选择,这个包还提供了map
样式的并行化(参见开头的示例):
函数dlp_mpi.map_unordered
并行调用work_load
,并串行执行for
主体。
进程之间的通信仅仅是result
和从示例中获得第i
个示例的索引,即该示例不在进程之间传输。在
运行时
如果没有这个包,您的代码将以串行方式运行。
以下代码片段的执行时间将通过与此包一起运行来演示。
关于颜色:examples = ...
是设置代码。
因此,代码和代表执行时间的相应代码块在代码中是蓝色的。在
并行化工作负载(深橙色)的最简单方法是循环分配负载:
for example in dlp_mpi.split_round_robin(examples)
。
此函数调用等效于for example in examples[dlp_mpi.RANK::dlp_mpi.SIZE]
。
因此,工人之间没有通信。
只有当需要对所有数据的结果做一些最终工作(例如计算平均指标)时,才需要进行沟通。
这是通过gather
函数完成的。
这个函数在主进程的列表中返回worker结果,而worker进程得到一个None
返回值。
根据工作量的不同,循环分配可能是次优的。
请参阅示例块图。
工人1的任务相对较长。
所以这个工人用的时间比其他人多。在
为了克服循环分配的限制,此包帮助使用管理器将工作分配给工人。 这样可以优化工人的利用率。 一旦一个工人完成了一个例子,它会向经理请求一个新的,然后分配一个。 注:通信只是要处理哪个示例(即示例的索引),而不是示例本身。在
拆分迭代器的另一种方法是使用map
函数。
然后在worker上执行该函数,并将返回值发送回管理器。
小心,循环体足够快,否则会成为瓶颈。
你应该只把循环体用于记账,而不是用于实际的工作量。
当worker向管理器发送任务时,管理器发回一个新任务并进入for循环体。
当经理在循环体中时,他不能对其他工人的请求作出反应,请参见方框图:
安装
您可以从pypi安装此软件包:
pip install dlp_mpi
要检查安装是否成功,请尝试以下命令:
$ mpiexec -np 4 python -c 'import dlp_mpi; print(dlp_mpi.RANK)'3012
该命令应打印数字0、1、2和3。 顺序是随机的。 当那条线印了4次0时,出了问题。在
当您没有安装mpi
或安装被中断时,可能会发生这种情况。
在基于Debian的Linux中,您可以使用sudo apt install libopenmpi-dev
来安装它。
当您没有使用apt
安装内容的权限时,还可以使用conda
安装{pip install
将从^{mpi4py
。
请小心,来自conda
的安装可能与本地安装的mpi
冲突。
特别是在高性能计算(HPC)环境中,这可能会引起麻烦。在
- 项目
标签: