Mise en place de l'autoscaling horizontal des pods sur les nœuds de travail GPU

Passez en revue les étapes suivantes pour activer l'autoscaling horizontal des pods sur vos nœuds de travail GPU.

Pourquoi une mise à l'échelle horizontale des pods?
Vous pouvez configurer l'autoscaling horizontal des pods afin d'adapter le nombre de pods lorsque la charge de travail consomme plus ou moins d'une certaine quantité de GPU. Les GPU étant une ressource coûteuse, il n'est pas souhaitable que les charges de travail soient exécutées au maximum de leur capacité pendant de longues périodes. Au lieu de cela, vous pouvez faire évoluer les pods ou les faire monter ou descendre en fonction de la charge de travail en cours dans le cluster.

Prérequis

Pour configurer HPA, les composants suivants doivent être installés sur votre cluster.

  • NVIDIA Data Center GPU Manager (DCGM) exporter pour rassembler les métriques GPU dans Kubernetes. L'exportateur DCGM expose les métriques GPU pour Prometheus qui peuvent être visualisées à l'aide de Grafana.
  • Prometheus et l'adaptateur Prometheus pour générer des mesures personnalisées.
  1. Installer le GPU Operator NVIDIA

  2. Installer 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. Obtenez les détails du service Prometheus.

    oc get svc
    
  4. Installez l'adaptateur « Prometheus ».

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

Mise en place de l'APH

Effectuez les étapes suivantes pour créer un déploiement qui utilise HPA.

  1. Créez un déploiement.

    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. Créer une ressource « 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. Exécutez les commandes suivantes pour consulter les résultats.

    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
    

    Il y avait une réplique qui a été portée à trois au fur et à mesure que la charge de travail augmentait.

    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