2016-10-03 2 views
0

У нас есть небольшой HPC с 4 * 64 ядрами, и в нем установлен SLURM.SLURM с многопроцессорной обработкой python дает непоследовательные результаты

Узлы:

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 

Для проверки Слерма я написал небольшой скрипт в Python с многопроцессорной:

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)])) 

я использую следующий пакетный 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 

Как и следовало ожидать, это напечатает 128256 раз в файл STDOUT.

Однако, если я запускаю это несколько раз я получаю очень разное количество линий (все они содержат 128, который является правильным)

Для первого запуска я получил 144 линии, второй раз я получил 256 (который является правильным), и в третий раз я получу 184.

В чем проблема? Должен ли я исследовать что-то внутри конфигурации SLURM, или что-то не так в python multiprocessing?

ответ

2

От sbatch человек страницы:

SLURM_JOB_CPUS_PER_NODE

Количество процессоров, доступных для работы на этом узле. Обратите внимание, что select/linear plugin выделяет целые узлы для заданий, поэтому значение указывает общее количество CPU на узле. Выберите/cons_res плагин выделяет отдельные процессоры для рабочих мест, так что это число указывает на количество процессоров на этом узле, выделенных на работу

Как отмечалось, переменная будет возвращать только номер на процессорам, выделенных в узле, где скрипт запущен. Если вы хотите иметь однородное распределение, вы должны указать --ntasks-per-node=32

Также учтите, что многопроцессорность не будет обрабатывать процессы в нескольких узлах. Если вы хотите охватить несколько узлов, у вас есть хорошая документация. here

+0

Даже если я получу только один узел из этой переменной, переменная в моем коде pythone будет константой 1. После этого многопроцессор должен выполнить две «итерации» и напечатайте два 1s. Это не объясняет непоследовательное количество результатов. –

+0

Несогласованные результаты могут быть вызваны неравномерным распределением. Если для первого узла назначено 30 процессов, а второй узел 34, вы получите другой результат, чем если бы оба узла получили 32 procs. –

+0

Почему это? Все узлы выполняют одно и то же, поэтому не важно, на какой узел он назначен. Вы имеете в виду, что один узел печатает, но один узел нет? Мне нет смысла –

Смежные вопросы