Executar uma carga de trabalho de lote pequena com o modo de provisionamento de início flexível


Este guia mostra como otimizar o provisionamento de GPU para cargas de trabalho de treinamento de escala média e pequena usando o modo de provisionamento flexível. Neste guia, você vai usar o modo de provisionamento flexível para implantar uma carga de trabalho que consiste em dois jobs do Kubernetes, cada um exigindo uma GPU. O GKE provisiona automaticamente um único nó com duas GPUs A100 para executar ambos os jobs.

Se a carga de trabalho exigir processamento distribuído com vários nós, use o modo de provisionamento flexível com provisionamento em fila. Para mais informações, consulte Executar uma carga de trabalho em grande escala com início flexível com provisionamento em fila.

Este guia é destinado a engenheiros de machine learning (ML), administradores e operadores de plataforma e especialistas em dados e IA que têm interesse em usar os recursos de orquestração de contêineres do Kubernetes para executar cargas de trabalho em lote. Para mais informações sobre papéis comuns e exemplos de tarefas referenciados no conteúdo Google Cloud , consulte Funções e tarefas de usuário comuns do GKE Enterprise.

Antes de começar

Antes de começar, veja se você realizou as seguintes tarefas:

  • Ative a API Google Kubernetes Engine.
  • Ativar a API Google Kubernetes Engine
  • Se você quiser usar a CLI do Google Cloud para essa tarefa, instale e, em seguida, inicialize a CLI gcloud. Se você instalou a gcloud CLI anteriormente, instale a versão mais recente executando gcloud components update.

Criar um pool de nós com o modo de provisionamento de início flexível

Para criar um pool de nós com o modo de provisionamento flexível ativado em um cluster Standard existente, use a CLI gcloud ou o Terraform.

Se você usar um cluster no modo Autopilot, pule esta seção e vá para a seção Executar uma carga de trabalho de treinamento.

gcloud

  1. Crie um pool de nós com o modo de provisionamento de início flexível:

    gcloud container node-pools create NODE_POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location LOCATION_NAME \
        --project CLUSTER_PROJECT_ID \
        --accelerator=type=nvidia-a100-80gb,count=2 \
        --machine-type=a2-ultragpu-2g \
        --flex-start \
        --num-nodes=0 \
        --enable-autoscaling \
        --total-min-nodes=0 \
        --total-max-nodes=5 \
        --location-policy=ANY \
        --reservation-affinity=none \
        --no-enable-autorepair
    

    Substitua:

    • NODE_POOL_NAME: o nome escolhido para o pool de nós.
    • LOCATION_NAME: a região de computação do plano de controle do cluster.
    • CLUSTER_NAME: o nome do cluster padrão que você quer modificar.

    Neste comando, a flag --flex-start instrui gcloud a criar um pool de nós com o modo de provisionamento de início flexível ativado.

    O GKE cria um pool de nós com nós que contêm duas GPUs A100 (a2-ultragpu-2g). Esse pool de nós escalona automaticamente os nós de zero para um máximo de cinco nós.

  2. Verifique o status do modo de provisionamento flexível no pool de nós:

    gcloud container node-pools describe NODE_POOL_NAME \
        --cluster CLUSTER_NAME \
        --location LOCATION_NAME \
        --format="get(config.flexStart)"
    

    Se o modo de provisionamento de início flexível estiver ativado no pool de nós, o campo flexStart será definido como True.

Terraform

É possível usar o modo de provisionamento flexível com GPUs usando um módulo do Terraform.

  1. Adicione o seguinte bloco à configuração do Terraform:

    resource "google_container_node_pool" " "gpu_dws_pool" {
    name = "gpu-dws-pool"
    
    queued_provisioning {
        enabled = false
    }
    
    }
    node_config {
        machine_type = "a3-highgpu-8g"
        flex_start = true
    }
    

O Terraform chama Google Cloud APIs para criar um cluster com um pool de nós que usa o modo de provisionamento flexível com GPUs. Inicialmente, o pool de nós não tem nós, e o escalonamento automático está ativado. Para saber mais sobre o Terraform, consulte as especificações de recursos do google_container_node_pool em terraform.io.

Executar uma carga de trabalho de treinamento

Nesta seção, você vai criar dois jobs do Kubernetes que exigem uma GPU cada. Um controlador de job no Kubernetes cria um ou mais pods e garante que eles executem uma tarefa específica.

  1. No console do Google Cloud, inicie uma sessão do Cloud Shell clicando em Ícone de ativação do Cloud Shell Ativar o Cloud Shell no console do Google Cloud. Uma sessão é aberta no painel inferior do console do Google Cloud.

  2. Crie um arquivo chamado dws-flex-start.yaml:

    apiVersion: batch/v1
    kind: Job
    metadata:
    name: gpu-job-1
    spec:
    template:
        spec:
        nodeSelector:
            cloud.google.com/gke-flex-start: "true"
        containers:
        - name: gpu-container-1
            image: gcr.io/k8s-staging-perf-tests/sleep:latest
            args: ["10s"] # Sleep for 10 seconds
            resources:
            requests:
                nvidia.com/gpu: 1
            limits:
                nvidia.com/gpu: 1
        restartPolicy: OnFailure
    ---
    apiVersion: batch/v1
    kind: Job
    metadata:
    name: gpu-job-2
    spec:
    template:
        spec:
        nodeSelector:
          cloud.google.com/gke-flex-start: "true"
        containers:
        - name: gpu-container-2
            image: gcr.io/k8s-staging-perf-tests/sleep:latest
            args: ["10s"] # Sleep for 10 seconds
            resources:
            requests:
                nvidia.com/gpu: 1
            limits:
                nvidia.com/gpu: 1
        restartPolicy: OnFailure
    
  3. Aplique o manifesto dws-flex-start.yaml:

    kubectl apply -f dws-flex-start.yaml
    
  4. Verifique se os jobs estão em execução no mesmo nó:

    kubectl get pods -l "job-name in (gpu-job-1,gpu-job-2)" -o wide
    

    O resultado será assim:

    NAME        READY   STATUS      RESTARTS   AGE   IP       NODE               NOMINATED NODE   READINESS GATES
    gpu-job-1   0/1     Completed   0          19m   10.(...) gke-flex-zonal-a2  <none>           <none>
    gpu-job-2   0/1     Completed   0          19m   10.(...) gke-flex-zonal-a2  <none>           <none>
    

Limpar

Para evitar cobranças na sua conta do Google Cloud pelos recursos usados nesta página, exclua o projeto que contém os recursos ou mantenha o projeto e exclua os recursos individuais.

Excluir o projeto

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Excluir o recurso individual

  1. Exclua os jobs:

    kubectl delete job -l "job-name in (gpu-job-1,gpu-job-2)"
    
  2. Exclua o pool de nós:

    gcloud container node-pools delete NODE_POOL_NAME \
          --location LOCATION_NAME
    
  3. Exclua o cluster:

    gcloud container clusters delete CLUSTER_NAME
    

A seguir