O compartilhamento de GPU permite que vários pods compartilhem os recursos de computação de uma única GPU, o que aumenta a utilização e reduz custos. Os containers na mesma GPU executam isoladamente entre si; assim, um container não pode exceder seus recursos alocados nem afetar outros containers.
Este tópico descreve como ativar o compartilhamento de GPU em um cluster ACK Edge.
Suporte a recursos por tipo de nó
Nós na nuvem e pools de nós de borda oferecem capacidades diferentes de compartilhamento de GPU. Escolha o caminho de configuração conforme o tipo de nó e os requisitos de isolamento.
|
Recurso |
Nós na nuvem |
Pools de nós de borda |
|
Compartilhamento de GPU |
Compatível |
Compatível |
|
Isolamento de memória da GPU |
Compatível |
Não compatível |
|
Isolamento de poder de computação |
Compatível |
Não compatível |
Os pools de nós de borda suportam apenas o compartilhamento de GPU. O isolamento de memória e de poder de computação não está disponível para nós de borda. Se suas cargas de trabalho exigirem isolamento de memória ou de poder de computação, use nós na nuvem.
Pré-requisitos
Antes de começar, verifique se você tem:
Um cluster ACK Edge executando Kubernetes 1.18 ou posterior. Para mais informações, consulte Criar um cluster ACK Edge
O conjunto de IA nativa da nuvem ativado. Para mais informações, consulte Visão geral do conjunto de IA nativa da nuvem e Faturamento do conjunto de IA nativa da nuvem
O arquivo kubeconfig do cluster ACK Edge obtido e o kubectl conectado ao cluster. Para mais informações, consulte Obter o arquivo kubeconfig e conectar-se ao 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 utilize nenhum dos métodos abaixo para solicitar recursos de GPU:
Executar aplicações com uso intenso 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 criação de imagens de 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. Consequentemente, a alocação real de recursos de GPU diverge do rastreamento do agendador, fazendo com que ele agende pods adicionais no mesmo nó. As aplicações passam a competir pela mesma GPU e algumas podem falhar ao iniciar devido à insuficiência de recursos. Tais 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 do conjunto de IA nativa da nuvem. Siga as etapas correspondentes ao seu estado atual de implantação.
Se o conjunto de IA nativa da nuvem não estiver implantado
Faça login no console ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, localize o cluster e clique em seu nome. 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 não houver requisitos para compartilhamento de poder de computação, use o padrãopolicy: 5. Para detalhes sobre as políticas compatíveis, consulte Instalar e usar 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 aparece com o estado Deployed na página Cloud-native AI Suite.
Se o conjunto de IA nativa da nuvem já estiver implantado
Faça login no console ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, localize o cluster e clique em seu nome. No painel de navegação à esquerda, escolha Applications > Cloud-native AI Suite.
Localize o ack-ai-installer e clique em Deploy na coluna Actions.
(Opcional) No painel Parameters, modifique o parâmetro
policydo cGPU. Se não houver requisitos para compartilhamento de poder de computação, use o padrãopolicy: 5. Para detalhes sobre as políticas compatíveis, consulte Instalar e usar cGPU em um container Docker.
Clique em OK.
Após a instalação do ack-ai-installer, seu estado muda para Deployed.
Etapa 2: Crie um pool de nós de GPU
Pools de nós na nuvem
Na página Clusters, localize o cluster e clique em seu nome. 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 principais parâmetros. 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 ACK para alterar o valor do rótulo. Essa ação 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 valores de rótulos.Parâmetro
Descrição
Expected nodes
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 poder 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, localize o cluster e clique em seu nome. 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 Gerenciamento de pool de nós de borda. Para mais informações sobre rótulos de nós, consulte Rótulos para ativar políticas de agendamento de GPU.
Etapa 3: Adicionar nós acelerados por GPU
Nós na 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 arquitetura GPU-accelerated ao pool de nós na 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 Adicionar um nó acelerado por GPU.
Etapa 4: Instale a ferramenta de inspeção de GPU (apenas nós na nuvem)
Use o kubectl-inspect-cgpu para inspecionar a alocação de memória da GPU em todo o cluster. Esta etapa aplica-se apenas a nós na nuvem.
-
Baixe o kubectl-inspect-cgpu para um diretório em 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 -
Consulte 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 detalhes de alocação de GPU por pod, execute
kubectl inspect cgpu -d.
Etapa 5: Implantar uma carga de trabalho de exemplo
Pools de nós na 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 solicite 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 solicite 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 na nuvem
Faça login 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 nvidia-smi dentro do container para visualizar a memória visível para ele:
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 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, localize o cluster e clique em seu nome. 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 compartilhamento de GPU, mas nã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 é regido 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 entre memória alocada e total da GPU é:
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:
Próximos passos
Visão geral do compartilhamento de GPU — conheça o mecanismo subjacente do cGPU
Instalar o componente de compartilhamento de GPU — atualize o ack-ai-installer
Desativar o recurso de isolamento de memória do cGPU — execute uma carga de trabalho sem isolamento de memória da GPU em nós na nuvem
Capacidades avançadas — agendamento com reconhecimento de topologia e outros recursos avançados de compartilhamento de GPU