Share via


Slurm

Slurm é um gerenciador de carga de trabalho de código aberto altamente configurável. Consulte o site do projeto Slurm para obter uma visão geral.

Observação

A partir do CycleCloud 8.4.0, a integração do Slurm foi reescrita para dar suporte a novos recursos e funcionalidades. Consulte a documentação do Slurm 3.0 para obter mais informações.

O Slurm pode ser facilmente habilitado em um cluster CycleCloud modificando o "run_list" na seção de configuração da definição do cluster. Os dois componentes básicos de um cluster Slurm são o nó "master" (ou "agendador") que fornece um sistema de arquivos compartilhado no qual o software Slurm é executado e os nós "execute", que são os hosts que montam o sistema de arquivos compartilhado 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

O Slurm pode ser facilmente habilitado em um cluster CycleCloud modificando o "run_list" na seção de configuração da definição do cluster. Os dois componentes básicos de um cluster Slurm são o nó "agendador", que fornece um sistema de arquivos compartilhado no qual o software Slurm é executado e os nós "execute", que são os hosts que montam o sistema de arquivos compartilhado e executam os trabalhos enviados. Por exemplo, um snippet de modelo de cluster 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

Editando 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 essa funcionalidade no Slurm, o CycleCloud preenche previamente os nós de execução no cluster. Por isso, você precisa executar um comando no nó agendador slurm depois de fazer alterações no cluster, como limites de dimensionamento automático ou tipos de VM.

Fazendo alterações de cluster

O cluster Slurm implantado no CycleCloud contém um script que facilita isso. Depois de fazer alterações no cluster, execute o seguinte como raiz (por exemplo, executando sudo -i) no nó agendador slurm para recompilar e slurm.conf atualizar os nós no cluster:

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

Observação

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 você fizer alterações que afetem as VMs para nós em uma partição MPI (como tamanho da VM, imagem ou cloud-init), todos os nós deverão ser encerrados primeiro. O remove_nodes comando imprime um aviso nesse caso, mas não sai com um erro. Se houver nós em execução, você receberá um erro de This node does not match existing scaleset attribute quando novos nós forem iniciados.

/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ê fizer alterações que afetam as VMs para nós em uma partição MPI (como tamanho da VM, imagem ou cloud-init) e os nós estiverem em execução, você receberá um erro de This node does not match existing scaleset attribute quando novos nós forem iniciados. Por esse motivo, o apply_changes comando garante que os nós sejam encerrados e falha com a seguinte mensagem de erro, caso contrário: os seguintes nós devem ser totalmente encerrados antes de aplicar alterações.

Se você estiver fazendo uma alteração que NÃO afete as propriedades da VM para nós de MPI, não será necessário terminar a execução de nós primeiro. Nesse caso, você pode fazer as alterações usando os dois comandos a seguir:

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

Observação

O apply_changes comando só existe no CycleCloud 8.3+, portanto, a única maneira de fazer uma alteração em versões anteriores é com os comandos acima + remove_nodesscale. Verifique se o remove_nodes comando não imprime um aviso sobre nós que precisam ser encerrados.

Criando partições adicionais

O modelo padrão fornecido com o Azure CycleCloud tem duas partições (hpc e htc), e você pode definir nodearrays 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 quantidade de memória disponível pode mudar ligeiramente devido a diferentes opções de kernel do Linux, e o sistema operacional e a VM podem usar uma pequena quantidade de memória que, de outra forma, estaria disponível para trabalhos, o CycleCloud reduz automaticamente a quantidade 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 esse valor pode ser substituído no modelo de cluster definindo slurm.dampen_memory como o percentual de memória a ser retido. Por exemplo, para reter 20% da memória de uma VM:

    slurm.dampen_memory=20

Desabilitar 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, é possível 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 dimensionado automaticamente.

Excluindo um nó

Para excluir um nó ou vários 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 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.

Excluindo uma partição

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

SuspendExcParts=hpc

Reinicie o serviço slurmctld.

Solução de problemas

Conflitos UID para usuários de Slurm e Munge

Por padrão, esse projeto usa um UID e UM GID de 11100 para o usuário slurm e 11101 para o usuário do Munge. Se isso causar um conflito com outro usuário ou grupo, esses padrões poderão ser substituídos.

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

Editar Agendador

Editar Agendador

E a execute nodearray: Editar Nodearray

e 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

Autoscale

O CycleCloud usa o recurso de Computação Elástica do Slurm. Para depurar problemas de dimensionamento automático, há alguns logs no nó do agendador que você pode marcar. A primeira é verificar se as chamadas de retomada de economia de energia estão sendo feitas 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

O outro log para marcar é /var/log/slurmctld/resume.log. Se a etapa de retomada estiver falhando, também haverá um /var/log/slurmctld/resume_fail.log. Se houver mensagens sobre nomes de nó desconhecidos ou inválidos, verifique se você não adicionou nós ao cluster sem seguir as etapas na seção "Fazendo alterações de cluster" acima.

Referência de configuração do Slurm

Veja a seguir 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'. Esta é a versão do Slurm a ser instalada e executada. No momento, essa é a opção padrão e única . Nas versões adicionais futuras do software Slurm podem ter suporte.
slurm.autoscale Padrão: 'false'. Essa é uma configuração por nodearray que controla se o Slurm deve parar e iniciar automaticamente os nós neste nodearray.
slurm.hpc Padrão: 'true'. Essa é uma configuração por nodearray que controla se os nós na nodearray serão colocados no mesmo grupo de posicionamento. Usado principalmente para nodearrays usando famílias de VM com InfiniBand. Ele só se aplica quando slurm.autoscale é definido como 'true'.
slurm.default_partition Padrão: 'false'. Essa é 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'. O percentual de memória a ser retido para sobrecarga do sistema operacional/VM.
slurm.suspend_timeout Padrão: '600'. A quantidade de tempo (em segundos) entre uma chamada de suspensão e quando esse nó pode ser usado novamente.
slurm.resume_timeout Padrão: '1800'. A quantidade de tempo (em segundos) para aguardar a inicialização bem-sucedida de um nó.
slurm.install Padrão: 'true'. Determina se o Slurm está instalado na inicialização do nó ('true'). Se Slurm estiver instalado em uma imagem personalizada, isso deverá ser definido como 'false'. (proj versão 2.5.0+)
slurm.use_pcpu Padrão: 'true'. Essa é uma configuração por nodearray para controlar o agendamento com vcpus hiperthreaded. Defina como 'false' para definir CPUs=vcpus em cyclecloud.conf.
slurm.user.name Padrão: 'slurm'. Esse é o nome de usuário para o serviço Slurm usar.
slurm.user.uid Padrão: '11100'. A ID de Usuário a ser usada para o usuário slurm.
slurm.user.gid Padrão: '11100'. A ID do Grupo a ser usada para o usuário slurm.
munge.user.name Padrão: 'munge'. Esse é o nome de usuário para o serviço de autenticação MUNGE usar.
munge.user.uid Padrão: '11101'. A ID de Usuário a ser usada para o usuário MUNGE.
munge.user.gid Padrão: '11101'. A ID do Grupo a ser usada para o usuário MUNGE.

O CycleCloud dá suporte a um conjunto padrão de atributos de dimensionamento automático entre agendadores:

Atributo Descrição
cyclecloud.cluster.autoscale.stop_enabled O dimensionamento automático está habilitado neste nó? [true/false]
cyclecloud.cluster.autoscale.idle_time_after_jobs A quantidade de tempo (em segundos) para um nó ficar ocioso depois de concluir trabalhos antes de ser reduzido verticalmente.
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 ser reduzido verticalmente.