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_nodes
scale
.
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:
E a execute
nodearray:
e adicione os seguintes atributos à Configuration
secçã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. |