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提供了变量RANKSIZE,其中SIZE是工人的数量,RANK是从0到{}的唯一标识符。 提高执行时间的最简单方法是在每个工作线程上处理examples[RANK::SIZE]。 这是循环负载平衡(dlp_mpi.split_round_robin)。 更高级的负载平衡是dlp_mpi.split_managed,其中一个进程管理负载,并在工人完成最后一个任务后向其分配新任务。在

当一个程序结束时,所有的结果都应该被汇总或写在一个文件中,所有过程之间的通信是必要的。 为此,可以使用dlp_mpi.gathermpi4py.MPI.COMM_WORLD.gather)。此函数将所有数据发送到根进程(这里,pickle用于序列化)。在

作为分割数据的另一种选择,这个包还提供了map样式的并行化(参见开头的示例): 函数dlp_mpi.map_unordered并行调用work_load,并串行执行for主体。 进程之间的通信仅仅是result和从示例中获得第i个示例的索引,即该示例不在进程之间传输。在

运行时

如果没有这个包,您的代码将以串行方式运行。 以下代码片段的执行时间将通过与此包一起运行来演示。 关于颜色:examples = ...是设置代码。 因此,代码和代表执行时间的相应代码块在代码中是蓝色的。在

(Serial Worker)

并行化工作负载(深橙色)的最简单方法是循环分配负载: for example in dlp_mpi.split_round_robin(examples)。 此函数调用等效于for example in examples[dlp_mpi.RANK::dlp_mpi.SIZE]。 因此,工人之间没有通信。 只有当需要对所有数据的结果做一些最终工作(例如计算平均指标)时,才需要进行沟通。 这是通过gather函数完成的。 这个函数在主进程的列表中返回worker结果,而worker进程得到一个None返回值。 根据工作量的不同,循环分配可能是次优的。 请参阅示例块图。 工人1的任务相对较长。 所以这个工人用的时间比其他人多。在

(Round Robin)

为了克服循环分配的限制,此包帮助使用管理器将工作分配给工人。 这样可以优化工人的利用率。 一旦一个工人完成了一个例子,它会向经理请求一个新的,然后分配一个。 注:通信只是要处理哪个示例(即示例的索引),而不是示例本身。在

(Managed Split)

拆分迭代器的另一种方法是使用map函数。 然后在worker上执行该函数,并将返回值发送回管理器。 小心,循环体足够快,否则会成为瓶颈。 你应该只把循环体用于记账,而不是用于实际的工作量。 当worker向管理器发送任务时,管理器发回一个新任务并进入for循环体。 当经理在循环体中时,他不能对其他工人的请求作出反应,请参见方框图:

(Managed Map)

安装

您可以从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)环境中,这可能会引起麻烦。在

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
Java Date作为MyBatis中Oracle SELECT查询的参数[not get Response]   来自两个独立线程的并行java访问队列   如果数据已经存在,java Android Studio SQLite不会将数据插入数据库   mysql java spring项目仅在第一次运行时显示错误,再次运行后运行正常。为什么呢?   java SQL错误:1364,SQLState:HY000字段“rating_id”没有默认值/保存具有onetoone关系的子实体时   Tomcat中无cookie的java支持会话#重复   JAVAlang.RuntimeException:Android Studio   java CheckboxMultipleChice存储在SQL中   Kafka Java SimpleConsumer奇怪的编码   使用Hibernate保存servlet中处理的数据时遇到java错误   JavaSpring在运行时添加数据源   java使用一个类中另一个类的方法   java空值随Spring Rest资源更新   java Spring引导:为什么要使用OncePerRequestFilter?   java Android异步任务重用   java JTextField未按预期填充列?