Execute uma carga de trabalho de pequeno lote com GPUs e o modo de aprovisionamento de início flexível


Este guia mostra como otimizar o aprovisionamento de GPUs para cargas de trabalho de preparação de média e pequena escala através do modo de aprovisionamento de início flexível. Neste guia, vai usar o início flexível para implementar uma carga de trabalho que consiste em dois trabalhos do Kubernetes. Cada tarefa requer uma GPU. O GKE aprovisiona automaticamente um único nó com duas GPUs A100 para executar ambos os trabalhos.

Se a sua carga de trabalho exigir o processamento distribuído em vários nós, considere usar o início flexível com aprovisionamento em fila. Para mais informações, consulte o artigo Execute uma carga de trabalho de grande escala com início flexível e aprovisionamento em fila.

Este guia destina-se a engenheiros de aprendizagem automática (ML), administradores e operadores de plataformas, bem como a especialistas em dados e IA interessados em usar capacidades de orquestração de contentores do Kubernetes para executar cargas de trabalho em lote. Para mais informações sobre as funções comuns e exemplos de tarefas que referimos no Google Cloud conteúdo, consulte Funções e tarefas comuns de utilizadores do GKE.

Preços de início flexível

Recomendamos o início flexível se a sua carga de trabalho exigir recursos aprovisionados dinamicamente conforme necessário, durante um máximo de sete dias com reservas de curto prazo, sem gestão complexa de quotas e acesso rentável. O início flexível é alimentado pelo programador de carga de trabalho dinâmico e é faturado através dos preços do programador de carga de trabalho dinâmico:

  • Com desconto (até 53%) para vCPUs, GPUs e TPUs.
  • Paga à medida que usa.

Antes de começar

Antes de começar, certifique-se de que realizou as seguintes tarefas:

  • Ative a API Google Kubernetes Engine.
  • Ative a API Google Kubernetes Engine
  • Se quiser usar a CLI gcloud para esta tarefa, instale-a e, em seguida, inicialize-a. Se instalou anteriormente a CLI gcloud, execute gcloud components update para obter a versão mais recente.

Se não tiver um cluster ou o seu cluster não cumprir os requisitos, pode criar um cluster regional padrão com a CLI gcloud. Adicione as seguintes flags para poder saber mais sobre o início flexível:

--location=us-central1 \
--node-locations=us-central1-a,us-central1-b \
--machine-type=g2-standard-8

Quando cria um node pool de início flexível, use as flags mencionadas anteriormente e --accelerator type=nvidia-l4,count=1.

Se tiver um cluster Standard que cumpra os requisitos, as secções seguintes explicam como selecionar um tipo de acelerador de GPU e um tipo de máquina para o seu cluster.

Escolha um tipo de acelerador de GPU

Se usar um cluster no modo de piloto automático, ignore esta secção e aceda à secção Execute uma carga de trabalho em lote.

A disponibilidade de GPUs é específica de cada zona. Tem de encontrar um tipo de acelerador de GPU que esteja disponível numa zona em que o cluster Standard se encontra. Se tiver um cluster padrão regional, a zona na qual o tipo de acelerador de GPU está disponível tem de estar na região em que o cluster se encontra. Quando cria o conjunto de nós, especifica o tipo de acelerador e as zonas para os nós. Se especificar um tipo de acelerador que não esteja disponível na localização do cluster, a criação do conjunto de nós falha.

Execute os seguintes comandos para obter a localização do cluster e um tipo de acelerador de GPU suportado.

  1. Obtenha a localização em que o conjunto se encontra:

    gcloud container clusters list
    

    O resultado é semelhante ao seguinte:

    NAME                LOCATION  MASTER_VERSION      MASTER_IP     MACHINE_TYPE  NODE_VERSION        NUM_NODES  STATUS   STACK_TYPE
    example-cluster-1   us-west2  1.33.2-gke.1111000  34.102.3.122  e2-medium     1.33.2-gke.1111000  9          RUNNING  IPV4
    
  2. Apresente os tipos de aceleradores de GPU disponíveis, excluindo as estações de trabalho virtuais na localização:

    gcloud compute accelerator-types list | grep LOCATION_NAME | grep -v "Workstation"
    

    Substitua LOCATION_NAME pela localização do cluster.

    Por exemplo, para obter uma lista de tipos de aceleradores de GPU na região us-west2, execute o seguinte comando:

    gcloud compute accelerator-types list | grep us-west2 | grep -v "Workstation"
    

    O resultado é semelhante ao seguinte:

    nvidia-b200            us-west2-c                 NVIDIA B200 180GB
    nvidia-tesla-p4        us-west2-c                 NVIDIA Tesla P4
    nvidia-tesla-t4        us-west2-c                 NVIDIA T4
    nvidia-tesla-p4        us-west2-b                 NVIDIA Tesla P4
    nvidia-tesla-t4        us-west2-b                 NVIDIA T4
    

Escolha um tipo de máquina compatível

Se usar um cluster no modo de piloto automático, ignore esta secção e aceda à secção Execute uma carga de trabalho em lote.

Depois de saber que GPUs estão disponíveis na localização do cluster, pode determinar os tipos de máquinas compatíveis. Google Cloud restringe as GPUs a séries de máquinas específicas. Siga estes passos para encontrar um tipo de máquina:

  1. Consulte a tabela Modelos de GPU disponíveis.
  2. Localize a linha do tipo de acelerador de GPU que escolheu.
  3. Consulte a coluna "Série da máquina" dessa linha. Esta coluna indica a série de máquinas que tem de usar.
  4. Para ver os nomes dos tipos de máquinas que pode especificar, clique no link na série de máquinas.

A única exceção é a série de máquinas N1, que oferece orientações adicionais sobre os tipos de máquinas N1 que pode usar com o tipo de acelerador escolhido.

Antes de usar uma máquina otimizada para aceleradores, certifique-se de que é suportada com o modo de aprovisionamento de início flexível, conforme mostrado em Disponibilidade da opção de consumo por tipo de máquina.

Determine a quantidade de aceleradores

Se usar um cluster no modo de piloto automático, ignore esta secção e aceda à secção Execute uma carga de trabalho em lote.

Para criar um node pool, tem de determinar o número de aceleradores a associar a cada nó no node pool. Os valores válidos dependem do tipo de acelerador e do tipo de máquina. Cada tipo de máquina tem um limite para o número de GPUs que pode suportar. Para determinar que valor usar (além da predefinição de 1):

  1. Consulte os tipos de máquinas com GPU.
  2. Na tabela, pesquise o tipo de acelerador para o tipo de série da máquina.
  3. Use o valor na coluna "GPU count".

Crie um node pool com início flexível

Se usar um cluster no modo de piloto automático, ignore esta secção e aceda à secção Execute uma carga de trabalho em lote.

Para criar um node pool com o início flexível ativado num cluster padrão existente, pode usar a CLI gcloud ou o Terraform.

gcloud

  1. Crie um node pool com início flexível:

    gcloud container node-pools create NODE_POOL_NAME \
        --cluster CLUSTER_NAME \
        --location LOCATION_NAME \
        --project PROJECT_ID \
        --accelerator type=ACCELERATOR_TYPE,count=COUNT \
        --machine-type MACHINE_TYPE \
        --max-run-duration MAX_RUN_DURATION \
        --flex-start \
        --node-locations NODE_ZONES \
        --num-nodes 0 \
        --enable-autoscaling \
        --total-min-nodes 0 \
        --total-max-nodes 5 \
        --location-policy ANY \
        --reservation-affinity none \
        --no-enable-autorepair
    

    Substitua o seguinte:

    • NODE_POOL_NAME: o nome que escolher para o seu conjunto de nós.
    • CLUSTER_NAME: o nome do cluster padrão que quer modificar.
    • LOCATION_NAME: a região de computação para o plano de controlo do cluster.
    • PROJECT_ID: o ID do seu projeto.
    • ACCELERATOR_TYPE: o tipo específico de acelerador (por exemplo, nvidia-tesla-t4 para NVIDIA T4) a anexar às instâncias.
    • COUNT: o número de aceleradores a associar às instâncias. O valor predefinido é 1.
    • MACHINE_TYPE: o tipo de máquina a usar para os nós.
    • MAX_RUN_DURATION: opcional. O tempo de execução máximo de um nó em segundos, até ao valor predefinido de sete dias. O número que introduzir tem de terminar em s. Por exemplo, para especificar um dia, introduza 86400s.
    • NODE_ZONES: uma lista separada por vírgulas de uma ou mais zonas onde o GKE cria o conjunto de nós.

    Neste comando, a flag --flex-start indica ao gcloud que crie um grupo de nós com o início flexível ativado.

    O GKE cria um node pool com nós que contêm duas instâncias do tipo de acelerador especificado. O conjunto de nós tem inicialmente zero nós e o dimensionamento automático está ativado

  2. Valide o estado do início flexível no conjunto de nós:

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

    Se o início flexível estiver ativado no conjunto de nós, o campo flexStart é definido como True.

Terraform

Pode usar o início flexível com GPUs através de 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 = "MACHINE_TYPE"
    accelerator_type = "ACCELERATOR_TYPE"
    accelerator_count = COUNT
    node_locations = ["NODE_ZONES"]
    flex_start = true
}

Substitua o seguinte:

  • MACHINE_TYPE: o tipo de máquina a usar para nós.
  • ACCELERATOR_TYPE: o tipo específico de acelerador (por exemplo, nvidia-tesla-t4 para NVIDIA T4) a anexar às instâncias.
  • COUNT: o número de aceleradores a associar às instâncias. O valor predefinido é 1.
  • NODE_ZONES: a lista separada por vírgulas de uma ou mais zonas onde o GKE cria o conjunto de nós.

O Terraform chama as Google Cloud APIs para criar um cluster com um conjunto de nós que usa o início flexível com GPUs. Inicialmente, o conjunto de nós tem zero nós e o dimensionamento automático está ativado. Para saber mais sobre o Terraform, consulte a especificação de recursos google_container_node_pool em terraform.io.

Execute uma carga de trabalho em lote

Nesta secção, cria dois trabalhos do Kubernetes que requerem uma GPU cada. Um controlador de tarefas no Kubernetes cria um ou mais pods e garante que executam com êxito uma tarefa específica.

  1. Na Google Cloud consola, inicie uma sessão do Cloud Shell clicando em Ícone de ativação do Cloud Shell Ativar Cloud Shell. É aberta uma sessão no painel inferior da consola Google Cloud .

  2. Crie um ficheiro com o nome dws-flex-start.yaml:

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: job-1
    spec:
      template:
        spec:
          nodeSelector:
            cloud.google.com/gke-flex-start: "true"
            cloud.google.com/gke-accelerator: ACCELERATOR_TYPE
          containers:
          - name: 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: job-2
    spec:
      template:
        spec:
          nodeSelector:
            cloud.google.com/gke-flex-start: "true"
            cloud.google.com/gke-accelerator: ACCELERATOR_TYPE
          containers:
          - name: 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 trabalhos estão a ser executados no mesmo nó:

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

    O resultado é semelhante ao seguinte:

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

Limpar

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

Elimine 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.

Elimine o recurso individual

  1. Elimine os trabalhos:

    kubectl delete job -l "job-name in (job-1,job-2)"
    
  2. Elimine o node pool:

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

    gcloud container clusters delete CLUSTER_NAME
    

O que se segue?