Slurm: использование ядер из нескольких узлов для распараллеливания R - PullRequest
0 голосов
/ 27 февраля 2019

Я хочу распараллелить сценарий R на HPC с планировщиком Slurm.

SLURM настроен на SelectType: CR_Core_Memory.

Каждый вычислительный узел имеет 16 ядер (32 потока).

Я передаю R-скрипт в SLURM со следующей конфигурацией, используя clustermq в качестве интерфейса к Slurm.

#!/bin/sh
#SBATCH --job-name={{ job_name }}
#SBATCH --partition=normal
#SBATCH --output={{ log_file | /dev/null }} # you can add .%a for array index
#SBATCH --error={{ log_file | /dev/null }}
#SBATCH --mem-per-cpu={{ memory | 2048 }}
#SBATCH --cpus-per-task={{ n_cpus }}
#SBATCH --array=1-{{ n_jobs }}
#SBATCH --ntasks={{ n_tasks }}
#SBATCH --nodes={{ n_nodes }}

#ulimit -v $(( 1024 * {{ memory | 4096 }} ))
R --no-save --no-restore -e 'clustermq:::worker("{{ master }}")'

В R-скрипте я делаю «многоядерное» распараллеливаниес 30 ядрами.Я хотел бы использовать ядра из нескольких узлов, чтобы удовлетворить требования 30 процессоров, то есть 16 ядер из узла 1, 14 из узла 2.

Я пытался использовать n_tasks = 2 и cpus-per-task=16.При этом задание назначается двум узлам.Однако только один узел выполняет вычисления (на 16 ядрах).Второй узел назначен заданию, но ничего не делает.

В этот вопрос srun используется для разделения параллелизма между узлами с foreach и идентификаторами Slurm.Я не использую ни srun, ни foreach.Есть ли способ добиться того, чего я хочу, с параллелизмом SBATCH и multicore?

(я знаю, что мог бы использовать SelectType=CR_CPU_Memory и иметь 32 потока, доступных на узел. Однако вопрос в том, какиспользуйте ядра / потоки от нескольких узлов в целом, чтобы иметь возможность увеличить параллелизм).

1 Ответ

0 голосов
/ 27 февраля 2019

Сводка из моих комментариев:

Ответ таков: вы не можете сделать это , потому что ваша задача - использовать несколько процессоров из одного процесса R.Вы просите один процесс R распараллелить задачу на большем количестве процессоров, чем на физической машине.Вы не можете разделить один процесс R на несколько узлов.Эти узлы не разделяют память, поэтому вы не можете объединять процессоры из разных узлов, по крайней мере, с типичной кластерной архитектурой.Это возможно, если у вас была распределенная операционная система, такая как DCOS.

В вашем случае решение заключается в том, что вам нужно разделить свою работу за пределами этих процессов R.Запустите 2 (или 3, или 4) отдельных R-процесса, каждый на своем собственном узле, а затем ограничьте каждый R-процесс максимальным числом процессоров, которые есть на ваших машинах.

...