Несколько задач в одном узле с 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 ...
Эту опцию также можно использовать при запуске более одного шага задания в рамках существующего выделения ресурсов, когда вы хотите, чтобы отдельные процессоры были выделены для каждого шага задания. Если достаточное количество процессоров не доступно для запуска шага задания, оно будет отложено. Это можно рассматривать как обеспечение механизма управления ресурсами для задания в рамках его распределения.
Добавить --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