2016-10-11 398 views
1

我想在slurm上運行一些並行代碼,其中不同進程不需要進行通信。天真地我使用了python的slurm包。但是,似乎我只在一個節點上使用cpu。在slurm上使用python的多處理

例如,如果我有4個節點,每個節點有5個CPU,我將只同時運行5個進程。我怎樣才能告訴多處理在不同的節點上運行?

的Python代碼如下所示

import multiprocessing 

def hello(): 
    print("Hello World") 

pool = multiprocessing.Pool() 
jobs = [] 
for j in range(len(10)): 
    p = multiprocessing.Process(target = run_rel) 
    jobs.append(p) 
    p.start() 

的問題是類似this one,但它並沒有詳細解決。

回答

1

您當前的代碼將在5個處理器上運行10次,在您啓動它的SINGLE節點上運行。它現在與SLURM無關。

您將不得不SBATCH腳本SLURM。

如果你想運行在5個內核與SLURM這個腳本修改腳本是這樣的:其中SLURM是

sbatch my_python_script.py 

#!/usr/bin/python3 

#SBATCH --output=wherever_you_want_to_store_the_output.log 
#SBATCH --partition=whatever_the_name_of_your_SLURM_partition_is 
#SBATCH -n 5 # 5 cores 

import sys 
import os 
import multiprocessing 

# Necessary to add cwd to path when script run 
# by SLURM (since it executes a copy) 
sys.path.append(os.getcwd()) 

def hello(): 
    print("Hello World") 

pool = multiprocessing.Pool() 
jobs = [] 
for j in range(len(10)): 
    p = multiprocessing.Process(target = run_rel) 
    jobs.append(p) 
    p.start() 

然後執行腳本的節點之一安裝

但是,這會將您的工作分配給SINGLE節點,所以速度將與您在單個節點上運行時的速度相同。

我不知道當你只有5個進程時,你爲什麼要在不同的節點上運行它。僅在一個節點上運行會更快。如果您在python腳本的開頭分配多於5個內核,則SLURM將爲您分配更多節點。

+0

感謝您的回答。實際上我想要並行運行大約40個進程,這就是爲什麼我需要使用不同的節點。我會在今晚晚些時候嘗試你的代碼 – physicsGuy

+0

我試過你的方法。但是,python只使用上面代碼的單個節點,而其他所有節點都未使用。有沒有簡單的方法呢? – physicsGuy