Configuração do dimensionamento automático de pod horizontal em nós de trabalho da GPU

Analise as etapas a seguir para ativar o dimensionamento automático de pod horizontal nos nós de trabalho da GPU.

Por que a autoescala horizontal de pods?
Talvez você queira configurar o dimensionamento automático de pod horizontal para dimensionar o número de pods quando a carga de trabalho consumir mais ou menos do que uma determinada quantidade de GPU. Como as GPUs são um recurso caro, talvez você não queira que as cargas de trabalho sejam executadas na capacidade máxima por longos períodos de tempo. Em vez disso, você pode escalonar ou reduzir pods com base na carga de trabalho em execução no cluster.

Pré-requisitos

Para configurar o HPA, os seguintes componentes devem ser instalados em seu cluster.

  • NVIDIA Exportador do Data Center GPU Manager (DCGM) para reunir métricas de GPU em Kubernetes. O exportador DCGM expõe as métricas de GPU para Prometheus, que podem ser visualizadas usando Grafana.
  • Prometheus e o adaptador Prometheus para gerar métricas personalizadas.
  1. Instale o operador de GPU NVIDIA

  2. Instale o site Prometheus.

    helm install prom-stack prometheus-community/kube-prometheus-stack -f ~/ca-prom-val.yaml
    
    cat ~/ca-prom-val.yaml
    
    prometheus:
        prometheusSpec:
            additionalScrapeConfigs:
            - job_name: gpu-metrics
                scrape_interval: 1s
                metrics_path: /metrics
                scheme: http
                kubernetes_sd_configs:
                - role: endpoints
                    namespaces:
                        names:
                        - nvidia-gpu-operator
                relabel_configs:
                - source_labels: [__meta_kubernetes_endpoints_name]
                    action: drop
                    regex: .*-node-feature-discovery-master
                - source_labels: [__meta_kubernetes_pod_node_name]
                    action: replace
                    target_label: kubernetes_node
    
  3. Obtenha os detalhes do serviço Prometheus.

    oc get svc
    
  4. Instale o adaptador “ Prometheus ”.

    helm upgrade --install prometheus-adapter prometheus-community/prometheus-adapter --set prometheus.url="http://prom-stack-kube-prometheus-prometheus.default.svc.cluster.local"
    

Configuração do HPA

Conclua as etapas a seguir para criar uma implantação que use o HPA.

  1. Crie uma implementação.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
        name: cuda-test
        labels:
            app: cuda-test
    spec:
        selector:
            matchLabels:
                app: cuda-test
        template:
            metadata:
                labels:
                    app: cuda-test
            spec:
                containers:
                - name: cuda-test-main
                    image: "registry.k8s.io/cuda-vector-add:v0.1"
                    command: ["bash", "-c", "for (( c=1; c<=5000; c++ )); do ./vectorAdd; done"]
                    resources:
                        limits:
                            nvidia.com/gpu: 1
    
  2. Crie um recurso do tipo “ HorizontalPodAutoscaler ”.

    kind: HorizontalPodAutoscaler
    apiVersion: autoscaling/v2
    metadata:
        name: cuda-hpa
        namespace: default
    spec:
        scaleTargetRef:
            apiVersion: apps/v1
            kind: Deployment
            name: cuda-test
        minReplicas: 1
        maxReplicas: 3
        metrics:
            - type: Pods
                pods:
                    metric:
                        name: DCGM_FI_DEV_GPU_UTIL     #the metric you want to use for autoscaling
                    target:
                        type: AverageValue
                        averageValue: '5'
    
  3. Execute os comandos a seguir para analisar os resultados.

    oc get pods | grep cuda
    
    cuda-test-d987464bf-brd48                                1/1     Running   0          4m19s
    cuda-test-d987464bf-gsx82                                0/1     Pending   0          4m19s
    cuda-test-d987464bf-zstzs                                1/1     Running   0          7m35s
    

    Havia uma réplica que foi ampliada para três à medida que o recurso de carga de trabalho aumentou.

    Min replicas:       1
    Max replicas:       3
    Deployment pods:    3 current / 3 desired
    Events:
    Type    Reason             Age   From                       Message
    ----    ------             ----  ----                       -------
    Normal  SuccessfulRescale  50s   horizontal-pod-autoscaler  New size: 3; reason: pods metric DCGM_FI_DEV_GPU_UTIL above target