Guida completa per principianti agli strumenti LLM di Hugging Face

Guida completa agli strumenti LLM di Hugging Face per principianti

Hugging Face è un laboratorio di ricerca e un centro che ha costruito una comunità di studiosi, ricercatori e appassionati di intelligenza artificiale. In breve tempo, Hugging Face ha ottenuto una presenza significativa nel campo dell’IA. Giganti della tecnologia come Google, Amazon e Nvidia hanno sostenuto la startup Hugging Face con investimenti significativi, portando la sua valutazione a 4,5 miliardi di dollari.

In questa guida, presenteremo i transformer, gli LLM e come la libreria Hugging Face svolge un ruolo importante nel favorire una comunità di intelligenza artificiale open source. Esploreremo anche le funzionalità essenziali di Hugging Face, tra cui pipeline, dataset, modelli e altro ancora, con esempi pratici in Python.

Transformer in NLP

Nel 2017, l’Università di Cornell ha pubblicato un influente articolo che ha introdotto i transformer. Questi sono modelli di deep learning utilizzati in NLP. Questa scoperta ha alimentato lo sviluppo di grandi modelli di linguaggio come ChatGPT.

I grandi modelli di linguaggio o LLM sono sistemi di intelligenza artificiale che utilizzano i transformer per comprendere e creare testi simili a quelli umani. Tuttavia, la creazione di questi modelli è costosa e richiede spesso milioni di dollari, limitando la loro accessibilità alle grandi aziende.

Hugging Face, fondata nel 2016, si propone di rendere i modelli di NLP accessibili a tutti. Nonostante sia un’azienda commerciale, offre una serie di risorse open source che aiutano persone e organizzazioni a costruire e utilizzare modelli di transformer in modo conveniente. L’apprendimento automatico consiste nell’insegnare ai computer a svolgere compiti riconoscendo schemi, mentre il deep learning, una sotto-categoria dell’apprendimento automatico, crea una rete che apprende in modo indipendente. I transformer sono un tipo di architettura di deep learning che utilizza in modo efficace e flessibile i dati di input, rendendoli una scelta popolare per la creazione di grandi modelli di linguaggio grazie a minori requisiti di tempo di addestramento.

Come Hugging Face facilita progetti di NLP e LLM

Hugging Face ha reso più semplice lavorare con LLM offrendo:

  1. Una serie di modelli pre-addestrati tra cui scegliere.
  2. Strumenti ed esempi per adattare questi modelli alle tue esigenze specifiche.
  3. Opzioni di deployment facili per vari ambienti.

Una risorsa molto utile offerta da Hugging Face è la Open LLM Leaderboard. Funzionando come una piattaforma completa, monitora, classifica e valuta l’efficienza di una serie di grandi modelli di linguaggio (LLM) e chatbot, fornendo un’analisi accurata degli sviluppi nel dominio open source.

LLM Benchmarks misura i modelli attraverso quattro metriche:

  • AI2 Reasoning Challenge (25-shot) – una serie di domande basate sul programma di scienze elementari.
  • HellaSwag (10-shot) – un test di inferenza di senso comune che, sebbene semplice per gli esseri umani, rappresenta una sfida significativa per i modelli all’avanguardia.
  • MMLU (5-shot) – una valutazione complessa che tocca la competenza di un modello di testo in 57 domini diversi, tra cui matematica di base, legge, informatica e altri.
  • TruthfulQA (0-shot) – uno strumento per valutare la tendenza di un modello a ripetere disinformazione online frequentemente incontrata.

Le metriche, che vengono descritte utilizzando termini come “25-shot”, “10-shot”, “5-shot” e “0-shot”, indicano il numero di esempi di input che vengono forniti a un modello durante il processo di valutazione per valutarne le prestazioni e le capacità di ragionamento in vari domini. Nei paradigmi “few-shot”, ai modelli vengono forniti un piccolo numero di esempi per guidare le loro risposte, mentre in un contesto “0-shot”, i modelli non ricevono esempi e devono fare affidamento esclusivamente sulla loro conoscenza preesistente per rispondere in modo appropriato.

Componenti di Hugging Face

Pipelines

‘Pipelines’ fanno parte della libreria transformers di Hugging Face, una caratteristica che aiuta nell’utilizzo semplice dei modelli pre-addestrati disponibili nel repository di Hugging Face. Fornisce un’API intuitiva per una serie di compiti, tra cui analisi del sentiment, risposta alle domande, modellazione del linguaggio mascherato, riconoscimento delle entità denominate e riassunto.

Le pipelines integrano tre componenti centrali di Hugging Face:

  1. Tokenizer: Prepara il testo per il modello convertendolo in un formato comprensibile dal modello stesso.
  2. Modello: Questo è il cuore della pipeline, dove vengono effettuate le previsioni effettive in base all’input pre-elaborato.
  3. Post-processore: Trasforma le previsioni grezze del modello in una forma leggibile dall’uomo.

Questi pipeline non solo riducono l’uso intensivo del codice, ma offrono anche un’interfaccia utente intuitiva per completare varie attività di elaborazione del linguaggio naturale.

Applicazioni dei Transformer utilizzando la libreria Hugging Face

Un punto di forza della libreria Hugging Face è la libreria Transformers, che semplifica le attività di elaborazione del linguaggio naturale collegando un modello con le necessarie fasi di pre e post-elaborazione, razionalizzando il processo di analisi. Per installare ed importare la libreria, utilizzare i seguenti comandi:

pip install -q transformers
from transformers import pipeline

Dopo aver fatto ciò, è possibile eseguire attività di elaborazione del linguaggio naturale a partire dall’analisi del sentiment, che categorizza il testo in sentimenti positivi o negativi. La potente funzione pipeline() della libreria funge da hub che comprende altri pipeline e facilita l’applicazione di attività specifiche in ambito audio, visione e multimodale.

Applicazioni Pratiche

Classificazione del Testo

La classificazione del testo diventa un gioco da ragazzi con la funzione pipeline() di Hugging Face. Ecco come è possibile avviare un pipeline di classificazione del testo:

classifier = pipeline("text-classification")

Per un’esperienza pratica, alimentare una stringa o una lista di stringhe nel proprio pipeline per ottenere previsioni, che possono essere facilmente visualizzate utilizzando la libreria Pandas di Python. Di seguito è riportato un esempio di codice Python che dimostra questo:

sentences = ["Sono entusiasta di introdurti nel meraviglioso mondo dell'AI.",
"Spero che non ti deluda."]
# Ottenere i risultati della classificazione per ogni frase nella lista
results = classifier(sentences)
# Scorrere ogni risultato e stampare l'etichetta e il punteggio
for i, result in enumerate(results):
print(f"Risultato {i + 1}:")
print(f" Etichetta: {result['label']}")
print(f" Punteggio: {round(result['score'], 3)}\n")

Output

Risultato 1: 
Etichetta: POSITIVO 
Punteggio: 1.0 
Risultato 2: 
Etichetta: POSITIVO 
Punteggio: 0.996 

Riconoscimento delle Entità Nominative (NER)

Il NER è fondamentale per estrarre oggetti reali definiti ‘entità nominative’ dal testo. Utilizzare il pipeline NER per identificare queste entità in modo efficace:

ner_tagger = pipeline("ner", aggregation_strategy="simple")
text = "Elon Musk è il CEO di SpaceX."
outputs = ner_tagger(text)
print(outputs)

Output

 Risultato 1: Etichetta: POSITIVO Punteggio: 1.0 Risultato 2: Etichetta: POSITIVO Punteggio: 0.996 

Risposta alle Domande

La risposta alle domande consiste nell’estrazione di risposte precise a domande specifiche da un determinato contesto. Inizializzare un pipeline di risposta alle domande e inserire la domanda e il contesto desiderati per ottenere la risposta desiderata:

reader = pipeline("question-answering")
text = "Hugging Face è un'azienda che crea strumenti per l'elaborazione del linguaggio naturale. Ha sede a New York ed è stata fondata nel 2016."
question = "Dove ha sede Hugging Face?"
outputs = reader(question=question, context=text)
print(outputs)

Output

 {'score': 0.998, 'start': 51, 'end': 60, 'answer': 'New York'} 

La funzione pipeline di Hugging Face offre una serie di pipeline predefinite per diverse attività, oltre alla classificazione del testo, al NER e alla risposta alle domande. Di seguito sono riportati i dettagli su un sottoinsieme delle attività disponibili:

Tabella: Attività delle Pipeline Hugging Face

Attività Descrizione Identificatore della Pipeline
Generazione del Testo Generare testo basato su un prompt fornito pipeline(task=“text-generation”)
Sommario Sommariare un testo lungo o un documento pipeline(task=“summarization”)
Classificazione dell’Immagine Etichettare un’immagine di input pipeline(task=“image-classification”)
Classificazione Audio Categorizzare dati audio pipeline(task=“audio-classification”)
Risposta alle Domande Visive Rispondere a una domanda utilizzando sia un’immagine che una domanda pipeline(task=“vqa”)

 

Per descrizioni dettagliate e ulteriori attività, fare riferimento alla documentazione della pipeline sul sito web di Hugging Face.

Perché Hugging Face sta spostando il suo focus su Rust

Pagina GitHub di Hugging Face Safetensors e tokenizer

L’ecosistema Hugging Face (HF) ha iniziato a utilizzare Rust nelle sue librerie come safetensors e tokenizers.

Hugging Face ha recentemente rilasciato anche un nuovo framework di machine learning chiamato Candle. A differenza dei framework tradizionali che utilizzano Python, Candle è costruito con Rust. L’obiettivo di utilizzare Rust è migliorare le prestazioni e semplificare l’esperienza dell’utente supportando le operazioni GPU.

L’obiettivo principale di Candle è facilitare l’inferenza senza server, rendendo possibile il deployment di binari leggeri e rimuovendo Python dai carichi di lavoro di produzione, che a volte possono rallentare i processi a causa dei suoi overhead. Questo framework è una soluzione per superare i problemi riscontrati con i framework completi di machine learning come PyTorch, che sono grandi e lenti nella creazione di istanze su un cluster.

Esploriamo perché Rust sta diventando una scelta preferita molto più di Python.

  1. Velocità e Prestazioni – Rust è noto per la sua incredibile velocità, superando Python, che è tradizionalmente utilizzato nei framework di machine learning. Le prestazioni di Python possono talvolta essere rallentate a causa del Global Interpreter Lock (GIL), ma Rust non affronta questo problema, promettendo un’esecuzione più rapida delle attività e, di conseguenza, un miglioramento delle prestazioni nei progetti in cui è implementato.
  2. Sicurezza – Rust fornisce garanzie di sicurezza della memoria senza un garbage collector, un aspetto essenziale per garantire la sicurezza dei sistemi concorrenti. Questo svolge un ruolo cruciale in aree come safetensors, dove la sicurezza nella gestione delle strutture dati è una priorità.

Safetensors

I Safetensors beneficiano della velocità e delle caratteristiche di sicurezza di Rust. Safetensors coinvolge la manipolazione di tensori, un’entità matematica complessa, e l’utilizzo di Rust garantisce che le operazioni siano non solo veloci, ma anche sicure, evitando bug comuni e problemi di sicurezza che potrebbero derivare da una gestione errata della memoria.

Tokenizer

I tokenizzatori gestiscono la divisione di frasi o frasi in unità più piccole, come parole o termini. Rust aiuta in questo processo accelerando il tempo di esecuzione, garantendo che il processo di tokenizzazione sia non solo accurato ma anche rapido, migliorando l’efficienza delle attività di elaborazione del linguaggio naturale.

Alla base del tokenizzatore di Hugging Face c’è il concetto di tokenizzazione a livello di sotto-parola, che trova un equilibrio delicato tra la tokenizzazione a livello di parola e a livello di carattere per ottimizzare la conservazione delle informazioni e la dimensione del vocabolario. Funziona attraverso la creazione di sotto-token, come “##ing” e “##ed”, mantenendo la ricchezza semantica evitando un vocabolario gonfio.

La tokenizzazione a livello di sotto-parola coinvolge una fase di addestramento per identificare il bilanciamento più efficace tra la tokenizzazione a livello di carattere e a livello di parola. Va oltre le semplici regole di prefisso e suffisso, richiedendo un’analisi completa dei modelli linguistici in corpus di testo estesi per progettare un tokenizzatore a livello di sotto-parola efficiente. Il tokenizzatore generato è in grado di gestire parole nuove suddividendole in sotto-parole note, mantenendo un alto livello di comprensione semantica.

Componenti di Tokenizzazione

https://huggingface.co/learn/nlp-course/chapter6/4

La libreria di tokenizzazione divide il processo di tokenizzazione in diverse fasi, ognuna delle quali affronta un aspetto distintivo della tokenizzazione. Approfondiamo queste componenti:

  • Normalizzatore: Effettua le trasformazioni iniziali sulla stringa di input, applicando gli aggiustamenti necessari come la conversione in minuscolo, la normalizzazione Unicode e la rimozione dei caratteri.
  • PreTokenizer: Responsabile della frammentazione della stringa di input in pre-segmenti, determinando le suddivisioni in base a regole predefinite, come la delimitazione degli spazi.
  • Modello: Supervisiona la scoperta e la creazione di sotto-token, adattandosi alle specificità dei dati di input e offrendo capacità di addestramento.
  • Post-Processor: Migliora le funzionalità di costruzione per facilitare la compatibilità con molti modelli basati su trasformatori, come BERT, aggiungendo token come [CLS] e [SEP].

Per iniziare con Hugging Face tokenizers, installa la libreria usando il comando pip install tokenizers ed importala nel tuo ambiente Python. La libreria può tokenizzare grandi quantità di testo in tempi molto brevi, risparmiando così preziose risorse computazionali per attività più intensive come l’addestramento dei modelli.

La libreria tokenizers utilizza Rust che eredita la similarità sintattica di C++ introducendo al contempo concetti nuovi nella progettazione dei linguaggi di programmazione. Insieme ai binding di Python, assicura che tu possa godere delle prestazioni di un linguaggio di livello inferiore mentre lavori in un ambiente Python.

Dataset

Hugging Face offre una vasta gamma di dataset adatti a una serie di compiti di NLP e altro ancora. Per utilizzarli in modo efficiente, è essenziale capire il processo di caricamento e analisi degli stessi. Di seguito è riportato uno script Python ben commentato che mostra come esplorare i dataset disponibili su Hugging Face:

from datasets import load_dataset
# Carica un dataset
dataset = load_dataset('squad')
# Mostra la prima voce
print(dataset[0])

Questo script utilizza la funzione load_dataset per caricare il dataset SQuAD, che è una scelta popolare per i compiti di domanda-risposta.

Sfruttare i modelli pre-addestrati e mettere tutto insieme

I modelli pre-addestrati costituiscono la base di molti progetti di deep learning, consentendo ai ricercatori e agli sviluppatori di avviare le proprie iniziative senza partire da zero. Hugging Face facilita l’esplorazione di una vasta gamma di modelli pre-addestrati, come mostrato nel codice qui sotto:

from transformers import AutoModelForQuestionAnswering, AutoTokenizer
# Carica il modello e il tokenizer pre-addestrati
model = AutoModelForQuestionAnswering.from_pretrained('bert-large-uncased-whole-word-masking-finetuned-squad')
tokenizer = AutoTokenizer.from_pretrained('bert-large-uncased-whole-word-masking-finetuned-squad')
# Mostra l'architettura del modello
print(model)

Con il modello e il tokenizer caricati, possiamo ora procedere a creare una funzione che prende in input un pezzo di testo e una domanda e restituisce la risposta estratta dal testo. Utilizzeremo il tokenizer per elaborare il testo e la domanda in un formato compatibile con il modello, e quindi passeremo questo input elaborato al modello per ottenere la risposta:

def get_answer(testo, domanda):
    # Tokenizza il testo e la domanda in input
    input = tokenizer(domanda, testo, return_tensors='pt', max_length=512, truncation=True)
    output = model(**input)
    # Ottieni i punteggi di inizio e fine per la risposta
    inizio_risposta = torch.argmax(output.start_logits)
    fine_risposta = torch.argmax(output.end_logits) + 1
    risposta = tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(input['input_ids'][0][inizio_risposta:fine_risposta]))
    return risposta

Nello snippet di codice, importiamo i moduli necessari dal pacchetto transformers, quindi carichiamo un modello pre-addestrato e il relativo tokenizer utilizzando il metodo from_pretrained. Scegliamo un modello BERT addestrato sul dataset SQuAD.

Vediamo un esempio di utilizzo di questa funzione in cui abbiamo un paragrafo di testo e vogliamo estrarre una risposta specifica a una domanda da esso:

testo = """
La Torre Eiffel, situata a Parigi, Francia, è uno dei monumenti più iconici al mondo. Fu progettata da Gustave Eiffel e completata nel 1889. La torre si erge ad un'altezza di 324 metri ed era la struttura artificiale più alta del mondo al momento del suo completamento.
"""
domanda = "Chi ha progettato la Torre Eiffel?"
# Ottieni la risposta alla domanda
risposta = get_answer(testo, domanda)
print(f"La risposta alla domanda è: {risposta}")
# Output: La risposta alla domanda è: Gustave Eiffel

In questo script, creiamo una funzione get_answer che prende in input un testo e una domanda, li tokenizza correttamente e utilizza il modello BERT pre-addestrato per estrarre la risposta dal testo. Dimostra un’applicazione pratica della libreria transformers di Hugging Face per costruire un sistema di domanda-risposta semplice ma potente. Per comprendere bene i concetti, si consiglia di sperimentare in modo pratico utilizzando un notebook Google Colab.

Conclusione

Attraverso la sua vasta gamma di strumenti open-source, modelli pre-addestrati e pipeline user-friendly, consente sia ai professionisti esperti che ai neofiti di immergersi nel vasto mondo dell’IA con una sensazione di facilità e comprensione. Inoltre, l’iniziativa di integrare Rust, grazie alla sua velocità e alle sue caratteristiche di sicurezza, sottolinea l’impegno di Hugging Face nel favorire l’innovazione garantendo efficienza e sicurezza nelle applicazioni di IA. Il lavoro trasformativo di Hugging Face non solo democratizza l’accesso agli strumenti di IA di alto livello, ma favorisce anche un ambiente collaborativo per l’apprendimento e lo sviluppo nel settore dell’IA, facilitando un futuro in cui l’IA sia accessibile a tutti.