2013-08-29 71 views
1

我想同時運行多次Python模擬,但在每次運行時參數略有不同。我正在嘗試使用multiprocessing模塊來執行此操作。我開始這樣的代碼,在那裏我有定義爲函數的基本模擬,與參數參數:多處理同時運行的Python腳本

import multiprocessing 
from math import * 

def sim_seq(output_name,input_name,s_val...#more arguments): 
    #do work here 
    output.write(#data) 
    output.close() 
    return 

我也創建與參數的文本文件用於模擬的每次運行,這是我讀和參數下面的循環中,在那裏我試圖用多用:

input_batch=('batch_file.txt') 
if __name__ == '__main__': 
    jobs=[] 
    with open(input_batch) as f: 
     for line in f: 
      line=line.split(' ') 
      for i in line: 
       if i[0]=='o': 
       output_name=str(i[2:]) 
       #read in more parameters from batch_file.txt 
     p = multiprocessing.Process(
      target=sim_seq, 
      args=(output_name,input_name,s_val...#more arguments)) 
     jobs.append(p) 
    for i in jobs: 
     i.start() 

這基本上完成了我想要它做的,它在一次運行三種模擬,各有不同參數。但是,我正在使用的計算機有16個計算節點,每個節點有32個處理器。我想知道如何控制每個模擬運行的位置。例如,我可以告訴每個處理器運行單獨的模擬嗎?我是使用多處理器的新手,我想知道我該如何告訴處理器或哪個節點要做什麼。我可以擁有32個單獨的參數設置,並且可以在自己的處理器上運行每個32個仿真實例,但它們都在同一時間運行嗎?使用多處理,多次同時運行同一個python函數的計算方法最快,但每次運行的參數不同?預先感謝任何意見和建議。

回答

1

(我假設每個計算節點都是一個單獨的機器,有自己的一套核心的。如果你的計算機集羣有某種操作系統,因此他們似乎都認爲本地虛擬化的核心,那麼你可以忽略「多個節點」下方位。)

在一個節點上

multiprocessing模塊本身處理的操作系統的單個實例內的多個進程。如果在一個節點上啓動了top或類似的進程列表,並且它顯示了N個內核,那麼這就是Python模擬可用的內核數量。

在這一約束,但是,您可以生成並根據需要管理儘可能多的進程,並且操作系統將安排他們在使用其正常的進程調度程序可用的核心。所以,在你的情況下,我聽起來應該能夠在單個節點上並行運行32個單獨的模擬。你所需要做的就是設置你的循環來創建32個進程,給它們參數運行,並等到它們全部完成。

如果您有32個以上的模擬運行,您可以設置一個包含32個工人的multiprocessing.Pool,然後在模擬參數列表上使用pool.map將工作分配給每個核心。

多個節點

如果你有超過32個模擬,並且要開始採取在單獨的節點核心(您可能需要登錄到使用ssh或類似的獨立節點)的優勢,那麼理論上你可以使用多處理模塊中的「遠程管理器」來處理這個問題。但是,我建議看看IPython.parallel的強大功能 - 它允許您在多個節點上啓動「處理引擎」,然後使用IPython shell將工作分配給節點。這最終會與上述進程池非常相似,只會利用羣集中所有計算節點上的所有內核。

或者,您可以設置或利用大量現有集羣調度程序(Condor,Sun GridEngine等)中的任何一個在每個處理節點上啓動一次(甚至是32次)模擬。

相關問題