Compartir a través de


Slurm

Léame del proyecto de clúster de CycleCloud Slurm

Slurm es un administrador de cargas de trabajo de código abierto altamente configurable. Para obtener más información, consulte la información general sobre el sitio del proyecto Slurm.

Nota:

A partir de CycleCloud 8.4.0, reescribimos la integración de Slurm para admitir nuevas características y funcionalidades. Para obtener más información, consulte la documentación de Slurm 3.0 .

Para habilitar Slurm en un clúster de CycleCloud, modifique el "run_list", disponible en la sección de configuración de la definición del clúster. Un clúster de Slurm tiene dos partes principales: el nodo maestro (o programador), que ejecuta el software Slurm en un sistema de archivos compartido y los nodos ejecutados, que montan ese sistema de archivos 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

Para habilitar Slurm en un clúster de CycleCloud, modifique en run_list la sección de configuración de la definición del clúster. Un clúster de Slurm tiene dos partes principales: el nodo del programador, que proporciona un sistema de archivos compartido y ejecuta el software Slurm y los nodos de ejecución, que montan el sistema de archivos compartido y ejecutan los trabajos enviados. Por ejemplo, un fragmento de código de plantilla de clúster simple podría 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 usan una versión actualizada de las API de escalado automático que permite a los clústeres usar varias matrices de nodos y particiones. Para que esta funcionalidad funcione en Slurm, CycleCloud rellena previamente los nodos ejecutados en el clúster. Debido a esta prepoblación, debe ejecutar un comando en el nodo planificador de Slurm después de realizar cambios en el clúster, como cambiar los límites de escalado automático 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 los cambios. Después de realizar cambios en el clúster, ejecute el siguiente comando como raíz (por ejemplo, ejecutando sudo -i) en el nodo programador de Slurm para recompilar el slurm.conf archivo y actualizar los nodos del clúster:

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

Nota:

Para las versiones de CycleCloud anteriores a la versión 7.9.10, el cyclecloud_slurm.sh script se encuentra en /opt/cycle/jetpack/system/bootstrap/slurm.

Importante

Si realiza algún cambio que afecte a las máquinas virtuales de los nodos de una partición de MPI (como el tamaño de máquina virtual, la imagen o cloud-init), primero debe finalizar todos los nodos. El remove_nodes comando imprime una advertencia en este caso, pero no sale con un error. Si cambia las máquinas virtuales de los nodos de una partición de MPI (por ejemplo, el tamaño de la máquina virtual, la imagen o cloud-init) mientras se ejecutan los nodos, los nodos nuevos no se pueden iniciar y verá el error This node doesn't match existing scaleset attribute.

/opt/cycle/slurm/cyclecloud_slurm.sh apply_changes

Nota:

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

Si cambia las máquinas virtuales de los nodos de una partición de MPI (por ejemplo, el tamaño de la máquina virtual, la imagen o cloud-init) mientras se ejecutan los nodos, los nodos nuevos no se pueden iniciar y verá el error This node doesn't match existing scaleset attribute. Por este motivo, el apply_changes comando garantiza que los nodos finalizan. Si los nodos no finalizan, se produce un error en el comando con este mensaje de error: Los nodos siguientes deben finalizar completamente antes de aplicar los cambios.

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

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

Nota:

El apply_changes comando solo está disponible en CycleCloud 8.3+. En versiones anteriores, debe usar los remove_nodes comandos y scale para realizar un cambio. Asegúrese de que el remove_nodes comando no imprime una advertencia sobre los nodos que deben finalizarse.

Creación de particiones complementarias

La plantilla predeterminada que se incluye con Azure CycleCloud tiene dos particiones (hpc y htc) y puede definir matrices de nodos personalizadas que se asignan directamente a 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 memoria disponible puede variar ligeramente debido a las opciones del kernel de Linux, y el sistema operativo y la máquina virtual usan una pequeña cantidad de memoria, CycleCloud reduce automáticamente el valor de memoria en la configuración de Slurm. De forma predeterminada, CycleCloud conserva 5% de la memoria disponible reportada en una máquina virtual, pero puede sobrescribir este valor en la plantilla de clúster estableciendo slurm.dampen_memory en el porcentaje de memoria que se va a retener. Por ejemplo, para retener un 20 % de 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, puede 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 uno 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 hpc partición, agregue el código siguiente a /sched/slurm.conf:

SuspendExcNodes=hpc-pg0-[1-2]

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

Exclusión de una partición

Para excluir particiones completas del escalado automático, use un proceso similar para excluir nodos. Para excluir la partición hpc completa, agregue el siguiente código a /sched/slurm.conf:

SuspendExcParts=hpc

A continuación, reinicie el servicio slurmctld.

Solución de problemas

Conflictos de UID para los usuarios de Slurm y munge

De forma predeterminada, este proyecto usa un UID y GID de 11100 para el usuario de Slurm y 11101 para el usuario munge. Si estos valores predeterminados provocan un conflicto con otro usuario o grupo, puede invalidarlos.

Para invalidar los valores UID y GID, seleccione el botón editar para ambos nodos scheduler :

Editar programador

Editar programador

Y la nodearray execute: Editar nodearray

Agregue los siguientes atributos a la sección Configuration: 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, compruebe algunos registros en el nodo del programador. En primer lugar, asegúrese de que se están produciendo 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

Compruebe /var/log/slurmctld/resume.log. Si se produce un error en el paso de reanudación, compruebe /var/log/slurmctld/resume_fail.log. Si ve mensajes sobre nombres de nodo desconocidos o no válidos, asegúrese de seguir los pasos descritos en la sección "Realizar cambios en el clúster" antes de agregar nodos al clúster.

Referencia de configuración de Slurm

En la tabla siguiente se describen 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 Predeterminado: 18.08.7-1. Establece la versión de Slurm para instalar y ejecutar. Actualmente, es la versión predeterminada y la única disponible. Es posible que se admita más versiones en el futuro.
slurm.autoscale Predeterminado: false. Una configuración por matriz de nodos que controla si Slurm detiene e inicia automáticamente los nodos dentro de esta matriz de nodos.
slurm.hpc Predeterminado: true. Una configuración por matriz de nodos que controla si los nodos en la matriz de nodos están en el mismo grupo de ubicación. Se usa principalmente para matrices de nodos que usan familias de máquinas virtuales con InfiniBand. Solo se aplica cuando slurm.autoscale se establece en true.
slurm.default_partition Predeterminado: false. Una configuración para cada nodoarray que determina si el nodoarray debe ser la partición predeterminada para los trabajos que no especifican una partición explícitamente.
slurm.dampen_memory Predeterminado: 5. Porcentaje de memoria que se va a retener para la sobrecarga del sistema operativo o la máquina virtual.
slurm.suspend_timeout 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 Predeterminado: 1800. Cantidad de tiempo en segundos para esperar a que un nodo arranque correctamente.
slurm.install Predeterminado: true. Determina si Slurm está instalado en el arranque del nodo (true). Si instala Slurm en una imagen personalizada, establezca esta opción de configuración en false (versión de proj 2.5.0+).
slurm.use_pcpu Predeterminado: true. Una configuración por nodearray para controlar la programación con vCPU hiperthreaded. Establezca en false para establecer CPUs=vcpus en cyclecloud.conf.
slurm.user.name Predeterminado: slurm. Nombre de usuario del servicio Slurm que se va a usar.
slurm.user.uid Predeterminado: 11100. Identificador de usuario que se va a usar para el usuario de Slurm.
slurm.user.gid Predeterminado: 11100. Identificador de grupo que se va a usar para el usuario de Slurm.
munge.user.name Predeterminado: munge. Nombre de usuario del servicio de autenticación MUNGE que se va a usar.
munge.user.uid Predeterminado: 11101. Identificador de usuario que se va a usar para el usuario MUNGE.
munge.user.gid Predeterminado: 11101. Identificador de grupo para el usuario MUNGE.

CycleCloud admite un conjunto estándar de atributos de detención automática en los planificadores.

Atributo Descripción
cyclecloud.cluster.autoscale.stop_enabled Habilitar la función de autostop en este nodo. [verdadero/falso]
cyclecloud.cluster.autoscale.idle_time_after_jobs Cantidad de tiempo (en segundos) para que un nodo se quede inactivo después de completar sus trabajos antes de que se detenga automáticamente.
cyclecloud.cluster.autoscale.idle_time_before_jobs Cantidad de tiempo (en segundos) para que un nodo permanezca inactivo antes de completar las tareas y antes de que se detenga automáticamente.