Compartilhar via


SLURM

README do Projeto de Cluster Slurm do CycleCloud

O Slurm é um gerenciador de cargas de trabalho de software livre altamente configurável. Para obter mais informações, consulte a visão geral no site do projeto Slurm.

Observação

A partir do CycleCloud 8.4.0, nós reescrevemos a integração do Slurm para dar 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 CycleCloud, modifique o 'run_list', disponível na seção de configuração da definição do 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 snippet de modelo de cluster simples pode ser semelhante a:

[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 CycleCloud, modifique a seção de configuração run_list da definição do 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 agrupamento simples pode ser semelhante a:

[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 do Slurm existentes

Os clusters Slurm em execução nas versões 7.8 e posteriores do CycleCloud usam uma versão atualizada das APIs de dimensionamento automático, o que permite que os clusters utilizem múltiplas matrizes de nós e partições. Para fazer essa funcionalidade funcionar no Slurm, o CycleCloud preenche previamente os nós executados no cluster. Devido a essa prepopulação, você precisa executar um comando no nó do agendador do Slurm depois de fazer alterações no cluster, como alterar os limites de dimensionamento automático ou os tipos de VM.

Fazendo alterações no cluster

O cluster Slurm implantado no CycleCloud contém um script que facilita as alterações. Depois de fazer alterações no cluster, execute o próximo comando como usuário root (por exemplo, executando sudo -i) no nó agendador do Slurm para recompilar o arquivo slurm.conf 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 antes da 7.9.10, o cyclecloud_slurm.sh script está localizado em /opt/cycle/jetpack/system/bootstrap/slurm.

Importante

Se você fizer alterações que afetem as VMs dos nós em uma partição MPI (como tamanho da VM, imagem ou cloud-init), você deverá encerrar todos os nós primeiro. O remove_nodes comando imprime um aviso nesse caso, mas não sai 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 estiverem em execução, novos nós não poderão ser iniciados e você verá o erro This node doesn't match existing scaleset attribute.

/opt/cycle/slurm/cyclecloud_slurm.sh apply_changes

Observação

Para as versões do CycleCloud < 8.2, o script cyclecloud_slurm.sh 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 estiverem em execução, novos nós não poderão ser iniciados e você verá 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 seguintes nós deverão ser totalmente encerrados antes de aplicar alterações.

Se você estiver fazendo uma alteração que não afete as propriedades da VM dos nós MPI, não será necessário encerrar os nós em execução. 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 só está disponível no CycleCloud 8.3+. Em versões anteriores, você precisava usar os comandos remove_nodes e scale para fazer uma alteração. Certifique-se de que o comando remove_nodes não exiba um aviso sobre nós que precisam ser encerrados.

Criando partições complementares

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 são mapeadas diretamente para partições slurm. Por exemplo, para criar uma partição de GPU, adicione a seguinte seção 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

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 de kernel do Linux e o sistema operacional e a VM usam uma pequena quantidade de memória, o CycleCloud reduz automaticamente o valor de 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 para o percentual de memória a ser retido. Por exemplo, para reter 20% da memória de uma VM:

    slurm.dampen_memory=20

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

Embora o recurso interno "KeepAlive" do CycleCloud não funcione atualmente para clusters Slurm, você pode desabilitar 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 de serem dimensionada automaticamente.

Excluindo um nó

Para excluir um ou mais nós do dimensionamento automático, adicione SuspendExcNodes=<listofnodes> ao arquivo de configuração 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 serviço slurmctld para que a nova configuração entre em vigor.

Excluindo uma partição

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

SuspendExcParts=hpc

Reinicie o serviço slurmctld.

Resolução de problemas

Conflitos de UID para os usuários Slurm e munge

Por padrão, este projeto usa um UID e GID de 11100 para o usuário do Slurm e 11101 para o usuário do 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 Editar para ambos os scheduler nós:

Editar Agendador

Editar Agendador

E o execute nodearray: Editar Nodearray

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

Autoscale

O CycleCloud usa o recurso Computação Elástica do Slurm. Para depurar problemas de escala automática, verifique alguns logs no nó do agendador. Primeiro, verifique se 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

Verifique /var/log/slurmctld/resume.log. Se a etapa de retomada estiver falhando, verifique /var/log/slurmctld/resume_fail.log. Se você vir mensagens sobre nomes de nó desconhecidos ou inválidos, siga as etapas na seção "Fazer Alterações de 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.version Padrão: 18.08.7-1. Define a versão do Slurm para instalar e executar. Atualmente, é a única versão padrão disponível. Mais versões podem ter suporte no futuro.
slurm.autoscale Padrão: false. Uma configuração por nodearray que controla se o Slurm deverá parar e iniciar nós automaticamente nesse nodearray.
slurm.hpc Padrão: true. Uma configuração por grupo de nós que controla se os nós na matriz de nós estão no mesmo grupo de posicionamento. Usado principalmente para matrizes de nós que usam famílias de VM com InfiniBand. Ele só se aplica quando slurm.autoscale é definido como true.
slurm.default_partition Padrão: false. Uma configuração por nodearray que controla se o 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 ser retida para sobrecarga de SO/VM.
slurm.suspend_timeout Padrão: 600. O período de tempo em segundos entre uma chamada de suspensão e o momento em que o nó pode ser usado novamente.
slurm.resume_timeout Padrão: 1800. A quantidade de tempo em segundos para esperar que um nó seja inicializado com sucesso.
slurm.install Padrão: true. Determina se o Slurm está instalado na inicialização do nó (true). Se você instalar o Slurm em uma imagem personalizada, defina essa 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 com hyperthreading. Defina false para definir CPUs=vcpus em cyclecloud.conf.
slurm.user.name Padrão: slurm. O nome de usuário para o serviço Slurm a ser usado.
slurm.user.uid Padrão: 11100. A ID do usuário a ser usada para o usuário do Slurm.
slurm.user.gid Padrão: 11100. A ID do grupo a ser usada 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 utilizado.
munge.user.uid Padrão: 11101. A ID do usuário a ser usada para o usuário do MUNGE.
munge.user.gid Padrão: 11101. A ID do grupo para o usuário do MUNGE.

O CycleCloud oferece suporte a um conjunto padrão de atributos de parada automática entre os agendadores.

Atributo Descrição
cyclecloud.cluster.autoscale.stop_enabled Habilita a parada automática neste nó. [verdadeiro/falso]
cyclecloud.cluster.autoscale.idle_time_after_jobs A quantidade de tempo (em segundos) para um nó ficar ocioso depois de concluir os trabalhos antes de parar automaticamente.
cyclecloud.cluster.autoscale.idle_time_before_jobs A quantidade de tempo (em segundos) para um nó ficar ocioso antes de concluir os trabalhos antes de parar automaticamente.