2014-09-18 64 views
2

我有一個函數可以在集羣中的多個節點上進行評估。我已經使用MPI4py獲得了簡單的示例,可以在我們的集羣上運行,但希望找到一個使用戶更友好一點的python包(例如實現的map功能),但是還可以更多地控制多少進程產生並在哪個節點上。我見過一些實現map的軟件包,但沒有任何控制每個節點上產生多少進程的軟件包。使用mpi4py發送進程到不同的節點

下面的代碼接近說明我的意思。但是,我沒有用MPI4py這種典型的方式編寫它,而是用map函數編寫它。我是這樣寫的,因爲這最終是我想要實現代碼的方式(使用一個模擬map的模塊),因爲我不太確定如何使用MPI編寫代碼來實現我想要的功能做。

from numpy import * 
from multiprocessing import Pool 

def foo(n): 
    random.seed(n) 
    a = random.randn(1000,1000) 
    b = random.randn(1000,1000) 
    c = dot(a, b) 
    return c.mean() 


if __name__ == '__main__': 
    pool = Pool(processes=4) 
    results = pool.map(foo, range(4)) 
    print results 

爲什麼要控制的發送到每個節點的進程數的原因是,一些的foo內的指令可以是多線程(如dot這將也被鏈接到MKL庫)。

如果我有一個12臺計算機的集羣,每個集羣有兩個核心,我想只發送一個作業到12個節點中的每一個,它將隱含地利用兩個核心。我不想產生24個作業(每個核心一個作業),因爲當兩個進程都嘗試使用兩個核心時,我擔心可能發生線程顛簸。我也不能只產生12個進程,因爲我不能確定它會發送一個到每個節點,而不是2到前6個節點。

首先,這應該是一個主要關注點嗎?運行24個進程而不是12個進程會對性能產生多大影響?

如果它會有所作爲,是否有一個python包將覆蓋MPI4py頂部,並做我在找什麼?

回答

1

我想要同樣的東西,所以我編寫了一個proof of concept,用於跟蹤每臺主機上有多少工作進程處於空閒狀態。如果你有一個將使用兩個線程的工作,那麼它會一直等到主機有兩個閒置的工作人員,將工作分配給其中一個工作人員,並讓其他工作人員保持閒置狀態,直到工作完成。

要指定在每臺主機上啓動多少個進程,請使用a hostfile

的關鍵是根進程從任何其他進程接收消息:

source_host, worker_rank, result = MPI.COMM_WORLD.recv(source=MPI.ANY_SOURCE) 

這樣一來,它只要每個作業完成後發現。然後,當它準備好了,它發出的工作給特定員工:

comm.send(row, dest=worker_rank) 

最後,它告訴所有的工人通過發送None消息關閉:我寫這之後

comm.send(None, dest=worker_rank) 

,我發現jbornschein's mpi4py task pull example。它不處理每個作業的線程數,但我喜歡它爲不同消息類型使用標籤的方式。

相關問題