Вы здесь

Запуск задач на кластере в системе SLURM

При запуске задачи пользователя на счет
- необходимо учитывать ограничения по ресурсам на вычислителях для пользователей (и не забывать о них);
- желательно использовать тот модуль установки переменных окружения, с которым программа была откомпилирована;
- пока задача не просчиталась, нельзя ее перекомпилировать, удалять исполняемый файл и менять входные данные.

Запуск программ осуществляется в системе SLURM. В результате запуска задача помещается в очередь заданий и ей присваивается уникальный идентификатор (его можно узнать командами mqinfo, mps или squeue, sacct). По умолчанию задаче пользователя выделяется по 1 ГБ оперативной памяти на каждое вычислительное ядро (при необходимости размер исполняемой программы в байтах можно узнать с помощью команды size).

Данная инструкция описывает общие и относящиеся к MPI-программам команды SLURM.
Особенности запуска параллельных OpenMP-, MATLAB-, ANSYS-программ рассматриваются в отдельных инструкциях:
    О запуске приложений с OpenMP, PGI Accelerator и OpenACC
    Использование системы Matlab для параллельных вычислений (подробно в Параллельный Matlab)
    Запуск программ из пакета ANSYS

Команды SLURM начинаются с буквы s.
На основе этих команд для удобства пользователей (в частности, обеспечения преемственности при переходе на SLURM, см. [6]) были реализованы упрощённые команды запуска MPI-, MATLAB-, ANSYS-программ и информационные команды (начинающиеся, за одним исключением, с буквы m).
Упрощённые команды и основные команды SLURM приведены ниже; подробнее о SLURM см., например, в [1-5]; полная информация выдаётся с помощью команды man.


Упрощённые команды

mqrun, замена mpirun, — запуск MPI-программы, аналог команды sbatch
mlrun, mlprun, mlgrun — запуск MATLAB-программ; matlab — запуск MATLAB
ansysrun — запуск ansysV, cfx5solve и fluent-программ, где V- номер текущей версии
mqinfo — выдача информации об узлах и очереди заданий с помощью команд sinfo и squeue
mps или mqinfo -u $USER -l — выдача информации об узлах и задачах только самого пользователя
mqdel,  mkill — отмена выполнения задачи (ожидающей старта или уже стартовавшей), действуют как команда scancel

Команда mqrun (замена mpirun, аналог sbatch ) запускает в пакетном режиме успешно откомпилированную С- или Fortran-программу, например
    mqrun -np 8 -maxtime 20 -stdin in.txt mytest

где для mytest затребовано формирование 8 процессов (опция -np или -n) с выделением каждому по умолчанию 1950 MB (т.е. -m 1950) и установкой входного файла (-stdin) при ограничении времени счета 20-ю минутами (–maxtime или –t). Так как не указаны опции -stdout и -stderr, то стандартными выходными файлами будут автоматически созданные mytest.1/output, mytest.1/error.
В ответ в строке вида
    Submitted batch job 1475

выдаётся уникальный идентификатор задачи в очереди заданий, здесь 1475.
Уникальный идентификатор используется в командах отмены выполнения задания, например
    mqdel 1475
    (или    mkill 1475)
Внимание!
1. В каталогах вида имя_программы.номер номера возрастают, начиная с 1. Пользователь должен сам удалять ненужные каталоги.
2. Для выдачи опций mqrun следует набрать
    mqrun -help


Основные команды SLURM

Команды запуска задач

Система SLURM позволяет с помощью команд sbatch и srun работать соответственно в пакетном и интерактивном режимах.
Пакетный режим является основным в работе с кластером.

Команда sbatch для запуска программы в пакетном режиме имеет вид
    sbatch -n <число процессов> -t <время> <имя скрипта>

или
    sbatch -n <число процессов> -t <время> --wrap="srun <имя программы> [<параметры программы>]"

Команда srun для запуска интерактивной программы имеет вид
    srun -n <число процессов> -t <время> <имя программы> [<параметры программы>] [&]

Внимание!
Библиотека OpenMPI работает только с командой sbatch и при этом перед именем программы вместо srun добавляется orterun:
    sbatch -n <число процессов> -t <время> --wrap="orterun <имя программы> [<параметры программы>]"


Опции:
-n задаёт число процессов (tasks); если не задано, то по умолчанию n=1;
-t заказывает время для решения задачи; при отсутствии t выделяется 30 минут (по умолчанию);
    20 часов - максимальное время для счета задачи в будние дни (с 9 часов понедельника до 16 часов пятницы);
    85 часов - максимальное время для счета задачи на выходные (с 16 часов пятницы до 9 часов понедельника плюс 20 часов), т.е. на 85 часов задача запустится, если она войдет в решение в 16 часов ближайшей пятницы, иначе будет ждать следующей; аналогично, на 84 часа есть шанс запустить до 17 часов пятницы и т.д. до 9 часов понедельника;
    100 часов - максимальное время, если к выходным добавляются праздничные дни.
    Время может быть задано в виде: минуты  минуты:секунды  часы:минуты:секунды  дни-часы  дни-часы:минуты  дни-часы:минуты:секунды

& позволяет запустить интерактивную задачу в фоновом режиме, при котором пользователю доступна работа в командной строке и одновременно выдача результатов работы интерактивной задачи идет на экран.

-N задает число узлов (nodes) для задачи, если пользователю это важно:
-N <кол-во узлов>

Для увеличения оперативной памяти можно воспользоваться опциями:
--mem-per-cpu=<MB> задаёт минимальную память в расчёте на одно ядро в мегабайтах ; если не задано, то по умолчанию 1 ГБ;
 --mem=<MB> задаёт память на узле в мегабайтах.
Эти опции взаимно исключают друг друга.

--gres с указанием требуемого количества GPU в виде:
--gres=gpu:<кол-во GPU на одном узле>
задаёт запуск программы на узлах с GPU. Если gres не задан, то количество GPU=0, т.е. GPU при счете не используются.

-p позволяет указать раздел (partition) кластера для запуска задачи:
-p <раздел> или --partition=<раздел>
Если раздел не задан пользователем явно, то по умолчанию будет выбран раздел apollo, но при отсутствии в нем нужного числа свободных процессоров будут задействованы разделы umt_p2 и all.
-p debug позволяет запускать задачи в специально выделенном для отладки программ разделе debug с максимальным временем счета 20 минут.
Разделы all, umt_p2, apollo и debug покрывают весь кластер и взаимно не пересекаются, т.е. содержат разные узлы.
Список разделов выдается командой sinfo -s .
Примеры команд запуска с заданием раздела.
    srun -p debug mytest
    mqrun -np 360 -maxtime 20 -p apollo myprog

или, используя соответствующие опции srun,
    mqrun -n 360 -t 20 -p apollo myprog

Опции mqrun выдаются по команде mqrun -help.

Пример. В результате интерактивного запуска
    srun hostname

выдаётся имя узла, на котором запущен соответствующий процесс, например,
    umt145


При запуске в пакетном режиме команда запуска программы задаётся либо в скрипте, либо через --wrap, например,
    sbatch mybat

или
    sbatch -n 2 --wrap="srun hostname"

где скрипт mybat
#!/bin/sh
#SBATCH -n 2
srun hostname &
wait

Внимание!
Команда srun внутри скрипта может запрашивать ресурсы только в тех пределах, которые установлены командой sbatch.
Скрипт запускается только на первом из выделенных узлов.
Запуск нескольких процессов осуществляется командой srun. При этом все опции, указанные в командной строке или самом скрипте в строках #SBATCH, приписываются к каждой команде srun данного скрипта, если не переопределены в ней. Так, результирующий файл приведённого примера будет содержать 2 строки с именами узлов (возможно, одинаковых), на которых выполнятся 2 процесса задачи, сформированные командой srun.
Если команды srun запускаются в фоновом режиме (символ & в конце строки), то они при наличии ресурсов могут выполняться одновременно.


По умолчанию стандартный вывод пакетной задачи и стандартный поток ошибок направляются в файл с именем slurm-%j.out, где %j заменяется уникальным идентификатором (номером) задачи.

Перенаправление ввода-вывода можно выполнить, указав программе sbatch опции
--error=<filename pattern>, --input=<filename pattern>,
--output=<filename pattern>
.
При задании имени файла (filename pattern) можно использовать символы замены, в частности, %j.

Выдаваемые результаты конкретной команды srun можно поместить вместо стандартного в указанный файл, добавив после команды символ перенаправления вывода (>)
    srun mytest > out_mytest &
Можно (чаще, при интерактивном запуске) параллельно просматривать результаты и сохранять их в файле, например:
    srun --mem 40000 hostname | tee out_hostname

Описание всех опций и примеры команд можно посмотреть в man-руководстве с помощью команд:
    man sbatch
    man srun


Примеры постановки задач в очередь.
u9999@umt:~$ sbatch -n 3 --wrap="srun mytest1 3 5.1"  — сформирована пакетная задача с запуском
                                                                                                3-х процессов mytest1 c 2-мя параметрами;
Submitted batch job 776                                  — задаче присвоен уникальный идентификатор 776;
u9999@umt:~$ srun -N 2 sleep 30 &                — сформирована интерактивная задача в фоновом режиме;
[1] 22313                                     — [1] - номер фоновой задачи в текущем сеансе, 22313 - pid процесса srun на управляющей машине. Уникальный идентификатор можно узнать с помощью команд squeue, sacct.


Информационные команды
     squeue      sacct      sinfo      scontrol      характеристики GPU

squeue — просмотр очереди (информации о задачах, находящихся в счете или в очереди на счет); возможно использование ключей, например:
    squeue --user=`whoami`     — посмотреть только свои задачи;
    squeue --states=RUNNING   — посмотреть считающиеся задачи;
    squeue --long                    — выдать более подробную информацию.

Пример.
u9999@umt:~$ srun -N 2 sleep 30 &
[1] 22313

u9999@umt:~$ squeue

  JOBID PARTITION     NAME     USER    ST    TIME  NODES NODELIST(REASON)
    777     all               sleep      u9999   R     0:23       2      umt[10,15]
JOBID — уникальный идентификатор задачи; никогда не используется повторно ;
PARTITION — название раздела, где считается задача;
NAME — имя задачи пользователя;
USER — логин пользователя;
ST — состояние задачи (R - выполняется, PD - в очереди);
TIME — текущее время счета;
NODES — количество узлов для задачи;
NODELIST(REASON) — список выделенных узлов.

sacct — просмотр задач текущего пользователя за сутки (с начала текущего дня);
возможно использование ключей, например:
     sacct -a --starttime 2011-01-01
     — посмотреть все задачи с начала года.

Пример.
u9999@umt:~$ sacct
       JobID    JobName  Partition    Account  AllocCPUS      State           ExitCode
------------    ---------- ----------   ---------- ------------ ---------------   -----------
522              sbatch      tesla                               2       COMPLETED         0:0
522.batch       batch                                            1       COMPLETED         0:0
777                sleep      all                                   2       CANCELLED+       0:0
780              sbatch      tesla                               2        FAILED               0:0
780.batch       batch                                            1        FAILED            127:0
783                sleep      tesla                               2        RUNNING            0:0

JobID — уникальный идентификатор задачи, повторно не используется;
JobName — имя задачи пользователя;
Partition — название раздела, где считается задача;
State — состояние задачи:   RUNNING — выполняется,
                                           PENDING — ждёт в очереди,
                                           COMPLETED — закончилась,
                                           FAILED — закончилась по ошибке,
                                           CANCELLED+ — снята пользователем;
ExitCode — код возврата.

sinfo — просмотр информации об узлах (прежде всего, о состоянии узлов: доступны, заняты, свободны, ...).
sinfo -s — выдача суммарной информации о разделах кластера без детализации по узлам.

Пример.
u9999@umt:~$ sinfo
PARTITION   AVAIL  TIMELIMIT  NODES   STATE   NODELIST
umt*             up      8:00:00       4         down*   umt[59,92,139,201]
umt*             up      8:00:00     203         idle      umt[1-58,60-91,93-118,120-138,140-200,202-208]
umt*             up      8:00:00       1        down     umt119
tesla               up      8:00:00       1         alloc      tesla2
tesla               up      8:00:00      18         idle       tesla[3-20]
tesla               up      8:00:00       1         down     tesla1

PARTITION — название раздела, где считаются задачи,
                      * - указывает на раздел по умолчанию;
AVAIL — состояние раздела узлов: up - есть доступ, down - нет доступа;
TIMELIMIT — максимальное время, выделяемое для счета задачи;
NODES — количество узлов;
STATE — состояние (в сокращённой форме):
                idle - свободен, alloc - используется процессом, mix - частично занят, частично свободен,
                down, drain, drng - заблокирован,
                comp - все задания, связанные с этим узлом, находятся в процессе завершения;
                * - обозначает узлы, которые в настоящее время не отвечают (not responding);
NODELIST — список узлов.

Пример выдачи sinfo из команд mqinfo и mps:

PARTITION SOCKET CORE CPU THREAD GRES    TIMELIMIT   CPUS(A/I/O/T)
umt           2            4       8      1                      20:00:00   1203/53/408/1664
tesla          2            6       12    1          gpu:8    infinite         322/2/36/360
all*            2            4+     8+   1                      20:00:00   1525/55/444/2024

PARTITION — название раздела: umt, tesla, all; * отмечен раздел по умолчанию;
SOCKET — число процессоров на узле;
CORE — число ядер в процессоре;
CPU — число ядер на узле;
THREAD — число нитей на ядро;
GRES — число общих для узла ресурсов, где gpu - графический ускоритель;
TIMELIMIT — максимальное время, выделяемое для счета задачи;
CPUS(A/I/O/T) — число ядер:
            A (alloc) - заняты, I (idle) - свободны, O (other) - заблокированы, T (total) - всего.

scontrol — выдача детальной информации об узлах, разделах, задачах:

    scontrol show node tesla34 — об узле, в частности, причине состояния drain, down;
    scontrol show partition       — о разделах;
    scontrol show job 174457     — о задаче.


Информацию о технических характеристиках GPU выдает программа pgaccelinfo, которая входит в поставку компилятора PGI. Поэтому предварительно надо установить соответствующий модуль, выполнив команду mpiset, например:
    mpiset 7
    srun --gres=gpu:1 pgaccelinfo

Опция вида -w 'tesla21' позволяет выдать эту информацию для конкретного (в данном случае 21) узла:
    srun -w 'tesla21' --gres=gpu:1 pgaccelinfo


Как удалить задачу
Для отмены выполнения задачи служит команда scancel:

  • Убрать из очереди
        scancel <id1,id2,...,idn> — снимает задачи с уникальными идентификаторами id1,id2,...,idn
        scancel -u u9999 — снимает все задачи пользователя u9999
  • Снять со счёта (выполняется аналогично )
        scancel --state=RUNNING 1,2,3 — снимает со счета уже стартовавшие задачи с идентификаторами 1,2 и 3
        CTRL+C — снимает интерактивную задачу без фонового режима.
  • Пример.
    u9999@umt:~$ squeue
      JOBID PARTITION     NAME     USER     ST       TIME  NODES NODELIST(REASON)
        977     tesla            sleep     u9999    R         1:32      2       tesla[1-2]
    u9999@umt:~$ scancel 977      — сняли со счета интерактивную задачу, считающуюся в фоновом режиме.
    srun: Force Terminated job 977
    u9999@umt:~$ srun: Job step aborted: Waiting up to 2 seconds for job step to finish.
    slurmd[tesla1]: *** STEP 977.0 CANCELLED AT 2011-11-01T18:04:45 ***
    srun: error: tesla1: task 0: Terminated
    srun: error: tesla2: task 1: Terminated
    Enter      — нажать
    [1]+  Exit 15                  srun -p tesla -N 2 sleep 1h
    u9999@umt:~$ squeue
      JOBID PARTITION     NAME     USER  ST       TIME  NODES NODELIST(REASON)
    u9999@umt:~$


    Полезные ссылки

    1. Quick Start User Guide / Slurm, Documentation.
    2. Общие принципы построения системы SLURM. Берсенев А.Ю. / Семинар ОСО, 13.04.2011.
    3. Обзор планировщиков для SLURM. Берсенев А.Ю. / Семинар ОСО, 20.04.2011.
    4. Оптимизация управления ресурсами суперкомпьютеров с помощью SLURM. M. Тим Джонс, 18.10.2012.
    5. Инструкция Slurm для пользователя. Краткое руководство по запуску / Суперкомпьютер ИК НАН Украины
    6. Берсенёв А.Ю. Шарф С.В. "О системе SLURM и изменениях в обслуживании очереди задач"/ Семинар ОСО, 25.04.2013 - Видеоархив УрО РАН: http://uran.vidicor.ru/vod/?id=2013_UrORAN_25_04_2013_slurm