L’Intelligenza Artificiale si basa su modelli pre-addestrati che hanno superato una fase di learning in cui grandi dataset tematici sono stati analizzati ed elaborati per fornire capacità di interpretazione. Un modello di intelligenza artificiale cresce nel tempo con diverse fasi di learning costose, onerose e lunghe. Pertanto, una volta pronto, deve possibilmente essere conservato e condiviso.

Hugging Face è una piattaforma che nasce proprio con l’intento di facilitare la pubblicazione e la condivisione di modelli di intelligenza artificiale, ma fa anche molto di più. È un hub completo che, grazie ad una vasta e attivissima community, include tanti strumenti utilizzabili in linguaggio Python come librerie (includendo transformers, tokenizer eccetera), dataset e qualsiasi altro materiale utile per cominiciare a lavorare con l’intelligenza artificiale. HuggingFace è fortemente incentrato sul NLP (Natural Language Processing, Elaborazione del Linguaggio Naturale) che è la culla degli LLM e dell’Intelligenza Artificiale generativa. Proprio questo spiega come mai, nato già come progetto di successo nel 2017, Hugging Face sia oggi un punto di riferimento assoluto dello scenario AI mondiale.

In questo articolo vogliamo esplorare Hugging Face in maniera assolutamente pratica, per mettere aziende, programmatori e curiosi in condizione di iniziare ad apprezzarlo e ricavarne velocemente i primi risultati.

Organizzazione di Hugging Face

Hugging Face è un sito molto vasto, ma le sezioni principali sono tre: Models, Spaces e Datasets.

Schermata del sito Hugging Face con le principali sezioni: Models, Spaces e Dataset

Modelli Hugging Face

Una delle zone più interessanti di Hugging Face è l’archivio di modelli sempre aggiornato, in cui troviamo un elenco di modelli IA, ciascuno ognuno dei quali è identificato con un nome che indica il produttore e il nome del modello separati da uno slash (per esempio: microsoft/phi-2). È possibile, mediante un form di ricerca, applicare filtri per identificare i modelli che rispondono alle nostre specifiche richieste e ci mettano in condizione di perseguire i nostri scopi. A ogni modello corrisponde una pagina web con descrizione, caratteristiche, utilizzi e documentazione varia, nonché statistiche di impiego da parte della community.

La base di modelli presenti in Hugging Face cresce in continuazione ma, come si può immaginare, non tutti saranno progetti attivi e ben mantenuti. Alcuni non sono ottimizzati e altri ancora sono abbandonati, ma l’aspetto social di questo hub permette di comprendere quali utilizzare e qual è il livello di maturità che li contraddistingue.

HuggingSpaces

Gli Hugging Face Spaces, ho HuggingSpaces, sono ambienti runtime in cui i membri della community pubblicano le proprie applicazioni di intelligenza artificiale in modo da poterne dimostrare le funzionalità, sebbene a volte con un’interfaccia un po’ rudimentale. Ci sono al momento più di 100.000 Spaces pronti da esplorare, sperimentare e – se si vuole – scaricare il codice per modificarlo, creare un progetto pilota o farne un’implementazione sul proprio sito o applicazione, nel rispetto delle licenze open source.

Gli ambiti sono tantissimi: si va dall’analisi e generazione di testo alla sostituzione di oggetti nelle immagini, dalla sintesi vocale per il text-to-speech utilizzando voci specifiche ai manichini virtuali per mostrare l’aspetto di una combinazione di vestiti. Nella vastità degli esempi disponibili, è molto probabile trovare uno Space che soddisfi il caso d’uso che si vuole sviluppare.

Hugging Face Dataset

Una raccolta di più di 50.000 dataset per l’addestramento o il fine tuning dei modelli di intelligenza virtuale, classificati per media e destinazione d’uso (testi per NLP, computer vision, audio, dati tabellari o modelli multimodali), ma anche per dimensione, lingua, task specifici e licenza d’uso.

Usare i modelli di Hugging Face con la libreria transformers

Per conoscere questa splendida realtà il modo migliore, come sempre, è quello di iniziare a metterci mano. Cominciamo in questo articolo a vedere come utilizzare i modelli di Hugging Face usando la libreria che ci consente accesso immediato alle migliaia di modelli disponibili.

Come ambiente di lavoro si può optare per una serie di alternative in base alle proprie abitudini ma, nel nostro caso, abbiamo scelto un contesto basato su Python, interamente on line e completo di supporto e librerie per l’Intelligenza Artificiale: Google Colab. Hugging Face può comunque essere usato anche per lavorare in ambienti on-premises o su ambienti cloud differenti.

Quello che dovremo fare sarà importare la libreria che detiene tutti gli strumenti per i transformer, e prima di questo uno dei framework che gli faranno da supporto: nel nostro caso, PyTorch.

Quelle che seguono sono due righe che possono rappresentare un ottimo inizio con Hugging Face (i punti esclamativi all’inizio servono, qualora si utilizzi Colab, a far eseguire il comando su sistema operativo):


!pip install torch
!pip install transformers

Dalla libreria dei transformer, il primo approccio che conviene avere è sicuramente quello con le pipeline. Possiamo considerare questo tipo di oggetto come un’astrazione di meccanismi più complessi che permette di utilizzare direttamente un modello.

Con una pipeline, possiamo affrontare direttamente lavori complessi come il question answering, la traduzione e la classificazione di testo, la sentiment analysis e molto altro.

Noi specificheremo qual è il task che vogliamo affrontare e l’oggetto pipeline cercherà di farcelo svolgere immediatamente utilizzando un modello preimpostato.

Vediamo il caso più diretto possibile.

L’esempio: classificare recensioni con Hugging Face

Diciamo che vogliamo che Hugging Face, mediante una pipeline, ci faccia svolgere un task di classificazione di recensioni commerciali, i commenti che gli utenti di un sito di e-commerce lasciano in risposta ai propri acquisti, per farne una sentiment analysis di base, valutando se si tratti di un commento positivo oppure negativo.

Per semplicità inizieremo il nostro lavoro partendo da una classificazione di testo generico, sebbene esistano modelli specializzati nel linguaggio relativo ad uno specifico settore (politica, commenti sportivi, notizie di finanza e molto altro).

Questo è l’intero codice necessario. Nonostante una brevità sorprendente, ha una enorme efficacia:


from transformers import pipeline
classifier = pipeline("text-classification")

sentences=["The best product I've ever bought",
           "It doesn't work...not recommended"]

result=classifier(sentences)
print(result)

Abbiamo scelto la classificazione di due frasi dal significato opposto (le abbiamo scritte in inglese solo per omogeneità: i modelli in genere sono multilingua e se ne possono sempre creare) e abbiamo chiesto alla pipeline di svolgere un task di text-classification. Ecco i risultati:

[{'label': 'POSITIVE', 'score': 0.9998494386672974}]
[{'label': 'NEGATIVE', 'score': 0.9997959733009338}}]

Quindi, rispettivamente, alla frase “The best product I’ve ever bought” (“Il miglior prodotto che abbia mai comprato”) è associato ad un sentimento POSITIVE, mentre “It doesn’t work…not recommended” (“Non funziona…non consigliato”) è considerato NEGATIVE, in entrambi i casi con una confidenza che si avvicina al 100%.

Niente male, potremmo dire: abbiamo svolto un task così complesso con tre righe di codice ottenendo dei risultati, da un punto di vista logico, assolutamente sensati.

Tuttavia, ci viene mostrato anche un messaggio di warning:

No model was supplied, defaulted to distilbert-base-uncased-finetuned-sst-2-english 
and revision af0f99b (https://huggingface.co/distilbert-base-uncased-finetuned-sst-2-english).
Using a pipeline without specifying a model name and revision in production is not recommended.

che ci avvisa in pratica che:

  • non abbiamo indicato nessun modello;
  • di default, il task è stato svolto con DistilBERT (scelta piuttosto tipica per la text classification essendo un LLM encoder-only) di cui ci viene anche dato il riferimento esplicito comprensivo di revisione;
  • usare una pipeline in produzione (quindi, in un lavoro “vero”) senza indicare esplicitamente il nome del modello da utilizzare e la sua revisione è assolutamente sconsigliato.

Selezionare il modello con cui lavorare in Hugging Face

Quando vogliamo indicare un modello specifico per poter lavorare con Hugging Face possiamo sempre utilizzare sempre una pipeline, ma indicando in questo caso il parametro model.

Se infatti usassimo il seguente codice:

classifier = pipeline("text-classification", 
                       model="distilbert-base-uncased-finetuned-sst-2-english")

indicheremmo esplicitamente che stiamo usando il modello distilbert ricevendo gli stessi risultati ma senza più alcun avviso.

Il parametro model è particolarmente utile quindi per indicare quale modello utilizzare e, con tutti quelli che propone Hugging Face, possiamo ottenere incrementi di prestazioni molto interessanti. Per esempio, visitando il portale, possiamo individuare tutti i modelli specializzati in text-classification, ordinati per numero di download in senso decrescente (quindi partendo dai più scaricati).

A questo punto, senza complicarci troppo la vita, potremmo ripetere il nostro esperimento utilizzando un altro modello: stesso codice ma valore diverso per il parametro model.

Scegliamo, ad esempio, nlptown/bert-base-multilingual-uncased-sentiment un modello multilingua che mira a classificare recensioni attribuendo un certo numero di stelle ad una review testuale.
Con il seguente codice (applicato alle frasi di prima):


classifier = pipeline("text-classification", 
                      model="nlptown/bert-base-multilingual-uncased-sentiment")
result=classifier(sentences)

Otteniamo come risultato:


[{'label': '5 stars', 'score': 0.969106912612915}, 
 {'label': '1 star', 'score': 0.7973095774650574}]

Quindi la prima recensione ha una probabilità del 97% quasi di essere a 5 stelle (“The best product I’ve ever bought”) mentre la seconda (“It doesn’t work…not recommended”) al 79% sarà ad una sola stella.

Anche questo modello, con poche righe ha fornito risultati assolutamente sensati. Basterà creare uno script che fornisca al modello i testi delle recensioni che si vogliono valutare per avere in output una loro classificazione tra positive, negative, punteggio medio in stelle e intervallo di confidenza.

Conclusioni

Al di là dei modelli scelti e dei risultati ottenuti quello che si è voluto dimostrare è che Hugging Face mette a disposizione tantissime risorse costantemente aggiornate, provate e valutate dalla sua community ed il tutto è utilizzabile con grande facilità e senza costi.

Questo non è che l’inizio della sperimentazione che proseguirà, in primis, mettendo alla prova modelli dedicati anche ad altri ambiti dell’Intelligenza Artificiale ma soprattutto continuando lo studio dei suoi strumenti applicativi e delle metodologie da applicare concentrandosi su ottimizzazione e addestramento personalizzato di modelli.