Como implantar um cluster do Slurm no Compute Engine

Neste tutorial, mostramos como implantar um cluster do Slurm no Compute Engine. O Slurm Resource Manager é um gerenciador de recursos conhecido usado em muitos centros de computação de alto desempenho. Para ver uma discussão sobre a terminologia e casos de uso de computação de alto desempenho, consulte Como usar clusters para computação técnica em grande escala na nuvem.

No diagrama a seguir, ilustramos a configuração que você criará neste tutorial.

Diagrama de arquitetura que mostra um cluster do Slurm instalado no Compute Engine.

Como gerenciador de carga de trabalho do cluster, o Slurm faz o seguinte:

  • Aloca recursos (nós de computação) para os usuários.
  • Fornece uma estrutura para iniciar, executar e monitorar o trabalho nos nós.
  • Gerencia uma fila de trabalho pendente.

A implantação desenvolvida para este tutorial é uma arquitetura de cluster simplificada compatível com alguns usuários que executam uma carga de trabalho de aplicativo único. É possível usar outras configurações para implantações de várias cargas de trabalho, implantações de produção em grande escala e implantações híbridas que funcionam com clusters no local ou de várias nuvens, mas essas configurações estão fora do escopo deste tutorial.

Neste tutorial, você interage com o sistema usando o nó de login (principal). Depois que o cluster for implantado, você se conecta ao nó de login usando SSH, instala os aplicativos e usa as ferramentas de linha de comando do Slurm para enviar jobs para computação. O programador Slurm, em execução no nó controlador, programa os jobs enfileirados, combinando os recursos disponíveis com os requisitos do job e gerencia a execução deles nos nós de computação. O servidor NFS fornece um espaço compartilhado comum para arquivos.

Objetivos

  • Use o Terraform para implantar um cluster do Slurm.
  • Executar um job usando o Slurm.
  • Consultar informações de cluster e monitorar jobs em execução no Slurm.
  • Escalonar automaticamente os nós para acomodar os parâmetros e os requisitos do job.

Custos

Neste tutorial, usamos os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Ao concluir este tutorial, exclua os recursos criados para evitar o faturamento contínuo. Para mais informações, consulte Limpeza.

Antes de começar

  1. Faça login na sua conta do Google Cloud. Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
  2. No Console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  3. Verifique se o faturamento está ativado para seu projeto na nuvem. Saiba como confirmar se o faturamento está ativado para o projeto.

  4. Ative as APIs Compute Engine and Deployment Manager.

    Ative as APIs

  5. No Console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  6. Verifique se o faturamento está ativado para seu projeto na nuvem. Saiba como confirmar se o faturamento está ativado para o projeto.

  7. Ative as APIs Compute Engine and Deployment Manager.

    Ative as APIs

  8. No Console do Cloud, ative o Cloud Shell.

    Ativar o Cloud Shell

    Na parte inferior do Console do Cloud, uma sessão do Cloud Shell é iniciada e exibe um prompt de linha de comando. O Cloud Shell é um ambiente com o SDK do Cloud pré-instalado com a ferramenta de linha de comando gcloud e os valores já definidos para seu projeto atual. A inicialização da sessão pode levar alguns segundos.

Como implantar o cluster do Slurm

Nesta seção, você preparará a configuração do cluster, usará o Deployment Manager para implantar o cluster do Slurm no Google Cloud e verificará se ele está operacional.

Preparar a configuração do cluster

  1. No Cloud Shell, clone o repositório slurm-gcp do GitHub:

    git clone https://github.com/SchedMD/slurm-gcp.git
    
  2. Defina as seguintes variáveis de ambiente:

    export CLUSTER_NAME="cluster-name"
    export CLUSTER_ZONE="cluster-zone"
    

    Substitua:

    • cluster-name: um nome exclusivo para o cluster.
    • cluster-zone: a zona em que você implanta o cluster.
  3. Na pasta slurm-gcp/tf/examples/basic, copie o arquivo basic.tfvars.example para o arquivo basic.tfvars:

    cd slurm-gcp/tf/examples/basic
    cp basic.tfvars.example basic.tfvars
    
  4. Use o comando sed para modificar o arquivo basic.tfvars do seu ambiente:

    sed -i "s/\(cluster_name.*= \)\"\(.*\)\"/\1\"${CLUSTER_NAME}\"/" basic.tfvars
    sed -i "s/<project>/$(gcloud config get-value core/project)/" basic.tfvars
    sed -i "s/\(zone.*= \)\"\(.*\)\"/\1\"${CLUSTER_ZONE}\"/" basic.tfvars
    
  5. (Opcional) Em um editor de texto, personalize o arquivo basic.tfvars para seu ambiente alterando os valores predefinidos:

    • machine_type: para usar um tipo de máquina diferente para os nós de computação do cluster, altere esse valor. Por exemplo, altere esse valor se precisar de mais núcleos de CPU ou memória do que estão disponíveis com o tipo de máquina n1-standard-2 padrão. Para mais informações, consulte Tipos de máquinas.
    • compute_disk_type: para usar SSDs em nós de computação, altere esse valor para pd-ssd.
    • compute_disk_size_gb: para usar discos maiores ou menores anexados aos nós de computação, altere esse valor.
  6. (Opcional) Em um editor de texto, personalize ainda mais o arquivo basic.tfvars para seu ambiente removendo o comentário de outras declarações de variável do Terraform.

Implantar o cluster Slurm usando o Terraform

  1. No Cloud Shell, inicialize o diretório de trabalho do Terraform:

    terraform init
    
  2. Use o Terraform para implantar seu cluster no Google Cloud:

    terraform apply -var-file=basic.tfvars
    

    A saída será assim:

    terraform apply -var-file=basic.tfvars -auto-approve
    module.slurm_cluster_controller.data.google_compute_default_service_account.default: Refreshing state...
    module.slurm_cluster_login.data.google_compute_default_service_account.default: Refreshing state...
    module.slurm_cluster_network.google_compute_network.cluster_network[0]: Creating...
    module.slurm_cluster_network.google_compute_network.cluster_network[0]: Still creating... [10s elapsed]
    module.slurm_cluster_network.google_compute_network.cluster_network[0]: Still creating... [20s elapsed]
    module.slurm_cluster_network.google_compute_network.cluster_network[0]: Creation complete after 22s [id=projects/myproject/global/networks/mycluster-network]
    module.slurm_cluster_network.google_compute_router.cluster_router[0]: Creating...
    module.slurm_cluster_network.google_compute_subnetwork.cluster_subnet[0]: Creating...
    module.slurm_cluster_network.google_compute_firewall.cluster_iap_ssh_firewall[0]: Creating...
    module.slurm_cluster_network.google_compute_firewall.cluster_internal_firewall[0]: Creating...
    module.slurm_cluster_network.google_compute_router.cluster_router[0]: Still creating... [10s elapsed]
    module.slurm_cluster_network.google_compute_subnetwork.cluster_subnet[0]: Still creating... [10s elapsed]
    module.slurm_cluster_network.google_compute_firewall.cluster_iap_ssh_firewall[0]: Still creating... [10s elapsed]
    module.slurm_cluster_network.google_compute_firewall.cluster_internal_firewall[0]: Still creating... [10s elapsed]
    module.slurm_cluster_network.google_compute_firewall.cluster_internal_firewall[0]: Creation complete after 11s [id=projects/myproject/global/firewalls/mycluster-allow-internal]
    module.slurm_cluster_network.google_compute_firewall.cluster_iap_ssh_firewall[0]: Creation complete after 11s [id=projects/myproject/global/firewalls/mycluster-allow-iap]
    module.slurm_cluster_network.google_compute_router.cluster_router[0]: Creation complete after 11s [id=projects/myproject/regions/us-central1/routers/mycluster-router]
    module.slurm_cluster_network.google_compute_subnetwork.cluster_subnet[0]: Still creating... [20s elapsed]
    module.slurm_cluster_network.google_compute_subnetwork.cluster_subnet[0]: Creation complete after 21s [id=projects/myproject/regions/us-central1/subnetworks/mycluster-us-central1]
    module.slurm_cluster_network.google_compute_router_nat.cluster_nat[0]: Creating...
    module.slurm_cluster_login.google_compute_instance.login_node[0]: Creating...
    module.slurm_cluster_controller.google_compute_instance.controller_node[0]: Creating...
    module.slurm_cluster_network.google_compute_router_nat.cluster_nat[0]: Still creating... [10s elapsed]
    module.slurm_cluster_login.google_compute_instance.login_node[0]: Still creating... [10s elapsed]
    module.slurm_cluster_controller.google_compute_instance.controller_node[0]: Still creating... [10s elapsed]
    module.slurm_cluster_network.google_compute_router_nat.cluster_nat[0]: Still creating... [20s elapsed]
    module.slurm_cluster_login.google_compute_instance.login_node[0]: Still creating... [20s elapsed]
    module.slurm_cluster_controller.google_compute_instance.controller_node[0]: Still creating... [20s elapsed]
    module.slurm_cluster_network.google_compute_router_nat.cluster_nat[0]: Creation complete after 22s [id=myproject/us-central1/mycluster-router/mycluster-nat]
    module.slurm_cluster_login.google_compute_instance.login_node[0]: Still creating... [30s elapsed]
    module.slurm_cluster_controller.google_compute_instance.controller_node[0]: Still creating... [30s elapsed]
    module.slurm_cluster_controller.google_compute_instance.controller_node[0]: Creation complete after 34s [id=projects/myproject/zones/us-central1-a/instances/mycluster-controller]
    module.slurm_cluster_login.google_compute_instance.login_node[0]: Creation complete after 35s [id=projects/myproject/zones/us-central1-a/instances/mycluster-login0]
    
    Apply complete! Resources: 8 added, 0 changed, 0 destroyed.
    
    Outputs:
    
    controller_network_ips = [
      [
        "10.0.0.2",
      ],
    ]
    login_network_ips = [
      [
        "10.0.0.3",
      ],
    ]
    
  3. A configuração do cluster leva de 5 a 10 minutos para ser concluída. Acompanhe o progresso da configuração:

    gcloud compute ssh ${CLUSTER_NAME}-controller \
        --command "sudo journalctl -fu google-startup-scripts.service" \
        --zone $CLUSTER_ZONE
    

    Quando o script terminar, o cluster do Slurm estará pronto para uso. A saída termina com a seguinte linha:

    Started Google Compute Engine Startup Scripts.
    
  4. Para parar de assistir à configuração, pressione Control+C.

Verificar se o cluster está operacional

  1. No Cloud Shell, verifique se o cluster está pronto fazendo login no nó de login:

    export CLUSTER_LOGIN_NODE=$(gcloud compute instances list \
        --zones ${CLUSTER_ZONE} \
        --filter="name ~ .*login." \
        --format="value(name)" | head -n1)
    gcloud compute ssh ${CLUSTER_LOGIN_NODE} \
        --zone $CLUSTER_ZONE
    

    O cluster estará pronto quando a saída for semelhante a esta:

                                     SSSSSSS
                                    SSSSSSSSS
                                    SSSSSSSSS
                                    SSSSSSSSS
                            SSSS     SSSSSSS     SSSS
                           SSSSSS               SSSSSS
                           SSSSSS    SSSSSSS    SSSSSS
                            SSSS    SSSSSSSSS    SSSS
                    SSS             SSSSSSSSS             SSS
                   SSSSS    SSSS    SSSSSSSSS    SSSS    SSSSS
                    SSS    SSSSSS   SSSSSSSSS   SSSSSS    SSS
                           SSSSSS    SSSSSSS    SSSSSS
                    SSS    SSSSSS               SSSSSS    SSS
                   SSSSS    SSSS     SSSSSSS     SSSS    SSSSS
              S     SSS             SSSSSSSSS             SSS     S
             SSS            SSSS    SSSSSSSSS    SSSS            SSS
              S     SSS    SSSSSS   SSSSSSSSS   SSSSSS    SSS     S
                   SSSSS   SSSSSS   SSSSSSSSS   SSSSSS   SSSSS
              S    SSSSS    SSSS     SSSSSSS     SSSS    SSSSS    S
        S    SSS    SSS                                   SSS    SSS    S
        S     S                                                   S     S
                    SSS
                    SSS
                    SSS
                    SSS
     SSSSSSSSSSSS   SSS   SSSS       SSSS    SSSSSSSSS   SSSSSSSSSSSSSSSSSSSS
    SSSSSSSSSSSSS   SSS   SSSS       SSSS   SSSSSSSSSS  SSSSSSSSSSSSSSSSSSSSSS
    SSSS            SSS   SSSS       SSSS   SSSS        SSSS     SSSS     SSSS
    SSSS            SSS   SSSS       SSSS   SSSS        SSSS     SSSS     SSSS
    SSSSSSSSSSSS    SSS   SSSS       SSSS   SSSS        SSSS     SSSS     SSSS
     SSSSSSSSSSSS   SSS   SSSS       SSSS   SSSS        SSSS     SSSS     SSSS
             SSSS   SSS   SSSS       SSSS   SSSS        SSSS     SSSS     SSSS
             SSSS   SSS   SSSS       SSSS   SSSS        SSSS     SSSS     SSSS
    SSSSSSSSSSSSS   SSS   SSSSSSSSSSSSSSS   SSSS        SSSS     SSSS     SSSS
    SSSSSSSSSSSS    SSS    SSSSSSSSSSSSS    SSSS        SSSS     SSSS     SSSS
    
  2. Para sair do cluster, pressione Control+D.

  3. Quando o cluster estiver pronto, programe um job para verificar se está funcionando corretamente. Esse job executa o comando hostname em vários nós no cluster.

    gcloud compute ssh ${CLUSTER_LOGIN_NODE} \
        --command 'sbatch -N2 --wrap="srun hostname"' --zone $CLUSTER_ZONE
    
    gcloud compute ssh ${CLUSTER_LOGIN_NODE} \
        --command 'cat slurm-*.out'  --zone $CLUSTER_ZONE
    

    A saída será assim:

    helloworld-compute1
    helloworld-compute2
    

    Agora você tem um cluster em funcionamento.

Como fazer o escalonamento automático do cluster do Slurm

Ao implantar um cluster do Slurm, você especifica valores para as propriedades max_node_count e static_node_count. O valor max_node_count determina o número máximo de nós de computação que o cluster executa a qualquer momento. O valor static_node_count especifica o número de nós de computação que estão sempre em execução. Por padrão, o arquivo slurm-cluster.yaml configura max_node_count para 10 e static_node_count para 2.

A diferença entre esses dois números, max_node_count - static_node_count, é o número de nós temporários no cluster. Os nós temporários são criados sob demanda em resposta a solicitações de programação de jobs. Depois que o job criado para execução for concluído, os nós serão destruídos, a menos que o cluster possa usá-los para executar outros jobs. No Google Cloud, o mecanismo de economia de energia do Slurm faz o escalonamento automático dos clusters instanciando nós temporários somente quando necessário.

  1. No Cloud Shell, conecte-se no nó de login do cluster:

    gcloud compute ssh ${CLUSTER_LOGIN_NODE} --zone $CLUSTER_ZONE
    
  2. Veja a contagem de nós:

    sinfo
    

    A resposta será semelhante a:

    PARTITION AVAIL TIMELIMIT  NODES  STATE   NODELIST
    debug*    up    infinite   8      idle~   demo-compute[3-10]
    debug*    up    infinite   2      idle    demo-compute[1-2]
    

    O sufixo ~ no descritor STATE idle na primeira linha de saída indica que os oito nós temporários estão no modo de economia de energia.

  3. Para escalonar automaticamente o cluster, crie três nós temporários:

    sbatch -N5 --wrap="srun hostname"
    

    A saída é semelhante a esta:

    Submitted batch job JOB_ID
    
  4. Veja a contagem de nós novamente:

    sinfo
    

    A saída será assim:

    PARTITION AVAIL  TIMELIMIT  NODES  STATE   NODELIST
    debug*    up     infinite   3      alloc#  demo-compute[3-5]
    debug*    up     infinite   5      idle~   demo-compute[6-10]
    debug*    up     infinite   2      idle    demo-compute[1-2]
    

    O sufixo # no descritor STATE alloc na primeira linha da saída indica que três nós temporários foram criados. Depois que os nós adicionais são criados e configurados, eles executam o job e, depois de um pequeno atraso, são destruídos.

  5. Para sair do cluster, pressione Control+D.

Limpeza

A maneira mais fácil de eliminar o faturamento é excluir o projeto do Cloud criado para o tutorial. A outra opção é excluir os recursos individuais.

Excluir o projeto

  1. No Console do Cloud, acesse a página Gerenciar recursos:

    Acessar "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

Excluir o cluster Slurm

  • Exclua o cluster:

    terraform destroy -var-file=basic.tfvars
    

A seguir