Система управління ресурсами (SLURM)

Загальні поняття

Розділ кластеру (англ. partition) -- підмножина вузлів кластеру.

На кластері НТУУ "КПІ" є наступні розділи:

  • login -- вузли, на яких інтерактивно працюють користувачі; запускати задачі заборонено;

  • debug -- вузли для тестових запусків та відлагодження програм;

  • single -- вузли для задач, які потребують не більше одного вузла (паралельні задачі, що використовують спільну пам'ять та послідовні задачі);

  • normal -- вузли для всіх інших задач.

Рівень обслуговування (англ. QoS) -- набір обмежень використання ресурсів, що накладається на задачу.

Обмеження ресурсів задач

При запуску задачі користувач сам обирає рівень обслуговування та розділ кластеру, що відповідає його задачі. На кластері НТУУ "КПІ" користувачу доступні різні рівні обслуговування в залежності від групи користувача.

Для kpistudents:

  • QoS ks-debug на partition debug -- для тестових запусків та відлагодження програм;
  • QoS ks-normal на partition normal -- для всього іншого.

Для kpiusers:

  • QoS ku-debug на partition debug -- для тестових запусків та відлагодження програм;
  • QoS ku-single на partition single -- для для задач, які потребують не більше одного вузла;
  • QoS ku-small на partition normal -- для невеликих задач;
  • QoS ku-normal на partition normal -- для всього іншого.

Для kpiheavyusers:

  • всі рівні обслуговування kpiusers;
  • QoS kh-large на partition normal -- для великих задач.

Для extusers:

  • всі рівні обслуговування kpiheavyusers.

Суть обмежень викладена в наступній таблиці:

╔═══════════╦═════════════════╦═════════════╦══════════════════════╗
║ Назва     ║ Максимальний    ║ Максимальна ║ Максимальний час     ║
║ QoS       ║ процесорний час,║ кількість   ║ при максимальній     ║
║           ║ хвилини         ║ процесорів  ║ кількості процесорів ║
╠═══════════╬═════════════════╬═════════════╬══════════════════════╣
║ ks-debug  ║      40         ║      8      ║       5 хвилин       ║
║ ks-normal ║     320         ║     32      ║      10 хвилин       ║
╟───────────╫─────────────────╫─────────────╫──────────────────────╢
║ ku-debug  ║      40         ║      8      ║       5 хвилин       ║
║ ku-small  ║    3000         ║     32      ║      90 хвилин       ║
║ ku-single ║   47000         ║ 4 (1 вузол) ║       8 діб          ║
║ ku-normal ║    6000         ║     32      ║     180 хвилин       ║
╟───────────╫─────────────────╫─────────────╫──────────────────────╢
║ kh-large  ║   16000         ║    128      ║     120 хвилин       ║
╚═══════════╩═════════════════╩═════════════╩══════════════════════╝

Зауважте, що "процесорний час" розраховується за формулою T_cpu = P * T_wall, де P -- кількість ядер, на яких виконується задача, T_wall -- час виконання задачі. Наприклад, задача, що виконується 10 хвилин на 8 ядрах, потребує 80 процесорних хвилин.

В межах обраного QoS ви можете використовувати процесорний час в будь-якій комбінації. Наприклад, ku-small дозволяє запустити задачу:

  • на 8 ядер на 375 хвилин, або
  • на 16 ядер на 187 хвилин, або
  • на 32 ядра на 93 хвилини.

Додавання задачі в чергу

Для додавання задачі в чергу використовуйте команду sbatch:

[user@n001 ~]$ sbatch JOBFILE

Де JOBFILE -- ім'я файла, що описує задачу. Приклад:

#!/bin/bash -l
#SBATCH -J example
#SBATCH -o example.out.%j
#SBATCH -e example.out.%j
#SBATCH -p debug
#SBATCH --qos=ku-debug
#SBATCH -n 8
#SBATCH -t 00:05:00

set -x
set -e
module list 2>&1

<команда запуску -- дивись нижче>

Обов'язково передавайте командному інтерпретатору опцію -l в першому рядку, інакше система модулів середовища буде працювати некоректно.

Рядки, що починаються з #SLURM є коментарями для командного інтерпретатора. Вони задають параметри запуску задачі. Ці параметри описані в man-сторінці sbatch:

[user@n001 ~]$ man sbatch

Загальні параметри:

  • -J example -- задає ім'я задачі. Не є обов'язковим, але допомагає відрізнити задачі в черзі одна від одної.

  • -o example.out.%j та -e example.out.%j -- задають імена файлів для збереження виводу та помилок програми (імена можуть бути однаковими чи різними). Текст %j буде замінено на номер задачі. Цей параметр не є обов'язковим, за замовчуванням буде створено файл з іменем, що починається на slurm.

  • -p debug -- задає розділ (partition) кластеру.

  • --qos=ku-debug -- задає рівень обслуговування.

Параметри, що задають запит ресурсів:

  • -n 8 -- задає кількість паралельних процесів, що будуть запущені.

  • -N 8 -- задає кількість вузлів, на яких буде запущено паралельні процеси.

  • -c 8 -- задає кількість ядер, яка буде доступна кожному паралельному процесу. За замовчанням -- 1.

  • -t 00:05:00 -- максимальний час виконання задачі.

Будь-які з цих параметрів можна вказувати як в файлі після #SBATCH, так і в командному рядку. Параметри командного рядку мають пріоритет над параметрами в файлі. Наприклад, для запуску задачі на 4 ядрах, незалежно від того, скільки ядер вказано у файлі:

[user@n001 ~]$ sbatch -n 4 JOBFILE

Запуск послідовних програм

Використовуйте параметр -n 1. Також встановіть відповідний рівень обслуговування, -p single --qos=ku-single.

В якості команди запуску в файлі опису задачі вкажіть:

srun ./program-name arg1 arg2

де program-name -- назва виконавчого файлу, а arg1, arg2 -- аргументи.

Запуск програм, що використовують спільну пам'ять (OpenMP, TBB, Pthread)

Використовуйте параметр -c T, де T -- кількість паралельних потоків, 4 або 8.

Також встановіть відповідний рівень обслуговування:

  • якщо ви належите до групи kpistudents, то -p debug --qos=ks-debug або -p normal --qos=ks-normal в залежності від мети запуску;

  • інакше, якщо T <= 4 -- то -p single --qos=ku-single;

  • інакше -- за звичайними правилами, -p normal --qos=ku-small або -p normal --qos=ku-normal.

Для задач, що використовують OpenMP, необхідно обов'язково проінформувати бібліотеку про кількість доступних ядер. Для цього додайте наступний рядок перед запуском програми:

export OMP_NUM_THREADS=T

Де T -- кількість паралельних потоків, має дорівновати числу в параметрі -c.

В якості команди запуску в файлі опису задачі вкажіть:

srun ./program-name arg1 arg2

де program-name -- назва виконавчого файлу, а arg1, arg2 -- аргументи.

Запуск програм, що використовують MPI

Використовуйте параметр -n P, де P -- кількість MPI-задач (ranks).

Також встановіть відповідний рівень обслуговування:

  • якщо ви належите до групи kpistudents, то -p debug --qos=ks-debug або -p normal --qos=ks-normal в залежності від мети запуску;

  • інакше, якщо P <= 4 -- то -p single --qos=ku-single;

  • інакше -- за звичайними правилами, -p normal --qos=ku-small, -p normal --qos=ku-normal або -p normal --qos=kh-large.

Оптимізація Якщо ваша програма виконує багато обмінів даними, то ви можете додатково задати параметр -N, щоб задати кількіть апаратних вузлів. Реалізації MPI, встановлені на кластері НТУУ "КПІ", виконують обмін даними швидше в межах одного апаратного вузла. Наприклад, комбінація -n 16 та -N 2 гарантує, що буде виділено 16 ядер на двох вузлах (8 ядер + 8 ядер). Зауважте, що при цьому ваша задача може довше простояти в черзі, очікуючи ресурси.

В якості команди запуску в файлі опису задачі вкажіть:

mpirun ./program-name arg1 arg2

де program-name -- назва виконавчого файлу, а arg1, arg2 -- аргументи.

Запуск програм, що використовують MPI та OpenMP одночасно

Використовуйте параметри -n P та -c T, де P -- кількість MPI-задач (ranks), а T -- кількість паралельних потоків в кожній MPI-задачі.

Також встановіть відповідний рівень обслуговування: -p normal --qos=ku-small, -p normal --qos=ku-normal або -p normal --qos=kh-large.

В якості команди запуску в файлі опису задачі вкажіть:

srun ./program-name arg1 arg2

де program-name -- назва виконавчого файлу, а arg1, arg2 -- аргументи.

Виведення списку задач в черзі

Щоб вивести список задач в черзі від всіх користувачів:

[user@n001 ~]$ squeue

Для виведення тільки власних задач:

[user@n001 ~]$ squeue -u login

Де login -- ваш логін.

Приклад.

[easybuild@n099 ~]$ squeue -l login
         JOBID PARTITION     NAME     USER  ST       TIME  NODES NODELIST(REASON)

В черзі немає ваших задач: ви не запускали задач або всі задачі завершили виконання (успішно або неуспішно).

Приклад.

[user@n001 ~]$ squeue
         JOBID PARTITION     NAME     USER  ST       TIME  NODES NODELIST(REASON)
            69     debug  example     user  PD       0:00      1 (PartitionTimeLimit)

Задача не запускається через те, що потребує більше часу, ніж дозволено (PartitionTimeLimit).

Статус задачі

Команда squeue відображає статус задачі записано в колонці "ST". Можливі наступні вараіанти:

  • CA -- CANCELLED. Задача була відмінена вами або системним адміністратором. Невідомо, чи почала виконуватись задача до цього.

  • CD -- COMPLETED. Задача завершила виконання на всіх вузлах.

  • CF -- CONFIGURING. Задачі були виділені ресурси, але вони ще не доступні (наприклад, вузол завантажується).

  • CG -- COMPLETING. Задача завершує виконання. Деякі процеси на деяких вузлах ще можуть виконуватись.

  • F -- FAILED. Задача завершила виконання з ненульовим статусом або з іншою помилкою.

  • NF -- NODE_FAIL. Задача завершилась через збій обчислювального вузла.

  • PD -- PENDING. Задача очікує виділення ресурсів.

  • PR -- PREEMPTED. Задача витіснена іншою задачею з більш високим пріоритетом. Не використовується на кластері НТУУ "КПІ".

  • R -- RUNNING. Задачі виділені ресурси, задача виконується.

  • S -- SUSPENDED. Задачі виділені ресурси, але виконання призупинено.

  • TO -- TIMEOUT. Задача завершена через перевищення обмеження часу.

Виведення детальної інформації про задачу

Для виведення детальної інформації про задачу (будь-яку, в тому числі задачу, що завершилась):

[user@n001 ~]$ scontrol show job JOBID

Де JOBID -- номер задачі. Номер задачі виводить команда sbatch. Номери задач в черзі можна подивитись командою squeue.

Видалення задачі з черги

Для видалення задачі з черги використовуйте команду scancel:

[user@n001 ~]$ scancel JOBID

Де JOBID -- номер задачі. Номер задачі виводить команда sbatch. Номери задач в черзі можна подивитись командою squeue.

Переривання задачі, що почала виконуватись

Для переривання задачі використовуйте команду scancel як описано в попередньому розділі.

Короткі тестові запуски та інтерактивне відлагодження задачі

Для полегшення відлагодження програм можна запустити її в інтерактивному режимі.

Виконайте команду salloc для виділення ресурсів. salloc приймає такі ж опції, як і sbatch. Наприклад, для виділення 8 ядер:

[user@n001 ~]$ salloc -p debug -n 8
salloc: Granted job allocation 93
[user@n001 ~]$

Після цього можна запустити програму:

[user@n001 ~]$ mpirun ./program

Або:

[user@n001 ~]$ srun ./program

Зверніть увагу: команди, які ви вводите, виконуються на тому самому головному вузлі. mpirun та srun працюють разом з salloc для запуску задачі на віддаленому вузлі. Не запускайте програму безпосередньо:

[user@n001 ~]$ ./program    # Не робіть так!

Для завершення інтерактивного сеансу та звільнення ресурсів введіть команду exit:

[user@n001 ~]$ exit
[user@n001 ~]$

УВАГА! Інтерактивний режим призначено виключно для полегшення відлагодження програм. В інтерактивному режимі ресурси виділяються на весь сеанс роботи, починаючи з команди salloc і звільняються за командою exit. Неправильне користування цим режимом призводить до простою ресурсів.

Для відлагодження програми, що використовує спільну пам'ять, за допомогою gdb:

[user@n001 ~]$ salloc -p debug -c 8
salloc: Granted job allocation 93
[user@n001 ~]$ srun --pty gdb ./program