Slurm

CycleCloud Slurm Cluster Project README

Slurm — это высококонфигурируемый диспетчер рабочих нагрузок с открытым исходным кодом. Дополнительные сведения см. в обзоре сайта проекта Slurm.

Примечание.

Начиная с версии CycleCloud 8.4.0, мы переписали интеграцию с Slurm для поддержки новых функций и функциональных возможностей. Дополнительные сведения см. в документации Slurm 3.0.

Чтобы включить Slurm в кластере CycleCloud, измените run_list, доступное в разделе конфигурации определения кластера. Кластер Slurm имеет две основные части: главный узел (или узел-планировщик), который запускает программное обеспечение Slurm в общей файловой системе, а также исполняющие узлы, которые подключают эту файловую систему и выполняют отправленные задания. Например, простой фрагмент шаблона кластера может выглядеть следующим образом:

[cluster custom-slurm]

[[node master]]
    ImageName = cycle.image.centos7
    MachineType = Standard_A4 # 8 cores

    [[[cluster-init cyclecloud/slurm:default]]]
    [[[cluster-init cyclecloud/slurm:master]]]
    [[[configuration]]]
    run_list = role[slurm_master_role]

[[nodearray execute]]
    ImageName = cycle.image.centos7
    MachineType = Standard_A1  # 1 core

    [[[cluster-init cyclecloud/slurm:default]]]
    [[[cluster-init cyclecloud/slurm:execute]]]
    [[[configuration]]]
    run_list = role[slurm_master_role]
    slurm.autoscale = true
    # Set to true if nodes are used for tightly-coupled multi-node jobs
    slurm.hpc = true
    slurm.default_partition = true

Чтобы включить Slurm в кластере CycleCloud, измените run_list в секции конфигурации для определения кластера. Кластер Slurm имеет две основные части: узел планировщика, который предоставляет общую файловую систему и запускает программное обеспечение Slurm, а также узлы выполнения, которые подключают общую файловую систему и запускают отправленные задания. Например, простой фрагмент шаблона кластера может выглядеть следующим образом:

[cluster custom-slurm]

[[node scheduler]]
    ImageName = cycle.image.centos7
    MachineType = Standard_A4 # 8 cores

    [[[cluster-init cyclecloud/slurm:default]]]
    [[[cluster-init cyclecloud/slurm:scheduler]]]
    [[[configuration]]]
    run_list = role[slurm_scheduler_role]

[[nodearray execute]]
    ImageName = cycle.image.centos7
    MachineType = Standard_A1  # 1 core

    [[[cluster-init cyclecloud/slurm:default]]]
    [[[cluster-init cyclecloud/slurm:execute]]]
    [[[configuration]]]
    run_list = role[slurm_scheduler_role]
    slurm.autoscale = true
    # Set to true if nodes are used for tightly-coupled multi-node jobs
    slurm.hpc = true
    slurm.default_partition = true

Изменение существующих кластеров Slurm

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

Внесение изменений в кластер

Кластер Slurm, развернутый в CycleCloud, содержит скрипт, который упрощает изменения. После внесения изменений в кластер выполните следующую команду в качестве корневого (например, выполнив sudo -i) на узле планировщика Slurm, чтобы перестроить slurm.conf файл и обновить узлы в кластере:

/opt/cycle/slurm/cyclecloud_slurm.sh remove_nodes
/opt/cycle/slurm/cyclecloud_slurm.sh scale

Примечание.

Для версий CycleCloud до версии 7.9.10 cyclecloud_slurm.sh скрипт находится в папке /opt/cycle/jetpack/system/bootstrap/slurm.

Это важно

При внесении изменений, влияющих на виртуальные машины для узлов в разделе MPI (например, размер виртуальной машины, образ или cloud-init), необходимо сначала завершить все узлы. Команда remove_nodes выводит предупреждение в этом случае, но не завершает работу с ошибкой. Если вы изменяете виртуальные машины для узлов в разделе MPI (например, размер виртуальной машины, образ или cloud-init) во время выполнения узлов, новые узлы не могут запуститься и вы увидите ошибку This node doesn't match existing scaleset attribute.

/opt/cycle/slurm/cyclecloud_slurm.sh apply_changes

Примечание.

Для CycleCloud версии < 8.2 cyclecloud_slurm.sh скрипт находится в папке /opt/cycle/jetpack/system/bootstrap/slurm.

Если вы изменяете виртуальные машины для узлов в разделе MPI (например, размер виртуальной машины, образ или cloud-init) во время выполнения узлов, новые узлы не могут запуститься и вы увидите ошибку This node doesn't match existing scaleset attribute. По этой причине команда apply_changes гарантирует, что узлы завершаются. Если узлы не были полностью завершены, команда завершится с ошибкой и следующим сообщением: Перед применением изменений необходимо полностью завершить следующие узлы.

Если вы вносите изменения, которые не влияют на свойства виртуальной машины для узлов MPI, сначала не нужно завершать выполнение узлов. В этом случае можно внести изменения с помощью следующих двух команд:

/opt/cycle/slurm/cyclecloud_slurm.sh remove_nodes
/opt/cycle/slurm/cyclecloud_slurm.sh scale

Примечание.

Команда apply_changes доступна только в CycleCloud 8.3+. В более ранних версиях необходимо использовать команды remove_nodes и scale для внесения изменений. Убедитесь, что команда remove_nodes не выводит предупреждение о узлах, которые необходимо прекратить.

Создание дополнительных разделов

Шаблон по умолчанию, который поставляется с Azure CycleCloud, содержит две секции (hpc и htc) и можно определить настраиваемые массивы узлов, которые сопоставляют непосредственно с секциями Slurm. Например, чтобы создать секцию GPU, добавьте следующий раздел в шаблон кластера:

    [[nodearray gpu]]
    MachineType = $GPUMachineType
    ImageName = $GPUImageName
    MaxCoreCount = $MaxGPUExecuteCoreCount
    Interruptible = $GPUUseLowPrio
    AdditionalClusterInitSpecs = $ExecuteClusterInitSpecs

        [[[configuration]]]
        slurm.autoscale = true
        # Set to true if nodes are used for tightly-coupled multi-node jobs
        slurm.hpc = false

        [[[cluster-init cyclecloud/slurm:execute:2.0.1]]]
        [[[network-interface eth0]]]
        AssociatePublicIpAddress = $ExecuteNodesPublic

Параметры памяти

CycleCloud автоматически задает объем доступной памяти для Slurm для планирования. Так как доступная память может немного отличаться из-за параметров ядра Linux, а ОС и виртуальная машина используют небольшой объем памяти, CycleCloud автоматически уменьшает значение памяти в конфигурации Slurm. По умолчанию CycleCloud резервирует 5% от сообщенной доступной памяти на виртуальной машине, но вы можете переопределить это значение в шаблоне кластера, установив slurm.dampen_memory на процент памяти, который нужно удерживать. Например, чтобы сохранить 20% памяти виртуальной машины:

    slurm.dampen_memory=20

Отключение автомасштабирования для определенных узлов или секций

Хотя встроенная функция CycleCloud "KeepAlive" в настоящее время не работает для кластеров Slurm, вы можете отключить автомасштабирование для работающего кластера Slurm, изменив файл slurm.conf напрямую. Можно исключить отдельные узлы или целые секции из автомасштабирования.

Исключение узла

Чтобы исключить один или несколько узлов из автомасштабирования, добавьте SuspendExcNodes=<listofnodes> в файл конфигурации Slurm. Например, чтобы исключить узлы 1 и 2 из hpc раздела, добавьте следующий код /sched/slurm.conf:

SuspendExcNodes=hpc-pg0-[1-2]

Затем перезапустите slurmctld службу, чтобы новая конфигурация вступила в силу.

Исключение раздела

Чтобы исключить все секции из автомасштабирования, используйте аналогичный процесс исключения узлов. Чтобы исключить всю hpc секцию, добавьте следующий код /sched/slurm.conf:

SuspendExcParts=hpc

Затем перезапустите slurmctld службу.

Устранение неполадок

Конфликты UID для пользователей Slurm и munge

По умолчанию этот проект использует uiD и GID 11100 для пользователя Slurm и 11101 для пользователя munge. Если эти значения по умолчанию вызывают конфликт с другим пользователем или группой, их можно переопределить.

Чтобы переопределить значения UID и GID, нажмите кнопку редактирования для обоих scheduler узлов:

Редактировать планировщик

Редактировать планировщик

И execute nodearray: Редактировать Nodearray

Добавьте в раздел Configuration следующие атрибуты: Редактировать конфигурацию

    slurm.user.name = slurm
    slurm.user.uid = 11100
    slurm.user.gid = 11100
    munge.user.name = munge
    munge.user.uid = 11101
    munge.user.gid = 11101

Автомасштабирование

CycleCloud использует функцию эластичных вычислений Slurm. Чтобы отладить проблемы автомасштабирования, просмотрите несколько журналов на узле планировщика. Во-первых, убедитесь, что вызовы режима энергосбережения выполняются путем проверки /var/log/slurmctld/slurmctld.log. Вы должны увидеть такие строки:

[2019-12-09T21:19:03.400] power_save: pid 8629 waking nodes htc-1

Проверьте /var/log/slurmctld/resume.log. Если шаг возобновления завершается ошибкой, проверьте /var/log/slurmctld/resume_fail.log. Если вы видите сообщения о неизвестных или недопустимых именах узлов, выполните действия, описанные в разделе "Внесение изменений в кластер" перед добавлением узлов в кластер.

Справочник по конфигурации Slurm

В следующей таблице описаны параметры конфигурации Slurm, которые можно переключить для настройки функциональности:

Параметры конфигурации Slurm Описание
slurm.version По умолчанию: 18.08.7-1. Задает версию Slurm для установки и запуска. В настоящее время это версия по умолчанию и единственная доступная. В будущем могут поддерживаться дополнительные версии.
slurm.autoscale По умолчанию: false. Параметр per-nodearray, который определяет, автоматически ли Slurm останавливает и запускает узлы в этом массиве узлов.
slurm.hpc По умолчанию: true. Параметр per-nodearray, который определяет, находятся ли узлы в массиве узлов в одной группе размещения. В основном используется для массивов узлов, использующих семейства виртуальных машин с InfiniBand. Она применяется только в том случае, если slurm.autoscale задано значение true.
slurm.default_partition (раздел по умолчанию) По умолчанию: false. Параметр для массива узлов, который контролирует, должен ли массив узлов быть разделом по умолчанию для заданий, которые не запрашивают раздел явно.
slurm.заглушить_память По умолчанию: 5. Процент памяти, резервируемый для обеспечения работы ОС или виртуальной машины.
slurm.suspend_timeout По умолчанию: 600. Время в секундах между вызовом приостановки и тем, когда этот узел можно использовать снова.
slurm.resume_timeout По умолчанию: 1800. Время ожидания успешной загрузки узла в секундах.
Установка Slurm По умолчанию: true. Определяет, установлен ли Slurm при загрузке узла (true). Если установить Slurm в пользовательском образе, задайте значение для параметра конфигурации false, начиная с версии proj 2.5.0+.
slurm.use_pcpu По умолчанию: true. Параметр per-nodearray для управления планированием с помощью гиперпоточных виртуальных ЦП. false установите, чтобы настроить CPUs=vcpus в cyclecloud.conf.
slurm.user.name По умолчанию: slurm. Имя пользователя для используемой службы Slurm.
slurm.user.uid По умолчанию: 11100. Идентификатор пользователя, используемый для пользователя Slurm.
slurm.user.gid По умолчанию: 11100. Идентификатор группы, используемый для пользователя Slurm.
munge.user.name По умолчанию: munge. Имя пользователя для используемой службы проверки подлинности MUNGE.
munge.user.uid По умолчанию: 11101. Идентификатор пользователя, используемый для пользователя MUNGE.
munge.user.gid По умолчанию: 11101. Идентификатор группы для пользователя MUNGE.

CycleCloud поддерживает стандартный набор атрибутов автоматической остановки в планировщиках:

Атрибут Описание
cyclecloud.cluster.autoscale.остановка_включена Включает автостоп на этом узле. [истина/ложь]
cyclecloud.cluster.autoscale.время_бездействия_после_завершения_задач Время (в секундах), в течение которого узел остаётся бездействующим после завершения заданий до автоматической остановки.
cyclecloud.cluster.autoscale.время_простоя_перед_задачами Время (в секундах), в течение которого узел простаивает перед выполнением заданий и перед автостопом.