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:
- Conceitos do Kubernetes, como pods, nós, implementações e namespaces.
- Conceitos do GKE, como pools de nós, escala automática e aprovisionamento automático de nós.
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.
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 |
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:
|
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.
|
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:
|
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?
- Saiba como partilhar GPUs com várias cargas de trabalho através da partilha de tempo da GPU.
- Saiba como partilhar GPUs com várias cargas de trabalho através do NVIDIA MPS.
- Saiba como executar GPUs de várias instâncias.
- Saiba mais sobre as GPUs.
- Para mais informações sobre a preempção de computação para a GPU NVIDIA, consulte o guia de otimização da NVIDIA Pascal.