Lea nuestro artículo sobre

.

Después de dedicar tiempo en mi primera historia a la optimización del código para reducir mi tiempo de computación en 90%, me interesaba conocer el equivalente de CO2 ahorrado por mis cambios. Inspirado por el DevBlog de Microsoft, decidí desarrollar mi propio método basándome en el artículo de Sara Bergman.

Durante este artículo, recorreremos cada fase del proceso que puede dividirse en tres partes diferentes :

  • El Perfilado, donde recogeremos data sobre el consumo de recursos de nuestro código
  • El Cómputo, donde transformaremos esos recursos, en consumo de energía
  • El Evaluación, donde convertiremos este consumo de energía en impacto sobre el medio ambiente

Cada parte irá acompañada de su implementación real en un cuaderno en Azure ML Studio.

Paso 1: Perfilado del código

El objetivo de este primer paso es bastante sencillo: averiguar el consumo de memoria y de CPU de su código. En el caso de nuestra máquina, se tendrán en cuenta tres parámetros principales:

  • la energía consumida por la CPU / GPU
  • la energía consumida por el uso de la memoria
  • la energía utilizada por el sistema de refrigeración (factor de eficacia del uso de la energía)

Podemos encontrar fácilmente información en línea para aproximar la Eficacia del Uso de la Energía (PUE), pero medir el consumo de CPU / Memoria de nuestro cuaderno Python no es tan sencillo. Existen muchas soluciones (timeit, cProfile, psutil) pero se centran más en el perfilado del tiempo que en el consumo de CPU y Memoria.

En aras de la propiedad y la simplicidad, decidí codificar mi propio script de perfilado en Bash, midiendo el consumo de mi máquina en un bucle eterno, ya que el código que necesitaba evaluar se encontraba en una instancia de JupyterLab que se ejecutaba en Linux (18.04.1-Ubuntu SMP).

El primer script, utilizado para medir cada segundo el uso exacto de Memoria se guardó como perfil_de_memoria.sh :

Measuring the CO2eq impact of your Python Notebook (Azure ML)

El segundo script, utilizado para medir cada segundo el consumo medio de CPU durante el último minuto se guardó como cpu_profiler.sh :

Pero tener esos dos scripts no era suficiente, ya que también necesitaba saber exactamente cuándo se estaba ejecutando mi código. Para servir a este propósito añadí una celda, en la parte superior de mi cuaderno :

Y otra celda, en el fondo de mi cuaderno :

Ahora que todo estaba listo, sólo tenía que :

1. Asegúrese de que mi entorno no estaba contaminado con otras tareas ejecutándose en segundo plano y cierre todas las instancias en curso pulsando el botón Apagar todo

2. Abra una instancia de terminal para ejecutar el script memory_log.sh en segundo plano

./registro_de_memoria.sh

3. Abra otra instancia de terminal para ejecutar el script cpu_log.sh en segundo plano

./cpu_log.sh

4. Instanciar y ejecutar todas las celdas de mi bloc de notas

Una vez ejecutado todo el cuaderno, puedo detener ambos scripts Linux pulsando CTRL + C en cada terminal, comprobar si mis archivos memory.log y cpu.log se crearon correctamente, y anotar la hora de inicio y la hora de finalización de la ejecución de mi cuaderno aprovechando las dos celdas añadidas con datetime.now().

Ahora tenía todo lo que necesitaba para la siguiente fase de cálculo.

Paso 2: Calcular en energía

Ahora que hemos recopilado todos los data sobre el consumo de recursos, podemos empezar a convertirlo todo en kWh, medida que representa el consumo de energía.
Para ello, utilizaremos la siguiente ecuación:

Empecemos primero con las métricas relacionadas con las CPU.
Como primer paso copio el contenido del archivo cpu.log en una hoja de cálculo de Google que luego utilizaré para obtener mi consumo medio de CPU :

Hago algunas manipulaciones en mi Hoja, (Dividir texto en columnas, Borrar columnas no utilizadas, Añadir nombres de columnas) con el fin de obtener algo más a mano para explotar :

Mi portátil funcionó desde las 12:33:20 hasta las 13:14:09, así que sólo tengo que añadir una fórmula que devuelva la media de cpu_1 entre esos tiempos, y dividir esa Media por el número de CPUs de mi máquina :

Ahora entiendo que mi portátil está utilizando en promedio 8.038 CPU durante sus 40 minutos de ejecución que corresponden a 100,47% de uso medio de la CPU.
Pero, ¿cuál es el consumo de mi CPU?
Depende del modelo de CPU utilizado, he encontrado más información sobre la CPU utilizada por mi máquina en el Azure Documentación de Microsoft. En el momento de mis experimentos (octubre de 2021), mi máquina utilizaba uno de los 4 tipos diferentes de CPU Intel Xeon :
- Intel Xeon Platinum 8270
- Intel Xeon Platinum 8171M
- Procesador Intel Xeon E5-2697 v4
- Intel Xeon E5-2673 v3 a 2,40GHz

Después de mirar en línea en el sitio web de Intel, pude emparejar los modelos de CPU con su consumo de energía, utilizando la Potencia de Diseño Térmico (TDP) que representa la potencia media, en vatios, que disipa el procesador cuando funciona a la Frecuencia Base con todos los núcleos activos.

Como la CPU utilizada puede cambiar en cada ejecución de mi código, decidí escoger el TDP medio de estas cuatro CPU, que es de 158.75 en ese caso.
Ahora he encontrado ambos Pc (=1,0047) y Cc (=158.75)

Echemos ahora un vistazo al archivo memory.log

Siguiendo los mismos procesos que antes, copio el contenido de mi archivo en una hoja de Google, divido el texto en columnas y las ordeno para obtener el siguiente formato :

A continuación, aplico una fórmula de promedio en la columna C, para obtener el uso medio de la memoria entre las 12:33:20 y las 13:14:09 en MB. Divido este número por 1024 para convertirlo en GB.

Para estimar el uso de energía de un GB de data, seguiré una regla empírica encontrada aquí : 3W por 8GB por lo que 0,375W/GB y 1.88W en total para mi uso de 5,015 GB de memoria.

Ahora he encontrado Pm (=1.88). Tenga en cuenta que la energía consumida por la memoria parece ser 85 veces menos importante que la consumida por la CPU y podría omitirse para obtener una evaluación algo menos precisa pero más rápida.

Como no utilizo ninguna GPU, puedo pasar directamente al último término que falta: la Eficacia del Uso de la Energía. El PUE es un ratio que determina la energía utilizada por el centro data para todo lo que no sea alojar servicios cloud como refrigeración, compensación de potencia reactiva, luces...

Mirando el Hoja informativa Microsoft Datacenter de 2015, la PUE media en su nuevo centro data fue de 1.125. Esta es la cifra que tomaremos para este ejemplo, pero un enfoque más disciplinado consistirá en hallar el PUE real del centro data utilizado para nuestros cálculos.

Ya tenemos todos los términos de nuestra ecuación, ¡hagamos los cálculos!

Como nuestro código se ejecutó entre las 12:33:20 y las 13:14:09, tardó 40 minutos y 49 segundos en ejecutarse (lo que equivale a 0,68 horas). Significa que en total consumió : 0,182 * 0,68 = 0,1238 kW

Paso 3: Evaluar el impacto

Último paso de nuestro viaje por la Medición del Carbono, ahora tenemos que evaluar el impacto de este consumo de electricidad, que depende en gran medida del lugar donde se haya consumido la energía. Para calcularlo utilizaremos el factor de Intensidad de Carbono que podemos encontrar fácilmente en Página web del mapa eléctrico, un proyecto para recopilar, preprocesar y unificar la electricidad pública data de 150 geografías.

Cuando calculé el impacto de CO2eq de mi código funcionando en Holanda, el valor del impacto de carbono se situó en 487 gramos por kW. Eso eleva el impacto de mi código a 487 * 0,1238 = 60,3 gCO2eq.

Este valor puede parecer bajo, pero sabiendo que mi trozo de código se ejecutaba todos los días y durante todo el año el impacto se elevó a 60,3 * 365,25 = 22,0 kgCO2eq al año.
Pero, ¿qué representa en comparación con otras actividades? Si lo comparamos con el uso de un coche, por ejemplo, y tomamos la Emisiones medias de C02 en 2019 para todos los coches nuevos, equivale a la huella de un viaje de 180 km.

Utilizando monconvertisseurco2.fr Puedo obtener más actividades equivalentes utilizando el “Carbono Base” abierto data, recogido por un organismo del Estado francés: la “Agencia Nacional para el Medio Ambiente y la Gestión de la Energía” o ADEME.

Conclusión

¡Lo hemos conseguido!

Tras un perfilado de nuestro código para obtener el uso tanto de memoria como de cpu, computar esas cifras en consumo eléctrico y evaluar el impacto en CO2eq, conseguimos comprender mejor la huella de carbono de nuestro código. Se trata de un hito importante para dar un paso atrás en el impacto medioambiental de nuestro código y para destacar la importancia de las optimizaciones del código.

En este caso concreto, como se ha mencionado en la primera parte sobre cómo rastrear y evitar los cuellos de botella de rendimiento en Jupiter Lab, sólo optimizar una línea de código me permitió ahorrar 90% de mi tiempo de cálculo y 92% de mi impacto CO2eq, pasando de 22kgCO2eq a menos de 2kgCO2eq al año.

Hoy en día, la mayoría de las plataformas proveedoras de cloud, incluida Azure, prometen tener un impacto neutro en el medio ambiente gracias a los proyectos de compensación de emisiones de carbono. Sin embargo, los expertos en medio ambiente coinciden en que, aunque eficaces e importantes, los proyectos de compensación de emisiones de carbono no bastan por sí solos para controlar el impacto de nuestra actividad sobre el planeta, y que el la mejor solución sigue siendo reducir las emisiones en la fuente, como en este proyecto de optimización.
¡Esto es lo que intentamos promover en Artefact a través de nuestras diferentes iniciativas medioambientales!

Medio Blog por Artefact.

Este artículo se publicó inicialmente en Medium.com.
¡Síganos en nuestro Medium Blog !