O compartilhamento de GPU em nós GPU-HPN permite que vários pods executem em um único dispositivo GPU. Assim, você solicita recursos fracionários de GPU em vez de dedicar uma GPU inteira para cada carga de trabalho. Isso reduz a capacidade ociosa e ajuda a executar mais cargas de trabalho por nó, sendo especialmente útil para sessões de desenvolvimento em Notebook e pequenos serviços de inferência de IA.
O compartilhamento de GPU está disponível apenas em clusters ACS. Este recurso está em preview público nas regiões Ulanqab e Shanghai Finance Cloud. Para usá-lo em outras regiões, abra um ticketabra um ticket.
Limitações
Antes de usar o compartilhamento de GPU, observe as seguintes restrições:
O compartilhamento de GPU oferece alocação granular de recursos dentro de uma única GPU. Ele não suporta solicitações agregadas em várias GPUs. Não é possível solicitar 0,5 do poder de computação de duas GPUs diferentes simultaneamente.
O módulo de compartilhamento de GPU gerencia a versão do driver para todos os pods que utilizam esse recurso. Não é possível especificar uma versão de driver para um pod individual.
Cada pod pode ter no máximo um container que usa recursos compartilhados de GPU (geralmente o container principal). Containers sidecar só podem solicitar CPU e memória.
Um container não pode solicitar recursos exclusivos de GPU (
nvidia.com/gpu) e recursos compartilhados de GPU (alibabacloud.com/gpu-core.percentage,alibabacloud.com/gpu-memory.percentage) ao mesmo tempo.
Como funciona
Os pods não acessam um dispositivo GPU diretamente. Em vez disso, interagem com ele por meio do módulo de compartilhamento de GPU, composto por dois componentes:
Módulo proxy: Integrado ao pod por padrão. Intercepta chamadas de API relacionadas ao dispositivo GPU e as encaminha para o módulo de gerenciamento de recursos.
Módulo de gerenciamento de recursos: Executa instruções da GPU no dispositivo físico e aplica limites de recursos com base na descrição de recursos do pod.
Quando o recurso de compartilhamento de GPU está ativado, o módulo de gerenciamento de recursos reserva automaticamente parte da CPU e da memória no nó. Para detalhes sobre os valores reservados, consulte Configuração do nó.
Estados do pod e Qualidade de Serviço
Assim como no gerenciamento de processos do sistema operacional, o módulo de compartilhamento de GPU atribui a cada pod um de três estados:
Hibernação: O pod não tem demanda de GPU (estado inicial quando um pod é iniciado).
Pronto: O pod está aguardando a alocação de recursos de GPU.
Em execução: O pod está usando ativamente recursos de GPU.
Quando vários pods competem por recursos de GPU simultaneamente, o módulo de compartilhamento de GPU aplica políticas de Qualidade de Serviço (QoS) para gerenciar a alocação de forma justa.
Política de fila (apenas modelo share-pool)
Os pods no estado pronto são enfileirados usando First In, First Out (FIFO). O pod que entrou primeiro no estado pronto recebe recursos primeiro. Se os recursos forem insuficientes, a política de preempção será acionada.
Política de preempção (apenas modelo share-pool)
Quando um pod na fila de prontos não consegue obter recursos, o módulo de compartilhamento de GPU tenta preemptar um pod em execução usando os seguintes critérios:
|
Política |
Descrição |
|
Filtro |
Um pod em execução é elegível para preempção apenas se ocupou recursos de GPU continuamente por mais tempo que |
|
Pontuação |
Entre os pods elegíveis, aqueles que mantiveram recursos de GPU por mais tempo são preemptados primeiro. |
Se nenhum pod em execução atender à condição de filtro, o pod enfileirado continua aguardando.
Escolher um modelo de compartilhamento
O ACS suporta dois modelos de compartilhamento. A principal diferença é se um pod recebe um dispositivo GPU fixo ou pode usar qualquer GPU disponível no nó:
Use share-pool quando as cargas de trabalho forem intermitentes ou variáveis (como sessões de Notebook). Os pods compartilham recursos de um pool comum de GPU, com mecanismos de QoS (fila e preempção) gerenciando a contenção.
Use static quando as cargas de trabalho precisarem de acesso garantido e ininterrupto à GPU, sem filas. Cada pod é fixado a um dispositivo GPU específico.
|
Modelo |
Atribuição de GPU |
** |
Enfileiramento |
Preempção |
Mais indicado para |
|
share-pool |
Qualquer GPU com recursos ociosos no nó |
|
FIFO |
Configurável |
Desenvolvimento em Notebook, cargas de trabalho multiusuário fora de pico |
|
static |
Dispositivo GPU fixo, não muda em tempo de execução |
|
Não suportado |
Não suportado |
Aplicações de IA de pequena escala que precisam de acesso garantido à GPU sem enfileiramento |
Para o modelo static, sempre defina requests == limits para poder de computação da GPU e memória da GPU. Se requests < limits, ocorre competição de recursos entre pods que compartilham a mesma GPU, o que pode causar a eliminação de pods por erro de falta de memória (OOM).
Exemplo: compartilhamento de recursos fora de pico em cenários de Notebook
No desenvolvimento com Notebook, as cargas de trabalho geralmente não mantêm recursos de GPU continuamente. Com o modelo share-pool, os pods usam recursos de GPU apenas quando necessário, e o mecanismo de QoS gerencia o acesso quando vários pods solicitam recursos simultaneamente.
Considere quatro pods em um nó com duas GPUs:
Pods A e B:
requests=0.5,limits=0.5Pods C e D:
requests=0.5,limits=1
Com base nos requests, todos os quatro pods cabem no nó.
Tempo T1: Os pods A e C estão em execução. Os pods B e D estão na fila de prontos. O módulo de compartilhamento de GPU tenta alocar recursos para o Pod D (primeiro na fila). A GPU 0 tem 0,5 de GPU ociosa, o que satisfaz os requests=0.5 do Pod D, mas o limit=1 do Pod D causaria competição de recursos com o Pod A na mesma GPU. Portanto, o Pod D permanece na fila.
Tempo T2 – Fase 1: O Pod C termina e entra em hibernação. A GPU 1 fica livre e seus recursos são alocados para o Pod D.
Tempo T2 – Fase 2: O Pod B recebe recursos alocados na GPU 0. Como o limit=0.5 do Pod B, ele pode compartilhar a GPU 0 com o Pod A sem competição de recursos.
Ativar o compartilhamento de GPU em um nó
As etapas a seguir mostram como ativar o modelo share-pool, implantar um pod com recursos fracionários de GPU, verificar a configuração e, opcionalmente, desativar o recurso.
Pré-requisitos
Antes de começar, certifique-se de que você tem:
Um cluster ACS com nós GPU-HPN.
kubectlconfigurado para conectar-se ao cluster.Excluído quaisquer pods no nó de destino que solicitem recursos exclusivos de GPU. Pods que usam apenas CPU e memória não precisam ser excluídos.
Etapa 1: Rotular o nó GPU-HPN
Liste os nós GPU-HPN no cluster:
kubectl get node -l alibabacloud.com/node-type=reserved
Saída esperada:
NAME STATUS ROLES AGE VERSION
cn-wulanchabu-c.cr-xxx Ready agent 59d v1.28.3-aliyun
Adicione o rótulo alibabacloud.com/gpu-share-policy=share-pool para ativar o compartilhamento de GPU:
kubectl label node cn-wulanchabu-c.cr-xxx alibabacloud.com/gpu-share-policy=share-pool
Etapa 2: Verificar o status do nó
Após aplicar o rótulo, verifique se o recurso está ativo no nó:
kubectl get node cn-wulanchabu-c.cr-xxx -o yaml
Saída esperada (trecho):
# The actual output may vary.
apiVersion: v1
kind: Node
spec:
# ...
status:
allocatable:
# GPU shared resource description
alibabacloud.com/gpu-core.percentage: "1600"
alibabacloud.com/gpu-memory.percentage: "1600"
# CPU, memory, and storage reserved for the GPU sharing module
cpu: "144"
memory: 1640Gi
nvidia.com/gpu: "16"
ephemeral-storage: 4608Gi
capacity:
# GPU shared resource description
alibabacloud.com/gpu-core.percentage: "1600"
alibabacloud.com/gpu-memory.percentage: "1600"
cpu: "176"
memory: 1800Gi
nvidia.com/gpu: "16"
ephemeral-storage: 6Ti
conditions:
# Indicates whether the GPU share policy configuration is valid
- lastHeartbeatTime: "2025-01-07T04:13:04Z"
lastTransitionTime: "2025-01-07T04:13:04Z"
message: gpu share policy is valid.
reason: Valied
status: "True"
type: GPUSharePolicyValid
# Indicates the GPU share policy in effect on this node
- lastHeartbeatTime: "2025-01-07T04:13:04Z"
lastTransitionTime: "2025-01-07T04:13:04Z"
message: gpu share policy is share-pool.
reason: share-pool
status: "True"
type: GPUSharePolicy
Confirme os seguintes itens na saída para verificar se o recurso está ativo:
allocatableecapacityincluemalibabacloud.com/gpu-core.percentageealibabacloud.com/gpu-memory.percentage.A condição
GPUSharePolicyValidtemstatus: "True".A condição
GPUSharePolicytemreason: share-pool.
Se os recursos do nó não forem atualizados conforme descrito, a configuração falhou. Verifique os campos reason e message da condição GPUSharePolicyValid para obter detalhes. Consulte Condições do nó para valores de motivo.
Etapa 3: Implantar um pod com recursos compartilhados de GPU
Crie um arquivo chamado gpu-share-demo.yaml. Defina o modelo de compartilhamento de GPU como share-pool, correspondendo à configuração do nó:
apiVersion: v1
kind: Pod
metadata:
labels:
alibabacloud.com/compute-class: "gpu-hpn"
# Set the GPU sharing model to share-pool, matching the node configuration
alibabacloud.com/gpu-share-policy: "share-pool"
name: gpu-share-demo
namespace: default
spec:
containers:
- name: demo
image: registry-cn-wulanchabu-vpc.ack.aliyuncs.com/acs/stress:v1.0.4
args:
- '1000h'
command:
- sleep
resources:
limits:
cpu: '5'
memory: 50Gi
alibabacloud.com/gpu-core.percentage: 100 # Upper limit of computing power usage
alibabacloud.com/gpu-memory.percentage: 100 # Upper limit of GPU memory usage; exceeding this causes a CUDA OOM error
requests:
cpu: '5'
memory: 50Gi
alibabacloud.com/gpu-core.percentage: 10 # Controls how many pods can be scheduled on the node
alibabacloud.com/gpu-memory.percentage: 10 # Controls how many pods can be scheduled on the node
Implante o pod:
kubectl apply -f gpu-share-demo.yaml
Etapa 4: Verificar o uso de recursos de GPU
Faça login no container para verificar o uso de recursos de GPU:
kubectl exec -it gpu-share-demo -- /bin/bash
Dentro do container, use nvidia-smi para visualizar a alocação e o uso de recursos de GPU. O comando a ser usado depende do tipo da sua placa GPU — nvidia-smi aplica-se a dispositivos GPU NVIDIA. Para outros tipos de placa, abra um ticketabra um ticket para obter assistência.
Para pods share-pool, o campo BusID na saída do nvidia-smi mostra Pending quando o pod não está usando ativamente recursos de GPU. Este é um comportamento esperado, não um erro.
Etapa 5 (opcional): Desativar o compartilhamento de GPU no nó
Antes de desativar o compartilhamento de GPU, exclua todos os pods no nó que usam recursos compartilhados de GPU. Pods que usam apenas CPU e memória não precisam ser excluídos.
-
Exclua o pod:
kubectl delete pod gpu-share-demo -
Defina a política de compartilhamento de GPU como
none:kubectl label node cn-wulanchabu-c.cr-xxx alibabacloud.com/gpu-share-policy=none -
Verifique o status do nó:
allocatableecapacitynão incluem maisalibabacloud.com/gpu-core.percentageoualibabacloud.com/gpu-memory.percentage.A condição
GPUSharePolicytemstatus: "False"ereason: none.A CPU e a memória em
allocatablesão restauradas aos seus valores originais.
kubectl get node cn-wulanchabu-c.cr-xxx -o yamlSaída esperada (trecho):
apiVersion: v1 kind: Node spec: # ... status: allocatable: # Reserved CPU and memory are restored after the feature is disabled cpu: "176" memory: 1800Gi nvidia.com/gpu: "16" ephemeral-storage: 4608Gi capacity: cpu: "176" memory: 1800Gi nvidia.com/gpu: "16" ephemeral-storage: 6Ti conditions: - lastHeartbeatTime: "2025-01-07T04:13:04Z" lastTransitionTime: "2025-01-07T04:13:04Z" message: gpu share policy config is valid. reason: Valid status: "True" type: GPUSharePolicyValid - lastHeartbeatTime: "2025-01-07T04:13:04Z" lastTransitionTime: "2025-01-07T04:13:04Z" message: gpu share policy is none. reason: none status: "False" type: GPUSharePolicyConfirme os seguintes itens na saída:
Configuração do nó
Rótulo de ativação
Defina o rótulo alibabacloud.com/gpu-share-policy em um nó para ativar ou desativar o compartilhamento de GPU.
apiVersion: v1
kind: Node
metadata:
labels:
alibabacloud.com/gpu-share-policy: share-pool # or: static, none
|
Valor |
Descrição |
|
|
Desativa o compartilhamento de GPU no nó. |
|
|
Trata todas as GPUs no nó como um pool compartilhado. Os pods não são fixados a um dispositivo GPU específico. |
|
|
Modo de fatiamento de GPU. Cada pod recebe um dispositivo GPU fixo que não muda em tempo de execução. O agendador prioriza a colocação de pods na mesma GPU para minimizar a fragmentação. |
Se existirem pods que usam GPUs exclusivas no nó, exclua-os antes de ativar a política de compartilhamento.
Se existirem pods que usam recursos compartilhados de GPU no nó, exclua-os antes de modificar ou desativar a política de compartilhamento.
Pods que usam apenas CPU e memória não precisam ser excluídos.
Configuração de QoS
Configure os parâmetros de Qualidade de Serviço (QoS) para compartilhamento de GPU usando a anotação de nó alibabacloud.com/gpu-share-qos-config. Esses parâmetros aplicam-se apenas ao modelo share-pool.
apiVersion: v1
kind: Node
metadata:
annotations:
alibabacloud.com/gpu-share-qos-config: '{"preemptEnabled": true, "podMaxDurationMinutes": 120, "reservedEphemeralStorage": "1.5Ti"}'
|
Parâmetro |
Tipo |
Padrão |
Descrição |
|
|
Boolean |
|
Se deve ativar a preempção. |
|
|
Int |
|
Um pod só pode ser preemptado após ocupar continuamente uma GPU por mais tempo que esta duração. Deve ser maior que 0. Unidade: minutos. |
|
|
resource.Quantity |
|
Armazenamento temporário local reservado por nó. Deve ser maior ou igual a 0. Usa o formato de quantidade do Kubernetes, como |
Campos de recursos compartilhados
Quando o compartilhamento de GPU está ativado, os seguintes campos são adicionados a allocatable e capacity do nó. Eles são removidos quando o recurso é desativado.
|
Campo |
Descrição |
Cálculo |
|
|
Poder de computação da GPU como porcentagem. |
|
|
|
Memória da GPU como porcentagem. |
|
|
|
Núcleos de CPU reservados para o módulo de compartilhamento de GPU, deduzidos de |
|
|
|
Memória reservada para o módulo de compartilhamento de GPU. |
|
|
|
Espaço em disco reservado por nó. |
1,5 TB por nó |
Condições do nó
O campo conditions do nó relata dois tipos de condição de compartilhamento de GPU.
GPUSharePolicyValid — se a configuração de compartilhamento de GPU é válida:
|
Campo |
Valores |
Descrição |
|
|
|
|
|
|
|
|
|
|
— |
Mensagem legível por humanos. |
|
|
UTC |
Hora da última atualização da condição. |
GPUSharePolicy — a política de compartilhamento de GPU atualmente ativa:
|
Campo |
Valores |
Descrição |
|
|
|
|
|
|
|
A política atualmente em vigor. |
|
|
— |
Mensagem legível por humanos. |
|
|
UTC |
Hora da última atualização da condição. |
Configuração do pod
Para usar o compartilhamento de GPU, configure os seguintes rótulos e solicitações de recursos no pod.
apiVersion: v1
kind: Pod
metadata:
labels:
alibabacloud.com/compute-class: "gpu-hpn" # Only gpu-hpn is supported
alibabacloud.com/gpu-share-policy: "share-pool" # Must match the node's sharing model
name: gpu-share-demo
namespace: default
spec:
containers:
- name: demo
image: registry-cn-wulanchabu-vpc.ack.aliyuncs.com/acs/stress:v1.0.4
args:
- '1000h'
command:
- sleep
resources:
limits:
cpu: '5'
memory: 50Gi
alibabacloud.com/gpu-core.percentage: 100
alibabacloud.com/gpu-memory.percentage: 100
requests:
cpu: '5'
memory: 50Gi
alibabacloud.com/gpu-core.percentage: 10
alibabacloud.com/gpu-memory.percentage: 10
Classe de computação
|
Rótulo |
Valor |
Descrição |
|
|
|
Apenas a classe de computação |
Política de compartilhamento de GPU
|
Rótulo |
Tipo |
Valores válidos |
Descrição |
|
|
String |
|
Especifica o modelo de compartilhamento de GPU para o pod. Apenas nós que usam o mesmo modelo são considerados para agendamento. |
Solicitações de recursos
Especifique recursos compartilhados de GPU no campo resources do container usando porcentagens do poder de computação e da memória de uma única GPU.
|
Campo |
Recurso |
Tipo |
Valores válidos |
Descrição |
|
|
|
Int |
share-pool: [10, 100]; static: [10, 100) |
A porcentagem do poder de computação de uma única GPU a ser solicitada. Mínimo: 10%. Controla quantos pods podem ser agendados em um nó. |
|
|
|
Int |
share-pool: [10, 100]; static: [10, 100) |
A porcentagem da memória de uma única GPU a ser solicitada. Mínimo: 10%. |
|
|
|
Int |
— |
O limite superior de uso de poder de computação em tempo de execução. |
|
|
|
Int |
— |
O limite superior de uso de memória da GPU em tempo de execução. Exceder isso causa um erro CUDA OOM. |
Tanto alibabacloud.com/gpu-core.percentage quanto alibabacloud.com/gpu-memory.percentage devem ser especificados em requests e limits.
O número de pods que podem ser agendados em um nó também é limitado pela CPU, memória e contagem máxima de pods do nó.
Perguntas frequentes
O que acontece com um pod aguardando na fila de prontos?
O pod registra periodicamente seu status de espera:
You have been waiting for ${1} seconds. Approximate position: ${2}
${1} é o número de segundos que o pod está aguardando. ${2} é sua posição atual na fila de prontos.
Quais métricas de monitoramento estão disponíveis para pods de compartilhamento de GPU?
As seguintes métricas estão disponíveis para pods share-pool:
|
Métrica |
Descrição |
Exemplo |
|
|
Status do pod no modo de compartilhamento de GPU. Valores: |
|
|
|
Posição do pod na fila de prontos, começando em 1. Aparece apenas quando |
|
Como as métricas de utilização de GPU diferem para pods com GPU compartilhada?
As métricas de utilização de GPU funcionam da mesma forma que para pods com GPU exclusiva, com algumas diferenças para pods com GPU compartilhada:
Monitoramento de pods ACS: A utilização do poder de computação da GPU e o uso de memória da GPU são valores absolutos baseados em toda a placa GPU, assim como em cenários de GPU exclusiva.
Visualização dentro do container (ex.:
nvidia-smi): O uso de memória da GPU é um valor absoluto, mas a utilização do poder de computação é um valor relativo onde o denominador é olimitdo pod.IDs de dispositivo: O ID do dispositivo nas métricas corresponde ao ID real no nó e nem sempre começa em 0.
Modelo share-pool: O número do dispositivo nas métricas pode mudar porque o pod pode usar diferentes dispositivos GPU do pool ao longo do tempo.
Como evitar conflitos de agendamento quando o compartilhamento de GPU está ativado apenas em alguns nós?
O agendador padrão do ACS corresponde automaticamente os tipos de pod e nó, evitando conflitos.
Se você usar um agendador personalizado, um pod de GPU exclusiva pode ser agendado em um nó de compartilhamento de GPU porque o nó expõe tanto nvidia.com/gpu quanto recursos compartilhados de GPU em sua capacity. Use uma destas abordagens:
Plugin de agendador: Escreva um plugin que leia rótulos de nó do ACS e campos Condition para filtrar nós com uma política de compartilhamento de GPU incompatível. Consulte Scheduling Framework.
Rótulos ou taints: Adicione um rótulo ou taint aos nós de compartilhamento de GPU e configure políticas de afinidade ou tolerância em seus pods.
Quais informações estão disponíveis quando um pod de compartilhamento de GPU é preemptado?
Para pods share-pool, a preempção gera tanto um Event quanto uma Condition no pod.
Eventos:
# This pod's GPU resources were preempted by <new-pod-name>
Warning GPUSharePreempted 5m15s gpushare GPU is preempted by <new-pod-name>.
# This pod preempted GPU resources from <old-pod-name>
Warning GPUSharePreempt 3m47s gpushare GPU is preempted from <old-pod-name>.
Condition:
- type: Interruption.GPUShareReclaim # Condition type for GPU sharing preemption events
status: "True" # True: a preemption or preemption-by action occurred
reason: GPUSharePreempt # GPUSharePreempt: this pod preempted another pod; GPUSharePreempted: this pod was preempted
message: GPU is preempted from <old-pod-name>.
lastTransitionTime: "2025-04-22T08:12:09Z"
lastProbeTime: "2025-04-22T08:12:09Z"
Como maximizar a densidade de pods em um cenário de Notebook?
Para pods de compartilhamento de GPU, você também pode definir requests de CPU e memória menores que limits para aumentar a densidade de pods em um nó. Quando o total de limits entre os pods em um nó excede os recursos allocatable do nó, os pods competem por CPU e memória.
CPU: A competição aparece como CPU Steal Time nas métricas do pod.
Memória: A competição pode desencadear um erro de falta de memória (OOM) no nível do nó, causando a eliminação de alguns pods.
Planeje as prioridades dos pods e as especificações de recursos com base nas características de cada aplicação. Para dados de utilização de recursos no nível do nó, consulte Métricas de monitoramento no nível de nó ACS GPU-HPN.