Вхід

Инструкция Slurm для пользователя. Краткое руководство по запуску

Простая Linux Утилита для Управления Ресурсами (SLURM) - это открытая, надежная и хорошо масштабируемая система управления ресурсами кластера с планировщиком задач, применяемая как для больших, так и для малых Linux-кластеров.

Как менеджер ресурсов кластера, SLURM выполняет три ключевых функции.

Во-первых, он определяет выделенный и/или совместный доступ пользователей к ресурсам (вычислительным узлам) на некоторое время для выполнения ими вычислительных задач.

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

Наконец, он распределяет ресурсы, управляя очередью ожидающих запуска задач.

Архитектура

SLURM состоит из сервиса slurmd, запускающегося на каждом вычислительном узле, и центрального  сервиса slurmctld, запускающегося на управляющем узле  (опционально - с резервной копией управляющего узла).

Сервисы slurmd образуют отказоустойчивую иерархическую структуру. Пользовательские команды включают: sacct, salloc, sattach, sbatch, sbcast, scancel, scontrol, sinfo, smap, squeue, srun, strigger и sview. Все эти команды могут быть запущены как с управляющего сервера, так и с узлов кластера.

Объекты, управляемые сервисами SLURM, это узлы - вычислительный ресурс SLURM-а, разделы, которые объединяют узлы в логические (возможно, частично перекрывающихся) множества, задачи подмножества ресурсов, выделенных пользователю на указанное количество времени, и шаги задачи, которые являются множествами (возможно параллельных) подзадач в рамках задачи.

Разделы могут рассматриваться как очереди задач, каждая из которых имеет комплекс ограничений, как например ограничение задачи по размеру, по времени выполнения, уровню доступа пользователей и т. д.  Задачи в очереди упорядочены по приориету и им выделяются ресурсы в соответствующем разделе.

Как только для задачи выделено множество узлов, пользователь может запускать параллельную работу в виде шагов задачи в любой конфигурации, в пределах выделенных узлов.

Для примера,  задача может быть запущена таким образом, что один единственный её шаг выполнения займет все выделенные ресурсы, в то же время несколько подзадач могут независимо друг от друга использовать часть выделенных ресурсов.

Команды

Справочные man-руководства существуют для всех сервисов SLURM, команд, и API функций. Параметр --help выдает краткий перечень возможных параметров команды. Заметьте, что параметры команд не зависят от регистра

sacct используется, чтобы сообщать задаче или подзадаче учетную информацию о текущих или завершенных задачах.

salloc используется, чтобы выделить ресурсы для задачи в реальном времени. Обычно эта команда используется, чтобы получить ресурсы и shell-доступ к ним. Затем используется командная строка, чтобы выполнять srun-команды для запуска параллельных задач. 

sattach используется, чтобы связать потоки стандартного ввода, вывода, ошибок, передачу сигналов с запущенной задачей или подзадачей.

sbatch используется, чтобы запустить скрипт пакетной обработки для дальнейшего выполнения. Скрипт обычно содержит одну или больше srun-команд для запуска параллельных задач.

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

scancel используется, чтобы отменить случайно  запущенные или зависшие задачи и подзадачи. Она может также быть использована, чтобы отправить управляющий сигнал всем процессам, связанным с выполняющейся задачей или подзадачей.

scontrol -  инструмент администрирования для просмотра и/или изменения состояния SLURM. Отметим, что многие из управляющих команд могут выполняются только суперпользователем.

sinfo сообщает состояние разделов и узлов, управляемых SLURM. Она имеет много способов фильтрации, сортировки, и форматирования выдаваемых результатов. 

smap предоставляет графическую информацию о состоянии задач, разделов, и узлов, управляемых SLURM.

squeue докладывает о  состоянии задач и подзадач. Она имеет много способов фильтрации, сортировки, и форматирования выдаваемых результатов. По умолчанию, она в первую очередь сообщает о запущенных задачах, зависшие задачи идут следующими по ранжированию.

srun используется, чтобы запустить задачу или подзадачу в реальном времени. srun имеет много различных параметров, чтобы конкретизировать требования к ресурсам, в том числе: минимальное и максимальное количество узлов, количество процессоров, указать какие узлы использовать или не использовать, характеристики узлов (сколько памяти, дискового пространства, определенные требуемые особенности, и т.п.). Задача может содержать множество job шагов, выполняющихся последовательно или в параллельно на независимых или общих узлах в пределах выделенных задаче узлов.

strigger используется для установки, и просмотра триггеров событий. Триггеры событий включают страбатывают в таких случаях, как например выход из строя узлов или задач, приближающихся к их пределу времени. 

sview - графический интерфейс пользователя, позволяющий получить и обновить информацию о состоянии задач, разделов, и узлов управляемых SLURM.

Примеры

Для начала мы определяем, какие разделы существуют в системе, какие узлы они включают, и какое состояние системы в целом. Эта информация предоставляется командой sinfo.

$ sinfo

PARTITION AVAIL  TIMELIMIT NODES  STATE NODELIST

scit1        up 44-10:40:0    24  down* n[1001-1024]

scit2        up 2-02:00:00    32  down* n[2001-2032]

scit3*       up 20-20:00:0     8 drain* n[3015,3019,3035,3058,3063-3065,3146]

scit3*       up 20-20:00:0    14  down* n[3007,3031,3043,3045-3046,3048,3073-3074]

scit3*       up 20-20:00:0     1  drain n3006

scit3*       up 20-20:00:0    72  alloc n[3008-3010,3012-3014,3016-3017]

scit3*       up 20-20:00:0     3   idle n[3049,3135,3143]

scit3gpu     up 44-10:40:0     4   idle gpu[1-4]

lite_task    up    3:00:00     1  down* n3152

lite_task    up    3:00:00     4  idle~ n[3026-3029]

Видим, что есть шесть разделов: scit1, scit2, scit3, scit3gpu, lite_task.  Наличие * в названии раздела указывает, что это default раздел для запускаемых задач. Мы видим, что все разделы находятся в состоянии UP.

В каждой строке приводится информация о максимальном времени работы задачи в разделе, количестве узлов, их состоянии и список узлов. Так, в разделе scit3 8 узлов на обслуживании и выключены (drain*) 14 выключены (down;*), 1 в обслуживании (drain).

Потом мы определяем, какие задачи выполняются в системе, используя команду squeue. Поля показывают ID задачи, раздел, название, пользователя, состояние, время работы, количество и список узлов. Посмотрите страницу man для более конкретной информации.

$ squeue

JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)

65646 batch chem mike R 24:19 2 adev[7-8]

65647 batch bio joan R 0:09 1 adev14

65648 batch math phil PD 0:00 6 (Resources)

Команда scontrol дает более детальную информацию об узлах, разделах, задачах.

$ scontrol show partition

PartitionName=scit1 TotalNodes=24 TotalCPUs=48 RootOnly=NO

   Default=NO Shared=NO Priority=1 State=UP MaxTime=44-10:40:00 Hidden=NO

   MinNodes=1 MaxNodes=24 DisableRootJobs=NO AllowGroups=ALL

   Nodes=n1[001-024] NodeIndices=0-23

PartitionName=scit2 TotalNodes=32 TotalCPUs=64 RootOnly=NO

   Default=NO Shared=NO Priority=1 State=UP MaxTime=2-02:00:00 Hidden=NO

   MinNodes=1 MaxNodes=UNLIMITED DisableRootJobs=NO AllowGroups=ALL

   Nodes=n2[001-032] NodeIndices=24-55

PartitionName=scit3 TotalNodes=98 TotalCPUs=560 RootOnly=NO

   Default=YES Shared=NO Priority=1 State=UP MaxTime=20-20:00:00 Hidden=NO

   MinNodes=1 MaxNodes=UNLIMITED DisableRootJobs=NO AllowGroups=ALL

Nodes=n[3106-3125,3127-3143,3146-3150,3006-3010,3012-3017,3019-3025,3030-3038,3043-3069,3073-3074] NodeIndices=61-65,67-72,74-80,85-93,98-124,128-129,141-160,162-178,181-185

PartitionName=scit3gpu TotalNodes=4 TotalCPUs=8 RootOnly=NO

   Default=NO Shared=NO Priority=1 State=UP MaxTime=44-10:40:00 Hidden=NO

   MinNodes=1 MaxNodes=UNLIMITED DisableRootJobs=NO AllowGroups=ALL

   Nodes=gpu[1-4] NodeIndices=188-191

PartitionName=lite_task TotalNodes=5 TotalCPUs=24 RootOnly=NO

   Default=NO Shared=NO Priority=1 State=UP MaxTime=03:00:00 Hidden=NO

   MinNodes=1 MaxNodes=UNLIMITED DisableRootJobs=NO AllowGroups=ALL

   Nodes=n[3026-3029,3152] NodeIndices=81-84,187-187

Получаем детальную информацию об узле:

$ scontrol show node n3025

NodeName=n3025 State=ALLOCATED CPUs=4 AllocCPUs=4 RealMemory=7887 TmpDisk=0

   Sockets=4 Cores=1 Threads=1 Weight=1 Features=(null) Reason=(null)

   Arch=x86_64 OS=Linux

Информация о задаче:

$ scontrol show job 36622

JobId=36622 UserId=xxxx(yyyy) GroupId=zzzz(zzzz)

   Name=d-n35

   Priority=4294878198 Partition=scit3 BatchFlag=1

   AllocNode:Sid=access:23692 TimeLimit=20-20:00:00 ExitCode=0:0

   JobState=RUNNING StartTime=06/01-19:09:01 EndTime=06/22-15:09:01

   NodeList=n3025 NodeListIndices=80-80

   AllocCPUs=4

   ReqProcs=4 ReqNodes=1 ReqS:C:T=1-64.00K:1-64.00K:1-64.00K

   Shared=0 Contiguous=0 CPUs/task=0 Licenses=(null)

   MinProcs=1 MinSockets=1 MinCores=1 MinThreads=1

   MinMemoryNode=0 MinTmpDisk=0 Features=(null)

   Dependency=(null) Account=(null) Requeue=1

   Reason=None Network=(null)

   ReqNodeList=(null) ReqNodeListIndices=

   ExcNodeList=(null) ExcNodeListIndices=

   SubmitTime=06/01-19:09:01 SuspendTime=None PreSusTime=0

   Command=/home/users/xxxxx/test/binary1 d-n35

   WorkDir=/home/users/xxxxx/test

Получить ресурсы и запустить задачу можно командой srun. В этом примере выполняется задача /bin/hostname на трех узлах, используется раздел по умолчанию, один процесс на узел. В примере опция -l задает включение указание номера процесса в начале каждой строки.

access$ srun -N3 -l /bin/hostname

0: node03

1: node04

2: node05

Это вариация предыдущего примера, в которой выполняются 4 процесса /bin/hostname, все на одном узле.

access$ srun -n4 -l /bin/hostname

0: node03

1: node03

2: node03

3: node03

Наиболее часто используемый способ работы с кластером - постановка задач в очередь для выполнения.Для этого вместо srun следует использовать команду sbatch, которая ставит задачу в очередь. Стандартный вывод задачи будет направлен в файл slurm-$jobid.out, а поток  ошибок в файл slurm-$jobid.err.

Рассмотрим еще один вариант работы - раздельное получение ресурсов и запуск задач в пределах выделеных ресурсов. Команда salloc используется чтобы создать выделенный ресурс и получить оболочку  в пределах этого выделенного ресурса.

После этого запускать шаги задачи можно командой srun.  После применения последней команды - exit, оболочка, созданная salloc, наконец будет завершена.

SLURM автоматически не перемещает выполняемые файлы программ или файлы данных на выделенные для задачи узлы. Файлы должны существовать либо на локальном диске, либо в некой глобальной файловой системе (например NFS или Lustre).

SLURM предоставляет инструмент sbcast для перемещения файлов в местное хранилище на выделенных узлах. В этом примере используется sbcast, чтобы переместить программу a.out в /tmp/joe.a.out на выделенные узлы. После выполнения программы мы удаляем её из местного хранилища

access$ salloc -N10 bash

$ sbcast a.out /tmp/joe.a.out

Granted job allocation 471

$ srun /tmp/joe.a.out

Result is 3.14159

$ srun rm /tmp/joe.a.out

$ exit

salloc: Relinquishing job allocation 471

В этом примере, мы подаем пакетное задание, получаем его статус и отменяем его.

access$ sbatch test

srun: jobid 473 submitted

access$ squeue

JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)

473 batch test jill R 00:00 1 node09

access$ scancel 473

access$ squeue

JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)

MPI

Характер использования MPI зависит от того, какой вид MPI используется. Есть три отличные друг от друга последовательности действий, используемых этими различными типами MPI.

  1. SLURM непосредственно запускает задачи и выполняет инициализацию коммуникаций (MPICH2, MPICH-GM, MPICH-MX, MVAPICH, MVAPICH2 и некоторые методы MPICH1).
  2. SLURM выделяет ресурсы, для задачи а затем mpirun запускает задачи, используя инфраструктуру SLURM (OPENMPI, LAM/MPI и HP-MPI).
  3. SLURM выделяет ресурсы, для задачи а затем mpirun запускает задачи, используя при этом любой механизм кроме SLURM, как например SSH или RSH (BlueGene MPI и некоторые методы MPICH1). Эти задачи инициируются за пределами области контролируемой или видимой из SLURM. Поэтому  в скрипте эпилога (epilog) SLURM необходимо предусмотреть средства принудительного останова процессов, чтобы можно было избавиться от этой задачи, когда у нее заберут выделенные для неё ресурсы.

Поддержка Мульти-ядерных/Многопоточных Архитектур

Socket/Core/Thread - иллюстрирует понятие Гнезда, Ядра и Нити, так как это определяется в документации SLURM.

вычисления на суперкомпьютере, сверхбыстрые вычисления, рендеринг, фитнес клубы, спортивные клубы