4 * 64コアの小さなHPCがあり、SLURMがインストールされています。PythonマルチプロセッシングによるSLURMの結果が一貫しない
ノードである:私はマルチプロセッシングとpythonで小さなスクリプトを書いたSLURMをテストする
sinfo -N -l
Mon Oct 3 08:58:12 2016
NODELIST NODES PARTITION STATE CPUS S:C:T MEMORY TMP_DISK WEIGHT FEATURES REASON
dlab-node1 1 dlab* idle 64 2:16:2 257847 0 1 (null) none
dlab-node2 1 dlab* idle 64 2:16:2 257847 0 1 (null) none
dlab-node3 1 dlab* idle 64 2:16:2 257847 0 1 (null) none
dlab-node4 1 dlab* idle 64 2:16:2 257847 0 1 (null) none
:
import multiprocessing
import os
def func(i):
print(n_procs)
n_procs = int(os.environ['SLURM_JOB_CPUS_PER_NODE'].split('(')[0]) * int(os.environ['SLURM_JOB_NUM_NODES'])
p = multiprocessing.Pool(n_procs)
list(p.imap_unordered(func, [i for i in range(n_procs*2)]))
私はSLURM
でそれを実行するために、次のバッチsh
スクリプトを使用します
#!/bin/bash
#
#SBATCH -p dlab # partition (queue)
#SBATCH -N 2 # number of nodes
#SBATCH -n 64 # number of cores
#SBATCH --mem 250 # memory pool for all cores
#SBATCH -t 0-2:00 # time (D-HH:MM)
#SBATCH -o slurm.%N.%j.out # STDOUT
#SBATCH -e slurm.%N.%j.err # STDERR
python3 asd.py
これは印刷されると期待します。128
256
回をSTDOUTファイルに追加します。私は、この複数回実行する場合
は、しかし、私はラインの非常に異なる量(彼らはすべてが正しい128
が含まれている)私は144行を得た最初の実行のために
、正しいです私は256を得た二時間を(取得します)そして3回目に私は184を得る。
何が問題なの?私はSLURMの設定の中で何かを調べるべきですか、あるいはPython multiprocessing
の中に何か問題がありますか? sbatch manページから
その変数からノードが1つしか得られなくても、私のpythoneコードの変数は定数1になります。その後、マルチプロセスは2つの "反復"を行い、 2つの1を印刷します。これは、一貫性のない結果の数を説明するものではありません。 –
一貫性のない結果が原因である可能性があります。最初のノードに30個のprocsが割り当てられ、2番目のノード34に2個のノードが32個のprocsを取得する場合とは異なる結果が得られます –
なぜですか?すべてのノードが同じことをするので、どのノードに割り当てられているかは関係ありません。 1つのノードは印刷されますが、1つのノードは印刷されません。 –