У нас есть небольшой 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
Как и следовало ожидать, это напечатает 128
256
раз в файл STDOUT.
Однако, если я запускаю это несколько раз я получаю очень разное количество линий (все они содержат 128
, который является правильным)
Для первого запуска я получил 144 линии, второй раз я получил 256 (который является правильным), и в третий раз я получу 184.
В чем проблема? Должен ли я исследовать что-то внутри конфигурации SLURM, или что-то не так в python multiprocessing
?
Даже если я получу только один узел из этой переменной, переменная в моем коде pythone будет константой 1. После этого многопроцессор должен выполнить две «итерации» и напечатайте два 1s. Это не объясняет непоследовательное количество результатов. –
Несогласованные результаты могут быть вызваны неравномерным распределением. Если для первого узла назначено 30 процессов, а второй узел 34, вы получите другой результат, чем если бы оба узла получили 32 procs. –
Почему это? Все узлы выполняют одно и то же, поэтому не важно, на какой узел он назначен. Вы имеете в виду, что один узел печатает, но один узел нет? Мне нет смысла –