首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在集群上支持scipy.weave.inline的应用程序中使用MPI?

如何在集群上支持scipy.weave.inline的应用程序中使用MPI?
EN

Stack Overflow用户
提问于 2013-06-18 02:34:19
回答 3查看 276关注 0票数 3

如果在集群上运行的支持MPI的大规模并行应用程序中调用scipy.weave.inline,则每个实例都会访问相同的已编译代码目录:$HOME/.pythonxxCOMPILED。由于显而易见的原因,这是不好的,并且会导致许多错误消息。如何规避这个问题?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-18 20:00:20

我之前对这个问题的看法是:

要么必须使用适当的锁定机制增强scipy.weave.catalog,以便序列化对目录的访问,要么每个实例都必须使用自己的目录。

我选择了后者。scipy.weave.inline函数使用绑定到scipy.weave.inline模块的模块级名称function_catalog的目录。这可以通过查看此模块的代码(https://github.com/scipy/scipy/tree/v0.12.0/scipy/weave)来发现。

现在简单的解决方案是在程序开始时将此名称与其他名称进行配对:

代码语言:javascript
复制
from mpi4py import MPI

import numpy as np

import scipy.weave.inline_tools
import scipy.weave.catalog

import os
import os.path

comm = MPI.COMM_WORLD
rank = comm.Get_rank()
size = comm.Get_size()

catalog_dir = os.path.join(some_path,  'rank'+str(rank))
try:
    os.makedirs(catalog_dir)
except OSError:
    pass

#monkeypatching the catalog
scipy.weave.inline_tools.function_catalog = scipy.weave.catalog.catalog(catalog_dir)

现在inline可以顺利地工作了:每个实例在通用的NFS目录中都有自己的目录。当然,如果同时运行两个不同的并行任务,则此命名方案会中断,但如果目录位于/tmp中,也会出现这种情况。

编辑:正如在上面的注释中提到的,如果多个独立作业并行运行,则此过程仍然存在问题。可以通过向路径名添加随机uuid来解决此问题:

代码语言:javascript
复制
import uuid

u = None
if rank == 0:
    u = str(uuid.uuid4())

u = comm.scatter([u]*size, root=0)

catalog_dir = os.path.join('/tmp/<username>/pythoncompiled',  u+'-'+str(rank))
os.makedirs(catalog_dir)

#monkeypatching the catalog
scipy.weave.inline_tools.function_catalog = scipy.weave.catalog.catalog(catalog_dir)

当然,在计算后删除这些文件会更好:

代码语言:javascript
复制
shutil.rmtree(catalog_dir)

编辑:还有一些额外的问题。存储cpp和o文件的中间目录也有一些问题,因为不同实例的并发访问,所以上述方法必须扩展到该目录:

代码语言:javascript
复制
basetmp = some_path
catalog_dir = os.path.join(basetmp, 'pythoncompiled',  u+'-'+str(rank))
intermediate_dir = os.path.join(basetmp, 'pythonintermediate',  u+'-'+str(rank))

os.makedirs(catalog_dir, mode=0o700)
os.makedirs(intermediate_dir, mode=0o700)

#monkeypatching the catalog and intermediate_dir
scipy.weave.inline_tools.function_catalog = scipy.weave.catalog.catalog(catalog_dir)
scipy.weave.catalog.intermediate_dir = lambda: intermediate_dir

#... calculations here ...

shutil.rmtree(catalog_dir)
shutil.rmtree(intermediate_dir)
票数 1
EN

Stack Overflow用户

发布于 2013-06-18 04:01:04

根据the scipy docs,您可以将编译后的数据存储在一个不在NFS上的目录中(比如/tmp或/scratch,或者您的系统可用的任何目录)。那么你就不必担心你的冲突了。您只需将PYTHONCOMPILED环境变量设置为其他值即可。

票数 1
EN

Stack Overflow用户

发布于 2013-12-04 00:15:07

一种快速的解决方法是在每个节点上使用一个本地目录(例如,韦斯利所说的/tmp ),但如果您有能力,请在每个节点上使用一个MPI任务。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17154381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档