Несколько задач в одном узле с SLURM

Я изо всех сил пытаюсь понять, как запустить несколько процессов в одном узле, используя SLURM.

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

for i in `seq 100`; do
  ./program ${i}
done

Теперь у меня есть доступ к кластеру с 24-ядерными узлами. Итак, я хочу запустить 24 экземпляра программы на 5 узлах (24 на 4 узлах + 4 на 5 узле) одновременно.

Я думал, что скрипт отправки должен выглядеть так:

#!/bin/bash
#SBATCH -N 5
#SBATCH -n 100
#SBATCH --ntasks-per-node=24
for i in `seq 100`; do
  srun ./program ${i} &
done
wait

Оказывается, с помощью этого сценария отправки, ./program запускается несколько раз для каждого i значение, даже если srun вызывается только один раз для каждого цикла.

Что здесь происходит? Как правильно это сделать?

1 ответ

По умолчанию, srun будет использовать полное распределение в прогонах, так что здесь, все 100 задач. Чтобы сказать, это только использовать одно ядро, вам нужно запустить

srun --exclusive --ntasks 1 ...

Из справочной страницы srun:

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

Добавить --nodes 1 избавится от предупреждений.

#!/bin/bash
#SBATCH -N 5
#SBATCH -n 100
#SBATCH --ntasks-per-node=24
for i in `seq 100`; do
  srun --exclusive --nodes 1 --ntasks 1 ./program ${i} &
done
wait
Другие вопросы по тегам