Partilhar via


Criar um pool de nós de GPU de várias instâncias no Serviço Kubernetes do Azure (AKS)

A GPU A100 da NVIDIA pode ser dividida em até sete instâncias independentes. Cada instância tem seu próprio Stream Multiprocessor (SM), que é responsável pela execução de instruções em paralelo, e memória GPU. Para obter mais informações sobre a NVIDIA A100, consulte GPU NVIDIA A100.

Este artigo orienta você sobre como criar um pool de nós de GPU de várias instâncias usando um tamanho de VM compatível com MIG em um cluster do Serviço Kubernetes do Azure (AKS).

Pré-requisitos e limitações

  • Uma conta do Azure com uma subscrição ativa. Se não tiver uma, pode criar uma conta gratuitamente.
  • Azure CLI versão 2.2.0 ou posterior instalada e configurada. Executar az --version para localizar a versão. Se precisar de instalar ou atualizar, veja Install Azure CLI (Instalar o Azure CLI).
  • O cliente de linha de comando Kubernetes, kubectl, instalado e configurado. Se você usa o Azure Cloud Shell, kubectl já está instalado. Se você quiser instalá-lo localmente, você pode usar o az aks install-cli comando.
  • Helm v3 instalado e configurado. Para obter mais informações, consulte Instalando o Helm.
  • Atualmente, não há suporte para pools de nós de GPU de várias instâncias no Azure Linux.
  • Não é possível usar o Escalonamento Automático de Cluster com pools de nós de GPU de várias instâncias.

Perfis de instância de GPU

Os perfis de instância da GPU definem como as GPUs são particionadas. A tabela a seguir mostra o perfil de instância de GPU disponível para o Standard_ND96asr_v4:

Nome do perfil Fração de SM Fração de memória Número de instâncias criadas
MIG 1g.5gb 1/7 1/8 7
MIG 2G.10GB 2/7 2/8 3
MIG 3G.20GB 3/7 4/8 2
MIG 4G.20GB 7/4 4/8 1
MIG 7G.40GB 7/7 8/8 1

Como exemplo, o perfil da instância da GPU indica que cada instância da GPU tem 1g SM (streaming de multiprocessadores) e 5gb de MIG 1g.5gb memória. Neste caso, a GPU é particionada em sete instâncias.

Os perfis de instância de GPU disponíveis para esse tamanho de VM incluem MIG1g, MIG2g, MIG3g, MIG4ge MIG7g.

Importante

Não é possível alterar o perfil de instância da GPU aplicado após a criação do pool de nós.

Criar um cluster do AKS

  1. Crie um grupo de recursos do Azure usando o az group create comando.

    az group create --name myResourceGroup --location southcentralus
    
  2. Crie um cluster AKS usando o az aks create comando.

    az aks create \
        --resource-group myResourceGroup \
        --name myAKSCluster \
        --generate-ssh-keys
    
  3. Configure kubectl para se conectar ao seu cluster AKS usando o az aks get-credentials comando.

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    

Criar um pool de nós de GPU de várias instâncias

Você pode usar a CLI do Azure ou uma solicitação HTTP para a API ARM para criar o pool de nós.

  • Crie um pool de nós de GPU de várias instâncias usando o az aks nodepool add comando e especifique o perfil da instância da GPU. O exemplo abaixo cria um pool de nós com o tamanho da VM GPU compatível com MIG Standard_ND96asr_v4 .

    az aks nodepool add \
        --name aks-mignode \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --node-vm-size Standard_ND96asr_v4 \
        --node-count 1 \
        --gpu-instance-profile MIG1g
    

Determinar a estratégia de GPU de várias instâncias (MIG)

Antes de instalar os plug-ins NVIDIA, você precisa especificar qual estratégia de GPU multiinstância (MIG) usar para particionamento de GPU: Estratégia única ou Estratégia mista. As duas estratégias não afetam como você executa cargas de trabalho de CPU, mas como os recursos de GPU são exibidos.

  • Estratégia única: a estratégia única trata cada instância de GPU como uma GPU. Se você usar essa estratégia, os recursos da GPU serão exibidos como nvidia.com/gpu: 1.
  • Estratégia mista: a estratégia mista expõe as instâncias da GPU e o perfil da instância da GPU. Se você usar essa estratégia, o recurso GPU será exibido como nvidia.com/mig1g.5gb: 1.

Instale o plug-in de dispositivo NVIDIA e os componentes GFD (GPU feature discovery)

  1. Defina sua estratégia MIG como uma variável de ambiente. Você pode usar uma estratégia única ou mista.

    # Single strategy
    export MIG_STRATEGY=single
    
    # Mixed strategy
    export MIG_STRATEGY=mixed
    
  2. Adicione o repositório de leme do plug-in do dispositivo NVIDIA usando os helm repo add comandos and helm repo update .

    helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
    helm repo update
    
  3. Instale o plug-in de dispositivo NVIDIA usando o helm install comando.

    helm install nvdp nvdp/nvidia-device-plugin \
    --version=0.15.0 \
    --generate-name \
    --set migStrategy=${MIG_STRATEGY} \
    --set gfd.enabled=true \
    --namespace nvidia-device-plugin \
    --create-namespace
    

Nota

A instalação do plug-in de dispositivo NVIDIA versão 0.15.0 e superior consolida o plug-in do dispositivo e os repositórios GFD. A instalação separada do leme do componente de software GFD não é recomendada neste tutorial.

Confirme a capacidade da GPU de várias instâncias

  1. Verifique a kubectl conexão com o cluster usando o kubectl get comando para retornar uma lista de nós do cluster.

    kubectl get nodes -o wide
    
  2. Confirme se o nó tem capacidade de GPU de várias instâncias usando o kubectl describe node comando. O comando de exemplo a seguir descreve o nó chamado aks-mignode, que usa MIG1g como o perfil de instância da GPU.

    kubectl describe node aks-mignode
    

    Sua saída deve ser semelhante à saída de exemplo a seguir:

    # Single strategy output
    Allocatable:
        nvidia.com/gpu: 56
    
    # Mixed strategy output
    Allocatable:
        nvidia.com/mig-1g.5gb: 56
    

Agendar trabalho

Os exemplos a seguir são baseados na imagem base CUDA versão 12.1.1 para Ubuntu 22.04, marcada como 12.1.1-base-ubuntu22.04.

Estratégia única

  1. Crie um arquivo nomeado single-strategy-example.yaml e copie no manifesto a seguir.

    apiVersion: v1
    kind: Pod
    metadata:
      name: nvidia-single
    spec:
      containers:
      - name: nvidia-single
        image: nvidia/cuda:12.1.1-base-ubuntu22.04
        command: ["/bin/sh"]
        args: ["-c","sleep 1000"]
        resources:
          limits:
            "nvidia.com/gpu": 1
    
  2. Implante o aplicativo usando o kubectl apply comando e especifique o nome do seu manifesto YAML.

    kubectl apply -f single-strategy-example.yaml
    
  3. Verifique os dispositivos GPU alocados usando o kubectl exec comando. Este comando retorna uma lista dos nós do cluster.

    kubectl exec nvidia-single -- nvidia-smi -L
    

    O exemplo a seguir é semelhante à saída mostrando implantações e serviços criados com êxito:

    GPU 0: NVIDIA A100 40GB PCIe (UUID: GPU-48aeb943-9458-4282-da24-e5f49e0db44b)
    MIG 1g.5gb     Device  0: (UUID: MIG-fb42055e-9e53-5764-9278-438605a3014c)
    MIG 1g.5gb     Device  1: (UUID: MIG-3d4db13e-c42d-5555-98f4-8b50389791bc)
    MIG 1g.5gb     Device  2: (UUID: MIG-de819d17-9382-56a2-b9ca-aec36c88014f)
    MIG 1g.5gb     Device  3: (UUID: MIG-50ab4b32-92db-5567-bf6d-fac646fe29f2)
    MIG 1g.5gb     Device  4: (UUID: MIG-7b6b1b6e-5101-58a4-b5f5-21563789e62e)
    MIG 1g.5gb     Device  5: (UUID: MIG-14549027-dd49-5cc0-bca4-55e67011bd85)
    MIG 1g.5gb     Device  6: (UUID: MIG-37e055e8-8890-567f-a646-ebf9fde3ce7a)
    

Estratégia mista

  1. Crie um arquivo nomeado mixed-strategy-example.yaml e copie no manifesto a seguir.

    apiVersion: v1
    kind: Pod
    metadata:
      name: nvidia-mixed
    spec:
      containers:
      - name: nvidia-mixed
        image: nvidia/cuda:12.1.1-base-ubuntu22.04
        command: ["/bin/sh"]
        args: ["-c","sleep 100"]
        resources:
          limits:
            "nvidia.com/mig-1g.5gb": 1
    
  2. Implante o aplicativo usando o kubectl apply comando e especifique o nome do seu manifesto YAML.

    kubectl apply -f mixed-strategy-example.yaml
    
  3. Verifique os dispositivos GPU alocados usando o kubectl exec comando. Este comando retorna uma lista dos nós do cluster.

    kubectl exec nvidia-mixed -- nvidia-smi -L
    

    O exemplo a seguir é semelhante à saída mostrando implantações e serviços criados com êxito:

    GPU 0: NVIDIA A100 40GB PCIe (UUID: GPU-48aeb943-9458-4282-da24-e5f49e0db44b)
    MIG 1g.5gb     Device  0: (UUID: MIG-fb42055e-9e53-5764-9278-438605a3014c)
    

Importante

A latest tag para imagens CUDA foi preterida no Docker Hub. Consulte o repositório da NVIDIA para obter as imagens mais recentes e as tags correspondentes.

Resolução de Problemas

Se você não vir o recurso de GPU de várias instâncias depois de criar o pool de nós, confirme se a versão da API não é anterior a 2021-08-01.

Próximos passos

Para saber mais sobre GPUs no Serviço Kubernetes do Azure, consulte: