2016-10-03 4 views
0

우리는 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 

나는 이것이 128256 시간을 STDOUT 파일에 저장합니다. 난이 여러 번 실행하면

그러나 나는 라인의 매우 다른 양 (모두가 올바른 128를 포함) i가 144 선을 가지고 첫 번째 실행을 위해

, 올바른 내가 256을 가지고 두 번째 시간을 (얻을) 그리고 세 번째로 184가됩니다.

무엇이 문제입니까? SLURM 구성 내에서 무언가를 조사해야합니까, 아니면 파이썬 내에 뭔가 이상한 점이 있습니까? multiprocessing? sbatch 사람 페이지에서

답변

2

:

SLURM_JOB_CPUS_PER_NODE이 노드에서 작업 에 사용 가능한 프로세서의

수입니다. select/linear 플러그인은 전체 노드를 작업에 할당하므로 값은 노드의 총 CPU 수를 나타냅니다. 선택/cons_res 플러그인 할당 작업에 개별 프로세서를, 그래서이 숫자가

강조으로

, 변수는 노드에 할당 된 CPU에서 수를 반환됩니다 작업에 할당이 노드의 프로세서 수를 위치를 나타냅니다 스크립트가 실행 중입니다. 동일한 균등 할당을 원한다면 지정해야합니다 --ntasks-per-node=32

또한 멀티 프로세싱은 둘 이상의 노드에서 프로세스를 생성하지 않습니다. 여러 개의 노드로 확장하려면 멋진 문서가 필요합니다. here

+0

해당 변수에서 하나의 노드 만 가져 오더라도 내 pythone 코드의 변수는 상수 1이됩니다. 그런 다음 다중 프로세스는 두 번의 "반복"을 수행해야하며 2 개의 1을 인쇄하십시오. 이것은 결과의 모순 된 숫자를 설명하지 않습니다. –

+0

일치하지 않는 결과는 균등하지 않은 할당으로 인한 것일 수 있습니다. 첫 번째 노드에 30 개의 procs가 할당되고 두 번째 노드에 34가 할당되면 두 노드가 모두 32 개의 procs를 얻는 것보다 다른 결과를 얻게됩니다 –

+0

왜 그럴까요? 모든 노드는 동일한 작업을 수행하므로 할당 된 노드는 중요하지 않습니다. 한 노드가 인쇄되지만 한 노드는 인쇄하지 않는다는 의미입니까? –