O cGPU permite que vários pods compartilhem uma única GPU física em clusters ACK Pro ao isolar a memória da GPU e o poder de computação no nível de software. Este tópico mostra como criar um node pool com alocação de poder de computação ativada, verificar a configuração e implantar uma carga de trabalho que utilize ambos os recursos.
Pré-requisitos
Antes de começar, verifique se você tem:
Um cluster ACK Pro executando Kubernetes 1.20 ou posterior. Para mais informações, consulte Criar um cluster gerenciado pelo ACK.
-
Uma versão do kube-scheduler compatível com a versão do seu cluster. Para obter a lista completa de recursos suportados por cada versão do kube-scheduler, consulte kube-scheduler.
Versão do cluster ACK
Versão do scheduler
1.28
1.28.1-aliyun-5.6-998282b9 ou posterior
1.26
v1.26.3-aliyun-4.1-a520c096 ou posterior
1.24
1.24.3-ack-2.0 ou posterior
1.22
1.22.15-ack-2.0 ou posterior
1.20
1.20.4-ack-8.0 ou posterior
O add-on de compartilhamento de GPU instalado com uma versão do chart Helm superior a 1.2.0. Para mais informações, consulte Gerenciar o componente de compartilhamento de GPU.
O cGPU 1.0.5 ou posterior instalado. Para mais informações, consulte Atualizar a versão do cGPU em um nó.
Limitações
Não há suporte para mistura de tipos de jobs no mesmo nó. O compartilhamento de GPU suporta dois tipos de jobs: os que solicitam apenas memória da GPU e os que solicitam tanto memória da GPU quanto poder de computação. Não é possível executar ambos os tipos no mesmo nó simultaneamente. Essa restrição existe porque o cGPU utiliza isolamento no nível de software, e não no nível de hardware (como MIG).
Os valores de poder de computação devem ser múltiplos de 5, com mínimo de 5. A escala varia de 0 a 100, onde 100 representa 100% do poder de computação de uma GPU. Por exemplo, um valor de 20 significa que o pod utiliza 20% do poder de computação da GPU. Se o valor especificado não for múltiplo de 5, o job não poderá ser enviado.
A rotulagem direta de nós não suporta alocação de poder de computação. Para ativar o isolamento de poder de computação em nós acelerados por GPU existentes, remova-os primeiro do cluster e adicione-os a um node pool compatível com esse isolamento. Executar
kubectl label nodes <NODE_NAME> ack.node.gpu.schedule=core_memdiretamente nos nós existentes não funciona.-
Disponível apenas em regiões específicas. A alocação de poder de computação está disponível nas seguintes regiões:
Região
ID da região
China (Pequim)
cn-beijing
China (Xangai)
cn-shanghai
China (Hangzhou)
cn-hangzhou
China (Zhangjiakou)
cn-zhangjiakou
China (Shenzhen)
cn-shenzhen
China (Chengdu)
cn-chengdu
China (Heyuan)
cn-heyuan
China (Hong Kong)
cn-hongkong
Indonésia (Jacarta)
ap-southeast-5
Singapura
ap-southeast-1
Tailândia (Bangkok)
ap-southeast-7
EUA (Virgínia)
us-east-1
EUA (Vale do Silício)
us-west-1
Japão (Tóquio)
ap-northeast-1
China East 2 Finance
cn-shanghai-finance-1
-
Clusters criados antes de 1º de março de 2022 exigem atualização manual do scheduler. Clusters criados em ou após 1º de março de 2022 usam automaticamente a versão do scheduler compatível com alocação de poder de computação. Para clusters mais antigos, siga estas etapas:
Envie um ticket para solicitar acesso à visualização privada do agendamento de GPU compartilhada.
Se a versão instalada do chart Helm de compartilhamento de GPU for 1.2.0 ou anterior, desinstale-o: a. Faça login no console ACK. No painel de navegação à esquerda, clique em console ACKconsole ACKClusters. b. Clique no nome do cluster. No painel de navegação à esquerda, escolha Applications > Helm. c. Na página Helm, localize ack-ai-installer e clique em Delete na coluna Actions. Na caixa de diálogo Delete, clique em OK.
Instale o componente de compartilhamento de GPU mais recente. Para mais informações, consulte Gerenciar o componente de compartilhamento de GPU.
Etapa 1: Criar um node pool com alocação de poder de computação
Faça login no console ACK. No painel de navegação à esquerda, clique em Clusters.
Clique no nome do cluster. No painel de navegação à esquerda, escolha Nodes > Node Pools.
Na página Node Pools, clique em Create Node Pool.
-
Configure o node pool com as definições a seguir. Para todos os outros parâmetros, consulte Criar e gerenciar um node pool. Em Node Labels, adicione estes dois rótulos:
Parâmetro
Descrição
Node Pool Name
Nome para o node pool. Este tópico usa
gpu-corecomo exemplo.Expected Nodes
Número inicial de nós. Defina como
0se não quiser criar nós imediatamente.ECS Tags
Rótulos para adicionar às instâncias do Elastic Compute Service (ECS) no node pool.
Node Labels
Rótulos para adicionar aos nós. Configure ambos os rótulos a seguir. Para mais informações, consulte Rótulos para ativar políticas de agendamento de GPU.
Chave
Valor
Finalidade
ack.node.gpu.schedulecore_memAtiva o isolamento de memória da GPU e o isolamento de poder de computação no nó.
ack.node.gpu.placementbinpackUtiliza o algoritmo binpack para consolidar pods no menor número possível de GPUs, maximizando a utilização da GPU.
Etapa 2: Verificar se os nós do node pool têm alocação de poder de computação ativada
Execute o comando a seguir para verificar se a alocação de poder de computação está ativada em um nó:
kubectl get nodes <NODE_NAME> -o yaml
Procure o campo aliyun.com/gpu-core.percentage nas seções allocatable e capacity da saída. Sua presença confirma que a alocação de poder de computação está ativa.
Saída esperada para um nó com 4 GPUs (cada uma com 15 GiB de memória):
# Irrelevant fields are omitted.
status:
allocatable:
# 4 GPUs x 100% = 400 total computing power units
aliyun.com/gpu-core.percentage: "400"
aliyun.com/gpu-count: "4"
# 4 GPUs x 15 GiB = 60 GiB total GPU memory
aliyun.com/gpu-mem: "60"
capacity:
aliyun.com/gpu-core.percentage: "400"
aliyun.com/gpu-count: "4"
aliyun.com/gpu-mem: "60"
Etapa 3: Implantar uma carga de trabalho com limites de poder de computação
Sem a alocação de poder de computação, um pod pode usar 100% do poder de computação de uma GPU e todos os 15 GiB de sua memória. Após ativar esse recurso, defina limites explícitos para ambos os recursos.
O exemplo a seguir implanta um job que solicita 2 GiB de memória da GPU e 30% de poder de computação.
-
Crie um arquivo chamado
cuda-sample.yamlcom o seguinte conteúdo:apiVersion: batch/v1 kind: Job metadata: name: cuda-sample spec: parallelism: 1 template: metadata: labels: app: cuda-sample spec: containers: - name: cuda-sample image: registry.cn-beijing.aliyuncs.com/ai-samples/gpushare-sample:benchmark-tensorflow-2.2.3 command: - bash - run.sh - --num_batches=500000000 - --batch_size=8 resources: limits: aliyun.com/gpu-mem: 2 # GPU memory in GiB aliyun.com/gpu-core.percentage: 30 # Percentage of GPU computing power; must be a multiple of 5 workingDir: /root restartPolicy: NeverPrincipais parâmetros de recursos:
Parâmetro
Valor
Descrição
aliyun.com/gpu-mem2Memória da GPU em GiB. O pod pode usar até 2 GiB.
aliyun.com/gpu-core.percentage30Percentual de poder de computação da GPU. Deve ser múltiplo de 5; 30 significa 30%.
-
Implante o job:
kubectl apply -f /tmp/cuda-sample.yamlA imagem é grande. O download inicial pode levar vários minutos.
-
Verifique se o job está em execução:
kubectl get po -l app=cuda-sampleSaída esperada:
NAME READY STATUS RESTARTS AGE cuda-sample-m**** 1/1 Running 0 15sO status
Runningna colunaSTATUSconfirma que o pod está ativo. -
Verifique a memória da GPU e o poder de computação usados pelo pod:
kubectl exec -ti cuda-sample-m**** -- nvidia-smiSaída esperada:
Thu Dec 16 02:53:22 2021 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 450.102.04 Driver Version: 450.102.04 CUDA Version: 11.0 | |-------------------------------+----------------------+----------------------+ | 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:08.0 Off | 0 | | N/A 33C P0 56W / 300W | 337MiB / 2154MiB | 30% Default | | | | N/A | +-----------------------------------------------------------------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| +-----------------------------------------------------------------------------+A saída confirma a aplicação do isolamento:
Memória da GPU: O pod está limitado a 2.154 MiB (aproximadamente 2 GiB), reduzido dos 15 GiB completos disponíveis antes da ativação do recurso. O uso atual é de 337 MiB.
Poder de computação: O pod está limitado a 30% (
GPU-Util: 30%), reduzido de 100%.
O comando
nvidia-smirelata a utilização do poder de computação por GPU, não por pod. Se n pods solicitarem 30% cada e n não for maior que 3, todos os pods serão agendados na mesma GPU e a saída mostrará uma utilização de n x 30%. -
Verifique os logs do pod para observar o comportamento de limitação:
kubectl logs cuda-sample-m**** -fSaída esperada:
[CUDA Bandwidth Test] - Starting... Running on... Device 0: Tesla V100-SXM2-16GB Quick Mode time: 2021-12-16/02:50:59,count: 0,memSize: 32000000,succeed to copy data from host to gpu time: 2021-12-16/02:51:01,count: 1,memSize: 32000000,succeed to copy data from host to gpu time: 2021-12-16/02:51:02,count: 2,memSize: 32000000,succeed to copy data from host to gpu time: 2021-12-16/02:51:03,count: 3,memSize: 32000000,succeed to copy data from host to gpuAs entradas de log aparecem em uma taxa menor em comparação com um pod sem restrições de poder de computação, o que confirma que o limite de 30% está em vigor.
-
(Opcional) Exclua o job após a verificação:
kubectl delete job cuda-sample