For AI agents: the complete documentation index is available at https://docs.ovhcloud.com/fr/llms.txt, the full documentation bundle is available at https://docs.ovhcloud.com/fr/llms-full.txt, and this page is available as Markdown at https://docs.ovhcloud.com/fr/guides/public-cloud/containers-orchestration/managed-kubernetes/monitoring-gpu-application.md.

Surveiller l'utilisation des GPU sur OVHcloud Managed Kubernetes Service

Voir en Markdown

Découvrez comment exposer, visualiser et surveiller les métriques GPU sur OVHcloud Managed Kubernetes Service

Objectif

Ce tutoriel vous montre comment surveiller une application GPU sur un cluster OVHcloud Managed Kubernetes.

Visualisation des métriques GPU

Les GPU fournissent la puissance de calcul nécessaire pour exécuter des tâches d'IA/ML et de Deep Learning impliquant des calculs intensifs, comme la reconnaissance d'images/d'objets, le traitement du langage naturel (NLP), ainsi que d'autres tâches gourmandes en calcul telles que le transcodage vidéo et le traitement d'images. L'utilisation des GPU avec Kubernetes permet d'étendre la scalabilité de Kubernetes aux applications d'IA/ML. Il est cependant toujours important de garder à l'esprit le coût des GPU. Si chaque application utilise un GPU dédié dans des scénarios de prédiction de modèles, les ressources de calcul peuvent être gaspillées. Il est donc important de surveiller l'utilisation des GPU afin de pouvoir réagir rapidement, prendre les bonnes décisions et optimiser leur utilisation.

Avant de commencer

Ce tutoriel suppose que vous disposez déjà d'un cluster OVHcloud Managed Kubernetes fonctionnel, ainsi que de connaissances de base sur son fonctionnement. Pour en savoir plus sur ces sujets, consultez le guide Démarrer avec OVHcloud Managed Kubernetes Service.

Vous devez également avoir installé Helm sur votre poste de travail et sur votre cluster ; consultez le tutoriel Comment installer Helm sur OVHcloud Managed Kubernetes Service.

Vous devez également suivre le tutoriel Déployer une application GPU sur OVHcloud Managed Kubernetes pour installer l'opérateur GPU NVIDIA et configurer correctement votre cluster avec les composants nécessaires pour ce guide.

En pratique

Dans ce guide, vous allez :

  • installer l'opérateur Prometheus (il installera Prometheus et Grafana)
  • utiliser le Data Center GPU Manager (DCGM) de NVIDIA pour exposer les métriques GPU à Prometheus
  • déployer une application pour démontrer l'inférence accélérée par GPU et générer du trafic
  • visualiser les métriques

DCGM et DCGM Exporter

NVIDIA Data Center GPU Manager (DCGM) est un ensemble d'outils permettant de gérer et de surveiller les GPU NVIDIA dans des environnements de cluster. Il s'agit d'une suite d'outils légère qui assure diverses fonctions sur chaque système hôte, notamment la surveillance active de l'état de santé, le diagnostic, la validation du système, les politiques, la gestion de l'alimentation et de l'horloge, ainsi que la configuration et la comptabilisation des groupes.

Pour collecter la télémétrie GPU dans Kubernetes, l'opérateur GPU NVIDIA déploie dcgm-exporter, qui repose sur DCGM pour exposer les métriques GPU à Prometheus et permettre leur visualisation avec Grafana. dcgm-exporter est conçu pour tirer parti de la KubeletPodResources API et expose les métriques GPU dans un format que Prometheus peut scraper.

Comme vous avez déjà suivi le tutoriel Déployer une application GPU sur OVHcloud Managed Kubernetes, dcgm-exporter devrait déjà être en cours d'exécution dans votre cluster.

$ kubectl get pod -n gpu-operator -l app=nvidia-dcgm-exporter
NAME                         READY   STATUS    RESTARTS   AGE
nvidia-dcgm-exporter-fvn8h   1/1     Running   0          25h
nvidia-dcgm-exporter-mt5qh   1/1     Running   0          25h
nvidia-dcgm-exporter-n65kl   1/1     Running   0          25h

Opérateur Prometheus

L'opérateur Prometheus fournit un déploiement et une gestion natifs Kubernetes de Prometheus et des composants de monitoring associés.

Architecture Prometheus

L'objectif de ce projet est de simplifier et d'automatiser la configuration d'une stack de monitoring basée sur Prometheus pour les clusters Kubernetes. L'opérateur Prometheus déploie également un tableau de bord Grafana, pour visualiser vos métriques de manière conviviale.

Si l'opérateur vous intéresse, n'hésitez pas à consulter la documentation officielle de l'opérateur Prometheus.

Installer l'opérateur Prometheus

Pour ce tutoriel, nous utilisons le chart Helm de l'opérateur Prometheus disponible sur le dépôt Prometheus Community.

Ajoutez le dépôt Helm Prometheus :

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

Cela ajoutera le dépôt Prometheus et mettra à jour tous vos dépôts :

$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
"prometheus-community" has been added to your repositories

$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...
...Successfully got an update from the "prometheus-community" chart repository
...
Update Complete. ⎈Happy Helming!⎈

Vous devez modifier certains paramètres. Pour cela, vous allez inspecter le chart afin de récupérer ces valeurs dans un fichier :

helm inspect values prometheus-community/kube-prometheus-stack > /tmp/kube-prometheus-stack.values

Ouvrez le fichier /tmp/kube-prometheus-stack.values dans votre éditeur préféré.

Ensuite, dans ce fichier, recherchez additionalScrapeConfigs (la valeur doit être vide [] par défaut). Vous allez ajouter une ConfigMap à cette section.

Avant :

    additionalScrapeConfigs: []

Après :

    additionalScrapeConfigs:
    - job_name: gpu-metrics
      scrape_interval: 1s
      metrics_path: /metrics
      scheme: http
      kubernetes_sd_configs:
      - role: endpoints
        namespaces:
          names:
          - gpu-operator
      relabel_configs:
      - source_labels: [__meta_kubernetes_pod_node_name]
        action: replace
        target_label: kubernetes_node

Ne fermez pas ce fichier avant d'avoir récupéré ou modifié la clé adminPassword.

Par défaut, le mot de passe Grafana devrait ressembler à ceci :

  adminPassword: prom-operator

Copiez le mot de passe administrateur Grafana, vous l'utiliserez plus tard dans ce tutoriel.

Vous êtes maintenant prêt à installer Prometheus et Grafana.

helm install prometheus-community/kube-prometheus-stack \
--create-namespace --namespace prometheus \
--generate-name \
--values /tmp/kube-prometheus-stack.values \
--set prometheus.service.type=LoadBalancer \
--set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false \
--set grafana.service.type=LoadBalancer

Comme vous pouvez le voir, un nouveau namespace prometheus sera créé, et nous avons spécifié que nous souhaitons déployer un LoadBalancer afin d'accéder facilement à Prometheus et Grafana depuis l'extérieur.

Vous devriez obtenir un résultat similaire à celui-ci :

$ helm install prometheus-community/kube-prometheus-stack \
--create-namespace --namespace prometheus \
--generate-name \
--values /tmp/kube-prometheus-stack.values \
--set prometheus.service.type=LoadBalancer \
--set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false \
--set grafana.service.type=LoadBalancer

NAME: kube-prometheus-stack-1682576024
LAST DEPLOYED: Thu Apr 27 08:13:49 2023
NAMESPACE: prometheus
STATUS: deployed
REVISION: 1
NOTES:
kube-prometheus-stack has been installed. Check its status by running:
  kubectl --namespace prometheus get pods -l "release=kube-prometheus-stack-1682576024"

Visit https://github.com/prometheus-operator/kube-prometheus for instructions on how to create & configure Alertmanager and Prometheus instances using the Operator.

Vous pouvez également vérifier en consultant les Pods dans le nouveau namespace prometheus avec la commande kubectl get pods -n prometheus :

$ kubectl get pods -n prometheus
NAME                                                              READY   STATUS    RESTARTS      AGE
alertmanager-kube-prometheus-stack-1682-alertmanager-0            2/2     Running   1 (72s ago)   77s
kube-prometheus-stack-1682-operator-67798748b6-gc7tg              1/1     Running   0             83s
kube-prometheus-stack-1682576024-grafana-7b96cfc746-7vmkx         3/3     Running   0             83s
kube-prometheus-stack-1682576024-kube-state-metrics-6b9fcd7qx2g   1/1     Running   0             83s
kube-prometheus-stack-1682576024-prometheus-node-exporter-4ch89   1/1     Running   0             84s
kube-prometheus-stack-1682576024-prometheus-node-exporter-4zlxk   1/1     Running   0             84s
kube-prometheus-stack-1682576024-prometheus-node-exporter-hs5wc   1/1     Running   0             84s
kube-prometheus-stack-1682576024-prometheus-node-exporter-p6qp4   1/1     Running   0             84s
kube-prometheus-stack-1682576024-prometheus-node-exporter-xv4w9   1/1     Running   0             84s
prometheus-kube-prometheus-stack-1682-prometheus-0                2/2     Running   0             76s

Vous pouvez aussi vérifier que Prometheus et Grafana disposent d'une IP externe :

$ kubectl get svc -n prometheus
NAME                                                        TYPE           CLUSTER-IP     EXTERNAL-IP     PORT(S)                      AGE
alertmanager-operated                                       ClusterIP      None           `<none>`          9093/TCP,9094/TCP,9094/UDP   113s
kube-prometheus-stack-1682-alertmanager                     ClusterIP      10.3.76.157    `<none>`          9093/TCP                     2m
kube-prometheus-stack-1682-operator                         ClusterIP      10.3.161.190   `<none>`          443/TCP                      2m
kube-prometheus-stack-1682-prometheus                       LoadBalancer   10.3.219.94    xx.xxx.xx.xx    9090:31176/TCP               2m
kube-prometheus-stack-1682576024-grafana                    LoadBalancer   10.3.17.251    xx.xxx.xxx.xx   80:31358/TCP                 2m
kube-prometheus-stack-1682576024-kube-state-metrics         ClusterIP      10.3.181.252   `<none>`          8080/TCP                     2m
kube-prometheus-stack-1682576024-prometheus-node-exporter   ClusterIP      10.3.13.211    `<none>`          9100/TCP                     2m
prometheus-operated                                         ClusterIP      None           `<none>`          9090/TCP                     112s

Si ce n'est pas le cas, veuillez attendre que les Load Balancers soient correctement créés.

Visualiser les métriques

Vous pouvez maintenant récupérer les URL de Prometheus et Grafana grâce aux commandes suivantes :

export PROMETHEUS_URL=$(kubectl get svc kube-prometheus-stack-1682-prometheus -n prometheus -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
echo Prometheus URL: http://$PROMETHEUS_URL:9090

export GRAFANA_URL=$(kubectl get svc kube-prometheus-stack-1682576024-grafana -n prometheus -o jsonpath='{.status.loadBalancer.ingress[0].ip}')

echo Grafana URL: http://$GRAFANA_URL

Vous devriez obtenir le résultat suivant :

$ export PROMETHEUS_URL=$(kubectl get svc kube-prometheus-stack-1682-prometheus -n prometheus -o jsonpath='{.status.loadBalancer.ingress[0].ip}')

$ echo Prometheus URL: http://$PROMETHEUS_URL:9090
Prometheus URL: http://152.228.168.191:9090

$ export GRAFANA_URL=$(kubectl get svc kube-prometheus-stack-1682576024-grafana -n prometheus -o jsonpath='{.status.loadBalancer.ingress[0].ip}')

$ echo Grafana URL: http://$GRAFANA_URL
Grafana URL: http://51.178.69.167

Ouvrez votre navigateur et accédez à l'interface Prometheus.

Comme vous avez déjà déployé DCGM avec l'opérateur GPU NVIDIA, DCGM devrait déjà avoir commencé à publier des métriques vers Prometheus. La disponibilité des métriques peut être vérifiée en saisissant DCGM_FI_DEV_GPU_UTIL dans la barre de recherche. Cliquez sur le bouton Execute pour déterminer si les métriques GPU sont visibles :

Prometheus

Vous pouvez vérifier l'utilisation des GPU avec plusieurs métriques dans Prometheus :

  • DCGM_FI_DEV_GPU_UTIL : utilisation du GPU.
  • DCGM_FI_DEV_SM_CLOCK : fréquence d'horloge SM (en MHz).
  • DCGM_FI_DEV_MEM_CLOCK : fréquence d'horloge mémoire (en MHz).
  • DCGM_FI_DEV_MEMORY_TEMP : température mémoire (en °C).

Vous trouverez la liste complète des métriques exportées par DCGM-exporter sur le site de NVIDIA.

Vous pouvez également accéder à l'interface Grafana. Ouvrez votre navigateur et accédez à l'adresse http://$GRAFANA_URL en utilisant les identifiants ci-dessous :

  • Identifiant : admin
  • Mot de passe : prom-operator (par défaut)
Grafana Page d'accueil Grafana

Tableau de bord DCGM dans Grafana

Vous disposez maintenant de Prometheus et Grafana en cours d'exécution ; vous devez à présent ajouter un tableau de bord pour DCGM. Pour cela, vous pouvez utiliser un tableau de bord standard publié par NVIDIA, qui peut également être personnalisé.

Pour ajouter le tableau de bord, dans la barre latérale de Grafana, cliquez sur + -> Import :

Menu Import de Grafana

Importez le tableau de bord NVIDIA depuis https://grafana.com/grafana/dashboards/12239, puis cliquez sur le bouton Load :

Menu Import de Grafana

Choisissez ensuite Prometheus comme source de données dans le menu déroulant, puis cliquez sur le bouton Import :

Menu Import de Grafana

Vous devriez maintenant voir votre nouveau tableau de bord :

Tableau de bord Grafana NVIDIA DCGM Exporter

Si vous avez suivi le tutoriel Déployer une application GPU sur OVHcloud Managed Kubernetes, vous devriez voir des métriques similaires à notre exemple.

Vous pouvez cliquer sur le menu déroulant instance afin de visualiser les métriques GPU d'un autre nœud, par exemple :

Tableau de bord Grafana NVIDIA DCGM Exporter, autre nœud

Visualiser les métriques pour des applications en cours d'exécution

Maintenant que vous disposez d'une stack de monitoring fonctionnelle et d'un tableau de bord pour visualiser vos données, il est temps d'exécuter une application afin de récupérer des métriques GPU et de visualiser des données intéressantes.

Comme exemple d'application complexe et intéressante utilisant le GPU, vous pouvez utiliser la démo standard DeepStream Intelligent Video Analytics disponible sur le registre NVIDIA NGC.

Il s'agit d'une démo d'analyse vidéo facile à déployer qui permet de démontrer l'analyse vidéo accélérée par GPU. Le conteneur repose sur le conteneur NVIDIA DeepStream et exploite son SEnet intégré avec un backend resnet18.

La démo Intelligent Video Analytics :

  • est une démo facile à utiliser pour démontrer l'inférence accélérée par GPU
  • repose sur le NGC Deepstream Container
  • s'appuie sur Kubernetes, Helm, NGC et DeepStream
  • ne nécessite pas de Video Management System (VMS)

Vous pouvez déployer l'application via le chart Helm NVIDIA :

helm fetch https://helm.ngc.nvidia.com/nvidia/charts/video-analytics-demo-0.1.4.tgz && \
helm install video-analytics-demo-0.1.4.tgz --generate-name

Vous devriez obtenir un résultat similaire à celui-ci :

$ helm fetch https://helm.ngc.nvidia.com/nvidia/charts/video-analytics-demo-0.1.4.tgz && \
helm install video-analytics-demo-0.1.4.tgz --generate-name
NAME: video-analytics-demo-0-1683012074
LAST DEPLOYED: Tue May  2 09:21:15 2023
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the RTSP URL by running these commands:
  export NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services video-analytics-demo-0-1683012074)
  export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
  echo rtsp://$NODE_IP:$NODE_PORT/ds-test

2.Get the WebUI URL by running these commands:
  export ANT_NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services video-analytics-demo-0-1683012074-webui)
  export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")
  echo http://$NODE_IP:$ANT_NODE_PORT/WebRTCApp/play.html?name=videoanalytics
  Disclaimer:
  Note: Due to the output from DeepStream being real-time via RTSP, you may experience occasional hiccups in the video stream depending on network conditions.

Vous pouvez vérifier que l'application fonctionne correctement :

$ kubectl get pod -n default
NAME                                                       READY   STATUS      RESTARTS   AGE
cuda-vectoradd                                             0/1     Completed   0          6d21h
video-analytics-demo-0-1683012074-54cb666d7d-rq5nd         1/1     Running     0          3m36s
video-analytics-demo-0-1683012074-webui-6679784745-rsz7r   1/1     Running     0          3m36s

Les Pods video-analytics-demo-* et video-analytics-demo-*-webui-* sont en cours d'exécution.

La démo peut être consultée dans le navigateur en accédant à l'adresse fournie par les instructions suivantes :

export ANT_NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services video-analytics-demo-0-1683012074-webui)

export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")

echo Demo URL: http://$NODE_IP:$ANT_NODE_PORT/WebRTCApp/play.html\?name\=videoanalytics

Résultat :

$ export ANT_NODE_PORT=$(kubectl get --namespace default -o jsonpath="{.spec.ports[0].nodePort}" services video-analytics-demo-0-1683012074-webui)

$ export NODE_IP=$(kubectl get nodes --namespace default -o jsonpath="{.items[0].status.addresses[0].address}")

$ echo Demo URL: http://$NODE_IP:$ANT_NODE_PORT/WebRTCApp/play.html\?name\=videoanalytics\~
Video Demo: http://51.83.111.178:31115/WebRTCApp/play.html?name=videoanalytics~

Ouvrez l'URL de l'application dans votre navigateur :

Démo GPU

Cliquez sur le bouton play (le bouton avec un triangle) pour démarrer l'application :

Démo GPU démarrée

Comme vous pouvez le constater, l'application, qui peut être utilisée pour des cas d'usage de villes intelligentes, exploite la puissance du GPU pour détecter des objets tels que des personnes et des voitures.

Vous pouvez maintenant vérifier les métriques dans Grafana et observer l'évolution des graphiques :

Métriques GPU de la démo Grafana Métriques GPU de la démo Grafana Métriques GPU de la démo Grafana

Ces captures d'écran montrent l'utilisation du GPU et l'allocation mémoire sur le GPU pendant l'exécution de l'application.

Vous pouvez fermer l'application une fois vos tests terminés afin d'arrêter la consommation du GPU.

Suppression (nettoyage)

Exécutez d'abord la commande helm list dans tous les namespaces (avec l'option -A) de votre cluster Kubernetes pour voir ce que vous avez installé.

$ helm list -A
NAME                             	NAMESPACE    	REVISION	UPDATED                              	STATUS  	CHART                        	APP VERSION
gpu-operator                     	gpu-operator 	1       	2023-04-25 09:59:59.619362 +0200 CEST	deployed	gpu-operator-v23.3.1         	v23.3.1
kube-prometheus-stack-1682576024 	prometheus   	1       	2023-04-27 08:13:49.279112 +0200 CEST	deployed	kube-prometheus-stack-45.21.0	v0.63.0
video-analytics-demo-0-1683012074	default      	1       	2023-05-02 09:21:15.816386 +0200 CEST	deployed	video-analytics-demo-0.1.4   	1.2

Vous pouvez maintenant supprimer ce que vous avez installé dans ce tutoriel, grâce aux commandes helm uninstall :

helm uninstall kube-prometheus-stack-1682576024 -n prometheus

helm uninstall video-analytics-demo-0-1683012074 -n default

Vous devriez obtenir un résultat similaire à celui-ci :

$ helm uninstall kube-prometheus-stack-1682576024 -n prometheus
release "kube-prometheus-stack-1682576024" uninstalled

$ helm uninstall video-analytics-demo-0-1683012074 -n default
release "video-analytics-demo-0-1683012074" uninstalled

Aller plus loin

Prometheus et Grafana sont des outils de monitoring très puissants, qui disposent également de systèmes d'alerte. N'hésitez pas à approfondir le sujet afin de créer des alertes, par exemple.

Pour en savoir plus sur l'utilisation pratique de votre cluster Kubernetes, nous vous invitons à consulter notre documentation OVHcloud Managed Kubernetes.

  • Si vous avez besoin d'une formation ou d'une assistance technique pour la mise en oeuvre de nos solutions, contactez votre commercial ou cliquez sur ce lien pour obtenir un devis et demander une analyse personnalisée de votre projet à nos experts de l’équipe Professional Services.

  • Échangez avec notre communauté d'utilisateurs.

Cette page vous a-t-elle aidé ?