Este tópico descreve como implantar um arquivo YAML para criar containers que compartilham uma única GPU. Após a implantação, use o compartilhamento de GPU para isolar a memória de GPU alocada a cada container. Essa prática aumenta a utilização dos recursos de GPU.
Sumário
Pré-requisitos
O ack-ai-installer e a ferramenta de inspeção de GPU estão instalados.
Observações de uso
Em nós de GPU gerenciados em clusters do Container Service for Kubernetes (ACK), observe os seguintes pontos ao solicitar e utilizar recursos de GPU para aplicações.
Não execute aplicações com uso intenso de GPU diretamente nos nós.
Não utilize ferramentas como
Docker,Podmanounerdctlpara criar containers e solicitar recursos de GPU. Por exemplo, não execute o comandodocker run --gpus alloudocker run -e NVIDIA_VISIBLE_DEVICES=allpara rodar aplicações que demandam muita GPU.Não adicione a variável de ambiente
NVIDIA_VISIBLE_DEVICES=allouNVIDIA_VISIBLE_DEVICES=<GPU ID>na seçãoenvdo arquivo YAML do pod. Além disso, não use a variável de ambienteNVIDIA_VISIBLE_DEVICESpara solicitar recursos de GPU aos pods e executar aplicações pesadas.Caso a variável de ambiente
NVIDIA_VISIBLE_DEVICESnão esteja especificada no arquivo YAML do pod, não definaNVIDIA_VISIBLE_DEVICES=allnem execute aplicações com alto consumo de GPU durante a criação de imagens de container.Não inclua
privileged: truena seçãosecurityContextdo arquivo YAML do pod para executar aplicações que exigem muitos recursos de GPU.
O uso dos métodos acima para solicitar recursos de GPU pode gerar os seguintes riscos potenciais:
Se você solicitar recursos de GPU em um nó usando um desses métodos, mas não especificar os detalhes no registro de recursos de dispositivo do agendador, as informações reais de alocação de GPU poderão divergir desse registro. Nesse cenário, o agendador ainda poderá direcionar pods que solicitam esses recursos para o mesmo nó. Consequentemente, suas aplicações podem competir pelos recursos da mesma GPU, resultando em falhas de inicialização devido à insuficiência de recursos.
A adoção dessas práticas também pode causar outros problemas desconhecidos, como os problemas relatados pela comunidade NVIDIA.
Procedimento
-
Execute o comando abaixo para consultar informações sobre o compartilhamento de GPU no seu cluster:
kubectl inspect cgpuNAME IPADDRESS GPU0(Allocated/Total) GPU1(Allocated/Total) GPU Memory(GiB) cn-shanghai.192.168.0.4 192.168.0.4 0/7 0/7 0/14 --------------------------------------------------------------------- Allocated/Total GPU Memory In Cluster: 0/14 (0%)NotaPara obter informações detalhadas sobre o compartilhamento de GPU, execute o comando kubectl inspect cgpu -d.
-
Implante uma aplicação de exemplo com o compartilhamento de GPU ativado e solicite 3 GiB de memória de GPU para ela.
apiVersion: batch/v1 kind: Job metadata: name: gpu-share-sample spec: parallelism: 1 template: metadata: labels: app: gpu-share-sample spec: containers: - name: gpu-share-sample image: registry.cn-hangzhou.aliyuncs.com/ai-samples/gpushare-sample:tensorflow-1.5 command: - python - tensorflow-sample-code/tfjob/docker/mnist/main.py - --max_steps=100000 - --data_dir=tensorflow-sample-code/data resources: limits: # The pod requests 3 GiB of GPU memory in total. aliyun.com/gpu-mem: 3 # Specify the requested amount of GPU memory. workingDir: /root restartPolicy: Never -
Execute o seguinte comando para verificar o uso de memória da GPU:
kubectl inspect cgpuSaída esperada
NAME IPADDRESS GPU0(Allocated/Total) GPU Memory(GiB) cn-beijing.192.168.1.105 192.168.1.105 3/14 3/14 --------------------------------------------------------------------- Allocated/Total GPU Memory In Cluster: 3/14 (21%)A saída indica que o nó cn-beijing.192.168.1.105 possui um total de 14 GiB de memória de GPU, sendo 3 GiB já alocados.
Verificar o resultado
Siga estas etapas para confirmar se o isolamento de memória de GPU está ativo no nó.
Faça login no nó mestre de destino.
-
Execute o comando abaixo para visualizar os logs da aplicação e confirmar que o isolamento de memória do cGPU está habilitado.
kubectl logs gpu-share-sample --tail=1Saída esperada:
2023-08-07 09:08:13.931003: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1326] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 2832 MB memory) -> physical GPU (device: 0, name: Tesla T4, pci bus id: 0000:00:07.0, compute capability: 7.5)Essa saída mostra que o container solicitou 2.832 MB de memória de GPU.
-
Execute o comando a seguir para acessar o container e verificar a quantidade total de memória de GPU alocada a ele.
kubectl exec -it gpu-share-sample nvidia-smiSaída esperada:
Mon Aug 7 08:52:18 2023 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 418.87.01 Driver Version: 418.87.01 CUDA Version: 10.1 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 Tesla T4 On | 00000000:00:07.0 Off | 0 | | N/A 41C P0 26W / 70W | 3043MiB / 3231MiB | 0% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| +-----------------------------------------------------------------------------+O resultado confirma que este container recebeu uma alocação total de 3.231 MiB de memória de GPU.
-
Acesse o nó de GPU que executa a aplicação de exemplo e verifique a memória total de GPU disponível no nó.
nvidia-smiSaída esperada:
Mon Aug 7 09:18:26 2023 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 418.87.01 Driver Version: 418.87.01 CUDA Version: 10.1 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 Tesla T4 On | 00000000:00:07.0 Off | 0 | | N/A 40C P0 26W / 70W | 3053MiB / 15079MiB | 0% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | 0 8796 C python3 3043MiB | +-----------------------------------------------------------------------------+A saída revela que o nó host dispõe de 15.079 MiB de memória de GPU no total, dos quais 3.053 MiB foram alocados ao container.