Depois de gastar tempo em minha primeira história com otimização de código para reduzir meu tempo de computação em 90%, fiquei interessado em saber o equivalente de CO2 economizado por minhas alterações. Inspirado pelo DevBlog da Microsoft, decidi desenvolver meu próprio método com base no artigo de Sara Bergman.
Neste artigo, analisaremos cada fase do processo, que pode ser dividido em três partes diferentes:

Cada parte será acompanhada de sua implementação real em um notebook no Azure ML Studio.
Etapa 1: criação de perfil do código
O objetivo dessa primeira etapa é bastante simples: encontrar o consumo de memória e CPU do seu código. No caso da nossa máquina, três parâmetros principais serão levados em conta:
Podemos encontrar facilmente informações on-line para aproximar a eficiência do uso de energia (PUE), mas medir o consumo de CPU/memória do nosso notebook Python não é tão simples assim. Existem muitas soluções (timeit, cProfile, psutil), mas elas se concentram mais na criação de perfis de tempo do que no consumo de CPU e memória.
Por uma questão de propriedade e simplicidade, decidi codificar meu próprio script de criação de perfil no Bash, medindo o consumo da minha máquina em um loop infinito, pois o código que eu precisava avaliar estava localizado em uma instância do JupyterLab em execução no Linux (18.04.1-Ubuntu SMP).
O primeiro script, usado para medir a cada segundo o uso exato da memória, foi salvo como memory_profiler.sh :

O segundo script, usado para medir a cada segundo o consumo médio da CPU durante o último minuto, foi salvo como cpu_profiler.sh :

Mas ter esses dois scripts não era suficiente, pois eu também precisava saber exatamente quando meu código estava sendo executado. Para isso, adicionei uma célula, na parte superior do meu notebook :

E outra célula, no final do meu caderno:

Agora que tudo estava pronto, eu só tinha que :
1. Certifique-se de que meu ambiente não esteja poluído com outras tarefas em execução em segundo plano e feche todas as instâncias em andamento pressionando o botão Shut Down All

2. Abra uma instância de terminal para executar o script memory_log.sh em segundo plano
./memory_log.sh
3. Abra outra instância de terminal para executar o script cpu_log.sh em segundo plano
./cpu_log.sh
4. Instanciar e executar todas as células do meu notebook

Depois que todo o notebook foi executado, posso interromper os dois scripts do Linux pressionando CTRL + C em cada terminal, verificar se os arquivos memory.log e cpu.log foram criados com êxito e anotar a hora de início e a hora de término da execução do meu notebook usando as duas células adicionadas com datetime.now().

Agora eu tinha tudo o que precisava para a próxima fase de computação.
Etapa 2: Calcular a energia
Agora que coletamos todos os data sobre o consumo de recursos, podemos começar a converter tudo em kWh, medida que representa o consumo de energia.
Para isso, usaremos a seguinte equação:

Vamos começar com as métricas relacionadas às CPUs.
Como primeira etapa, copio o conteúdo do arquivo cpu.log em uma planilha do Google que usarei posteriormente para obter meu consumo médio de CPU:

Faço algumas manipulações em minha planilha (dividir o texto em colunas, excluir colunas não utilizadas, adicionar nomes de colunas) para obter algo mais prático para explorar:

Meu notebook funcionou das 12:33:20 às 13:14:09, então posso simplesmente adicionar uma fórmula para retornar a média de cpu_1 entre esses horários e dividir essa média pelo número de CPUs da minha máquina:

Agora entendo que meu Notebook está usando em média 8.038 CPUs durante seus 40 minutos de execução, que correspondem a 100,47% de uso médio da CPU.
Mas qual é o consumo da minha CPU?
Isso depende do modelo de CPU usado. Encontrei mais informações sobre a CPU usada pela minha máquina no Documentação da Microsoft sobre o Azure. Na época dos meus experimentos (outubro de 2021), minha máquina estava usando um dos 4 tipos diferentes de CPU Intel Xeon:
- Intel Xeon Platinum 8270
- Intel Xeon Platinum 8171M
- Processador Intel Xeon E5-2697 v4
- Intel Xeon E5-2673 v3 a 2,40 GHz
Depois de pesquisar on-line no site da Intel, consegui associar os modelos de CPU ao seu consumo de energia, usando o Thermal Design Power (TDP), que representa a energia média, em watts, que o processador dissipa ao operar na frequência básica com todos os núcleos ativos.

Como a CPU usada pode mudar a cada execução do meu código, decidi escolher o TDP médio dessas quatro CPUs, que é 158.75 nesse caso.
Agora encontrei os dois Pc (=1,0047) e Cc (=158.75)
Vamos agora dar uma olhada no arquivo memory.log
Seguindo os mesmos processos de antes, copio o conteúdo do meu arquivo em um Google Sheet, divido o texto em colunas e as organizo para obter o seguinte formato:

Em seguida, aplico uma fórmula média na coluna C para obter o uso médio da memória entre 12:33:20 e 13:14:09 em MB. Eu divido esse número por 1024 para convertê-lo em GB.

Para estimar o uso de energia de um GB de data, seguirei uma regra geral encontrada aqui : 3W por 8GB, portanto, 0,375W/GB e 1.88W no total para meu uso de 5,015 GB de memória.
Agora encontrei Pm (=1.88). Observe que a energia consumida pela minha memória parece ser 85 vezes menos importante do que a consumida pela minha CPU e pode ser ignorada para obter uma avaliação um pouco menos precisa, mas mais rápida.
Como não uso nenhuma GPU, posso passar diretamente para o último termo que falta: o Power Usage Effectiveness. A PUE é uma taxa que determina a energia usada pelo centro data para qualquer outra coisa que não seja hospedar serviços cloud, como resfriamento, compensação de energia reativa, luzes...
Olhando para o Ficha técnica do Microsoft Datacenter de 2015, Em seu novo centro data, a PUE média foi de 1.125. Esse é o número que usaremos para este exemplo, mas uma abordagem mais disciplinada será encontrar a PUE real do centro data usado para nossos cálculos.
Agora temos todos os termos de nossa equação, vamos fazer as contas!

Como nosso código foi executado entre 12:33:20 e 13:14:09, ele levou 40 minutos e 49 segundos para ser executado (o que equivale a 0,68 horas). Isso significa que, no total, ele consumiu: 0,182 * 0,68 = 0,1238 kW
Etapa 3: Avaliar o impacto
Na última etapa de nossa jornada de medição de carbono, precisamos agora avaliar o impacto desse consumo de eletricidade, que depende muito do local onde a energia foi consumida. Para calcular esse impacto, usaremos o fator de intensidade de carbono que podemos encontrar facilmente em Site do Electricity Map, O senhor está trabalhando em um projeto para reunir, pré-processar e unificar a eletricidade pública data de 150 regiões geográficas.

Quando calculei o impacto de CO2eq do meu código em execução na Holanda, o valor do impacto de carbono foi de 487 gramas por kW. Isso faz com que o impacto do meu código seja de 487 * 0,1238 = 60,3 gCO2eq.
Esse valor pode parecer baixo, mas, sabendo que meu código estava sendo executado todos os dias e durante todo o ano, o impacto foi aumentado para 60,3 * 365,25 = 22,0 kgCO2eq por ano.
Mas o que isso representa em comparação com outras atividades? Se compararmos com o uso de um carro, por exemplo, e considerarmos o Emissões médias de C02 em 2019 para todos os carros novos, O que o senhor acha que é o equivalente à pegada de uma viagem de 180 km?.
Usando monconvertisseurco2.fr Consegui obter mais atividades equivalentes usando o “Base Carbon” aberto data, coletado por uma organização do estado francês: a “Agência Nacional para o Meio Ambiente e Gerenciamento de Energia” ou ADEME.

Conclusão
Conseguimos!
Depois de criar um perfil do nosso código para obter o uso da memória e da CPU, computar esses números em consumo de eletricidade e avaliar o impacto em CO2eq, conseguimos entender melhor a pegada de carbono do nosso código. Esse é um marco importante para dar um passo atrás no impacto ambiental do nosso código e para destacar a importância das otimizações de código.
Nesse caso específico, conforme mencionado na primeira parte sobre como rastrear e evitar gargalos de desempenho no Jupiter Lab, Com a otimização de apenas uma linha de código, economizei 90% do meu tempo de computação e 92% do meu impacto de CO2eq, passando de 22kgCO2eq para menos de 2kgCO2eq por ano.
Atualmente, a maioria das plataformas de provedores cloud, incluindo o Azure, promete ter um impacto neutro sobre o meio ambiente graças aos projetos de compensação de carbono. No entanto, os especialistas em meio ambiente concordam que, apesar de eficazes e importantes, os projetos de compensação de carbono não são suficientes, os projetos de compensação de carbono por si só não são suficientes para controlar o impacto de nossa atividade no planeta, e que o a melhor solução ainda é reduzir as emissões na fonte, como neste projeto de otimização.
É isso que tentamos promover na Artefact por meio de nossas diferentes iniciativas ambientais!

BLOG







