Partilhar via


Chorume

README do Projeto do Cluster Slurm no CycleCloud

O Slurm é um gerenciador de carga de trabalho de código aberto altamente configurável. Para obter mais informações, consulte a visão geral no site do projeto Slurm.

Observação

Começando com o CycleCloud 8.4.0, reescrevemos a integração do Slurm para oferecer suporte a novos recursos e funcionalidades. Para obter mais informações, consulte a documentação do Slurm 3.0 .

Para habilitar o Slurm em um cluster do CycleCloud, modifique o 'run_list', disponível na seção de configuração da sua definição de cluster. Um cluster Slurm tem duas partes principais: o nó mestre (ou agendador), que executa o software Slurm em um sistema de arquivos compartilhado, e os nós executados, que montam esse sistema de arquivos e executam os trabalhos enviados. Por exemplo, um trecho de modelo de cluster simples pode ter a seguinte aparência:

[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 o Slurm em um cluster do CycleCloud, modifique a run_list seção de configuração da sua definição de cluster. Um cluster Slurm tem duas partes principais: o nó do agendador, que fornece um sistema de arquivos compartilhado e executa o software Slurm, e os nós de execução, que montam o sistema de arquivos compartilhado e executam os trabalhos enviados. Por exemplo, um trecho de modelo de cluster simples pode se parecer com:

[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

Editando clusters Slurm existentes

Os clusters Slurm executados nas versões 7.8 e posteriores do CycleCloud usam uma versão atualizada das APIs de dimensionamento automático que permite que os clusters usem várias matrizes e partições de nós. Para que esta funcionalidade funcione no Slurm, o CycleCloud prepopula os nós a executar no cluster. Devido a essa pré-população, necessita executar um comando no nó do agendador Slurm após realizar quaisquer alterações no cluster, como alterar os limites de dimensionamento automático ou os tipos de VM.

Alterar configurações do cluster

O cluster Slurm implantado no CycleCloud contém um script que facilita as alterações. Depois de fazer quaisquer alterações no cluster, execute o próximo comando como root (por exemplo, executando sudo -i) no nó do agendador Slurm para reconstruir o slurm.conf arquivo e atualizar os nós no cluster:

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

Observação

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

Importante

Se fizer alterações que afetem as VMs para nodos numa partição MPI (como o tamanho da VM, imagem ou cloud-init), deverá encerrar todos os nodos primeiro. Neste remove_nodes caso, o comando imprime um aviso, mas não termina com um erro. Se você alterar as VMs para nós em uma partição MPI (como o tamanho da VM, imagem ou cloud-init) enquanto os nós estão em execução, novos nós não podem iniciar e você vê o erro This node doesn't match existing scaleset attribute.

/opt/cycle/slurm/cyclecloud_slurm.sh apply_changes

Observação

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

Se você alterar as VMs para nós em uma partição MPI (como o tamanho da VM, imagem ou cloud-init) enquanto os nós estão em execução, novos nós não podem iniciar e você vê o erro This node doesn't match existing scaleset attribute. Por esse motivo, o apply_changes comando garante que os nós sejam encerrados. Se os nós não forem encerrados, o comando falhará com esta mensagem de erro: Os nós a seguir devem ser totalmente encerrados antes de aplicar as alterações.

Se você estiver fazendo uma alteração que não afete as propriedades da VM para nós MPI, não precisará encerrar os nós em execução primeiro. Nesse caso, você pode fazer as alterações usando estes dois comandos:

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

Observação

O apply_changes comando está disponível apenas no CycleCloud 8.3+. Em versões anteriores, você precisa usar os remove_nodes comandos e scale para fazer uma alteração. Verifique se o comando remove_nodes não imprime um aviso sobre os nós que precisam ser terminados.

Criação de partições suplementares

O modelo padrão fornecido com o Azure CycleCloud tem duas partições (hpc e htc), e você pode definir matrizes de nós personalizadas que mapeiam diretamente para partições Slurm. Por exemplo, para criar uma partição GPU, adicione a seguinte seção ao seu 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

Configurações de memória

O CycleCloud define automaticamente a quantidade de memória disponível para o Slurm usar para fins de agendamento. Como a memória disponível pode variar ligeiramente devido às opções do kernel Linux e o SO e a VM usam uma pequena quantidade de memória, o CycleCloud reduz automaticamente o valor da memória na configuração do Slurm. Por padrão, o CycleCloud retém 5% da memória disponível relatada em uma VM, mas você pode substituir esse valor no modelo de cluster definindo slurm.dampen_memory a porcentagem de memória a ser retida. Por exemplo, para reter 20% da memória de uma VM:

    slurm.dampen_memory=20

Desativação do escalamento automático para nós ou partições específicos

Embora o recurso "KeepAlive" integrado do CycleCloud não funcione atualmente para clusters Slurm, você pode desativar o dimensionamento automático para um cluster Slurm em execução editando o arquivo slurm.conf diretamente. Você pode excluir nós individuais ou partições inteiras do dimensionamento automático.

Excluindo um nó

Para excluir um ou mais nós do dimensionamento automático, adicione SuspendExcNodes=<listofnodes> ao arquivo de configuração do Slurm. Por exemplo, para excluir os nós 1 e 2 da hpc partição, adicione o seguinte código 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.

Excluindo uma partição

Para excluir partições inteiras do dimensionamento automático, use um processo semelhante à exclusão de nós. Para excluir a partição inteira hpc , adicione o seguinte código a /sched/slurm.conf:

SuspendExcParts=hpc

Em seguida, reinicie o serviço slurmctld.

Solução de problemas

Conflitos de UID para utilizadores Slurm e munge

Por padrão, este projeto usa um UID e GID de 11100 para o usuário Slurm e 11101 para o usuário munge. Se esses padrões causarem um conflito com outro usuário ou grupo, você poderá substituí-los.

Para substituir os valores UID e GID, selecione o botão de edição para ambos os scheduler nós:

Editar Agenda

Editar Agenda

E o execute nodearray: Edit Nodearray

Adicione os seguintes atributos à Configuration seçã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

Escala automática

O CycleCloud usa o recurso Elastic Computing do Slurm. Para depurar problemas de dimensionamento automático, verifique alguns logs no nó do agendador. Primeiro, certifique-se de que as chamadas de retomada de economia de energia estão acontecendo verificando /var/log/slurmctld/slurmctld.log. Você deve ver linhas como:

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

Consulte /var/log/slurmctld/resume.log. Se a etapa de retomada estiver falhando, marque /var/log/slurmctld/resume_fail.log. Se você vir mensagens sobre nomes de nó desconhecidos ou inválidos, siga as etapas na seção "Fazendo alterações no cluster" antes de adicionar nós ao cluster.

Referência de configuração do Slurm

A tabela a seguir descreve as opções de configuração específicas do Slurm que você pode alternar para personalizar a funcionalidade:

Opções de configuração específicas do Slurm Descrição
slurm.versão Padrão: 18.08.7-1. Define a versão do Slurm para instalar e executar. Atualmente, é a versão padrão e única disponível. Mais versões podem ser suportadas no futuro.
slurm.autoscale Padrão: false. Uma configuração por array de nós que controla se o Slurm para e inicia automaticamente os nós neste array de nós.
slurm.hpc Padrão: true. Uma configuração por array de nós que controla se os nós no array de nós estão no mesmo grupo de colocação. Usado principalmente para arrays de nós que utilizam famílias de Máquinas Virtuais com InfiniBand. Aplica-se apenas quando slurm.autoscale está definido como true.
slurm.default_partition Padrão: false. Uma configuração por nodearray que controla se a nodearray deve ser a partição padrão para trabalhos que não solicitam uma partição explicitamente.
slurm.dampen_memory Padrão: 5. A porcentagem de memória a reservar para compensar a sobrecarga do SO/VM.
slurm.suspend_timeout Padrão: 600. A quantidade de tempo, em segundos, entre o momento de uma chamada de suspensão e o instante em que esse nó pode ser novamente utilizado.
slurm.resume_timeout Padrão: 1800. A quantidade de tempo, em segundos, para aguardar a inicialização bem-sucedida de um nó.
slurm.instalar Padrão: true. Determina se o Slurm está instalado durante a inicialização do nó (true). Se você instalar o Slurm em uma imagem personalizada, defina esta opção de configuração como false (proj versão 2.5.0+).
slurm.use_pcpu Padrão: true. Uma configuração por nodearray para controlar o agendamento com vCPUs hyperthreaded. Defina false para definir CPUs=vcpus em cyclecloud.conf.
slurm.user.name Padrão: slurm. O nome de utilizador para usar no serviço Slurm.
slurm.user.uid Padrão: 11100. O ID de usuário a ser usado para o usuário do Slurm.
slurm.user.gid Padrão: 11100. O ID de grupo a ser usado para o usuário do Slurm.
munge.user.name Padrão: munge. O nome de usuário para o serviço de autenticação MUNGE a ser usado.
munge.user.uid Padrão: 11101. O ID de usuário a ser usado para o usuário MUNGE.
munge.user.gid Padrão: 11101. O ID de grupo para o utilizador MUNGE.

O CycleCloud suporta um conjunto padrão de atributos de parada automática entre agendadores:

Atributo Descrição
cyclecloud.cluster.autoscale.parar_ativado Habilita a parada automática neste nó. [verdadeiro/falso]
cyclecloud.cluster.autoscale.tempo_inativo_após_tarefas O período de tempo (em segundos) durante o qual um nó permanece ocioso após concluir trabalhos, antes de parar automaticamente.
cyclecloud.cluster.autoscale.idle_time_before_jobs (tempo de inatividade antes dos trabalhos) A quantidade de tempo (em segundos) que um nó permanece ocioso após concluir os trabalhos, antes de parar automaticamente.