O Container Service for Kubernetes (ACK) permite instalar o plug-in gerenciado do Prometheus para monitorar recursos de GPU. A solução cGPU possibilita agendar várias aplicações em uma única GPU e isolar a memória e o poder de computação alocados a cada aplicação. Este tópico descreve como monitorar o uso de memória da GPU de um cluster com o plug-in gerenciado do Prometheus e como isolar a memória da GPU com o cGPU.
Cenários
Este tópico aplica-se a clusters Kubernetes dedicados e profissionais com o cGPU ativado.
Pré-requisitos
Crie um cluster Kubernetes dedicado com nós acelerados por GPU. A versão do Kubernetes deve ser 1.16 ou posterior. Para mais informações, consulte Criar um cluster dedicado ACK com nós acelerados por GPU.
Ative o Application Real-Time Monitoring Service (ARMS). Para mais informações, consulte Ativar o ARMS.
O Managed Service for Prometheus deve estar habilitado para o cluster. Para mais informações, consulte Habilitar o monitoramento do Prometheus.
O modelo da GPU deve ser Tesla P4, Tesla P100, Tesla T4 ou Tesla V100 (16 GB).
Informações básicas
O desenvolvimento de IA depende de alto poder de computação, grandes volumes de dados e algoritmos otimizados. As GPUs da NVIDIA oferecem técnicas comuns de computação heterogênea, base do aprendizado profundo de alto desempenho. Como o custo das GPUs é elevado, destinar uma GPU exclusiva para cada aplicação em cenários de previsão de modelos pode desperdiçar recursos de computação. O compartilhamento de GPU melhora a utilização dos recursos. É fundamental planejar como obter a maior taxa de consultas com o menor custo possível e garantir o cumprimento do acordo de nível de serviço (SLA) da aplicação.
Use o plug-in gerenciado do Prometheus para monitorar GPUs dedicadas
Faça login no console do ARMS.
No painel de navegação à esquerda, clique em Prometheus Monitoring.
Na página Prometheus Monitoring, selecione a região onde o cluster está implantado e clique em Install na coluna Actions.
-
Na mensagem de Confirmation, clique em OK.
A instalação do plug-in do Prometheus leva cerca de 2 minutos. Após a conclusão, ele aparecerá na coluna
Installed Dashboards
.
-
Implante a aplicação de exemplo abaixo via CLI. Para mais informações, consulte Criar uma carga de trabalho sem estado (Deployment).
apiVersion: apps/v1 kind: StatefulSet metadata: name: app-3g-v1 labels: app: app-3g-v1 spec: replicas: 1 serviceName: "app-3g-v1" podManagementPolicy: "Parallel" selector: # define how the deployment finds the pods it manages matchLabels: app: app-3g-v1 updateStrategy: type: RollingUpdate template: # define the pods specifications metadata: labels: app: app-3g-v1 spec: containers: - name: app-3g-v1 image: registry.cn-hangzhou.aliyuncs.com/ai-samples/gpushare-sample:tensorflow-1.5 command: - cuda_malloc - -size=4096 resources: limits: nvidia.com/gpu: 1Após implantar a aplicação, execute o comando abaixo para consultar seu status. A saída indica que o nome da aplicação é app-3g-v1-0.
kubectl get podSaída esperada:
NAME READY STATUS RESTARTS AGE app-3g-v1-0 1/1 Running 1 2m56s -
Localize e clique no cluster onde a aplicação está implantada. Na página Dashboards, clique em GPU APP na coluna Name.
A figura a seguir mostra que a aplicação utiliza apenas 20% da memória da GPU, indicando desperdício de 80%. A memória total da GPU é de aproximadamente 16 GB, mas o uso se estabiliza em cerca de 3,4 GB. Alocar uma GPU inteira para cada aplicação resulta em grande desperdício de recursos. Para melhorar a utilização, use o cGPU e compartilhe uma única GPU entre várias aplicações.

Compartilhe uma GPU entre vários contêineres
-
Adicione rótulos aos nós acelerados por GPU.
Faça login no Console de Gerenciamento do Container Service.
No painel de navegação à esquerda, clique em Cluster.
Na página Cluster List, clique no nome do cluster desejado ou em Application Management na coluna Actions.
No painel de navegação à esquerda da página de gerenciamento do cluster, escolha .
Na página Nodes, clique em Manage Labels and Taints no canto superior direito.
Na página Manage Labels and Taints, selecione os nós que deseja gerenciar e clique em Add Label.
-
Na caixa de diálogo Add, defina Name como cgpu, defina Value como true e clique em OK.
ImportanteSe um nó worker receber o rótulo
cgpu=true
, o recurso de GPU
nvidia.com/gpu
deixará de ser exclusivo para os pods nesse nó worker. Para desativar o cGPU no nó worker, defina o valor de
cgpu
como
false
. Isso torna o recurso de GPU
nvidia.com/gpu
exclusivo novamente para os pods no nó worker.
-
Instale o componente cGPU.
Faça login no Console de Gerenciamento do Container Service.
No painel de navegação à esquerda, escolha .
Na página App Catalog, pesquise por ack-cgpu e clique nele quando aparecer.
Na seção Deploy, no lado direito da página, selecione o cluster criado, escolha o namespace onde deseja implantar o ack-cgpu e clique em Create.
-
Faça login em um nó mestre e execute o comando abaixo para consultar os recursos de GPU.
Para mais informações, consulte Conectar-se a um cluster ACK usando kubectl.
kubectl inspect cgpuSaída esperada:
NAME IPADDRESS GPU0(Allocated/Total) GPU Memory(GiB) cn-hangzhou.192.168.2.167 192.168.2.167 0/15 0/15 ---------------------------------------------------------------------- Allocated/Total GPU Memory In Cluster: 0/15 (0%)NotaA saída indica que os recursos de GPU foram alternados de unidades de GPU para memória de GPU.
-
Implante cargas de trabalho que compartilhem recursos de GPU.
-
Modifique o arquivo YAML usado para implantar a aplicação de exemplo.
Altere o número de réplicas de pods de 1 para 2. Isso permite implantar dois pods para executar a aplicação. Antes de ativar o cGPU, a GPU era exclusiva para o único pod. Após ativar o cGPU, a GPU passa a ser compartilhada entre dois pods.
Substitua o tipo de recurso de
nvidia.com/gpuparaaliyun.com/gpu-mem. A unidade dos recursos de GPU passa a ser GB.
apiVersion: apps/v1 kind: StatefulSet metadata: name: app-3g-v1 labels: app: app-3g-v1 spec: replicas: 2 serviceName: "app-3g-v1" podManagementPolicy: "Parallel" selector: # define how the deployment finds the pods it manages matchLabels: app: app-3g-v1 template: # define the pods specifications metadata: labels: app: app-3g-v1 spec: containers: - name: app-3g-v1 image: registry.cn-hangzhou.aliyuncs.com/ai-samples/gpushare-sample:tensorflow-1.5 command: - cuda_malloc - -size=4096 resources: limits: aliyun.com/gpu-mem: 4 # Each pod requests 4 GB of GPU memory. Two replicated pods are configured. Therefore, a total of 8 GB of GPU memory is requested by the application. -
Recrie as cargas de trabalho com base nas configurações modificadas.
A saída indica que os dois pods foram agendados no mesmo nó acelerado por GPU.
kubectl inspect cgpu -dSaída esperada:
NAME: cn-hangzhou.192.168.2.167 IPADDRESS: 192.168.2.167 NAME NAMESPACE GPU0(Allocated) app-3g-v1-0 default 4 app-3g-v1-1 default 4 Allocated : 8 (53%) Total : 15 -------------------------------------------------------- Allocated/Total GPU Memory In Cluster: 8/15 (53%) -
Execute o comando abaixo para fazer login nos dois contêineres, um por vez.
A saída mostra que o limite de memória da GPU é de 4.301 MiB, ou seja, cada contêiner pode usar no máximo 4.301 MiB de memória da GPU.
-
Execute o comando a seguir para fazer login no contêiner app-3g-v1-0:
kubectl exec -it app-3g-v1-0 nvidia-smiSaída esperada:
Mon Apr 13 01:33:10 2020 +-----------------------------------------------------------------------------+ | 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 V100-SXM2... On | 00000000:00:07.0 Off | 0 | | N/A 37C P0 57W / 300W | 3193MiB / 4301MiB | 0% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| +-----------------------------------------------------------------------------+ -
Execute o comando a seguir para fazer login no contêiner app-3g-v1-1:
kubectl exec -it app-3g-v1-1 nvidia-smiSaída esperada:
Mon Apr 13 01:36:07 2020 +-----------------------------------------------------------------------------+ | 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 V100-SXM2... On | 00000000:00:07.0 Off | 0 | | N/A 38C P0 57W / 300W | 3193MiB / 4301MiB | 0% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| +-----------------------------------------------------------------------------+
-
-
Faça login no nó acelerado por GPU para verificar o uso da GPU.
A saída indica que o uso total de memória da GPU é de 6.396 MiB, correspondente à soma da memória usada pelos dois contêineres. Isso demonstra que o cGPU isolou a memória da GPU entre os contêineres. Se você fizer login em um contêiner e solicitar mais recursos de GPU, um erro de alocação de memória será relatado.
-
Execute o comando abaixo para fazer login em um nó acelerado por GPU:
kubectl exec -it app-3g-v1-1 bash -
Execute o comando a seguir para consultar o uso da GPU:
cuda_malloc -size=1024Saída esperada:
gpu_cuda_malloc starting... Detected 1 CUDA Capable device(s) Device 0: "Tesla V100-SXM2-16GB" CUDA Driver Version / Runtime Version 10.1 / 10.1 Total amount of global memory: 4301 MBytes (4509925376 bytes) Try to malloc 1024 MBytes memory on GPU 0 CUDA error at cgpu_cuda_malloc.cu:119 code=2(cudaErrorMemoryAllocation) "cudaMalloc( (void**)&dev_c, malloc_size)"
-
-
É possível monitorar o uso de GPU de cada aplicação ou nó no
ou no
.
-
GPU APP: Visualize a quantidade e a porcentagem de memória da GPU utilizada por cada aplicação.

-
GPU Node: Acompanhe o uso de memória de cada GPU individualmente.

Use o plug-in gerenciado do Prometheus para monitorar o compartilhamento de GPU
Caso a quantidade de memória da GPU solicitada por uma aplicação exceda o limite superior, o módulo de isolamento de memória do cGPU impede que outras aplicações sejam afetadas.
-
Implante uma nova aplicação que utilize a GPU compartilhada.
A aplicação solicita 4 GB de memória da GPU, mas o uso real de memória chega a 6 GB.
apiVersion: apps/v1 kind: StatefulSet metadata: name: app-6g-v1 labels: app: app-6g-v1 spec: replicas: 1 serviceName: "app-6g-v1" podManagementPolicy: "Parallel" selector: # define how the deployment finds the pods it manages matchLabels: app: app-6g-v1 template: # define the pods specifications metadata: labels: app: app-6g-v1 spec: containers: - name: app-6g-v1 image: registry.cn-shanghai.aliyuncs.com/tensorflow-samples/cuda-malloc:6G resources: limits: aliyun.com/gpu-mem: 4 # Each pod requests 4 GB of GPU memory. One replicated pod is configured for the application. Therefore, a total of 4 GB of GPU memory is requested by the application. -
Execute o comando abaixo para consultar o status do pod.
O pod que executa a nova aplicação permanece no estado
CrashLoopBackOff
. Os dois pods existentes continuam funcionando normalmente.
kubectl get podSaída esperada:
NAME READY STATUS RESTARTS AGE app-3g-v1-0 1/1 Running 0 7h35m app-3g-v1-1 1/1 Running 0 7h35m app-6g-v1-0 0/1 CrashLoopBackOff 5 3m15s -
Execute o comando a seguir para verificar erros no log do contêiner.
A saída indica que ocorreu um erro cudaErrorMemoryAllocation.
kubectl logs app-6g-v1-0Saída esperada:
CUDA error at cgpu_cuda_malloc.cu:119 code=2(cudaErrorMemoryAllocation) "cudaMalloc( (void**)&dev_c, malloc_size)" -
Utilize o painel GPU APP fornecido pelo plug-in gerenciado do Prometheus para visualizar o status dos contêineres.
A figura a seguir mostra que os contêineres existentes não foram afetados após a implantação da nova aplicação.
