Après avoir passé du temps dans mon premier article sur l'optimisation du code pour réduire mon temps de calcul de 90%, j'ai voulu connaître l'équivalent CO2 économisé par mes changements. Inspiré par le DevBlog de Microsoft, j'ai décidé de développer ma propre méthode en me basant sur l'article de Sara Bergman.
Dans cet article, nous passerons en revue toutes les phases du processus qui peut être divisé en trois parties différentes :

Chaque partie sera accompagnée de son implémentation réelle sur un notebook dans Azure ML Studio.
Étape 1 : Profilage du code
L'objectif de cette première étape est assez simple : déterminer la consommation de mémoire et de CPU de votre code. Dans le cas de notre machine, trois paramètres principaux seront pris en compte :
Nous pouvons facilement trouver des informations en ligne pour approximer le Power Usage Effectiveness (PUE), mais mesurer la consommation CPU / Mémoire de notre notebook Python n'est pas si simple. De nombreuses solutions existent (timeit, cProfile, psutil) mais elles sont plutôt axées sur le profilage du temps que sur la consommation de CPU et de mémoire.
Pour des raisons de propriété et de simplicité, j'ai décidé de coder mon propre script de profilage en Bash, mesurant la consommation de ma machine dans une boucle sans fin, étant donné que le code que je devais évaluer se trouvait sur une instance JupyterLab fonctionnant sous Linux (18.04.1-Ubuntu SMP).
Le premier script, utilisé pour mesurer chaque seconde l'utilisation exacte de la mémoire, a été enregistré sous la forme suivante memory_profiler.sh :

Le second script, utilisé pour mesurer chaque seconde la consommation moyenne de l'unité centrale au cours de la dernière minute, a été enregistré sous la forme suivante cpu_profiler.sh :

Mais avoir ces deux scripts n'était pas suffisant, car j'avais aussi besoin de savoir exactement quand mon code s'exécutait. Pour ce faire, j'ai ajouté une cellule, en haut de mon carnet de notes :

Et une autre cellule, au bas de mon carnet :

Maintenant que tout est prêt, il ne me reste plus qu'à :
1. Assurez-vous que mon environnement n'est pas pollué par d'autres tâches en cours d'exécution en arrière-plan et fermez toutes les instances en cours en cliquant sur le bouton "Shut Down All".

2. Ouvrez une instance de terminal pour exécuter le script memory_log.sh en arrière-plan.
./memory_log.sh
3. Ouvrez une autre instance de terminal pour exécuter le scriptu_log.sh en arrière-plan.
./cpu_log.sh
4. Instanciez et exécutez toutes les cellules de mon bloc-notes.

Une fois que l'ensemble du cahier s'est exécuté, je peux arrêter les deux scripts Linux en appuyant sur CTRL + C dans chaque terminal, vérifier si mes fichiers memory.log et cpu.log ont été créés avec succès, et noter l'heure de début et l'heure de fin de l'exécution de mon cahier en utilisant les deux cellules ajoutées avec datetime.now().

J'avais maintenant tout ce qu'il me fallait pour la prochaine phase de calcul.
Étape 2 : Calcul de l'énergie
Maintenant que nous avons collecté toutes les data sur la consommation des ressources, nous pouvons commencer à convertir le tout en kWh, mesure représentant la consommation d'énergie.
Pour ce faire, nous utiliserons l'équation suivante :

Commençons par les mesures relatives aux processeurs.
Dans un premier temps, je copie le contenu du fichier cpu.log dans une feuille de calcul Google que j'utiliserai plus tard pour obtenir ma consommation moyenne de CPU :

Je fais quelques manipulations sur ma feuille, (Diviser le texte en colonnes, Supprimer les colonnes inutilisées, Ajouter des noms de colonnes) afin d'obtenir quelque chose de plus pratique à exploiter :

Mon ordinateur portable a fonctionné de 12:33:20 à 13:14:09, il me suffit donc d'ajouter une formule pour obtenir la moyenne de cpu_1 entre ces périodes, et de diviser cette moyenne par le nombre d'unités centrales de ma machine :

Je comprends maintenant que mon carnet de notes utilise en moyenne 8.038 CPU pendant ses 40 minutes d'exécution qui correspondent à 100,47% d'utilisation moyenne du CPU.
Mais quelle est la consommation de mon processeur ?
Cela dépend du modèle de CPU utilisé. J'ai trouvé plus d'informations sur le CPU utilisé par ma machine dans la rubrique Azure Documentation Microsoft. Au moment de mes expériences (octobre 2021), ma machine utilisait l'un des 4 différents types de CPU Intel Xeon :
- Intel Xeon Platinum 8270
- Intel Xeon Platinum 8171M
- Processeur Intel Xeon E5-2697 v4
- Intel Xeon E5-2673 v3 @ 2.40GHz
Après avoir consulté le site web d'Intel, j'ai pu faire correspondre les modèles de CPU avec leur consommation d'énergie, en utilisant la puissance thermique (TDP) qui représente la puissance moyenne, en watts, que le processeur dissipe lorsqu'il fonctionne à la fréquence de base avec tous les cœurs actifs.

Comme le processeur utilisé peut changer à chaque exécution de mon code, j'ai décidé de prendre le TDP moyen de ces quatre processeurs, soit 158.75 dans ce cas.
J'ai maintenant trouvé les deux Pc (=1,0047) et Cc (=158.75)
Jetons maintenant un coup d'œil au fichier memory.log
En suivant les mêmes processus que précédemment, je copie le contenu de mon fichier dans une feuille Google, divise le texte en colonnes et les arrange pour obtenir le format suivant :

J'applique ensuite une formule de calcul de la moyenne à la colonne C, afin d'obtenir le résultat suivant utilisation moyenne de la mémoire entre 12:33:20 et 13:14:09 en Mo. Je divise ce nombre par 1024 pour le convertir en Go.

Pour estimer la consommation d'énergie d'un Go de data, je suivrai la règle empirique suivante ici : 3W par 8GB soit 0.375W/GB et 1.88W au total pour mon utilisation de 5,015 Go de mémoire.
J'ai maintenant trouvé Pm (=1.88). Notez que la puissance consommée par ma mémoire semble être 85 fois moins importante que celle consommée par mon CPU et peut être ignorée pour obtenir une évaluation légèrement moins précise mais plus rapide.
Comme je n'utilise pas de GPU, je peux directement passer au dernier terme manquant : le Power Usage Effectiveness (PUE). Le PUE est un ratio qui détermine l'énergie utilisée par le centre data pour tout ce qui n'est pas l'hébergement des services cloud comme le refroidissement, la compensation de la puissance réactive, les lumières ...
En regardant la Fiche d'information Microsoft Datacenter de 2015, Le PUE moyen dans son nouveau centre data a été de 1.125. C'est le chiffre que nous retiendrons pour cet exemple, mais une approche plus disciplinée consisterait à trouver le PUE réel du centre data utilisé pour nos calculs.
Nous avons maintenant tous les termes de notre équation, faisons le calcul !

Comme notre code a été exécuté entre 12:33:20 et 13:14:09, il a pris 40 minutes et 49 secondes pour s'exécuter (ce qui équivaut à 0,68 heure). Cela signifie qu'au total il a consommé : 0.182 * 0.68 = 0,1238 kW
Étape 3 : Évaluer l'impact
Dernière étape de notre parcours de mesure du carbone, nous devons maintenant évaluer l'impact de cette consommation d'électricité qui dépend fortement de l'endroit où l'énergie a été consommée. Pour le calculer, nous utiliserons le facteur d'intensité carbone que nous pouvons facilement trouver dans Site web de la carte de l'électricité, Le projet de collecte, de prétraitement et d'unification de l'électricité publique data provenant de 150 zones géographiques.

Lorsque j'ai calculé l'impact CO2eq de mon code fonctionnant aux Pays-Bas, la valeur de l'impact carbone était de 487 grammes par kW. Cela porte l'impact de mon code à 487 * 0.1238 = 60,3 gCO2eq.
Cette valeur peut sembler faible, mais sachant que mon morceau de code fonctionnait tous les jours et toute l'année, l'impact a été porté à 60.3 * 365.25 = 22,0 kgCO2eq par an.
Mais que représente-t-elle par rapport à d'autres activités ? Si nous comparons cela à l'utilisation d'une voiture par exemple et que nous prenons les Moyenne 2019 des émissions de C02 pour toutes les voitures neuves, Cela équivaut à l'empreinte d'un voyage de 180 km.
L'utilisation monconvertisseurco2.fr J'ai pu obtenir plus d'activités équivalentes en utilisant la “Base Carbone” ouverte data, collectée par un organisme de l'Etat français : l'Agence Nationale de l'Environnement et de la Maîtrise de l'Energie (ADEME).

Conclusion
Nous avons réussi !
Après avoir profilé notre code pour obtenir l'utilisation de la mémoire et du processeur, calculé ces chiffres en consommation d'électricité et évalué l'impact en CO2eq, nous avons réussi à mieux comprendre l'empreinte carbone de notre code. Il s'agit d'une étape importante pour prendre du recul sur l'impact environnemental de notre code et pour souligner l'importance de l'optimisation du code.
Dans ce cas précis, comme indiqué dans la première partie sur la façon de repérer et d'éviter les goulets d'étranglement dans Jupiter Lab, Ainsi, la simple optimisation d'une ligne de code m'a permis d'économiser 90% de mon temps de calcul et 92% de mon impact CO2eq, passant de 22kgCO2eq à moins de 2kgCO2eq par an.
Aujourd'hui, la plupart des plateformes des fournisseurs cloud, y compris Azure, promettent avoir un impact neutre sur l'environnement grâce aux projets de compensation des émissions de carbone. Cependant, les experts en environnement s'accordent à dire que, bien qu'efficaces et importants, les projets de compensation carbone ne suffisent pas à maîtriser l'impact de notre activité sur la planète, et que le la meilleure solution reste la réduction des émissions à la source, comme dans ce projet d'optimisation.
C'est ce que nous essayons de promouvoir chez Artefact à travers nos différentes initiatives environnementales !

BLOG







