우리는 4 * 64 코어의 작은 HPC를 가지고 있으며 SLURM이 설치되어 있습니다.파이썬 다중 처리를 사용하는 SLURM은 일관성없는 결과를 나타냅니다.
노드는 다음과 같습니다
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
스크립트를 사용
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
내가 멀티와 파이썬에 약간의 스크립트를 쓴 SLURM을 테스트하려면
#!/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
를 포함) i가 144 선을 가지고 첫 번째 실행을 위해
, 올바른 내가 256을 가지고 두 번째 시간을 (얻을) 그리고 세 번째로 184가됩니다.
무엇이 문제입니까? SLURM 구성 내에서 무언가를 조사해야합니까, 아니면 파이썬 내에 뭔가 이상한 점이 있습니까? multiprocessing
? sbatch 사람 페이지에서
해당 변수에서 하나의 노드 만 가져 오더라도 내 pythone 코드의 변수는 상수 1이됩니다. 그런 다음 다중 프로세스는 두 번의 "반복"을 수행해야하며 2 개의 1을 인쇄하십시오. 이것은 결과의 모순 된 숫자를 설명하지 않습니다. –
일치하지 않는 결과는 균등하지 않은 할당으로 인한 것일 수 있습니다. 첫 번째 노드에 30 개의 procs가 할당되고 두 번째 노드에 34가 할당되면 두 노드가 모두 32 개의 procs를 얻는 것보다 다른 결과를 얻게됩니다 –
왜 그럴까요? 모든 노드는 동일한 작업을 수행하므로 할당 된 노드는 중요하지 않습니다. 한 노드가 인쇄되지만 한 노드는 인쇄하지 않는다는 의미입니까? –