簡體   English   中英

如何在群集上的MPI應用程序中使用scipy.weave.inline?

[英]How can scipy.weave.inline be used in a MPI-enabled application on a cluster?

如果在一個大型並行MPI啟用的應用程序中調用scipy.weave.inline,該應用程序在具有所有節點通用的主目錄的集群上運行,則每個實例都會訪問編譯代碼的相同目錄:$ HOME / .pythonxx_compiled。 由於明顯的原因這很糟糕,並導致許多錯誤消息。 如何規避這個問題呢?

根據scipy文檔 ,您可以將編譯的數據存儲在不在NFS共享上的目錄中(例如/ tmp或/ scratch或您的系統可用的任何內容)。 那你就不用擔心你的沖突了。 您只需要將PYTHONCOMPILED環境變量設置為其他內容。

我之前對此問題的看法:

scipy.weave.catalog必須使用適當的鎖定機制進行增強,以便序列化對目錄的訪問,或者每個實例都必須使用自己的目錄。

我選擇了后者。 scipy.weave.inline函數使用一個目錄,該目錄綁定到scipy.weave.inline模塊的模塊級名稱function_catalog 這可以通過查看該模塊的代碼( https://github.com/scipy/scipy/tree/v0.12.0/scipy/weave )來發現。

簡單的解決方案現在是在程序開始時將此名稱單個化為其他名稱:

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來解決:

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)

當然,在計算之后刪除這些文件會很好:

shutil.rmtree(catalog_dir)

編輯 :還有一些其他問題。 由於來自不同實例的同時訪問,存儲cpp和o文件的中間目錄也存在一些問題,因此上述方法必須擴展到此目錄:

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)

一個快速的解決方法是在每個節點上使用本地目錄(例如Wesley所說的/ tmp),但如果您有容量,則每個節點使用一個MPI任務。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM