2017-06-17 4 views
3

SLURMを使用するクラスタでParticle Swarm Optimizationの問題を実行しようとしていますが、最適化アルゴリズムはシングルコアのmatlabプロセスで管理しています。各パーティクルの評価には、結果が収束するまで2つのPythonプログラムを交互に繰り返す複数のMPI呼び出しが必要です。各MPIコールには最大20分かかります。SLURMと限られたリソースと並行してMPI呼び出しのキューを実行する

各MPI呼び出しを別々のSLURMジョブとして最初に提出しましたが、その結果待ち行列の時間が各ジョブをローカルでローカルに実行するよりも遅くなりました。私は現在、利用可能なリソースを利用するためにMPIタスクを継続的に実行するNノードジョブを提出する方法を見つけようとしています。 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コアは何もしていないが、5回目の仕事が終わるまで20分待つ。

最適化には5000mpi以上のコールが必要になる可能性があるため、効率を上げると絶対ウォールタイムに大きな違いが生じます。 SLIMの大きな仕事でMPIコールをどのように流すことができるのか、誰にもアドバイスがありますか?私は本当に助けていただければ幸いです。

+0

特定のMPI実行が数秒未満でない限り、オプションはSLURM予約を作成し、この予約内でジョブを送信することです(予約がアクティブになると、ジョブはキュー内で) –

+0

@GillesGouaillardetそれは私が気づいていなかったオプションです、ありがとう!私はクラスターでそれを行う許可を得ていないかもしれないように見えますが、私は明日それを整理しようとします。代わりに、私はgnu semもうまくいくかもしれないと思います。まだhpcに新しい。 – user8176985

答えて

0

SLURMでは、mpirunではなくsrunを使用する必要があります。 2番目の点は、入力した疑似コードが、完了信号を待たずに無限の数のジョブを起動することです。あなたは彼らが、仕上がり状態を評価し、多分、仕事の次のセットを起動するのを待つ、あなたが仕事のセットだけを起動して、内側のループに待ち時間を入れてみてください:

#!/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は、タスクごとに割り当てられるCPUの数を指定します。

私が書いたコードは、バックグラウンド41のジョブ(0から40まで)で起動しますが、リソースが使用可能になった時点で開始されます(--exclusive)。各ジョブは8つのCPUを使用します。あなたはそれらが終了するのを待つでしょう、私はあなたがそのラウンドの後にKeepRunning.txtを更新することを前提とします。

関連する問題