2017-06-17 18 views
3

我試圖在使用SLURM的集羣上運行粒子羣優化問題,並使用由單核心matlab進程管理的優化算法。每個粒子評估都需要在兩個Python程序之間交替進行多個MPI調用,直到結果收斂。每個MPI呼叫最多需要20分鐘。與SLURM和有限資源並行地運行MPI調用隊列

我最初很天真地將每個MPI調用作爲一個單獨的SLURM作業提交,但由此產生的排隊時間使得它比本地串行運行每個作業要慢。我現在試圖找出提交N節點作業的方法,該作業將持續運行MPI任務以利用可用資源。 matlab進程將使用文本文件標誌來管理這項工作。

下面是一個僞代碼bash的文件,該文件可能有助於解釋什麼,我想在一個較小的規模做到:

#!/bin/bash 

#SBATCH -t 4:00:00 # walltime 
#SBATCH -N 2 # number of nodes in this job 
#SBATCH -n 32 # total number of processor cores in this job 

# Set required modules 
module purge 
module load intel/16.0 
module load gcc/6.3.0 

# Job working directory 
echo Working directory is $SLURM_SUBMIT_DIR 
cd $SLURM_SUBMIT_DIR 
echo Running on host `hostname` 
echo Time is `date` 
echo Directory is `pwd` 

# Run Command 
while <"KeepRunning.txt」 == 1> 
do 
    for i in {0..40} 
    do 
    if <「RunJob_i.txt」 == 1> 
    then 
     mpirun -np 8 -rr -f ${PBS_NODEFILE} <job_i> & 
    fi 
    done 
done 

wait 

這種方法是行不通的(只是崩潰),但我不」不知道爲什麼(可能會過度使用資源?)。我的一些同行建議使用parallelsrun,但據我所知,這需要我分批調用MPI功能。這將是一個巨大的資源浪費,因爲很大一部分運行很快完成或失敗(這是預期的行爲)。這個問題的一個具體例子是開始一批5個8核心工作,其中4個立即崩潰;現在32核心將無所事事,而第五項工作等待20分鐘才能完成。

由於優化可能需要5000個以上的mpi調用,任何提高效率都會使絕對壁掛時間產生巨大差異。有人對我如何在大型SLURM作業上運行持續的MPI調用流有任何建議嗎?我真的很感激任何幫助。

+0

除非給定的MPI運行不到幾秒鐘,一個選擇是創建一個SLURM預訂,然後只需提交預訂裏面你們的工作(一旦預留處於活動,你的工作不會花費任何時間在排隊) –

+0

@GillesGouaillardet這是一個我沒有意識到的選項,謝謝!看起來我可能沒有權限在我們的羣集上執行此操作,但我會盡力在明天將其整理出來。作爲替代,我認爲gnu sem也可能工作。對於hpc還是新的。 – user8176985

回答

0

一些事情:在SLURM下你應該使用srun,而不是mpirun。 第二件事是您提供的僞代碼在不等待任何完成信號的情況下啓動無限數量的作業。你應該嘗試把等待入內循環,這樣你就推出只是一組作業,等待他們完成,評估條件和,也許,啓動下一組的工作:

#!/bin/bash 
#SBATCH -t 4:00:00 # walltime 
#SBATCH -N 2 # number of nodes in this job 
#SBATCH -n 4 # total number of tasks in this job 
#SBATCH -s 8 # total number of processor cores for each task 

# Set required modules 
module purge 
module load intel/16.0 
module load gcc/6.3.0 

# Job working directory 
echo Working directory is $SLURM_SUBMIT_DIR 
cd $SLURM_SUBMIT_DIR 
echo Running on host `hostname` 
echo Time is `date` 
echo Directory is `pwd` 

# Run Command 
while <"KeepRunning.txt」 == 1> 
do 
    for i in {0..40} 
    do 
    if <「RunJob_i.txt」 == 1> 
    then 
     srun -np 8 --exclusive <job_i> & 
    fi 
    done 
    wait 
    <Update "KeepRunning.txt」> 

done 

保重也是區分任務和核心。 -n表示將使用多少任務,-c表示每個任務將分配多少個cpus。

我寫會在後臺工作41推出(從0到40,含稅),但一旦資源可用(--exclusive),他們纔開始的代碼,等待,而他們都被佔用。每個作業將使用8個CPU。您將等待它們完成,並且我假設您將在該輪後更新KeepRunning.txt。