Compartir a través de


Slurm

Slurm es un administrador de cargas de trabajo de código abierto altamente configurable. Consulte el sitio del proyecto de Slurm para obtener información general.

Nota

A partir de CycleCloud 8.4.0, la integración de Slurm se ha reescrito para admitir nuevas características y funcionalidades. Consulte la documentación de Slurm 3.0 para obtener más información.

Slurm se puede habilitar fácilmente en un clúster de CycleCloud modificando la "run_list" en la sección de configuración de la definición del clúster. Los dos componentes básicos de un clúster de Slurm son el nodo "master" (o "scheduler") que proporciona un sistema de archivos compartido en el que se ejecuta el software Slurm y los nodos "execute" que son los hosts que montan el sistema de archivos compartidos y ejecutan los trabajos enviados. Por ejemplo, un fragmento de código de plantilla de clúster simple puede tener el siguiente aspecto:

[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 se puede habilitar fácilmente en un clúster de CycleCloud modificando la "run_list" en la sección de configuración de la definición del clúster. Los dos componentes básicos de un clúster de Slurm son el nodo "scheduler", que proporciona un sistema de archivos compartido en el que se ejecuta el software Slurm y los nodos "execute" que son los hosts que montan el sistema de archivos compartidos y ejecutan los trabajos enviados. Por ejemplo, un fragmento de código de plantilla de clúster simple puede tener el siguiente aspecto:

[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

Edición de clústeres de Slurm existentes

Los clústeres de Slurm que se ejecutan en CycleCloud versiones 7.8 y posteriores implementan una versión actualizada de las API de escalado automático que permite a los clústeres usar varias particiones y conjuntos de nodos. Para facilitar esta funcionalidad en Slurm, CycleCloud rellena previamente los nodos de ejecución en el clúster. Por este motivo, debe ejecutar un comando en el nodo programador de Slurm después de realizar cambios en el clúster, como los límites de escalabilidad automática o los tipos de máquina virtual.

Realización de cambios en el clúster

El clúster de Slurm implementado en CycleCloud contiene un script que facilita esto. Después de realizar cambios en el clúster, ejecute lo siguiente como raíz (por ejemplo, ejecutando sudo -i) en el nodo programador de Slurm para volver a generar slurm.conf y actualizar los nodos del clúster:

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

Nota

Para cycleCloud versiones < 7.9.10, el cyclecloud_slurm.sh script se encuentra en /opt/cycle/jetpack/system/bootstrap/slurm.

Importante

Si realiza cambios que afecten a las máquinas virtuales de los nodos de una partición MPI (por ejemplo, el tamaño de la máquina virtual, la imagen o cloud-init), los nodos deben finalizar primero. El remove_nodes comando imprime una advertencia en este caso, pero no sale con un error. Si hay nodos en ejecución, obtendrá un error de This node does not match existing scaleset attribute cuándo se inician los nuevos nodos.

/opt/cycle/slurm/cyclecloud_slurm.sh apply_changes

Nota

Para CycleCloud versiones < 8.2, el cyclecloud_slurm.sh script se encuentra en /opt/cycle/jetpack/system/bootstrap/slurm.

Si realiza cambios que afectan a las máquinas virtuales de los nodos de una partición MPI (por ejemplo, el tamaño de la máquina virtual, la imagen o cloud-init) y los nodos se están ejecutando, obtendrá un error de This node does not match existing scaleset attribute cuándo se inician los nuevos nodos. Por este motivo, el apply_changes comando garantiza que los nodos están terminados y se produce un error con el siguiente mensaje de error si no: Los nodos siguientes deben finalizarse completamente antes de aplicar los cambios.

Si va a realizar un cambio que no afecta a las propiedades de máquina virtual de los nodos MPI, no es necesario finalizar primero los nodos en ejecución. En este caso, puede realizar los cambios mediante los dos comandos siguientes:

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

Nota

El apply_changes comando solo existe en CycleCloud 8.3 y versiones posteriores, por lo que la única manera de realizar un cambio en versiones anteriores es con los comandos anteriores + remove_nodesscale. Asegúrese de que el remove_nodes comando no imprime una advertencia sobre los nodos que deben finalizarse.

Creación de particiones adicionales

La plantilla predeterminada que se incluye con Azure CycleCloud tiene dos particiones (hpc y htc), y puede definir nodos personalizados que se asignan directamente a las particiones de Slurm. Por ejemplo, para crear una partición de GPU, agregue la siguiente sección a la plantilla de clúster:

    [[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

Configuración de memoria

CycleCloud establece automáticamente la cantidad de memoria disponible para que Slurm se use con fines de programación. Dado que la cantidad de memoria disponible puede cambiar ligeramente debido a diferentes opciones de kernel de Linux, y el sistema operativo y la máquina virtual pueden usar una pequeña cantidad de memoria que, de lo contrario, estaría disponible para los trabajos, CycleCloud reduce automáticamente la cantidad de memoria en la configuración de Slurm. De forma predeterminada, CycleCloud mantiene el 5 % de la memoria disponible notificada en una máquina virtual, pero este valor se puede invalidar en la plantilla de clúster estableciendo slurm.dampen_memory en el porcentaje de memoria que se va a retener. Por ejemplo, para retener el 20 % de la memoria de una máquina virtual:

    slurm.dampen_memory=20

Deshabilitación del escalado automático para nodos o particiones específicos

Aunque la característica integrada CycleCloud "KeepAlive" no funciona actualmente para los clústeres de Slurm, es posible deshabilitar la escalabilidad automática para un clúster de Slurm en ejecución editando el archivo slurm.conf directamente. Puede excluir nodos individuales o particiones completas de la escalabilidad automática.

Exclusión de un nodo

Para excluir un nodo o varios nodos del escalado automático, agregue SuspendExcNodes=<listofnodes> al archivo de configuración de Slurm. Por ejemplo, para excluir los nodos 1 y 2 de la partición hpc, agregue lo siguiente a /sched/slurm.conf:

SuspendExcNodes=hpc-pg0-[1-2]

A continuación, reinicie el slurmctld servicio para que la nueva configuración surta efecto.

Exclusión de una partición

Excluir particiones completas del escalado automático es similar a excluir nodos. Para excluir toda hpc la partición, agregue lo siguiente a /sched/slurm.conf

SuspendExcParts=hpc

A continuación, reinicie el servicio slurmctld.

Solución de problemas

Conflictos de UID para usuarios de Slurm y Munge

De forma predeterminada, este proyecto usa un UID y GID de 11100 para el usuario Slurm y 11101 para el usuario munge. Si esto provoca un conflicto con otro usuario o grupo, estos valores predeterminados se pueden invalidar.

Para invalidar uiD y GID, haga clic en el botón editar para ambos nodos scheduler :

Editar programador

Editar programador

Y nodearray execute : Editar nodearray

y agregue los atributos siguientes a la Configuration sección :

Editar configuración Editar configuración

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

Escalado automático

CycleCloud usa la característica Elastic Computing de Slurm. Para depurar problemas de escalado automático, hay algunos registros en el nodo del programador que puede comprobar. La primera es asegurarse de que se realizan las llamadas de reanudación de ahorro de energía comprobando /var/log/slurmctld/slurmctld.log. Debería ver líneas como:

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

El otro registro que se va a comprobar es /var/log/slurmctld/resume.log. Si se produce un error en el paso de reanudación, también habrá ./var/log/slurmctld/resume_fail.log Si hay mensajes sobre nombres de nodo desconocidos o no válidos, asegúrese de que no ha agregado nodos al clúster sin seguir los pasos descritos en la sección "Realizar cambios en el clúster" anterior.

Referencia de configuración de Slurm

A continuación se muestran las opciones de configuración específicas de Slurm que puede alternar para personalizar la funcionalidad:

Opciones de configuración específicas de Slurm Descripción
slurm.version Valor predeterminado: '18.08.7-1'. Esta es la versión de Slurm que se va a instalar y ejecutar. Actualmente es la opción predeterminada y única . En las futuras versiones adicionales del software Slurm se pueden admitir.
slurm.autoscale Valor predeterminado: 'false'. Se trata de una configuración por nodoarray que controla si Slurm debe detener e iniciar automáticamente los nodos en esta matriz de nodos.
slurm.hpc Valor predeterminado: "true". Se trata de una configuración por nodoarray que controla si los nodos de la matriz nodearray se colocarán en el mismo grupo de selección de ubicación. Se usa principalmente para nodearrays mediante familias de máquinas virtuales con InfiniBand. Solo se aplica cuando slurm.autoscale se establece en "true".
slurm.default_partition Valor predeterminado: 'false'. Se trata de una configuración por nodoarray que controla si nodearray debe ser la partición predeterminada para los trabajos que no solicitan una partición explícitamente.
slurm.dampen_memory Valor predeterminado: '5'. Porcentaje de memoria que se va a retener para la sobrecarga del sistema operativo o la máquina virtual.
slurm.suspend_timeout Valor predeterminado: '600'. Cantidad de tiempo (en segundos) entre una llamada de suspensión y cuándo se puede volver a usar ese nodo.
slurm.resume_timeout Valor predeterminado: '1800'. Cantidad de tiempo (en segundos) que se espera a que un nodo arranque correctamente.
slurm.install Valor predeterminado: "true". Determina si Slurm está instalado en el arranque del nodo ("true"). Si Slurm está instalado en una imagen personalizada, debe establecerse en "false". (versión proj 2.5.0+)
slurm.use_pcpu Valor predeterminado: "true". Se trata de una configuración por nodoarray para controlar la programación con vcpus hiperprocesos. Establezca en "false" para establecer CPU=vcpus en cyclecloud.conf.
slurm.user.name Valor predeterminado: 'slurm'. Este es el nombre de usuario del servicio Slurm que se va a usar.
slurm.user.uid Valor predeterminado: '11100'. Identificador de usuario que se va a usar para el usuario de Slurm.
slurm.user.gid Valor predeterminado: '11100'. Identificador de grupo que se va a usar para el usuario de Slurm.
munge.user.name Valor predeterminado: 'munge'. Este es el nombre de usuario del servicio de autenticación MUNGE que se va a usar.
munge.user.uid Valor predeterminado: '11101'. Identificador de usuario que se va a usar para el usuario MUNGE.
munge.user.gid Valor predeterminado: '11101'. Identificador de grupo que se va a usar para el usuario MUNGE.

CycleCloud admite un conjunto estándar de atributos de escalado automático entre programadores:

Atributo Descripción
cyclecloud.cluster.autoscale.stop_enabled ¿Está habilitado el escalado automático en este nodo? [true/false]
cyclecloud.cluster.autoscale.idle_time_after_jobs Cantidad de tiempo (en segundos) para que un nodo esté inactivo después de completar los trabajos antes de reducirse verticalmente.
cyclecloud.cluster.autoscale.idle_time_before_jobs Cantidad de tiempo (en segundos) para que un nodo esté inactivo antes de completar los trabajos antes de reducirse verticalmente.