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_nodes
scale
.
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
:
Y nodearray execute
:
y agregue los atributos siguientes a la Configuration
secció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. |