Share via


Slurm

O Slurm é um gestor de cargas de trabalho de open source altamente configurável. Consulte o site do projeto Slurm para obter uma descrição geral.

Nota

A partir do CycleCloud 8.4.0, a integração do Slurm foi reescrita para suportar novas funcionalidades e funcionalidades. Veja a documentação do Slurm 3.0 para obter mais informações.

O Slurm pode ser facilmente ativado num cluster do CycleCloud ao modificar o "run_list" na secção de configuração da definição do cluster. Os dois componentes básicos de um cluster Slurm são o nó "master" (ou "scheduler") que fornece um sistema de ficheiros partilhado no qual o software Slurm é executado e os nós "execute", que são os anfitriões que montam o sistema de ficheiros partilhados e executam as tarefas submetidas. Por exemplo, um fragmento de modelo de cluster simples pode ter o seguinte aspeto:

[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

O Slurm pode ser facilmente ativado num cluster do CycleCloud ao modificar o "run_list" na secção de configuração da definição do cluster. Os dois componentes básicos de um cluster Slurm são o nó "scheduler" que fornece um sistema de ficheiros partilhado no qual o software Slurm é executado e os nós "execute", que são os anfitriões que montam o sistema de ficheiros partilhado e executam as tarefas submetidas. Por exemplo, um fragmento de modelo de cluster simples pode ter o seguinte aspeto:

[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

Editar Clusters Slurm Existentes

Os clusters Slurm em execução no CycleCloud versões 7.8 e posteriores implementam uma versão atualizada das APIs de dimensionamento automático que permite que os clusters utilizem várias nodearrays e partições. Para facilitar esta funcionalidade no Slurm, o CycleCloud pré-preenche os nós de execução no cluster. Por este motivo, tem de executar um comando no nó Slurm scheduler depois de efetuar alterações ao cluster, como limites de dimensionamento automático ou tipos de VM.

Fazer Alterações ao Cluster

O cluster Slurm implementado no CycleCloud contém um script que o facilita. Depois de efetuar alterações ao cluster, execute o seguinte como raiz (por exemplo, ao executar sudo -i) no nó Slurm scheduler para reconstruir o slurm.conf e atualizar os nós no cluster:

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

Nota

Para as versões < 7.9.10 do CycleCloud, o cyclecloud_slurm.sh script está localizado em /opt/cycle/jetpack/system/bootstrap/slurm.

Importante

Se efetuar alterações que afetem as VMs dos nós numa partição de MPI (como o tamanho da VM, a imagem ou o cloud-init), todos os nós têm de ser terminados primeiro. Neste remove_nodes caso, o comando imprime um aviso, mas não sai com um erro. Se existirem nós em execução, receberá um erro de This node does not match existing scaleset attribute quando os novos nós forem iniciados.

/opt/cycle/slurm/cyclecloud_slurm.sh apply_changes

Nota

Para as versões < 8.2 do CycleCloud, o cyclecloud_slurm.sh script está localizado em /opt/cycle/jetpack/system/bootstrap/slurm.

Se fizer alterações que afetam as VMs dos nós numa partição de MPI (como o tamanho da VM, a imagem ou o cloud-init) e os nós estiverem em execução, receberá um erro de This node does not match existing scaleset attribute quando forem iniciados novos nós. Por este motivo, o apply_changes comando certifica-se de que os nós são terminados e falha com a seguinte mensagem de erro, caso contrário: os seguintes nós têm de ser totalmente terminados antes de aplicar as alterações.

Se estiver a fazer uma alteração que NÃO afete as propriedades da VM para nós de MPI, não terá de terminar primeiro os nós em execução. Neste caso, pode fazer as alterações com os dois comandos seguintes:

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

Nota

O apply_changes comando só existe no CycleCloud 8.3+, pelo que a única forma de fazer uma alteração em versões anteriores é com os comandos acima + remove_nodesscale. Certifique-se de que o remove_nodes comando não imprime um aviso sobre os nós que têm de ser terminados.

Criar partições adicionais

O modelo predefinido que é fornecido com o Azure CycleCloud tem duas partições (hpc e htc) e pode definir nós personalizados que mapeiam diretamente para partições Slurm. Por exemplo, para criar uma partição de GPU, adicione a secção seguinte ao modelo de cluster:

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

Definições de memória

O CycleCloud define automaticamente a quantidade de memória disponível para o Slurm utilizar para fins de agendamento. Uma vez que a quantidade de memória disponível pode mudar ligeiramente devido a diferentes opções de kernel do Linux e o SO e a VM podem utilizar uma pequena quantidade de memória que, de outra forma, estaria disponível para tarefas, o CycleCloud reduz automaticamente a quantidade de memória na configuração slurm. Por predefinição, o CycleCloud retém 5% da memória disponível comunicada numa VM, mas este valor pode ser substituído no modelo de cluster ao definir slurm.dampen_memory para a percentagem de memória a reter. Por exemplo, para reter 20% da memória de uma VM:

    slurm.dampen_memory=20

Desativar o dimensionamento automático para nós ou partições específicos

Embora a funcionalidade "KeepAlive" incorporada do CycleCloud não funcione atualmente para clusters Slurm, é possível desativar o dimensionamento automático para um cluster Slurm em execução ao editar diretamente o ficheiro slurm.conf. Pode excluir os nós individuais ou partições inteiras de serem dimensionados automaticamente.

Excluir um nó

Para excluir um nó ou vários nós do dimensionamento automático, adicione SuspendExcNodes=<listofnodes> ao ficheiro de configuração Slurm. Por exemplo, para excluir os nós 1 e 2 da partição hpc, adicione o seguinte a /sched/slurm.conf:

SuspendExcNodes=hpc-pg0-[1-2]

Em seguida, reinicie o slurmctld serviço para que a nova configuração entre em vigor.

Excluir uma partição

Excluir partições inteiras do dimensionamento automático é semelhante a excluir nós. Para excluir toda hpc a partição, adicione o seguinte a /sched/slurm.conf

SuspendExcParts=hpc

Em seguida, reinicie o slurmctld serviço.

Resolução de problemas

Conflitos de UID para utilizadores do Slurm e munge

Por predefinição, este projeto utiliza um UID e UM GID de 11100 para o utilizador Slurm e 11101 para o utilizador Munge. Se isto causar um conflito com outro utilizador ou grupo, estas predefinições poderão ser substituídas.

Para substituir o UID e o GID, clique no botão editar para ambos os scheduler nós:

Editar Agendador

Editar Agendador

E a execute nodearray: Edit nodearray

e adicione os seguintes atributos à Configuration secção :

Editar configuração

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

Dimensionamento Automático

O CycleCloud utiliza a funcionalidade de Computação Elástica do Slurm. Para depurar problemas de dimensionamento automático, existem alguns registos no nó do agendador que pode verificar. A primeira é certificar-se de que as chamadas de currículo de poupança de energia estão a ser efetuadas ao verificar /var/log/slurmctld/slurmctld.log. Deverá ver linhas como:

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

O outro registo a verificar é /var/log/slurmctld/resume.log. Se o passo de currículo estiver a falhar, também haverá um /var/log/slurmctld/resume_fail.log. Se existirem mensagens sobre nomes de nós desconhecidos ou inválidos, confirme que não adicionou nós ao cluster sem seguir os passos na secção "Fazer Alterações ao Cluster" acima.

Referência de Configuração do Slurm

Seguem-se as opções de configuração específicas do Slurm que pode alternar para personalizar a funcionalidade:

Opções de Configuração Específicas do Slurm Descrição
slurm.version Predefinição: "18.08.7-1". Esta é a versão do Slurm para instalar e executar. Esta é atualmente a opção predefinida e única . No futuro, poderão ser suportadas versões adicionais do software Slurm.
slurm.autoscale Predefinição: "false". Esta é uma definição por nodearray que controla se o Slurm deve parar e iniciar automaticamente os nós nesta nodearray.
slurm.hpc Predefinição: "true". Esta é uma definição por nódarray que controla se os nós na matriz de nós serão colocados no mesmo grupo de colocação. Utilizado principalmente para nodearrays com famílias de VMs com InfiniBand. Só se aplica quando o slurm.autoscale está definido como "verdadeiro".
slurm.default_partition Predefinição: "false". Esta é uma definição por nodearray que controla se a matriz de nós deve ser a partição predefinida para tarefas que não pedem explicitamente uma partição.
slurm.dampen_memory Predefinição: "5". A percentagem de memória a reter para sobrecarga do SO/VM.
slurm.suspend_timeout Predefinição: "600". A quantidade de tempo (em segundos) entre uma chamada de suspensão e quando esse nó pode ser utilizado novamente.
slurm.resume_timeout Predefinição: "1800". A quantidade de tempo (em segundos) a aguardar que um nó arranque com êxito.
slurm.install Predefinição: "true". Determina se o Slurm está instalado no arranque do nó ("verdadeiro"). Se o Slurm estiver instalado numa imagem personalizada, deve ser definido como "falso". (versão proj 2.5.0+)
slurm.use_pcpu Predefinição: "true". Esta é uma definição por nodearray para controlar o agendamento com vcpus hiperthreaded. Defina como "false" para definir CPUs=vcpus em cyclecloud.conf.
slurm.user.name Predefinição: 'slurm'. Este é o nome de utilizador do serviço Slurm a utilizar.
slurm.user.uid Predefinição: "11100". O ID de Utilizador a utilizar para o utilizador slurm.
slurm.user.gid Predefinição: "11100". O ID de Grupo a utilizar para o utilizador slurm.
munge.user.name Predefinição: "munge". Este é o nome de utilizador do serviço de autenticação MUNGE a utilizar.
munge.user.uid Predefinição: "11101". O ID de Utilizador a utilizar para o utilizador MUNGE.
munge.user.gid Predefinição: "11101". O ID de Grupo a utilizar para o utilizador MUNGE.

O CycleCloud suporta um conjunto padrão de atributos de paragens automáticas entre agendadores:

Atributo Descrição
cyclecloud.cluster.autoscale.stop_enabled O parante automático está ativado neste nó? [true/false]
cyclecloud.cluster.autoscale.idle_time_after_jobs A quantidade de tempo (em segundos) para um nó ficar inativo depois de concluir as tarefas antes de ser reduzido verticalmente.
cyclecloud.cluster.autoscale.idle_time_before_jobs A quantidade de tempo (em segundos) para um nó ficar inativo antes de concluir as tarefas antes de ser reduzido verticalmente.