Green AI Metodi e Soluzioni per Migliorare la Sostenibilità dell’IA

Green AI Methods and Solutions for Improving AI Sustainability.

Uno sguardo tecnico a un argomento da tempo atteso

Foto di Benjamin Davies su Unsplash

Introduzione

Se sei arrivato a leggere questo articolo, probabilmente hai sentito parlare della controversia attuale riguardante la sicurezza e l’affidabilità dei modelli di linguaggio di grandi dimensioni (LLM) attuali. La lettera aperta firmata da nomi noti nel mondo dell’informatica come Steve Wozniak, Gary Marcus e Stuart Russel ha presentato le loro preoccupazioni su questo argomento e ha richiesto una sospensione di 6 mesi nella formazione di LLM. Ma c’è un altro argomento che sta guadagnando lentamente molta attenzione, che forse motiverebbe un’altra lettera aperta in un prossimo futuro: il consumo di energia e l’impronta di carbonio della formazione e dell’inferenza dei modelli di intelligenza artificiale.

Si stima che solo la formazione del popolare modello GPT-3, un LLM di 175 miliardi di parametri, abbia emesso circa 502 tonnellate di CO2 [1]. Ci sono persino calcolatori online disponibili per stimare le emissioni di formazione di un modello particolare. Ma la fase di formazione non è l’unica che consuma energia. Dopo la formazione, durante la fase di inferenza, un modello di intelligenza artificiale viene eseguito migliaia o milioni di volte al giorno. Anche se ogni esecuzione consuma una piccola quantità di energia, il consumo accumulato nel corso di settimane, mesi e anni può diventare un enorme problema.

Ecco perché il concetto di Green AI sta diventando sempre più popolare. Il suo focus principale è quello di trovare soluzioni e sviluppare tecniche per migliorare la sostenibilità dell’IA, riducendo il suo consumo di energia e la sua impronta di carbonio. In questo articolo, miriamo a presentare una panoramica di alcune tecniche e metodologie che vengono attivamente studiate, che possono essere utilizzate per migliorare questo concetto e che di solito non vengono discusse in modo accessibile. Alla fine di questo articolo, troverai risorse e riferimenti relativi agli argomenti discussi.

Sebbene questo articolo sia incentrato sulle metodologie tecniche che consentono di risparmiare energia durante la distribuzione degli algoritmi di IA, è importante avere una comprensione generale di esse anche se non sei un ricercatore. Se sei la persona responsabile della formazione dell’algoritmo di IA della tua azienda, potresti tenere a mente alcune ottimizzazioni durante la formazione che miglioreranno il consumo energetico dell’algoritmo una volta distribuito. Se sei la persona responsabile della selezione dell’hardware su cui verrà distribuito il tuo algoritmo, tieni gli occhi aperti per i concetti menzionati in questo articolo, in quanto possono essere un segno di hardware all’avanguardia e ottimizzato.

Nozioni di base di architettura del computer

Per comprendere questo articolo, è essenziale avere una comprensione di base dell’architettura del computer e di come il software e l’hardware interagiscono tra loro. Si tratta di un argomento molto complesso, ma cercheremo di fornire un breve riassunto prima di entrare nella parte principale dell’articolo.

Probabilmente hai sentito parlare del bit, l’unità di informazione più semplice all’interno di qualsiasi computer e la ragione per cui esiste il mondo digitale. I bit possono assumere solo due stati: 0 o 1. Un gruppo di 8 bit viene chiamato byte. Ai fini di questo articolo, possiamo pensare a qualsiasi architettura del computer in termini di 2 componenti hardware che manipolano e memorizzano questi byte: le unità di calcolo e la memoria.

Le unità di calcolo sono quelle responsabili di prendere un certo numero di byte in ingresso e generare un altro gruppo di byte in uscita. Ad esempio, se vogliamo moltiplicare 7 x 6, inseriremmo i byte che rappresentano 7 in uno degli ingressi di un moltiplicatore e i byte che rappresentano 6 nell’altro ingresso. L’uscita del moltiplicatore ci darebbe i byte che rappresentano il numero 42, il risultato della moltiplicazione. Questa moltiplicazione richiede un certo tempo e una certa energia fino a quando il risultato non è disponibile all’uscita del moltiplicatore.

La memoria è dove i byte vengono memorizzati per un uso futuro. La lettura e la scrittura di byte dalla memoria (anche chiamata “accesso” alla memoria) richiedono tempo ed energia. Nell’architettura del computer, di solito ci sono più “livelli” nella gerarchia della memoria, con quelli più vicini alle unità di calcolo che hanno i tempi di accesso più veloci e il minor consumo di energia per ogni byte letto, e quelli più lontani che sono le memorie più lente e più esigenti in termini di energia. L’idea principale dietro questa organizzazione gerarchica della memoria è il riutilizzo dei dati. I dati utilizzati molto spesso vengono portati dall’ultimo livello di memoria nel più vicino e riutilizzati il più possibile. Questo concetto viene chiamato “caching”, e queste memorie più veloci e più vicine vengono chiamate cache L1 e L2.

Il software è responsabile di orchestrare il movimento dei dati dalla memoria nelle unità di calcolo e quindi di memorizzare i risultati nella memoria. Di conseguenza, le decisioni software possono davvero influire sul consumo energetico di un sistema. Ad esempio, se il software richiede dati che non sono disponibili nella cache L1, l’hardware deve prima recuperarli dal livello L2 o addirittura dal livello più basso, causando ritardi temporali e ulteriore consumo di energia.

Tecniche per l’AI sostenibile

Ora che le basi dell’architettura informatica sono state stabilite, possiamo concentrarci sulle tecniche e metodologie specifiche utilizzate nell’AI sostenibile. Queste sono suddivise in due categorie distinte:

  1. ottimizzazioni hardware, come la riduzione di tensione/frequenza o il calcolo approssimato. Queste tecniche lavorano sul design fisico e le proprietà dei circuiti elettronici.
  2. ottimizzazioni software, come il pruning, la quantizzazione, il fine-tuning e altri.

DVFS: Scalatura dinamica di tensione e frequenza

Il consumo energetico dei circuiti elettronici a base di silicio standard è direttamente correlato alla tensione utilizzata nel circuito e alla sua frequenza di lavoro. Nelle stesse condizioni operative, se uno di questi parametri viene ridotto, lo stesso accade per il consumo energetico. Potremmo sfruttare questo comportamento per rendere l’esecuzione degli algoritmi di AI più sostenibile?

Certo! Immaginiamo di avere un piccolo dispositivo embedded collegato a una batteria, che riceve molteplici richieste (ciascuna con la propria criticità e vincoli), le elabora con un algoritmo di AI e quindi invia i risultati. Vogliamo che l’elaborazione dell’algoritmo di AI consumi il minor quantitativo di energia possibile in modo da mantenere la batteria in funzione il più a lungo possibile, giusto? Potremmo effettivamente cambiare dinamicamente la tensione e la frequenza di funzionamento del dispositivo quando arrivano compiti meno critici, e poi riportarle alle normali condizioni operative quando i compiti critici devono essere elaborati?

A seconda del dispositivo che esegue l’algoritmo di AI, questa è un’opzione completamente valida! Infatti, questo è un campo di ricerca attivo. Se sei interessato a saperne di più, ti consiglio di dare un’occhiata a “AutoScale: Energy Efficiency Optimization for Stochastic Edge Inference Using Reinforcement Learning” di Kim [2] o “Multi-Agent Collaborative Inference Via DNN Decoupling: Intermediate Feature Compression and Edge Learning” di Hao [3], che forniscono buoni esempi di come questa tecnica possa essere utilizzata per ridurre il consumo energetico degli algoritmi di AI.

Calcolo approssimato

Quando si esegue un’operazione matematica su una CPU o una GPU, ci aspettiamo di solito risultati esatti per il calcolo richiesto, giusto? Questo è normalmente il caso quando si utilizza hardware di tipo consumer. Dato che la moltiplicazione è una delle operazioni matematiche più utilizzate in un algoritmo di AI, ci aspettiamo di ottenere un risultato esatto quando si moltiplicano due numeri interi e un’approssimazione molto buona quando si moltiplicano due numeri in virgola mobile (questa approssimazione di solito è così precisa da non essere un problema per i programmi utente di base). Perché dovremmo considerare la possibilità di inserire due numeri interi e NON ottenere il risultato matematico corretto?

Ma negli ultimi anni è stata attivamente cercata una nuova approccio. La domanda è semplice: c’è un modo per progettare moltiplicatori più semplici, che consumino meno area fisica e meno energia, sacrificando l’accuratezza nel risultato della moltiplicazione? Ma, cosa più importante, questi nuovi moltiplicatori possono essere utilizzati in applicazioni reali, senza danneggiarne significativamente le prestazioni? La risposta a entrambe le domande è sì. Questo è il paradigma di calcolo noto come calcolo approssimato.

Questo è assolutamente affascinante! Ci sono già lavori che presentano moltiplicatori approssimati in grado di fornire risultati esatti per la moltiplicazione di due numeri interi che forniscono risultati errati solo per un ridotto numero di combinazioni di input, ma sono in grado di fornire riduzioni del consumo energetico dell’ordine del 20% per l’esecuzione di modelli interi. Se sei interessato a questa incredibile tecnica, ti incoraggio a dare un’occhiata a “Approximate Computing for ML: State-of-the-art, Challenges and Visions” di Zervakis [4], che fornisce un bel riassunto dei lavori specifici incentrati su questo argomento.

Pruning e quantizzazione

Per le persone familiarizzate con la formazione degli algoritmi di AI, in particolare delle reti neurali, queste due tecniche dovrebbero suonare familiari. Per coloro che non sono familiari con questi termini, i concetti sono veramente degni di lettura.

Il pruning è un metodo basato sull’idea che ci sia molta ridondanza nei parametri di una rete neurale, che sono quelli che contengono la conoscenza della rete. Per questo motivo, molti di essi possono essere rimossi senza danneggiare effettivamente la previsione della rete.

La quantizzazione significa rappresentare i parametri di una rete utilizzando meno byte. Ricorda come abbiamo detto che i computer rappresentano i numeri utilizzando una certa quantità di byte? Beh, di solito le reti vengono formate utilizzando una rappresentazione chiamata “floating point”, in cui ogni numero può essere lungo 4 o 8 byte. Ma ci sono tecniche per rappresentare effettivamente questi parametri utilizzando solo 1 byte (la rappresentazione “integer”) e ancora avere una qualità di previsione simile o talvolta anche uguale.

Sono sicuro che stai già immaginando come queste due tecniche aiutino a ridurre il consumo energetico di una rete neurale. Per il pruning, se sono necessari meno parametri per elaborare un input, due cose accadono che migliorano il consumo energetico dell’algoritmo. In primo luogo, devono essere eseguite meno computazioni nelle unità di calcolo. In secondo luogo, poiché ci sono meno computazioni da effettuare, viene letta meno memoria. Per la quantizzazione, moltiplicare due numeri rappresentati come interi utilizzando solo un byte richiede un moltiplicatore hardware molto più piccolo e semplice, che a sua volta richiede meno energia per effettuare la moltiplicazione effettiva. Infine, se la dimensione di ciascun parametro viene ridotta da 8 byte a 1 byte, questo significa che la quantità di dati che devono essere letti dalla memoria è anche 8 volte più piccola, riducendo notevolmente il consumo energetico necessario per elaborare un input.

Vuoi sapere di più? Dai un’occhiata a “Lightweight Parameter Pruning for Energy-Efficient Deep Learning: A Binarized Gating Module Approach” di Zhi [5] o a “Pruning for Power: Optimizing Energy Efficiency in IoT with Neural Network Pruning” di Widmann [6] per avere degli esempi di lavori attuali sul tema.

Fine-tuning

Dato il carattere chiuso di molti degli ultimi LLMs, una quantità significativa di potenza di calcolo viene utilizzata solamente per replicare i risultati di questi modelli. Se questi modelli fossero aperti al pubblico, si potrebbe applicare loro la tecnica conosciuta come fine-tuning. Questo è un metodo con cui solo alcuni dei parametri di un modello pre-addestrato vengono modificati durante una procedura di training a fine-tuning, per specializzare la rete per una particolare attività. Questo processo richiede di solito meno iterazioni di addestramento e quindi consuma meno energia rispetto alla riformazione di una rete intera da zero.

Ecco perché aprire questi modelli al pubblico aiuterebbe non solo le persone che cercano di costruire prodotti con essi, ma anche i ricercatori che li riformano da zero e quindi consumano molta energia che potrebbe essere risparmiata.

Conclusioni

Spero che queste tecniche e metodi vi siano risultati affascinanti quanto lo sono stati per me. È rassicurante e confortante sapere che ci sono persone che stanno attivamente cercando di migliorare queste tecniche su un argomento così importante come il risparmio energetico e l’impronta di carbonio.

Ma non possiamo sederci e rilassarci, delegando la responsabilità di trovare soluzioni ottimizzate ai ricercatori che lavorano su questi argomenti. State per avviare un nuovo progetto? Verificate prima se potete fare il fine-tuning di un modello pre-addestrato. Il vostro hardware è ottimizzato per eseguire algoritmi potati, ma non avete le competenze per applicare efficacemente questa tecnica? Andate là fuori, passate del tempo per imparare oppure trovate qualcuno che abbia già queste competenze. Nel lungo termine, ne varrà la pena, non solo per voi e la vostra azienda, ma per il nostro pianeta Terra nel suo insieme.

Non esitate a seguirmi su Twitter o LinkedIn e fatemi sapere cosa ne pensate di questo articolo, o compratemi un caffè se vi è piaciuto davvero!

Grazie per aver letto!

Riferimenti

[1] “Estimating the carbon footprint of BLOOM, a 176B parameter language model”

[2] “AutoScale: Energy Efficiency Optimization for Stochastic Edge Inference Using Reinforcement Learning”

[3] “Multi-Agent Collaborative Inference Via DNN Decoupling: Intermediate Feature Compression and Edge Learning”

[4] “Approximate Computing for ML: State-of-the-art, Challenges and Visions”

[5] “Lightweight Parameter Pruning for Energy-Efficient Deep Learning: A Binarized Gating Module Approach”

[6] “Pruning for Power: Optimizing Energy Efficiency in IoT with Neural Network Pruning”