Ciao a tutti, sono Vincenzo Lomonaco, ricercatore all’Università di Pisa.
Nella puntata di oggi parliamo di un tema importantissimo per l’aspetto infrastrutturale e di efficientamento dell’intelligenza artificiale: parliamo di parallelizzazione, un principio computazionale fondamentale nel contesto dell’informatica e quindi anche dell’AI.
È possibile sviluppare soluzioni di AI che sia in fase di addestramento, che durante il loro utilizzo possano essere efficientate tramite la parallelizzazione? Qual è lo stato dell’arte in questa direzione? Scopriamolo insieme in questa puntata di Le Voci dell’AI.
La parallelizzazione è una tecnica fondamentale nell’informatica che consente l’esecuzione simultanea di più calcoli, migliorando significativamente le prestazioni dei sistemi computazionali.
Le origini della parallelizzazione risalgono fino agli anni ’60, con l’introduzione dei primi supercomputer capaci di elaborare più istruzioni contemporaneamente.
Questo approccio è stato successivamente potenziato grazie allo sviluppo dei microprocessori multi-core e delle GPU – Graphics Processing Unit – che hanno reso accessibile la parallelizzazione anche su scala personale e commerciale.
La sua importanza è cruciale in vari campi, non solo quello dell’intelligenza artificiale, come la simulazione scientifica, l’analisi dei dati e la modellizzazione climatica, dove la velocità dell’elaborazione è essenziale.
La parallelizzazione permette quindi di scomporre problemi complessi in sottoproblemi più piccoli e gestibili in parallelo, che vengono quindi risolti contemporaneamente riducendo drasticamente i tempi di calcolo.
Tecniche come il parallel computing, il distributed computing e il concurrent computing sono diventate quindi pilastri architetturali dei moderni sistemi informatici.
Inoltre, lo sviluppo di linguaggi di programmazione e di framework specifici come CUDA per le GPU ed MPI – Message Passing Interface – per il calcolo distribuito ha ulteriormente facilitato l’adozione della parallelizzazione.
È bene sottolineare che la parallelizzazione non riduce necessariamente il dispendio energetico di un sistema, anzi, ma serve principalmente a velocizzare l’elaborazione dei dati.
Quando più processori lavorano contemporaneamente su diverse parti di un problema, l’energia totale consumata può aumentare a causa dello overhead di coordinazione e comunicazione tra i processori.
Tuttavia, il vantaggio principale della parallelizzazione è lo speed-up, ovvero la riduzione del tempo di calcolo rispetto all’esecuzione sequenziale dello stesso algoritmo.
Quindi il concetto di speed-up è proprio misurato come il rapporto tra il tempo impiegato da un algoritmo sequenziale e quello impiegato dallo stesso algoritmo in parallelo.
La scalabilità
Un altro concetto fondamentale per la parallelizzazione è invece la capacità di un sistema parallelo di migliorare le sue prestazioni, con l’aggiunta di più processori.
Un sistema è considerato quindi scalabile se l’aumento del numero di processori porta a un incremento proporzionale delle prestazioni.
Tuttavia, va precisato che non tutti i problemi e gli algoritmi si adattano bene alla parallelizzazione.
I problemi definiti come embarrassingly parallel sono quelli che possono essere facilmente suddivisi in sottoproblemi indipendenti tra loro, quindi che si prestano particolarmente bene a un’esecuzione parallela.
Questi problemi, quindi, ideali per la parallelizzazione, danno la possibilità di minimizzare anche le comunicazioni tra i diversi processori e ridurre quindi l’overhead, ottenendo un significativo sfidato e un’importante scalabilità.
Esempi di problemi in parallelo includono il rendering di immagini o la ricerca in grandi database.
Il principio computazionale della parallelizzazione è quindi cruciale per l’avanzamento dell’intelligenza artificiale.
Molti algoritmi di AI, specialmente quelli basati sull’apprendimento profondo e quindi su reti neurali artificiali, richiedono l’elaborazione di enormi quantità di dati e l’esecuzione di calcoli complessi.
La parallelizzazione permette di distribuire questi compiti su più processori o unità di elaborazione grafica, quindi su GPU, diminuendo significativamente il tempo di addestramento e di inferenza.
Quindi, durante l’utilizzo di questi modelli, durante l’addestramento di reti neurali, per esempio, i calcoli relativi ai gradienti e alle operazioni matriciali possono essere suddivisi e gestiti simultaneamente da molteplici core della CPU o GPU.
Questo non solo riduce il tempo necessario per completare l’addestramento, ma permette anche di lavorare con modelli più complessi e più grandi e con un numero maggiore di dati, quindi migliorando in ultima analisi anche le capacità predittive, la precisione di questi modelli e soluzioni di intelligenza artificiale.
Inoltre, la parallelizzazione consente di eseguire in tempo reale applicazioni di AI come il riconoscimento vocale, la visione artificiale e l’elaborazione del linguaggio naturale.
Senza la parallelizzazione tante applicazioni richiederebbero tempi di calcolo troppo lunghi per essere pratiche.
Strumenti software come TensorFlow e Torch sono progettati per sfruttare la parallelizzazione, facilitando l’implementazione, la prototipazione, l’ottimizzazione di algoritmi di AI su hardware parallelo.
In sostanza, la realizzazione non solo accelera l’AI, ma espande le sue potenzialità, permettendo innovazioni rapide e applicazioni via via più sofisticate.
Ma perché la parallelizzazione risulta così utile e fondamentale per le reti neurali artificiali del deep learning, tant’è che senza di essa sarebbe impossibile pensare a soluzioni basate su queste tecnologie? In questa immagine ne capiamo subito il motivo.
Una rete neurale non è nient’altro che la composizione in un grafo direzionato di una serie di neuroni qui evidenziati con dei cerchietti.
Ogni neurone è il risultato della combinazione lineare del valore dei neuroni dei livelli precedenti, quindi la somma dei prodotti tra ogni valore I e il suo corrispettivo peso W.
La modulazione di questo segnale di input all’interno del grafo costituisce la computazione che poi ci porta a una predizione finale, quello di cui abbiamo bisogno per la nostra applicazione. L’apprendimento consiste nella variazione dei pesi W tra le connessioni dei neuroni.
Sostanzialmente, tutte queste operazioni possono essere riassunte comodamente in semplicissime moltiplicazioni matriciali, alla base dell’algebra lineare. Una moltiplicazione matriciale può essere facilmente parallelizzata.
Intuitivamente, il calcolo del valore di un neurone è completamente indipendente da quello di un neurone adiacente dello stesso livello. Quindi queste operazioni possono essere fatte in parallelo.
In questo grafico vediamo anche solo in’inferenza, senza la parte di addestramento, il vantaggio significativo nell’uso delle GPU rispetto a una CPU di riferimento per l’utilizzo di una soluzione di AI.
Una Tesla V100, quindi con un costo inferiore ai 1.000 €, risulta addirittura 47 volte più veloce di una CPU Xeon E5, mentre una Tesla P100 ha un vantaggio di circa 15 volte.
Capiamo quindi il perché del grande successo di Nvidia, uno dei maggiori produttori di GPU sulla Terra e della sua capitalizzazione in borsa, che ha aumentato negli ultimi cinque anni di più di 2000 volte. Pensate il suo valore.
Giusto per capire meglio i tempi, l’addestramento di modelli fondazionali, lo stato dell’arte su una GPU Nvidia di ultima generazione, come per esempio una V100, può richiedere da giorni a qualche settimana e a seconda della complessità del modello, della dimensione del dataset per il training.
In confronto lo stesso addestramento su CPU può richiedere mesi o addirittura essere impraticabile per modelli molto grandi, visti i tempi troppo lunghi rispetto alla necessità applicativa.
Per quanto riguarda l’inferenza, quindi semplicemente la predizione, le GPU possono elaborare richieste in millisecondi, mentre un sistema su CPU può impiegare diversi secondi, quindi rendendo le GPU essenziali per le applicazioni in tempo reale, per esempio la guida autonoma.
In questa puntata abbiamo discusso dell’importanza della parallelizzazione nel contesto dell’intelligenza artificiale e di come soluzioni basate su GPU per l’addestramento e l’inferenza siano fondamentali per sostenere il progresso in quest’area.
Ovviamente la parallelizzazione non è esclusiva di grandi super computer o di acceleratori specifici su dispositivi singoli.
La distribuzione del carico di lavoro computazionale può essere vista sicuramente su più livelli, dove è un insieme di dispositivi hardware, anche eterogenei tra loro, che offrono una sorta di piattaforma computazionale per soluzioni di AI distribuite e facilmente decentralizzate.
Questa idea, molto più allineata anche al grande successo dei microservizi nell’informatica moderna, sarà sicuramente al centro dell’intelligenza parallela del futuro.
Ciao e alla prossima puntata di Le Voci dell’AI!