Software

PyTorch 2.0, cos’è, a cosa serve

Uno studio approfondito sul framework nato nei laboratori di ricerca di Facebook FAIR, largamente affermatosi per la sua semplicità d’uso e la velocità. La prima versione è stata rilasciata nel 2017, mentre nel marzo 2023 è arrivata la 2.0. Esaminiamo le nuove features e il confronto con Tensorflow

Pubblicato il 11 Lug 2023

Paolo Dotti

Quence - TXTGROUP

pytorch 2.0

Non basta una frase per definire un framework, ci sono diversi aspetti che si possono evidenziare e tutti ne definiscono una parte. PyTorch è una interfaccia multipiattaforma e scalabile per implementare modelli di machine learning e deep learning. PyTorch è anche un framework open source per lo sviluppo di modelli di apprendimento automatico. Il 15 marzo 2023 è stata rilasciata la versione 2.0.

PyTorch 2.0, come nasce

PyTorch è nato nei laboratori di ricerca sull’intelligenza artificiale di Facebook (FAIR – Facebook AI Research); è noto e si è ampiamente diffuso per la sua semplicità d’uso, flessibilità, velocità. Rilasciato nella sua prima versione nel 2017, include le funzionalità di Torch e Caffe2; nel 2022 viene annunciata la nuova gestione da parte della PyTorch foundation, un’organizzazione indipendente che fa capo al consorzio Linux Foundation. La versione PyTorch 2.0 è stata rilasciata a marzo 2023.

PyTorch è basato sulla libreria Torch, un framework di calcolo scientifico con supporto di algoritmi di machine learning, basato sul linguaggio di scripting LUAJIT e con interfaccia in linguaggio C.

PyTorch, come si può intuire dal nome, ha come interfaccia primaria di sviluppo il linguaggio Python; inoltre è disponibile anche un’interfaccia in C++.

PyTorch è ottimizzato per sfruttare la potenza computazionale di CPU, GPU e TPU; oltre alle CUDA libraries su GPU di schede NVIDIA, supporta anche GPU su hardware e architetture AMD e Apple.

PyTorch è tutto questo e anche di più.

Ad oggi è ampiamente utilizzato per rapide sperimentazioni, in contesti di ricerca, ma anche in molte soluzioni di mercato realizzate da aziende come Tesla e Uber. Dal sito ufficiale di PyTorch si possono consultare diverse applicazioni pratiche Ecosystem | PyTorch che spaziano tra computer vision, natural language processing, modelli transformer, moduli e framework di supporto per implementazioni di modelli complessi di deep learning.

PyTorch, la tecnologia

La tecnologia di PyTorch è sviluppata con un obiettivo primario di usabilità e in secondo luogo di velocità e performance. Imitando lo zen di Python, “explicit is better than implicit”, “simple is better than complex”, lancia “simple over easy”, semplice da comprendere, facile da usare.

PyTorch è costruita per essere integrata in Python, dove può essere utilizzata come un qualsiasi altero modulo al pari dei noti “Numpy”, “Pandas”, “scikik-learn”. Nella pagina ufficiale PyTorch Design Philosophy — PyTorch 2.0 documentation la filosofia di PyTorch.

Il principio alla base di PyTorch, come anche di framework suoi concorrenti, è costituito dai grafi computazionali. Senza entrare in dettagli approfonditi e senza usare il rigore matematico, un grafo è una struttura composta da nodi e archi. Ogni nodo rappresenta un’operazione, che può avere zero, uno o più input e output. Gli archi connettono i nodi e possono essere entranti o uscenti, rappresentando rispettivamente input o output. Tecnicamente PyTorch basa i suoi calcoli su un grafo diretto aciclico (DAG) ovvero un grafo in cui gli archi sono orientati e non ci sono cicli, un nodo non può essere visitato più di una volta.

In figura (dalla documentazione ufficiale di PyTorch) è riportato un esempio di grafo computazionale generato per il calcolo di una funzione w=log(x*y); x,y,v e w sono nodi, le frecce sono gli archi orientati da un nodo di input a un nodo di output e rappresentano il flusso di dati. Questa rappresentazione è molto usata soprattutto nel deep learning perché descrive bene una rete neurale, dove i nodi sono i neuroni e gli archi le connessioni tra essi.

PyTorch 2.0

La struttura dati fondamentale nei framework di apprendimento automatico e soprattutto nel deep learning per eseguire i calcoli, è costituita dai tensori. Il tensore, come inteso in questo contesto, è una entità molto più semplice di quello che sono i tensori in matematica e in fisica. Intendiamo per tensori gli scalari, i vettori, le matrici e così via. Per essere più pratici un tensore di rango 0 è uno scalare, ovvero un numero; il tensore di rango 1 è un vettore; il tensore di rango 2 è una matrice; genericamente un tensore di rango N è una matrice in N dimensioni. I singoli elementi di un tensore sono numeri.

PyTorch 2.0

Per fare un’analogia, possiamo pensare ai tensori come agli “array” in Numpy, con la particolarità che i tensori sono strutture ottimizzate per essere manipolate nelle GPU. I tensori consentono di effettuare operazioni matematiche su molti dati con un’alta efficienza computazionale.

Chi vuole cimentarsi con PyTorch deve prima di tutto familiarizzare con la creazione e manipolazione di tensori; in un secondo momento si può procedere alla creazione di modelli anche complessi e basati sulle reti neurali.

Per approfondire tecnologia e “best practice” nell’uso di PyTorch, la documentazione ufficiale (PyTorch 2.0 | PyTorch) costituisce un buon inizio.

Le nuove features di PyTorch

Più veloce, più “pythonic” e dinamica come sempre. Così inizia il tutorial introduttivo per la versione 2.0 di PyTorch rilasciata a marzo 2023.

Avrebbe dovuto essere la versione 1.14 ma per la tipologia delle nuove funzionalità diventa 2.0; mantiene comunque la retrocompatibilità con le versioni 1.x senza modifiche al codice. Fondamentalmente è stata annunciata l’introduzione di “torch.compile” che aumenta considerevolmente la velocità di compilazione e di training di un modello oltretutto riportando alcune parti di PyTorch da C++ a Python: più veloce e più pythonic. Queste caratteristiche hanno favorito il passaggio del numero di versione a 2.0 invece che 1.14; la roadmap delle release 2.x prevede un continuo incremento in performance e scalabilità.

Nel processo di costruzione di un modello di machine learning e soprattutto in un modello di deep learning, l’addestramento del modello richiede la maggior percentuale di risorse computazionali e la novità di PyTorch 2.0 interviene sulla fase più onerosa del processo ottimizzandolo. Questo fa di PyTorch 2.x una novità da non perdere.

Per usare le nuove funzionalità, la nuova modalità di compilazione, basta aggiungere una linea di codice a quanto già sviluppato e funzionante, perché questo sia ottimizzato e usi il nuovo stack della versione 2.0; con questo si ottiene un incremento di velocità nel training dei modelli da 1.5 a 2 volte.

Oggetti e funzioni in PyTorch, scritti in un codice per versioni precedenti, possono essere ottimizzati semplicemente aggiungendo la chiamata con una linea di codice simile a:

oggetto_compilato = torch.compile( oggetto_da_ottimizzare)

La funzione torch.compile() si appoggia alle tecnologie

  • TorchDynamo (acquisizione veloce del grafo, distinzione tra blocchi compilabili e non)
  • AOTAutograd (evoluzione del precedente modulo Autograd, componente fondamentale per il calcolo dei gradienti)
  • PrimTorch (più di 2000 operatori e primitive disponibili per facilitare lo sviluppo del backend)
  • TorchInductor (un compilatore per deep learning che genera codice veloce per molti acceleratori hardware, GPU e CPU di diverse architetture)

Tutti questi componenti sono scritti in Python e supportano una caratteristica chiave di PyTorch, la possibilità di modificare i tensori “run time” senza dover ricompilare il modello.

Di seguito uno schema, sempre dalla documentazione ufficiale di PyTorch 2.0.

PyTorch 2.0

Il lavoro che esegue la funzione “torch.compile()” si può scomporre in tre fasi, come rappresentato nella figura:

  • graph acquisition, la parte più onerosa comprendente costruzione, calcolo dei gradienti, semplificazione delle operazioni dove possibile.
  • graph lowering, mappa la rappresentazione di un grafo ad alto livello in una rappresentazione a basso livello eliminando ridondanze ottimizzando le performance
  • graph compilation, mappa il modello PyTorch in codice ottimizzato per GPU e CPU.

Tensorflow vs PyTorch 2.0

Sebbene non siano gli unici framework per realizzare modelli di machine learning e di deep learning, PyTorch e Tensorflow sono molto popolari e conosciuti da tutti coloro che si avvicinano ai temi dell’intelligenza artificiale. Inoltre, gli sviluppatori e i data scientist sono sempre attenti alle novità e pronti ai confronti fra due framework concorrenti.

Entrambi i framework offrono caratteristiche similari e di livello paragonabile come:

  • Architettura globale abbastanza complessa ma per gli addetti ai lavori semplice da aggredire
  • Livello di astrazione
  • Buona documentazione, esempi e casi applicativi concreti
  • Disponibilità di modelli pre-addestrati
  • Velocità e performance comparabili
  • API di basso livello.

Alcune differenze sono:

PyTorch è più agevole per attività di debugging, è molto utilizzato in progetti di ricerca per la sua maggiore semplicità di utilizzo e di debugging. Stiamo assistendo a un aumento della popolarità di PyTorch favorito anche dal rilascio della versione 2.0 con l’impegno di una roadmap degna delle novità introdotte.

La scelta di PyTorch è di privilegiare il linguaggio Python mentre Tensorflow offre interfacce abbastanza equivalenti per sviluppare in Python, C++, javascript.

Tensorflow è ancora oggi più adatto in progetti strutturati che vengono rilasciati e manutenuti in produzione. Inoltre, è disponibile il framework di alto livello Keras che permette di sviluppare in Python facilmente e velocemente un modello che in caso di necessità può essere successivamente migrato in Tensorflow.

Tra le differenze è d’obbligo citare la modalità di calcolo con i grafi:

  • PyTorch usa grafi computazionali dinamici, più flessibili, il codice può essere eseguito una linea alla volta e si ha accesso a tutte le variabili; il codice è più semplice da scrivere e riflette la modalità di lavoro con Python. Questa funzionalità è molto utile quando si costruiscono e si addestrano reti neurali.
  • Tensorflow costruisce staticamente il grafo con tutte le operazioni prima dell’esecuzione; ciò rende molto più veloce l’esecuzione dei calcoli ma richiede più sforzo nella codifica e nel debug. Una modifica nel grafo richiede la ricompilazione del modello.

Quello che fa di PyTorch un framework appetibile sono le possibilità di approccio e la semplicità date dalla sua interfaccia Python e la modalità dinamica del grafo computazionale.

Valuta la qualità di questo articolo

La tua opinione è importante per noi!

Articoli correlati