Acerca das estratégias de partilha de GPU no GKE

Esta página explica as caraterísticas e os melhores tipos de cargas de trabalho para cada estratégia de partilha de GPU disponível no Google Kubernetes Engine (GKE), como GPUs de várias instâncias, partilha de tempo da GPU e NVIDIA MPS. A partilha de GPUs ajuda a minimizar a capacidade subutilizada no cluster e a fornecer aos cargas de trabalho capacidade suficiente para concluir tarefas.

Esta página destina-se a administradores e operadores da plataforma, bem como a especialistas em dados e IA que querem executar cargas de trabalho baseadas em GPUs que consomem capacidade de GPU da forma mais eficiente possível. Para saber mais sobre as funções comuns a que fazemos referência no conteúdo, consulte o artigo Funções e tarefas comuns do utilizador do GKE. Google Cloud

Antes de ler esta página, certifique-se de que conhece os seguintes conceitos:

Como funcionam os pedidos de GPU no Kubernetes

O Kubernetes permite que as cargas de trabalho peçam precisamente as quantidades de recursos de que precisam para funcionar. Embora possa pedir unidades de CPU fracionadas para cargas de trabalho, não pode pedir unidades de GPU fracionadas. Os manifestos de pods têm de pedir recursos de GPU em números inteiros, o que significa que uma GPU física inteira é atribuída a um contentor, mesmo que o contentor só precise de uma fração dos recursos para funcionar corretamente. Isto é ineficiente e pode ser dispendioso, especialmente quando está a executar várias cargas de trabalho com requisitos de GPU baixos semelhantes.

Prática recomendada:

Use estratégias de partilha de GPU para melhorar a utilização da GPU quando as suas cargas de trabalho não precisam de todos os recursos da GPU.

O que são estratégias de partilha de GPU?

As estratégias de partilha de GPU permitem que vários contentores usem de forma eficiente as GPUs anexadas e poupem nos custos de execução. O GKE oferece as seguintes estratégias de partilha de GPUs:

  • GPU de várias instâncias: o GKE divide uma única GPU suportada em até sete fatias. Cada fatia pode ser atribuída a um contentor no nó de forma independente, para um máximo de sete contentores por GPU. A GPU de várias instâncias oferece isolamento de hardware entre as cargas de trabalho, além de uma qualidade de serviço (QoS) consistente e previsível para todos os contentores em execução na GPU.
  • Partilha de tempo da GPU: o GKE usa a capacidade de partilha de tempo incorporada fornecida pela GPU NVIDIA e pela pilha de software. A partir da arquitetura Pascal, as GPUs da NVIDIA suportam a preempção ao nível da instrução. Quando faz a comutação de contexto entre processos em execução numa GPU, a preempção ao nível da instrução garante que cada processo recebe uma fatia de tempo justa. A partilha de tempo da GPU oferece isolamento ao nível do software entre as cargas de trabalho em termos de isolamento do espaço de endereços, isolamento de desempenho e isolamento de erros.
  • NVIDIA MPS: o GKE usa o Multi-Process Service (MPS) da NVIDIA. O MPS da NVIDIA é uma implementação alternativa e compatível com binários da API CUDA, concebida para permitir de forma transparente que as cargas de trabalho CUDA de vários processos cooperativos sejam executadas em simultâneo num único dispositivo GPU. A GPU com NVIDIA MPS oferece isolamento ao nível do software em termos de limites de recursos (percentagem de threads ativas e memória do dispositivo fixada).

Que estratégia de partilha de GPU usar

A tabela seguinte resume e compara as caraterísticas das estratégias de partilha de GPU disponíveis:

GPU de várias instâncias Partilha de tempo da GPU NVIDIA MPS
Geral Partilha paralela da GPU entre contentores Mudança rápida de contexto Partilha paralela da GPU entre contentores
Isolamento Uma única GPU é dividida em até sete fatias e cada contentor na mesma GPU física tem computação, memória e largura de banda dedicadas. Por conseguinte, um contentor numa partição tem um débito e uma latência previsíveis, mesmo quando outros contentores saturam outras partições.

Cada contentor acede à capacidade total da GPU física subjacente através da comutação de contexto entre processos executados numa GPU.

No entanto, a partilha de tempo não impõe limites de memória entre tarefas partilhadas, e a mudança rápida de contexto para acesso partilhado pode introduzir sobrecarga.

O MPS da NVIDIA tem um isolamento de recursos limitado, mas ganha mais flexibilidade noutras dimensões, por exemplo, tipos de GPUs e unidades partilhadas máximas, o que simplifica a atribuição de recursos.
Adequado para estas cargas de trabalho Recomendado para cargas de trabalho executadas em paralelo e que precisam de uma determinada resiliência e QoS. Por exemplo, quando executa cargas de trabalho de inferência de IA, a GPU multi-instância permite que várias consultas de inferência sejam executadas em simultâneo para obter respostas rápidas, sem que se afetem umas às outras.

Recomendado para cargas de trabalho interativas e com picos de atividade que têm períodos de inatividade. Estas cargas de trabalho não são rentáveis com uma GPU totalmente dedicada. Ao usar a partilha de tempo, as cargas de trabalho têm acesso rápido à GPU quando estão em fases ativas.

A partilha de tempo da GPU é ideal para cenários que evitam o tempo de inatividade de GPUs dispendiosas, em que o isolamento total e o acesso contínuo à GPU podem não ser necessários, por exemplo, quando vários utilizadores testam ou criam protótipos de cargas de trabalho.

As cargas de trabalho que usam a partilha de tempo têm de tolerar determinados compromissos de desempenho e latência.

Recomendado para o processamento em lote de tarefas pequenas, porque o MPS maximiza o débito e a utilização simultânea de uma GPU. O MPS permite que as tarefas em lote sejam processadas de forma eficiente em paralelo para cargas de trabalho de pequenas a médias dimensões.

O MPS da NVIDIA é ideal para processos cooperativos que atuam como uma única aplicação. Por exemplo, tarefas de MPI com paralelismo de classificação entre MPIs. Com estas tarefas, cada pequeno processo CUDA (normalmente, classificações MPI) pode ser executado em simultâneo na GPU para saturar totalmente toda a GPU.

As cargas de trabalho que usam CUDA MPS têm de tolerar as limitações de proteção de memória e contenção de erros.

Monitorização As métricas de utilização da GPU não estão disponíveis para GPUs de várias instâncias. Use o Cloud Monitoring para monitorizar o desempenho da partilha de tempo da GPU. Para saber mais sobre as métricas disponíveis, consulte o artigo Monitorize a partilha de tempo da GPU ou os nós MPS da NVIDIA. Use o Cloud Monitoring para monitorizar o desempenho do seu NVIDIA MPS. Para saber mais sobre as métricas disponíveis, consulte o artigo Monitorize a partilha de tempo da GPU ou os nós MPS da NVIDIA.
Peça GPUs partilhadas em cargas de trabalho Execute GPUs de várias instâncias Execute GPUs com partilha de tempo Execute GPUs com NVIDIA MPS
Prática recomendada:

Para maximizar a utilização da GPU, combine estratégias de partilha de GPU. Para cada partição de GPU de várias instâncias, use a partilha de tempo ou o MPS da NVIDIA. Em seguida, pode executar vários contentores em cada partição, com esses contentores a partilharem o acesso aos recursos nessa partição. Recomendamos que use qualquer uma das seguintes combinações:

  • GPU de várias instâncias e partilha de tempo da GPU.
  • GPU de várias instâncias e NVIDIA MPS.

Como funcionam as estratégias de partilha de GPU

Pode especificar o número máximo de contentores permitidos para partilhar uma GPU física:

  • Nos clusters do Autopilot, esta opção é configurada na especificação da carga de trabalho.
  • Nos clusters padrão, esta opção é configurada quando cria um novo conjunto de nós com GPUs anexadas. Todas as GPUs no conjunto de nós são partilhadas com base na definição especificada ao nível do conjunto de nós.

As secções seguintes explicam o comportamento de agendamento e o funcionamento de cada estratégia de partilha de GPU.

GPU de várias instâncias

Pode pedir uma GPU multi-instância em cargas de trabalho especificando a etiqueta cloud.google.com/gke-gpu-partition-size no campo nodeSelector da especificação do pod, em spec: nodeSelector.

O GKE agenda cargas de trabalho para os nós disponíveis adequados fazendo corresponder estas etiquetas. Se não existirem nós disponíveis adequados, o GKE usa o dimensionamento automático e o aprovisionamento automático de nós para criar novos nós ou conjuntos de nós que correspondam a esta etiqueta.

Partilha de tempo da GPU ou NVIDIA MPS

Pode pedir a partilha de tempo da GPU ou o NVIDIA MPS em cargas de trabalho especificando as seguintes etiquetas no campo nodeSelector da especificação do pod, em spec:nodeSelector.

  • cloud.google.com/gke-max-shared-clients-per-gpu: selecione nós que permitam que um número específico de clientes partilhe a GPU subjacente.
  • cloud.google.com/gke-gpu-sharing-strategy: selecione nós que usam a estratégia de partilha de tempo ou NVIDIA MPS para GPUs.

A tabela seguinte descreve como o comportamento de agendamento muda com base na combinação de etiquetas de nós que especifica nos seus manifestos.

Etiquetas de nós
cloud.google.com/gke-max-shared-clients-per-gpu

e

cloud.google.com/gke-gpu-sharing-strategy

O GKE agenda cargas de trabalho em nós disponíveis que correspondem a ambas as etiquetas.

Se não existirem nós disponíveis, o GKE usa o dimensionamento automático e o aprovisionamento automático de nós para criar novos nós ou conjuntos de nós que correspondam às etiquetas.

Apenas cloud.google.com/gke-max-shared-clients-per-gpu

Autopilot: o GKE rejeita a carga de trabalho.

Padrão: o GKE agenda cargas de trabalho em nós disponíveis que correspondem à etiqueta. Se não existirem nós disponíveis, o GKE usa o dimensionamento automático e o aprovisionamento automático de nós para criar novos nós ou conjuntos de nós que correspondam à etiqueta. Por predefinição, os nós aprovisionados automaticamente recebem a seguinte etiqueta e valor para cada estratégia:

  • Partilha de tempo da GPU: cloud.google.com/gke-gpu-sharing-strategy=TIME_SHARING
  • NVIDIA MPS: cloud.google.com/gke-gpu-sharing-strategy=MPS
Apenas cloud.google.com/gke-gpu-sharing-strategy

Autopilot: o GKE rejeita a carga de trabalho.

Padrão: o GKE agenda cargas de trabalho em nós disponíveis que usam estratégias de partilha específicas.

  • Se existirem vários conjuntos de nós partilhados com valores diferentes para cloud.google.com/gke-max-shared-clients-per-gpu, a carga de trabalho pode ser agendada em qualquer nó disponível.
  • Se não existirem nós disponíveis em nenhum node pool, o redimensionador automático de clusters aumenta a escala do node pool com o valor mais baixo para cloud.google.com/gke-max-shared-clients-per-gpu.
  • Se todos os conjuntos de nós estiverem no limite da capacidade, o aprovisionamento automático de nós cria um novo conjunto de nós com um valor predefinido de cloud.google.com/gke-max-shared-clients-per-gpu=2

O processo de pedido de GPU que conclui é o mesmo para a partilha de tempo da GPU e a estratégia NVIDIA MPS.

Se estiver a desenvolver aplicações de GPU que são executadas em partilha de tempo da GPU ou NVIDIA MPS, só pode pedir uma GPU para cada contentor. O GKE rejeita um pedido de mais do que uma GPU num contentor para evitar um comportamento inesperado. Além disso, o número de GPUs pedidas com a partilha de tempo e o NVIDIA MPS não é uma medida da capacidade de computação disponível para o contentor.

A tabela seguinte mostra o que esperar quando pede quantidades específicas de GPUs.

Pedidos de GPU que se aplicam à partilha de tempo da GPU e ao NVIDIA MPS
Uma partilha de tempo da GPU ou NVIDIA MPS por contentor O GKE permite o pedido, mesmo que o nó tenha uma GPU física ou várias GPUs físicas.
Mais do que uma partilha de tempo da GPU por contentor

O GKE rejeita o pedido.

Este comportamento é o mesmo quando pede mais do que uma instância de GPU de várias instâncias num contentor, porque cada instância de GPU é considerada uma GPU física discreta.

Mais do que um NVIDIA MPS por contentor

Com base no número de GPUs físicas no nó, o GKE faz o seguinte:

  • O GKE permite o pedido quando o nó tem apenas uma GPU física.
  • O GKE rejeita o pedido quando o nó tem várias GPUs físicas. Este comportamento é o mesmo quando pede mais do que uma instância de GPU de várias instâncias num contentor, porque cada instância de GPU é considerada uma GPU física discreta.

Se o GKE rejeitar a carga de trabalho, é apresentada uma mensagem de erro semelhante à seguinte:

status:
  message: 'Pod Allocate failed due to rpc error: code = Unknown desc = [invalid request
    for sharing GPU (time-sharing), at most 1 nvidia.com/gpu can be requested on GPU nodes], which is unexpected'
  phase: Failed
  reason: UnexpectedAdmissionError

Monitorize a partilha de tempo da GPU ou os nós da NVIDIA MPS

Use o Cloud Monitoring para monitorizar o desempenho da partilha de tempo da GPU ou dos nós MPS da NVIDIA. O GKE envia métricas para cada nó de GPU para o Cloud Monitoring. Estas métricas de partilha de tempo da GPU ou do nó NVIDIA MPS aplicam-se ao nível do nó (node/accelerator/).

Pode verificar as seguintes métricas para cada partilha de tempo de GPU ou nó NVIDIA MPS no Cloud Monitoring:

  • Ciclo de atividade (node/accelerator/duty_cycle): percentagem do tempo durante o último período de amostragem (10 segundos) durante o qual o nó da GPU estava a processar ativamente. Varia entre 1% e 100%.
  • Utilização de memória (node/accelerator/memory_used): quantidade de memória do acelerador atribuída em bytes para cada nó da GPU.
  • Capacidade de memória (node/accelerator/memory_total): memória total do acelerador em bytes para cada nó da GPU.

Estas métricas são diferentes das métricas para GPUs normais que não são nós de partilha de tempo ou NVIDA MPS. As métricas para GPUs físicas normais aplicam-se ao nível do contentor (container/accelerator) e não são recolhidas para contentores agendados numa GPU que usa a partilha de tempo da GPU ou o NVIDIA MPS.

O que se segue?