Utilice Kubernetes Custom Metrics y Managed Service for Prometheus para recopilar métricas de GPU y escalar automáticamente los contenedores con HPA .
Requisitos previos
Un GPU node is added to your cluster o un dedicated GPU cluster is created.
Cómo funciona
Las GPU aceleran la computación en escenarios como el entrenamiento de modelos de aprendizaje profundo y la inference. El escalamiento automático basado en métricas de GPU, como la utilización y la memoria, ayuda a optimizar los costos.
Kubernetes Horizontal Pod Autoscaler (HPA) usa las métricas de CPU y memoria de forma predeterminada. Para las métricas de GPU, Prometheus Adapter obtiene los datos de Managed Service for Prometheus y los expone mediante la Custom Metrics API. Después, HPA escala las cargas de trabajo según la utilización de GPU, el uso de memoria y otros indicadores. A continuación se muestra un diagrama que ilustra el proceso.
Paso 1: Desplegar Prometheus y el adaptador de métricas
-
Enable Prometheus monitoring para su clúster.
NotaOmita este paso si instaló Prometheus durante la creación del clúster.
En la página Clusters, haga clic en el nombre de su clúster. En el panel de navegación izquierdo, haga clic en .
En la página Clusters, haga clic en el nombre de su clúster. En el panel de navegación izquierdo, haga clic en .
En el panel de navegación izquierdo, elija .
-
Instale y configure ack-alibaba-cloud-metrics-adapter.
1. Obtener la URL de la API HTTP
Inicie sesión en la consola de ARMS.
Seleccione la región de su clúster de ACK. Haga clic en la instancia de destino.
En la página Settings, dentro de la pestaña Settings, copie la dirección de red interna del campo HTTP API Address (Grafana Read Address).
2. Configurar la URL de Prometheus
Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, haga clic en .
En la página Marketplace, haga clic en la pestaña App Catalog. Busque ack-alibaba-cloud-metrics-adapter y haga clic en esta opción.
En la página ack-alibaba-cloud-metrics-adapter, haga clic en Deploy.
En el asistente Basic Information, seleccione su clúster y espacio de nombres. Haga clic en Next.
En el asistente Parameters, seleccione una Chart Version. En la sección Parameters, establezca el parámetro
urlcon la URL de la API HTTP que copió. Haga clic en OK.
Paso 2: Configurar las reglas del adaptador
1. Consultar las métricas de GPU
Para conocer las métricas de GPU disponibles, consulte Monitoring metric descriptions.
2. Configurar las reglas del adaptador
Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, haga clic en Clusters.
-
En la lista de Helm, busque ack-alibaba-cloud-metrics-adapter. En la columna Actions, haga clic en Update. Agregue las siguientes
rulesal campocustom.Configuración completa después de agregar las reglas:
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: 5Compruebe la configuración. La salida debe incluir métricas como
DCGM_FI_DEV_GPU_UTIL,DCGM_CUSTOM_PROCESS_SM_UTIL,DCGM_FI_DEV_FB_USEDyDCGM_CUSTOM_PROCESS_MEM_USED. El siguiente ejemplo resaltaDCGM_CUSTOM_PROCESS_SM_UTIL; su salida real puede variar.
Paso 3: Implementar el escalamiento automático
Pruebe el escalamiento automático mediante el despliegue de un servicio de inference de GPU, la ejecución de una prueba de estrés y la observación del comportamiento de escalamiento basado en GPU.
1. Desplegar el servicio de inference
-
Despliegue el servicio de inference.
-
Compruebe el estado del Pod y del Service.
-
Compruebe el estado del Pod.
kubectl get pods -o wideSalida 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>Se desplegó un Pod en el nodo de GPU 192.168.94.107.
-
Compruebe el estado del Service.
kubectl get svc bert-intent-detection-svcSalida 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 5m1sLa salida muestra el nombre del servicio, lo que confirma que el Service se desplegó correctamente.
-
-
Inicie sesión en el nodo de GPU 192.168.94.107 mediante SSH y compruebe el uso de la GPU.
nvidia-smiSalida 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 | +-----------------------------------------------------------------------------+La salida muestra el servicio de inference ejecutándose en la GPU. La utilización de la GPU es del 0 % porque aún no se han recibido solicitudes.
-
Compruebe el despliegue del servicio de inference.
curl -v "http://47.95.XX.XX/predict?query=Music"Salida 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.Un código de estado 200 con un resultado de reconocimiento de intención confirma que el despliegue se completó correctamente.
2. Configurar el HPA
Este ejemplo activa el escalado horizontal cuando la utilización de GPU del Pod supera el 20 %. La siguiente tabla muestra las métricas compatibles con HPA.
|
Métrica |
Descripción |
Unidad |
|
DCGM_FI_DEV_GPU_UTIL |
|
% |
|
DCGM_FI_DEV_FB_USED |
|
MiB |
|
DCGM_CUSTOM_PROCESS_SM_UTIL |
Utilización de GPU del contenedor. |
% |
|
DCGM_CUSTOM_PROCESS_MEM_USED |
Uso de memoria de GPU del contenedor. |
MiB |
|
DCGM_CUSTOM_PROCESS_GPU_MEM_USED_RATIO |
Utilización de memoria de GPU del contenedor.
|
% |
-
Despliegue el HPA.
Versión del clúster ≥ 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%. EOFVersión del clúster < 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 -
Compruebe el estado del HPA.
kubectl get hpaSalida esperada:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE gpu-hpa Deployment/bert-intent-detection 0/20 1 10 1 74sTARGETSmuestra0/20, lo que significa que la utilización actual de GPU es 0. El escalamiento automático se activa cuando la utilización supera 20.
3. Probar el escalamiento automático
Probar el escalado horizontal
-
Ejecute una prueba de estrés.
hey -n 10000 -c 200 "http://47.95.XX.XX/predict?query=music"NotaHPA calcula las réplicas deseadas con la fórmula:
Desired Replicas = ceil[Current Replicas * (Current Metric / Desired Metric)]. Por ejemplo, con 1 réplica, un valor de métrica de 23 y un objetivo de 20, el resultado es 2 réplicas. -
Durante la prueba de estrés, observe el estado del HPA y de los Pods.
-
Compruebe el estado del HPA.
kubectl get hpaSalida esperada:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE gpu-hpa Deployment/bert-intent-detection 23/20 1 10 2 7m56sTARGETSmuestra23/20. La utilización de GPU supera el objetivo del 20 %, lo que activa el escalado horizontal. -
Compruebe el estado de los Pods.
kubectl get podsSalida 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 14sHay dos Pods ejecutándose, lo que coincide con el objetivo de 2.
El escalado horizontal queda confirmado.
-
Probar el reescalado horizontal
Cuando la prueba de estrés se detiene, la utilización de GPU baja del 20 % y comienza el reescalado horizontal.
-
Compruebe el estado del HPA.
kubectl get hpaSalida esperada:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE gpu-hpa Deployment/bert-intent-detection 0/20 1 10 1 15mTARGETSmuestra0/20, lo que significa que la utilización de GPU es 0. Después de unos 5 minutos, comienza el reescalado horizontal. -
Compruebe el estado de los Pods.
kubectl get podsSalida esperada:
NAME READY STATUS RESTARTS AGE bert-intent-detection-7b486f6bf-f**** 1/1 Running 0 52mSolo queda un Pod, lo que confirma el reescalado horizontal.
Preguntas frecuentes
¿Cómo comprobar el uso de la GPU?
En la pestaña GPU Monitoring, observe las tendencias de utilización de GPU: una tendencia ascendente indica que la tarjeta está activa, mientras que una línea plana significa que está inactiva. Para consultar la tendencia, siga estos pasos:
Inicie sesión en la consola de ACK. En el panel de navegación izquierdo, haga clic en Clusters.
En la página Prometheus Monitoring, haga clic en la pestaña GPU Monitoring.