Система SLURM позволяет с помощью команд sbatch
и srun
работать соответственно в пакетном и интерактивном режимах. Пакетный режим является основным в работе с кластером.
Команда sbatch
для запуска программы в пакетном режиме имеет вид
sbatch [опции] --wrap="srun <имя программы> [параметры программы]"
или
sbatch [опции] <имя скрипта> [параметры скрипта]
Минимальный скрипт может выглядеть так
#!/bin/bash
srun myprogram param1 param2
Внимание!
Библиотека OpenMPI работает только с командой sbatch
и при этом перед именем программы в опции --wrap или в скрипте вместо srun добавляется orterun:
sbatch [опции] --wrap="orterun <имя программы> [параметры программы]"
Команда srun
для запуска интерактивной программы имеет вид
srun [опции] <имя программы> [параметры программы]
-n <число процессов>
если число процессов (tasks) не задано, то по умолчанию n=1.
-t <время>
при отсутствии заказа времени для решения задачи выделяется по умолчанию 30 минут. Максимальное время для счета задачи:
Время может быть задано в виде:
-N <кол-во узлов>
задает число узлов (nodes) для задачи, если пользователю это важно.
Для увеличения оперативной памяти можно воспользоваться опциями:
--mem-per-cpu=<MB>
задаёт минимальную память в расчёте на одно ядро в мегабайтах ; если не задано, то по умолчанию 1 ГБ;--mem=<MB>
задаёт память на узле в мегабайтах.
Эти опции взаимно исключают друг друга.
--gres=gpu:<тип GPU>:<кол-во GPU>
задаёт запуск программы на узлах с GPU. Если gres
не задан, то количество GPU=0, т.е. GPU при счете не используются. Если не указан тип GPU, то автоматически назначается младшая модель (m2090). Типы GPU в 2024 году m2090, k40m, v100, a100.
-p <раздел>
или --partition=<раздел>
позволяет указать раздел (partition) кластера для запуска задачи.sinfo -s
.
Если раздел не задан пользователем явно, то по умолчанию будет выбран раздел apollo, но при отсутствии в нем нужного числа свободных процессоров будет задействован раздел tesla.-p debug
позволяет запускать задачи в специально выделенном для отладки программ разделе debug с максимальным временем счета 30 минут. Например, srun -p debug mytest
Опции -w
, -x
, -С
позволяют более гибко регулировать список узлов, допустимых для запуска задачи (см. man sbatch
).
Например:
-w tesla[5-7,15]
- выделить заданию ресурсы узлов tesla5, tesla6, tesla7, tesla15, а если на них не хватит, то и другие узлы;-x tesla22
- не выделять заданию ресурсы узла tesla22;-С a2017
- выделять задаче только те узлы, которые имеют ресурс с именем (Feature), указанным после -C
. На кластере имеются ресурсы с именами: tesla, a2017, a2019 (поколения узлов); bigmem (узлы с большим объёмом ОЗУ), a100, v100 (модель GPU).
Информацию о том, какие ресурсы есть на конкретном узле, можно получить командой вида scontrol show node tesla22
.Описание всех опций и примеры команд можно посмотреть в руководстве man с помощью команд:
man sbatch
man srun
По умолчанию стандартный вывод пакетной задачи и стандартный поток ошибок направляются в файл с именем slurm-%j.out, где %j заменяется уникальным идентификатором (номером) задачи. Перенаправление ввода-вывода можно выполнить, указав программе sbatch опции
--input=<filename pattern>
--output=<filename pattern>
--error=<filename pattern>
При задании имени файла (filename pattern) можно использовать символы замены, в частности, %j
заменяется на JobID, %t
- на номер процесса в рамках задания. Таким образом file_%j_%t.txt
при каждом запуске задачи сгенерирует уникальные имена для каждого процесса.
Выдаваемые результаты конкретной команды srun можно поместить вместо стандартного в указанный файл, добавив после команды символ перенаправления вывода >
.
srun mytest > out_mytest &
Можно (чаще, при интерактивном запуске) параллельно просматривать результаты и сохранять их в файле, например:
srun --mem 40000 mytest | tee out_mytest
В результате интерактивного запуска программы hostname
выдаётся имя узла, на котором запущен соответствующий процесс, например:
u9999@umt:~$> srun hostname
apollo5
При запуске в пакетном режиме команда запуска программы задаётся либо в скрипте, либо через опцию --wrap
, например,
sbatch -n 2 --wrap="srun hostname"
или
sbatch mybat
где скрипт mybat:
#!/bin/sh
#SBATCH -n 2
srun hostname &;
wait
Внимание!
srun
внутри скрипта может запрашивать ресурсы только в тех пределах, которые установлены командой sbatch
.srun
. При этом все опции, указанные в командной строке или самом скрипте в строках #SBATCH
, приписываются к каждой команде srun
данного скрипта, если не переопределены в ней. Так, результирующий файл приведённого примера будет содержать 2 строки с именами узлов (возможно, одинаковых), на которых выполнятся 2 процесса задачи, сформированные командой srun.&
в конце строки), то они при наличии ресурсов могут выполняться одновременно.u9999@umt:~$ sbatch -n 3 --wrap="srun mytest1 3 5.1"
Submitted batch job 776
сформирована пакетная задача с запуском 3-х процессов mytest1 c 2-мя параметрами. Задаче присвоен уникальный идентификатор 776.
u9999@umt:~$ srun -N 2 sleep 30 &
[1] 22313
сформирована интерактивная задача в фоновом режиме. [1] - номер фоновой задачи в текущем сеансе, 22313 - pid процесса srun
на управляющей машине. Уникальный идентификатор можно узнать с помощью команд squeue
, sacct
.
Все опции запуска описаны в batch-файле. За 60 секунд до окончания заказанного времени все процессы, запущенные через srun
получат сигнал TERM и завершатся, после чего последняя команда в скрипте restart_sbatch
снова поставит его в очередь. Перезапуск произойдёт и в том случае, когда программа, запущенная через srun
завершится самостоятельно.
Опция --signal задаёт номер сигнала, который будет отправлен процессам (KILL) и время отправки сигнала (60 секунд до конца заказанного времени счёта).
Запуск
sbatch restart_sbatch
Содержимое restart_sbatch:
#!/bin/sh
#SBATCH -n 1 -t 180
#SBATCH --signal=KILL@60
srun myprog arg1 arg2
# здесь можно вставить анализ результатов,
# формирование новых параметров,
# проверку условий завершения
# и т.п.
sbatch ./restart_sbatch