Ajudar a melhorar esta página
Para contribuir com este guia de usuário, escolha o link Editar esta página no GitHub, disponível no painel direito de cada página.
Usar o fatiamento de tempo com GPUs da NVIDIA no Amazon EKS
O fatiamento de tempo permite que vários pods compartilhem uma única GPU física da NVIDIA. O agendador do Kubernetes coloca vários pods na mesma GPU, e o agendador do CUDA da GPU realiza a multiplexação temporal do trabalho. O fatiamento de tempo é a estratégia mais simples de compartilhamento de GPU. Ele usa apenas software, não requer hardware especial e funciona em todos os tipos de instância de GPU da NVIDIA na AWS. O fatiamento de tempo não oferece isolamento de memória ou computação entre pods que compartilham uma GPU. É mais adequado para workloads com baixa utilização de GPU, como serviços de inferência que ficam ociosos entre requisições ou ambientes de desenvolvimento em que vários usuários compartilham uma GPU. Para workloads que exigem isolamento de memória e computação em nível de hardware, use a GPU de várias instâncias (MIG).
No Amazon EKS, você pode gerenciar o fatiamento de tempo com o driver NVIDIA DRA ou o plug-in de dispositivo da NVIDIA.
O fatiamento de tempo só poderá ser usado com o Karpenter se você estiver usando o provisionamento de capacidade estática
O fatiamento de tempo é uma boa opção quando:
-
A utilização da GPU é consistentemente baixa, por exemplo, serviços de inferência sensíveis à latência que ficam ociosos entre as requisições.
-
Vários desenvolvedores compartilham um único nó de GPU para trabalhos de desenvolvimento ou execução de cadernos.
-
Seus nós usam um tipo de instância de GPU que não é compatível com o MIG, como as famílias
g5,g6oug6e. -
Você pode aceitar que um pod às vezes fique mais lento porque outro pod na mesma GPU está ocupado.
Considere uma abordagem diferente quando:
-
Você precisa de isolamento de memória. Os pods em uma GPU com fatiamento de tempo compartilham a mesma memória da GPU, e um pod pode esgotar a memória da qual outros pods dependem. Use o MIG para isolamento de memória.
-
Você precisa de latência previsível por pod ou qualidade de serviço. O agendador da GPU compartilha a computação em todos os slots da melhor maneira possível, sem garantias.
-
Você executa workloads de treinamento. O fatiamento de tempo adiciona alternância de contexto que reduz a eficiência do treinamento. Um trabalho de ponto de verificação que outro pod atrasa deve ser repetido a partir do último ponto de verificação.
Considerações
Antes de usar o fatiamento de tempo na produção, analise as considerações a seguir.
Considerações gerais
-
Sem isolamento de memória: pods que compartilham uma GPU com fatiamento de tempo compartilham sua memória. Um pod pode alocar a memória de que outros pods precisam, o que pode causar erros de memória insuficiente. Ajuste a quantidade de pods que compartilham cada GPU com o espaço de memória de suas workloads. Se seus pods carregam regularmente modelos grandes, compartilhe menos pods por GPU ou use o MIG.
-
Compartilhamento de computação com o melhor esforço: o agendador da GPU compartilha a computação entre os pods em regime de melhor esforço e não garante a computação proporcional a cada pod.
-
O fatiamento de tempo e o MPS não podem compartilhar a mesma GPU: o fatiamento de tempo define o modo de computação da GPU como
DEFAULT, enquanto o Multi-Process Service (MPS) da NVIDIA requerEXCLUSIVE_PROCESS. Você pode usar as duas estratégias no mesmo cluster, mas não na mesma GPU física ao mesmo tempo. O fatiamento de tempo também não tem efeito em uma instância MIG. Para compartilhar uma única instância MIG entre contêineres, use o MPS. -
Métricas por contêiner: o Data Center GPU Manager (DCGM) da NVIDIA não pode atribuir métricas a contêineres individuais quando o fatiamento de tempo está ativo. As métricas no nível da GPU permanecem disponíveis, mas você não consegue identificar qual pod consumiu uma determinada quantidade de recursos da GPU.
Considerações sobre o driver NVIDIA DRA
-
Recurso alfa: o fatiamento de tempo por meio do driver DRA requer o feature gate
TimeSlicingSettings, que é um recurso alfa desabilitado por padrão. Para obter mais informações, consulte Usar o fatiamento de tempo da GPU com o driver NVIDIA DRA. -
Somente compartilhamento mediado pelo usuário: os pods compartilham uma GPU somente fazendo referência ao mesmo
ResourceClaimouResourceClaimTemplate, com escopo de namespace, portanto, o compartilhamento não pode cruzar namespaces. O compartilhamento mediado pelo sistema é uma capacidade futura proposta. -
Desabilite o plug-in de dispositivo integrado no Bottlerocket: o driver DRA não pode ser executado junto com o plug-in de dispositivo da NVIDIA no mesmo nó. No Bottlerocket, desabilite o plug-in de dispositivo integrado, que requer a versão 1.63.0 ou posterior do Bottlerocket. Para obter mais informações, consulte Instale o driver NVIDIA DRA.
-
Suporte de computação: o driver NVIDIA DRA é compatível com provisionamento de capacidade estática no Karpenter, grupos de nós gerenciados pelo EKS ou nós autogerenciados, e não é compatível com o Modo Automático do EKS. Para obter mais informações, consulte a documentação do NodePool estático do Karpenter
no site do Karpenter.
Considerações sobre o plug-in de dispositivo da NVIDIA
-
Compartilhamento de computação em regime de melhor esforço com slots: o plug-in de dispositivo anuncia um número fixo de slots por GPU. Se um único pod solicitar mais de um slot, ele não receberá computação adicional. Habilite a opção
fail-requests-greater-than-onepara rejeitar pods que solicitam mais de um slot. -
Provisionamento com o Karpenter: o Karpenter conta cada requisição
nvidia.com/gpucomo uma GPU física, mesmo quando o fatiamento de tempo está habilitado na GPU. Para obter mais informações, consulte Karpenter issue #2140no GitHub. -
Não compatível com o Modo do Automático do EKS: o Modo do Automático do EKS gerencia o plug-in de dispositivo da NVIDIA e não expõe sua configuração. Como o fatiamento de tempo requer a configuração do plug-in de dispositivo, você não pode aplicar uma configuração de fatiamento de tempo nos nós do Modo do Automático do EKS.
-
Alterações na configuração do fatiamento de tempo: o plug-in de dispositivo da NVIDIA não monitora o
ConfigMapde fatiamento de tempo em busca de alterações. Reinicie o plug-in de dispositivo depois de atualizar a configuração.
Opções de configuração
Você pode usar o fatiamento de tempo para GPUs da NVIDIA com as AMIs AL2023 e Bottlerocket NVIDIA otimizadas para EKS. As configurações de fatiamento de tempo variam de acordo com o uso do driver NVIDIA DRA ou do plug-in de dispositivo da NVIDIA.
Usar o fatiamento de tempo da GPU com o driver NVIDIA DRA
Com o driver NVIDIA DRA, os pods compartilham uma GPU fazendo referência a um ResourceClaim comum que solicita o DeviceClass gpu.nvidia.com com um fatiamento de tempo GpuConfig.
Atualmente, o driver NVIDIA DRA implementa o fatiamento de tempo mediado pelo usuário: uma GPU é compartilhada somente entre os pods e contêineres que você aponta explicitamente para a mesma declaração. Como um ResourceClaim e um ResourceClaimTemplate têm escopo de namespace, os pods que compartilham uma GPU dessa forma devem estar no mesmo namespace. Para compartilhar uma GPU entre contêineres em um único pod, faça com que cada contêiner referencie o mesmo nome de requisição na declaração. Cada contêiner que faz referência a nomes de requisições diferentes recebe uma GPU separada. Crie um ResourceClaimTemplate separado para cada intervalo de fatiamento de tempo necessário e um em cada namespace em que você deseja compartilhar GPUs.
O fatiamento de tempo mediado pelo sistema ocorre quando o driver compartilha uma GPU entre declarações independentes (inclusive entre namespaces) com base em critérios definidos pelo sistema, em vez de em uma declaração que você configura. Para obter mais informações sobre fatiamento de tempo mediado pelo sistema, consulte System-mediated time-slicing of GPUs (issue #659)
Importante
O fatiamento de tempo por meio do driver DRA requer o feature gate TimeSlicingSettings, que é um recurso alfa desabilitado por padrão. Se você solicitar a estratégia de compartilhamento TimeSlicing sem habilitar esse feature gate, o driver não preparará o dispositivo e o pod permanecerá em ContainerCreating com um evento FailedPrepareDynamicResources que indica error validating GPU config: unknown GPU sharing strategy: TimeSlicing. Habilite o feature gate somente se você aceitar os riscos de usar um recurso alfa.
Pré-requisitos
-
Um cluster do Amazon EKS executando o Kubernetes versão 1.34 ou posterior. O driver NVIDIA DRA é compatível com provisionamento de capacidade estática no Karpenter, grupos de nós gerenciados pelo EKS ou nós autogerenciados.
-
Nós com tipos de instância de GPU NVIDIA que utilizam a AMI NVIDIA AL2023 otimizada para EKS.
-
O driver NVIDIA DRA instalado conforme descrito em Instale o driver NVIDIA DRA, com o feature gate
TimeSlicingSettingshabilitado.
Procedimento
-
Crie um
ResourceClaimque solicite uma GPU com a estratégia de compartilhamentoTimeSlicing. Vários pods que fazem referência a essa declaração compartilham a mesma GPU física.cat <<EOF | kubectl apply -f - apiVersion: resource.k8s.io/v1 kind: ResourceClaim metadata: name: shared-timeslice-gpu spec: devices: requests: - name: gpu exactly: deviceClassName: gpu.nvidia.com count: 1 config: - requests: ["gpu"] opaque: driver: gpu.nvidia.com parameters: apiVersion: resource.nvidia.com/v1beta1 kind: GpuConfig sharing: strategy: TimeSlicing timeSlicingConfig: interval: Long EOF -
Implante dois ou mais pods que façam referência ao
ResourceClaimcompartilhado pelo nome. Cada pod faz referência à declaração por meio deresourceClaimseresources.claims.cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: share-a spec: tolerations: - key: nvidia.com/gpu operator: Exists effect: NoSchedule containers: - name: cuda image: nvidia/cuda:12.6.0-base-ubuntu22.04 command: ["nvidia-smi", "-L"] resources: claims: - name: gpu resourceClaims: - name: gpu resourceClaimName: shared-timeslice-gpu restartPolicy: OnFailure EOF -
Verifique se os pods compartilham a mesma GPU física. Execute
nvidia-smi -Lem cada pod e confirme que eles relatam o mesmo UUID da GPU.kubectl logs share-aVeja abaixo um exemplo de saída. Um segundo pod que faz referência à mesma declaração indica um UUID idêntico da
GPU, o que confirma que os dois pods compartilham uma GPU física.GPU 0: NVIDIA L4 (UUID: GPU-b41973ee-5d0a-cde8-6287-12b53f861f02)
Usar o fatiamento de tempo da GPU nos nós do Bottlerocket com o plug-in de dispositivo da NVIDIA
No Bottlerocket, a AMI acelerada otimizada para EKS inclui o plug-in de dispositivo da NVIDIA. Você habilita o fatiamento de tempo por meio das configurações settings.kubelet-device-plugins.nvidia, que o Bottlerocket renderiza na configuração do plug-in de dispositivo quando o nó é inicializado.
Pré-requisitos
-
Um cluster do Amazon EKS. O procedimento a seguir provisiona os nós de GPU da NVIDIA com a AMI Bottlerocket NVIDIA otimizada para EKS.
-
O Karpenter foi instalado e configurado em seu cluster porque o procedimento a seguir usa um
EC2NodeClassdo Karpenter para fornecer as configurações de fatiamento de tempo nos dados do usuário do nó do Bottlerocket. Para obter mais informações, consulte Getting Started with Karpenterno site do Karpenter. -
kubectlconfigurado para se comunicar com o seu cluster; consulte Instalar ou atualizar o kubectl para obter mais informações.
Procedimento
Adicione as configurações de fatiamento de tempo aos dados do usuário do Bottlerocket para seus nós de GPU. O exemplo a seguir configura quatro slots por GPU. A forma como você fornece dados do usuário depende de como você provisiona os nós. O exemplo a seguir mostra um EC2NodeClass do Karpenter.
cat <<EOF | kubectl apply -f - apiVersion: karpenter.k8s.aws/v1 kind: EC2NodeClass metadata: name: gpu-bottlerocket-timeslicing spec: amiFamily: Bottlerocket amiSelectorTerms: - alias: bottlerocket@latest role: eksctl-KarpenterNodeRole-<cluster-name> subnetSelectorTerms: - tags: karpenter.sh/discovery: <cluster-name> securityGroupSelectorTerms: - tags: karpenter.sh/discovery: <cluster-name> userData: | [settings.kubelet-device-plugins.nvidia] device-sharing-strategy = "time-slicing" [settings.kubelet-device-plugins.nvidia.time-slicing] replicas = 4 rename-by-default = false fail-requests-greater-than-one = true EOF
Quando os nós provisionados com essas configurações se juntam ao cluster, o plug-in do dispositivo anuncia quatro slots nvidia.com/gpu para cada GPU física. Você os solicita em sua especificação de workload com requisições ou limites de recursos de contêiner para o recurso estendido nvidia.com/gpu.
Usar o fatiamento de tempo da GPU nos nós do AL2023 com o plug-in de dispositivo da NVIDIA
No AL2023, você instala o plug-in de dispositivo da NVIDIA conforme descrito em Instalar o plug-in de dispositivo NVIDIA para Kubernetes e fornece a configuração de fatiamento de tempo em um ConfigMap.
Pré-requisitos
-
Um cluster do Amazon EKS com nós que usam tipos de instância de GPU da NVIDIA e a AMI NVIDIA AL2023 otimizada para EKS.
-
O Helm instalado em seu ambiente de linha de comando. Consulte as Instruções de configuração do Helm para obter mais informações.
-
kubectlconfigurado para se comunicar com o seu cluster; consulte Instalar ou atualizar o kubectl para obter mais informações.
Procedimento
-
Crie o
ConfigMapde fatiamento de tempo no namespacenvidiaem que você instalou o plug-in de dispositivo em Instalar o plug-in de dispositivo NVIDIA para Kubernetes. Este exemplo configura quatro slots por GPU.cat <<EOF | kubectl apply -f - apiVersion: v1 kind: ConfigMap metadata: name: nvidia-device-plugin-config namespace: nvidia data: config.yaml: | version: v1 sharing: timeSlicing: renameByDefault: false failRequestsGreaterThanOne: true resources: - name: nvidia.com/gpu replicas: 4 EOF -
Atualize a versão existente do plug-in de dispositivo da NVIDIA para referenciar o
ConfigMapcom o valorconfig.name. O sinalizador--reuse-valuespreserva os valores que você definiu ao instalar o plug-in de dispositivo em Instalar o plug-in de dispositivo NVIDIA para Kubernetes.helm upgrade nvdp nvdp/nvidia-device-plugin \ --namespace nvidia \ --reuse-values \ --set config.name=nvidia-device-plugin-config
nota
O plug-in de dispositivo não é recarregado automaticamente quando você altera o ConfigMap. Depois de atualizar a configuração de fatiamento de tempo, reinicie os pods do plug-in de dispositivo para aplicar a alteração.
Verificar se o fatiamento de tempo da GPU está ativo
Depois que seus nós com fatiamento de tempo estiverem Ready, confirme se o plug-in de dispositivo anuncia o número esperado de slots e se os pods compartilham uma GPU física.
nota
A verificação do UUID compartilhado neste procedimento demonstra o fatiamento de tempo com mais clareza quando os pods chegam à mesma GPU física. Em um nó com uma única GPU, o plug-in de dispositivo anuncia quatro slots e todos os quatro pods compartilham essa GPU, portanto eles indicam o mesmo UUID. Em um nó com várias GPUs físicas, o agendador pode colocar pods em GPUs diferentes. Esses pods indicam UUIDs diferentes, embora o fatiamento de tempo esteja ativo. Para demonstrar o compartilhamento em uma GPU, agende a workload em um tipo de instância de GPU única. Por exemplo, adicione um seletor de nós, como node.kubernetes.io/instance-type: g6.2xlarge, na especificação do pod.
-
Confirme se o nó anuncia o número configurado de slots de GPU. Com quatro slots por GPU, um nó com uma GPU física indica
4.kubectl get nodes "-o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu"Veja abaixo um exemplo de saída.
NAME GPU ip-192-168-11-225.us-west-2.compute.internal 4 -
Crie uma implantação que execute quatro réplicas, cada uma solicitando um slot de GPU.
cat <<EOF | kubectl apply -f - apiVersion: apps/v1 kind: Deployment metadata: name: timeslicing-demo spec: replicas: 4 selector: matchLabels: app: timeslicing-demo template: metadata: labels: app: timeslicing-demo spec: tolerations: - key: nvidia.com/gpu operator: Exists effect: NoSchedule containers: - name: cuda image: nvidia/cuda:12.6.0-base-ubuntu22.04 command: ["bash", "-c", "nvidia-smi --query-gpu=uuid --format=csv,noheader; sleep infinity"] resources: limits: nvidia.com/gpu: 1 EOF -
Confirme se todos os quatro pods estão agendados no mesmo nó.
kubectl get pods -l app=timeslicing-demo -o wide -
Confirme se todos os quatro pods indicam o mesmo UUID de GPU. Um único UUID compartilhado entre todos os quatro pods confirma que uma GPU física está sendo multiplexada no tempo.
kubectl logs -l app=timeslicing-demo --prefixVeja abaixo um exemplo de saída.
[pod/timeslicing-demo-xxxxxxxxxx-aaaaa/cuda] GPU-c0583cce-87c5-c736-db7f-6d3128c84d03 [pod/timeslicing-demo-xxxxxxxxxx-bbbbb/cuda] GPU-c0583cce-87c5-c736-db7f-6d3128c84d03 [pod/timeslicing-demo-xxxxxxxxxx-ccccc/cuda] GPU-c0583cce-87c5-c736-db7f-6d3128c84d03 [pod/timeslicing-demo-xxxxxxxxxx-ddddd/cuda] GPU-c0583cce-87c5-c736-db7f-6d3128c84d03