Utilize as Custom Metrics do Kubernetes e o Managed Service for Prometheus para coletar métricas de GPU e dimensionar containers automaticamente com o HPA.Managed Service for Prometheus e use HPA para dimensionar os containers automaticamente.
Pré-requisitos
Um nó de GPU foi adicionado ao seu cluster ou um cluster dedicado de GPU foi criado.
Como funciona
As GPUs aceleram a computação em cenários como treinamento e inferência de modelos de deep learning. O dimensionamento automático baseado em métricas de GPU, como utilização e memória, ajuda a otimizar custos.
O Horizontal Pod Autoscaler (HPA) do Kubernetes utiliza métricas de CPU e memória por padrão. Para métricas de GPU, o Prometheus Adapter busca dados no Managed Service for Prometheus e os expõe por meio da Custom Metrics API. Em seguida, o HPA dimensiona as cargas de trabalho com base na utilização da GPU, uso de memória e outros indicadores. O diagrama a seguir ilustra o processo.
Etapa 1: Implantar o Prometheus e o adaptador de métricas
-
Ative o monitoramento do Prometheus para o seu cluster.
NotaPule esta etapa se o Prometheus já tiver sido instalado durante a criação do cluster.
Na página Clusters, clique em nome do seu cluster. No painel de navegação à esquerda, clique em .
Na página Clusters, clique em nome do seu cluster. No painel de navegação à esquerda, clique em .
No painel de navegação à esquerda, escolha .
-
Instale e configure o ack-alibaba-cloud-metrics-adapter.
1. Obter a URL da API HTTP
Faça login no console do ARMS.
Selecione a região do seu cluster ACK. Clique em instância desejada.
Na página Settings, na aba Settings, copie o endereço de rede interna do campo HTTP API Address (Grafana Read Address).
2. Configurar a URL do Prometheus
Faça login no console do ACK. No painel de navegação à esquerda, clique em .
Na página Marketplace, clique em aba App Catalog. Pesquise por ack-alibaba-cloud-metrics-adapter e clique em ele.
Na página do ack-alibaba-cloud-metrics-adapter, clique em Deploy.
No assistente de Basic Information, selecione seu cluster e namespace. Clique em Next.
No assistente de Parameters, selecione uma Chart Version. Na seção Parameters, defina o parâmetro
urlcomo a URL da API HTTP copiada. Clique em OK.
Etapa 2: Configure regras do adaptador
1. Visualize métricas de GPU
Para ver as métricas de GPU disponíveis, consulte Descrições das métricas de monitoramento.
2. Configure regras do adaptador
Faça login no console do ACK. No painel de navegação à esquerda, clique em Clusters.
-
Na lista do Helm, localize o ack-alibaba-cloud-metrics-adapter. Na coluna Actions, clique em Update. Adicione as seguintes
rulesao campocustom.Configuração completa após adicionar as regras:
Chart Url https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/ack-alibaba-cloud-metrics-adapter-1.3.2.tgz adapter: rules: custom: - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>) name: as: ${1}_bytes_per_second matches: ^(.*)_bytes resources: overrides: namespace: resource: namespace pod: resource: pod seriesQuery: container_memory_working_set_bytes{namespace!="",pod!=""} - metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[1m])) by (<<.GroupBy>>) name: as: ${1}_core_per_second matches: ^(.*)_seconds_total resources: overrides: namespace: resource: namespace pod: resource: pod seriesQuery: container_cpu_usage_seconds_total{namespace!="",pod!=""} - metricsQuery: <<.Series>>{<<.LabelMatchers>>} resources: overrides: NodeName: resource: node seriesQuery: DCGM_FI_DEV_GPU_UTIL{} # GPU utilization. - metricsQuery: <<.Series>>{<<.LabelMatchers>>} resources: overrides: NamespaceName: resource: namespace NodeName: resource: node PodName: resource: pod seriesQuery: DCGM_CUSTOM_PROCESS_SM_UTIL{} # Container GPU utilization. - metricsQuery: <<.Series>>{<<.LabelMatchers>>} resources: overrides: NodeName: resource: node seriesQuery: DCGM_FI_DEV_FB_USED{} # GPU memory usage. - metricsQuery: <<.Series>>{<<.LabelMatchers>>} resources: overrides: NamespaceName: resource: namespace NodeName: resource: node PodName: resource: pod seriesQuery: DCGM_CUSTOM_PROCESS_MEM_USED{} # Container GPU memory usage. - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>})by(<<.GroupBy>>) / sum(DCGM_CUSTOM_CONTAINER_MEM_ALLOCATED{})by(<<.GroupBy>>) name: as: ${1}_GPU_MEM_USED_RATIO matches: ^(.*)_MEM_USED resources: overrides: NamespaceName: resource: namespace PodName: resource: pod seriesQuery: DCGM_CUSTOM_PROCESS_MEM_USED{NamespaceName!="",PodName!=""} # Container GPU memory utilization. default: false enabled: true logLevel: 5Verifique a configuração. A saída deve conter métricas como
DCGM_FI_DEV_GPU_UTIL,DCGM_CUSTOM_PROCESS_SM_UTIL,DCGM_FI_DEV_FB_USEDeDCGM_CUSTOM_PROCESS_MEM_USED. O exemplo a seguir destacaDCGM_CUSTOM_PROCESS_SM_UTIL; sua saída real pode variar.
Etapa 3: Implementar o dimensionamento automático
Teste o dimensionamento automático implantando um serviço de inferência de GPU, executando um teste de estresse e observando o comportamento de dimensionamento baseado em GPU.
1. Implantar o serviço de inferência
-
Implante o serviço de inferência.
-
Verifique o status do Pod e do Service.
-
Verifique o status do Pod.
kubectl get pods -o wideSaída esperada:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES bert-intent-detection-7b486f6bf-f**** 1/1 Running 0 3m24s 10.15.1.17 cn-beijing.192.168.94.107 <none> <none>Um Pod está implantado no nó de GPU 192.168.94.107.
-
Verifique o status do Service.
kubectl get svc bert-intent-detection-svcSaída esperada:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE bert-intent-detection-svc LoadBalancer 172.16.186.159 47.95.XX.XX 80:30118/TCP 5m1sA saída exibe o nome do serviço, confirmando que o Service foi implantado com sucesso.
-
-
Acesse o nó de GPU 192.168.94.107 via SSH e verifique o uso da GPU.
nvidia-smiSaída esperada:
Wed Feb 16 11:48:07 2022 +-----------------------------------------------------------------------------+ | 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:07.0 Off | 0 | | N/A 32C P0 55W / 300W | 15345MiB / 16160MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | 0 N/A N/A 2305118 C python 15343MiB | +-----------------------------------------------------------------------------+A saída mostra o serviço de inferência em execução na GPU. A utilização da GPU é de 0% porque nenhuma requisição foi recebida ainda.
-
Valide a implantação do serviço de inferência.
curl -v "http://47.95.XX.XX/predict?query=Music"Saída esperada:
* Trying 47.95.XX.XX... * TCP_NODELAY set * Connected to 47.95.XX.XX (47.95.XX.XX) port 80 (#0) > GET /predict?query=Music HTTP/1.1 > Host: 47.95.XX.XX > User-Agent: curl/7.64.1 > Accept: */* > * HTTP 1.0, assume close after body < HTTP/1.0 200 OK < Content-Type: text/html; charset=utf-8 < Content-Length: 9 < Server: Werkzeug/1.0.1 Python/3.6.9 < Date: Wed, 16 Feb 2022 03:52:11 GMT < * Closing connection 0 PlayMusic # Intent recognition result.Um código de status 200 com um resultado de reconhecimento de intenção confirma a implantação bem-sucedida.
2. Configure o HPA
Este exemplo aciona o scale-out quando a utilização da GPU do Pod ultrapassa 20%. A tabela a seguir lista as métricas suportadas pelo HPA.
|
Métrica |
Descrição |
Unidade |
|
DCGM_FI_DEV_GPU_UTIL |
|
% |
|
DCGM_FI_DEV_FB_USED |
|
MiB |
|
DCGM_CUSTOM_PROCESS_SM_UTIL |
Utilização da GPU pelo container. |
% |
|
DCGM_CUSTOM_PROCESS_MEM_USED |
Uso de memória da GPU pelo container. |
MiB |
|
DCGM_CUSTOM_PROCESS_GPU_MEM_USED_RATIO |
Taxa de utilização de memória da GPU pelo container.
|
% |
-
Implante o HPA.
Versão do cluster ≥ 1.23
cat <<EOF | kubectl create -f - apiVersion: autoscaling/v2 # Use the autoscaling/v2 HPA configuration. kind: HorizontalPodAutoscaler metadata: name: gpu-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: bert-intent-detection minReplicas: 1 maxReplicas: 10 metrics: - type: Pods pods: metric: name: DCGM_CUSTOM_PROCESS_SM_UTIL target: type: Utilization averageValue: 20 # Triggers a scale-out when the container's GPU utilization exceeds 20%. EOFVersão do cluster < 1.23
cat <<EOF | kubectl create -f - apiVersion: autoscaling/v2beta1 # Use the autoscaling/v2beta1 HPA configuration. kind: HorizontalPodAutoscaler metadata: name: gpu-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: bert-intent-detection minReplicas: 1 maxReplicas: 10 metrics: - type: Pods pods: metricName: DCGM_CUSTOM_PROCESS_SM_UTIL # GPU utilization of the Pod. targetAverageValue: 20 # Triggers a scale-out when the container's GPU utilization exceeds 20%. EOF -
Verifique o status do HPA.
kubectl get hpaSaída esperada:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE gpu-hpa Deployment/bert-intent-detection 0/20 1 10 1 74sTARGETSexibe0/20, indicando que a utilização atual da GPU é 0. O dimensionamento automático é acionado quando a utilização excede 20%.
3. Testar o dimensionamento automático
Testar scale-out
-
Execute um teste de estresse.
hey -n 10000 -c 200 "http://47.95.XX.XX/predict?query=music"NotaO HPA calcula as réplicas desejadas com:
Desired Replicas = ceil[Current Replicas * (Current Metric / Desired Metric)]. Por exemplo, com 1 réplica, valor da métrica 23 e alvo 20, o resultado é 2 réplicas. -
Durante o teste de estresse, observe o status do HPA e dos Pods.
-
Verifique o status do HPA.
kubectl get hpaSaída esperada:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE gpu-hpa Deployment/bert-intent-detection 23/20 1 10 2 7m56sTARGETSexibe23/20. A utilização da GPU excedeu a meta de 20%, acionando o scale-out. -
Verifique o status do Pod.
kubectl get podsSaída esperada:
NAME READY STATUS RESTARTS AGE bert-intent-detection-7b486f6bf-f**** 1/1 Running 0 44m bert-intent-detection-7b486f6bf-m**** 1/1 Running 0 14sDois Pods estão em execução, correspondendo ao alvo de 2.
Scale-out confirmado.
-
Testar scale-in
Após o término do teste de estresse, a utilização da GPU cai abaixo de 20% e o scale-in começa.
-
Verifique o status do HPA.
kubectl get hpaSaída esperada:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE gpu-hpa Deployment/bert-intent-detection 0/20 1 10 1 15mTARGETSexibe0/20, indicando que a utilização da GPU é 0. Após cerca de 5 minutos, o scale-in começa. -
Verifique o status do Pod.
kubectl get podsSaída esperada:
NAME READY STATUS RESTARTS AGE bert-intent-detection-7b486f6bf-f**** 1/1 Running 0 52mApenas um Pod permanece, confirmando o scale-in.
FAQ
Como verificar o uso da GPU?
Na aba GPU Monitoring, observe as tendências de utilização da GPU: uma tendência crescente indica uma placa ativa, enquanto uma tendência plana significa ociosidade. Para visualizar a tendência:
Faça login no console do ACK. No painel de navegação à esquerda, clique em Clusters.
Na página Prometheus Monitoring, clique em aba GPU Monitoring.