O compartilhamento de GPU permite que vários pods compartilhem os recursos de computação de uma única GPU, melhorando a utilização da GPU e reduzindo custos. Os containers em uma mesma GPU são executados isoladamente, impedindo que um container exceda seus recursos alocados e afete os demais.
Este tópico descreve como ativar o compartilhamento de GPU em um cluster ACK Edge.
Suporte a recursos por tipo de nó
Os nós de nuvem e os pools de nós de borda suportam diferentes capacidades de compartilhamento de GPU. Escolha o caminho de configuração com base no seu tipo de nó e nos requisitos de isolamento.
|
Recurso |
Nós de nuvem |
Pools de nós de borda |
|
Compartilhamento de GPU |
Suportado |
Suportado |
|
Isolamento de memória da GPU |
Suportado |
Não suportado |
|
Isolamento de capacidade de computação |
Suportado |
Não suportado |
Os pools de nós de borda suportam apenas o compartilhamento de GPU. O isolamento de memória e de capacidade de computação não estão disponíveis para nós de borda. Se suas cargas de trabalho exigirem isolamento de memória ou de capacidade de computação, use nós de nuvem.
Pré-requisitos
Antes de começar, certifique-se de ter:
Um cluster ACK Edge executando o Kubernetes 1.18 ou posterior. Para mais informações, consulte Create an ACK Edge cluster
A suíte de IA nativa da nuvem ativada. Para mais informações, consulte Cloud-native AI suite overview e Billing of the cloud-native AI suite
Ter obtido o arquivo kubeconfig do cluster ACK Edge e conectado o kubectl ao cluster. Para mais informações, consulte Obtain the kubeconfig file and connect to the cluster
Notas de uso
Para nós de GPU gerenciados em clusters ACK, siga estas regras ao solicitar e usar recursos de GPU.
Não use nenhum dos métodos a seguir para solicitar recursos de GPU:
Executar aplicações com uso intensivo de GPU diretamente nos nós
Usar Docker, Podman ou nerdctl para criar containers com solicitações de GPU — por exemplo,
docker run --gpus alloudocker run -e NVIDIA_VISIBLE_DEVICES=allAdicionar
NVIDIA_VISIBLE_DEVICES=allouNVIDIA_VISIBLE_DEVICES=<GPU ID>à seçãoenvde um arquivo YAML de podDefinir
NVIDIA_VISIBLE_DEVICES=alldurante a compilação da imagem do container quandoNVIDIA_VISIBLE_DEVICESnão estiver especificado no YAML do podAdicionar
privileged: trueà seçãosecurityContextde um arquivo YAML de pod
Esses métodos ignoram o registro de recursos de dispositivo do agendador. Como resultado, a alocação real de recursos de GPU diverge do que o agendador rastreia, fazendo com que ele agende pods adicionais para o mesmo nó. Isso faz com que as aplicações compitam pela mesma GPU, e algumas podem falhar ao iniciar por insuficiência de recursos de GPU. Esses métodos também podem desencadear outros problemas desconhecidos, como aqueles relatados pela comunidade NVIDIA.
Etapa 1: Instale o componente de compartilhamento de GPU
O componente de compartilhamento de GPU (ack-ai-installer) faz parte da suíte de IA nativa da nuvem. Siga as etapas de acordo com o estado atual da sua implantação.
Se a suíte de IA nativa da nuvem não estiver implantada
Faça logon no console do ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, encontre o cluster e clique no nome dele. No painel de navegação à esquerda, escolha Applications > Cloud-native AI Suite.
Na página Cloud-native AI Suite, clique em Deploy.
Na página Deploy Cloud-native AI Suite, selecione Scheduling Policy Extension (Batch Task Scheduling, GPU Sharing, Topology-aware GPU Scheduling).
(Opcional) Clique em Advanced ao lado do componente. No painel Parameters, modifique o parâmetro
policydo cGPU e clique em OK. Se você não tiver requisitos para compartilhamento de capacidade de computação, use o padrãopolicy: 5. Para detalhes sobre as políticas suportadas, consulte Instalar e usar o cGPU em um container Docker.
Na parte inferior da página, clique em Deploy Cloud-native AI Suite.
Após a conclusão da implantação, o ack-ai-installer aparecerá com o estado Deployed na página Cloud-native AI Suite.
Se a suíte de IA nativa da nuvem já estiver implantada
Faça logon no console do ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, encontre o cluster e clique no nome dele. No painel de navegação à esquerda, escolha Applications > Cloud-native AI Suite.
Encontre o ack-ai-installer e clique em Deploy na coluna Actions.
(Opcional) No painel Parameters, modifique o parâmetro
policydo cGPU. Se você não tiver requisitos para compartilhamento de capacidade de computação, use o padrãopolicy: 5. Para detalhes sobre as políticas suportadas, consulte Instalar e usar o cGPU em um container Docker.
Clique em OK.
Após a instalação do ack-ai-installer, o estado dele mudará para Deployed.
Etapa 2: Crie um pool de nós de GPU
Pools de nós de nuvem
Na página Clusters, encontre o cluster e clique no nome dele. No painel de navegação à esquerda, escolha Nodes > Node Pools.
No canto superior direito da página Node Pools, clique em Create Node Pool.
-
Na caixa de diálogo Create Node Pool, configure os parâmetros e clique em Confirm Order. A tabela a seguir descreve os parâmetros principais. Para outros parâmetros, consulte Criar e gerenciar um pool de nós.
ImportanteApós adicionar o rótulo de compartilhamento de GPU a um nó, não use
kubectl label nodesou o recurso de gerenciamento de rótulos no console do ACK para alterar o valor do rótulo. Fazer isso pode causar problemas de agendamento. Configure o compartilhamento de GPU no nível do pool de nós. Para detalhes, consulte Configurar políticas de agendamento de GPU para pools de nós e Problemas que podem ocorrer se você alterar os valores dos rótulos.Parâmetro
Descrição
Expected nodes
O número inicial de nós. Defina como
0para criar um pool de nós vazio.Node label
Clique no ícone
, defina Key como ack.node.gpu.schedulee defina Value comocgpu. Este rótulo ativa o compartilhamento de GPU com isolamento de memória da GPU e compartilhamento de capacidade de computação — os pods no nó solicitam apenas memória da GPU, e vários pods podem compartilhar a mesma GPU. Para mais informações, consulte Rótulos para ativar políticas de agendamento de GPU.
Pools de nós de borda
Na página Clusters, encontre o cluster e clique no nome dele. No painel de navegação à esquerda, escolha Nodes > Node Pools.
Na página Node Pools, clique em Create Node Pool.
Na caixa de diálogo Create Node Pool, configure os parâmetros e clique em Confirm Order. Na seção Node Labels, clique no ícone
, defina Key como ack.node.gpu.schedulee defina Value comoshare. Este rótulo ativa o compartilhamento de GPU. Para outros parâmetros, consulte Edge node pool management. Para mais informações sobre rótulos de nó, consulte Labels for enabling GPU scheduling policies.
Etapa 3: Adicione nós acelerados por GPU
Nós de nuvem
Ignore esta etapa se você já adicionou nós acelerados por GPU ao criar o pool de nós.
Adicione instâncias ECS com a arquitetura GPU-accelerated ao pool de nós de nuvem. Para mais informações, consulte Adicionar instâncias ECS existentes ou Criar e gerenciar um pool de nós.
Nós de borda
Para mais informações, consulte Add a GPU-accelerated node.
Etapa 4: Instale a ferramenta de inspeção de GPU (apenas nós de nuvem)
Use o kubectl-inspect-cgpu para inspecionar a alocação de memória da GPU em todo o cluster. Esta etapa se aplica apenas aos nós de nuvem.
-
Baixe o kubectl-inspect-cgpu para um diretório no seu PATH. Este exemplo usa
/usr/local/bin/.Linux: ``
bash wget http://aliacs-k8s-cn-beijing.oss-cn-beijing.aliyuncs.com/gpushare/kubectl-inspect-cgpu-linux -O /usr/local/bin/kubectl-inspect-cgpu``macOS: ``
bash wget http://aliacs-k8s-cn-beijing.oss-cn-beijing.aliyuncs.com/gpushare/kubectl-inspect-cgpu-darwin -O /usr/local/bin/kubectl-inspect-cgpu``
-
Conceda permissões de execução:
chmod +x /usr/local/bin/kubectl-inspect-cgpu -
Verifique o uso de GPU em todo o cluster:
kubectl inspect cgpuSaída esperada:
NAME IPADDRESS GPU0(Allocated/Total) GPU Memory(GiB) cn-shanghai.192.168.6.104 192.168.6.104 0/15 0/15 ---------------------------------------------------------------------- Allocated/Total GPU Memory In Cluster: 0/15 (0%)Para visualizar os detalhes de alocação de GPU por pod, execute
kubectl inspect cgpu -d.
Etapa 5: Implante uma carga de trabalho de exemplo
Pools de nós de nuvem
-
Verifique a alocação atual de memória da GPU:
kubectl inspect cgpuSaída esperada:
NAME 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%) -
Implante um Job de exemplo que solicita 3 GiB de memória da GPU. Substitua
npxxxxxxxxxxxxxxpelo ID do seu pool de nós.apiVersion: batch/v1 kind: Job metadata: name: gpu-share-sample spec: parallelism: 1 template: metadata: labels: app: gpu-share-sample spec: nodeSelector: alibabacloud.com/nodepool-id: npxxxxxxxxxxxxxx # Replace with your node pool ID 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: aliyun.com/gpu-mem: 3 # GPU memory to request, in GiB workingDir: /root restartPolicy: NeverO campo
aliyun.com/gpu-memespecifica a quantidade de memória da GPU em GiB. Por exemplo,3solicita 3 GiB de memória da GPU compartilhada.
Pools de nós de borda
Implante um Job de exemplo que solicita 4 GiB de memória da GPU. Substitua npxxxxxxxxxxxxxx pelo ID do seu pool de nós de borda.
apiVersion: batch/v1
kind: Job
metadata:
name: tensorflow-mnist-share
spec:
parallelism: 1
template:
metadata:
labels:
app: tensorflow-mnist-share
spec:
nodeSelector:
alibabacloud.com/nodepool-id: npxxxxxxxxxxxxxx # Replace with your edge node pool ID
containers:
- name: tensorflow-mnist-share
image: registry.cn-beijing.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:
aliyun.com/gpu-mem: 4 # GPU memory to request, in GiB
workingDir: /root
restartPolicy: Never
Etapa 6: Verifique os resultados
Pools de nós de nuvem
Faça logon no plano de controle.
-
Exiba a última linha de log do pod para confirmar que o isolamento de memória da GPU está ativo:
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)A saída indica que o container solicitou 2.832 MiB de memória da GPU.
-
Execute o nvidia-smi dentro do container para visualizar a memória visível ao container:
3043MiB / 3231MiB— o container vê apenas 3.231 MiB (aproximadamente 3 GiB), e não a memória total da GPU. Isso confirma que o isolamento de memória da GPU está funcionando.
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 | |=============================================================================| +-----------------------------------------------------------------------------+Considerações importantes:
-
Execute o nvidia-smi no nó para visualizar a memória total da GPU:
15079MiB— memória total da GPU no nó (a Tesla T4 completa)3053MiB / 15079MiB— o container ocupa 3.053 MiB de um total de 15.079 MiB, deixando a memória restante disponível para que outros pods compartilhem a mesma GPU
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 | +-----------------------------------------------------------------------------+Considerações importantes:
Pools de nós de borda
Na página Clusters, encontre o cluster e clique no nome dele. No painel de navegação à esquerda, escolha Workloads > Pods.
-
Na coluna Actions do seu pod (por exemplo,
tensorflow-mnist-multigpu-*), clique em Terminal** e execute:16384MiB— o pod vê a memória total da GPU (V100 SXM2, 16 GiB). Os pools de nós de borda suportam o compartilhamento de GPU, mas não o isolamento de memória da GPU, portanto, a visão do pod não se restringe aos 4 GiB solicitados.O uso real de memória da GPU pelo pod é controlado por variáveis de ambiente definidas automaticamente pelo componente de compartilhamento de GPU: ``
ALIYUN_COM_GPU_MEM_CONTAINER=4 # GPU memory the pod is allocated (GiB) ALIYUN_COM_GPU_MEM_DEV=16 # Total memory of the physical GPU (GiB)``A proporção da memória da GPU alocada em relação ao total é:
4 / 16 = 0.25(25%)
nvidia-smiSaída esperada:
Wed Jun 14 06:45:56 2023 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 515.105.01 Driver Version: 515.105.01 CUDA Version: 11.7 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Tesla V100-SXM2... On | 00000000:00:09.0 Off | 0 | | N/A 35C P0 59W / 300W | 334MiB / 16384MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| +-----------------------------------------------------------------------------+Considerações importantes:
O que fazer a seguir
Visão geral do compartilhamento de GPU — conheça o mecanismo subjacente do cGPU
Install the GPU sharing component — atualize o ack-ai-installer
Disable the memory isolation feature of cGPU — execute uma carga de trabalho sem isolamento de memória da GPU em nós de nuvem
Advanced capabilities — agendamento com reconhecimento de topologia e outros recursos avançados de compartilhamento de GPU