Вы здесь

Запуск задач на кластере в системе 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

3. При необходимости можно указать опции команды sbatch в качестве значения параметра --slurm-opts команды mqrun, например:
mqrun -n 6 -nh 2 --slurm-opts '--ntasks-per-node=3 --gres=gpu:3 -x tesla[49,52]' ./test


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

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

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

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

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

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

Внимание!
Библиотека OpenMPI работает только с командой sbatch и при этом перед именем программы вместо srun добавляется orterun:
    sbatch [опции] --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=<раздел>
Существует 4 основных раздела: apollo, umt_p2, all и debug, которые покрывают весь кластер и взаимно не пересекаются, т.е. содержат разные узлы (см. Кластер «Уран»). Список всех разделов выдается командой sinfo -s.
Если раздел не задан пользователем явно, то по умолчанию будет выбран раздел apollo, но при отсутствии в нем нужного числа свободных процессоров будут задействованы разделы umt_p2 и all.
-p debug позволяет запускать задачи в специально выделенном для отладки программ разделе debug с максимальным временем счета 20 минут, например:
    srun -p debug mytest

Опции -w, -x, позволяют более гибко регулировать список узлов, допустимых для запуска задачи
(см. man sbatch), например:
-w tesla[5-7,15] - выделить заданию ресурсы узлов tesla5, tesla6, tesla7, tesla15, а если на них не хватит, то и другие узлы;
-x tesla22 - не выделять для задания ресурсы узла -x tesla22;
k40m - выделять задаче только те узлы, которые имеют ресурс с именем (Feature), указанным после -C. На кластере имеются ресурсы с именами umt, tesla, bigmem, m2090, k40m.
Информацию о том, какие ресурсы есть на конкретном узле можно получить командой вида
    scontrol show node tesla22

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

При задании имени файла (filename pattern) можно использовать символы замены, в частности, %j.

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

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

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

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

2. При запуске в пакетном режиме команда запуска программы задаётся либо в скрипте, либо через --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.
Если команды 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