Есть ли способ использовать процессоры по отдельности в кластере с slurm?

#slurm #gnu-parallel

#slurm #gnu-parallel

Вопрос:

Я использовал кластер из 200 узлов с 32 ядрами в каждом для моделирования случайных процессов.

Мне нужно выполнить около 10 000 симуляций одной и той же системы, поэтому я запускаю одно и то же моделирование (с разными начальными значениями RNG) в 32 ядрах одного узла, пока оно не выполнит все 10 000 симуляций. (каждая симуляция полностью независима от других)

При этом некоторые симуляции, в зависимости от начального уровня, занимают гораздо больше времени, чем другие, и через некоторое время мне обычно выделяется полный узел, но только с одним запущенным ядром (поэтому я излишне занимаю 31 ядро).).

в моем сценарии sbatch у меня есть это:

 # Specify the number of nodes(nodes=) and the number of cores per nodes(tasks-pernode=) to be used
#SBATCH -N 1
#SBATCH --ntasks-per-node=32
  

 cat list.dat | parallel --colsep 't' -j 32 ./main{}  > "Results/A.out"
  

который запускает 32 . / main одновременно в одном и том же узле, пока не будут использованы все строки list.dat (10 000 строк).

Есть ли способ освободить эти неиспользуемые ядра для других заданий? И есть ли у меня способ отправить эти 32 задания случайным узлам, то есть отправить одно задание, используя максимум 32 ядра в (потенциально) разных узлах (независимо от того, что свободно на данный момент)?

Спасибо!

Ответ №1:

Если кластер настроен на совместное использование вычислительных узлов между заданиями, одним из вариантов является отправка массива заданий на 10 000 заданий. Сценарий отправки будет выглядеть следующим образом (непроверенный):

 #SBATCH -N 1
#SBATCH --ntasks-per-node=1
#SBATCH --array=1-10000

cat list.dat | sed -n "${SLURM_ARRAY_TASK_ID} p" | xargs -I{} ./main{}  > "Results/A.out_${SLURM_ARRAY_TASK_ID}"
  

Затем каждое моделирование будет планироваться независимо друг от друга и использовать все свободные ядра в кластере, не оставляя выделенных, но неиспользуемых ядер.

В отличие от отправки 10 000 независимых заданий, массив заданий позволит вам управлять всеми заданиями с помощью одной команды. Кроме того, массивы заданий создают гораздо меньшую нагрузку на планировщик, чем отдельные задания.

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

 #SBATCH -N 1
#SBATCH --ntasks-per-node=12
#SBATCH --array=1-10000:100

cat list.dat | sed -n "${SLURM_ARRAY_TASK_ID},$((SLURM_ARRAY_TASK_ID 99)) p" | parallel --colsep 't' -j 12 ./main{}  > "Results/A.out_${SLURM_ARRAY_TASK_ID}"
  

Комментарии:

1. прежде всего, спасибо за ваш быстрый ответ! да, но это создаст длинную очередь, поскольку я запускаю это 10000 симуляций для многих наборов параметров… есть ли способ, используя только одно задание, запросить 32 независимых ядра?

2. Массивы заданий спроектированы таким образом, что на самом деле нет длинной очереди. С точки зрения планировщика, все задания в массиве заданий являются одним заданием. В одном задании все ресурсы планируются одновременно. Затем вы можете «освободить» отдельные узлы (а не отдельные ядра» с scontrol update jobid=... nnodes=... помощью . Но вам нужно реализовать логику самостоятельно и убедиться, что вы освободили правильные узлы.