Approfondimento Vision Transformers su Hugging Face Optimum Graphcore

Vision Transformers su Hugging Face Optimum Graphcore - an in-depth analysis.

Questo post del blog mostrerà quanto sia facile ottimizzare modelli Transformer pre-addestrati per i tuoi dati utilizzando la libreria Optimum di Hugging Face su processori di intelligenza Graphcore (IPU). Come esempio, mostreremo una guida passo-passo e forniremo un notebook che utilizza un ampio dataset di raggi X del torace ampiamente utilizzato per addestrare un modello vision transformer (ViT).

Introduzione ai modelli vision transformer (ViT)

Nel 2017 un gruppo di ricercatori di intelligenza artificiale di Google ha pubblicato un articolo che introduce l’architettura del modello transformer. Caratterizzati da un nuovo meccanismo di auto-attenzione, i transformer sono stati proposti come un nuovo ed efficiente gruppo di modelli per applicazioni di linguaggio. Infatti, negli ultimi cinque anni, i transformer hanno visto una popolarità esplosiva e sono ora accettati come lo standard de facto per il processing del linguaggio naturale (NLP).

I transformer per il linguaggio sono forse più noti per le famiglie di modelli GPT e BERT in continua evoluzione. Entrambi possono essere eseguiti facilmente ed efficientemente su IPUs Graphcore come parte della crescente libreria Optimum di Hugging Face Graphcore).

Una spiegazione approfondita dell’architettura del modello transformer (con un focus su NLP) può essere trovata sul sito web di Hugging Face.

Anche se i transformer hanno avuto successo iniziale nel linguaggio, sono estremamente versatili e possono essere utilizzati per una serie di altri scopi, compresa la visione computerizzata (CV), come vedremo in questo post del blog.

CV è un’area in cui le reti neurali convoluzionali (CNN) sono senza dubbio l’architettura più popolare. Tuttavia, l’architettura vision transformer (ViT), introdotta per la prima volta in un articolo del 2021 di Google Research, rappresenta una svolta nel riconoscimento delle immagini e utilizza lo stesso meccanismo di auto-attenzione di BERT e GPT come suo componente principale.

Mentre BERT e altri modelli di elaborazione del linguaggio basati su transformer prendono in input una frase (cioè una lista di parole), i modelli ViT dividono un’immagine di input in diversi piccoli frammenti, equivalenti a singole parole nell’elaborazione del linguaggio. Ogni frammento viene codificato linearmente dal modello transformer in una rappresentazione vettoriale che può essere elaborata singolarmente. Questo approccio di suddividere le immagini in frammenti, o token visivi, si contrappone agli array di pixel utilizzati dalle CNN.

Grazie all’addestramento pregresso, il modello ViT apprende una rappresentazione interna delle immagini che può poi essere utilizzata per estrarre caratteristiche visive utili per i compiti successivi. Ad esempio, è possibile addestrare un classificatore su un nuovo dataset di immagini etichettate posizionando uno strato lineare sopra l’encoder visivo pre-addestrato. In genere si posiziona uno strato lineare sopra il token [CLS], poiché l’ultimo stato nascosto di questo token può essere considerato come una rappresentazione di un’intera immagine.

Rispetto alle CNN, i modelli ViT hanno mostrato una maggiore precisione di riconoscimento con un costo computazionale inferiore e vengono utilizzati in una serie di applicazioni, tra cui la classificazione delle immagini, il rilevamento degli oggetti e la segmentazione. I casi d’uso nel settore sanitario includono la rilevazione e la classificazione per COVID-19, fratture del femore, enfisema, cancro al seno e malattia di Alzheimer, tra molti altri.

Modelli ViT: perfetti per le IPU

Le IPU di Graphcore si adattano particolarmente bene ai modelli ViT grazie alla loro capacità di parallelizzare l’addestramento utilizzando una combinazione di pipelining dei dati e parallelismo del modello. L’accelerazione di questo processo massivamente parallelo è resa possibile dall’architettura MIMD delle IPU e dalla soluzione di scalabilità basata sulla IPU-Fabric.

Introducendo il parallelismo della pipeline, la dimensione del batch che può essere elaborata per ogni istanza del parallelismo dei dati viene aumentata, l’efficienza di accesso dell’area di memoria gestita da una IPU viene migliorata e il tempo di comunicazione dell’aggregazione dei parametri per l’apprendimento parallelo dei dati viene ridotto.

Grazie all’aggiunta di una gamma di modelli transformer pre-ottimizzati alla libreria open-source Optimum di Hugging Face Graphcore, è estremamente facile raggiungere un elevato grado di prestazione ed efficienza durante l’esecuzione e l’ottimizzazione dei modelli come ViT su IPUs.

Attraverso Hugging Face Optimum, Graphcore ha rilasciato checkpoint di modelli addestrati su IPU e file di configurazione pronti all’uso per rendere facile l’addestramento di modelli con massima efficienza. Questo è particolarmente utile poiché i modelli ViT richiedono generalmente un addestramento pregresso su una grande quantità di dati. Questa integrazione consente di utilizzare i checkpoint rilasciati dagli stessi autori originali all’interno dell’hub di modelli di Hugging Face, quindi non sarà necessario addestrarli personalmente. Consentendo agli utenti di collegare e utilizzare qualsiasi dataset pubblico, Optimum abbrevia il ciclo di sviluppo complessivo dei modelli di intelligenza artificiale e consente un’integrazione senza soluzione di continuità con l’hardware all’avanguardia di Graphcore, offrendo un tempo di valore più rapido.

Per questo post del blog, utilizzeremo un modello ViT pre-addestrato su ImageNet-21k, basato sul documento Un’immagine vale 16×16 parole: trasformatori per il riconoscimento delle immagini su larga scala di Dosovitskiy et al. Come esempio, ti mostreremo il processo di utilizzo di Optimum per affinare ViT sul dataset ChestX-ray14.

Il valore dei modelli ViT per la classificazione dei raggi X

Come per tutte le attività di imaging medico, i radiologi impiegano molti anni per imparare a individuare in modo affidabile ed efficiente i problemi e fare diagnosi tentative basate sulle immagini dei raggi X. In larga misura, questa difficoltà deriva dalle differenze molto minute e dalle limitazioni spaziali delle immagini, motivo per cui le tecniche di rilevazione e diagnosi assistite dal computer (CAD) hanno mostrato un grande potenziale per migliorare i flussi di lavoro dei clinici e i risultati dei pazienti.

Allo stesso tempo, lo sviluppo di qualsiasi modello per la classificazione dei raggi X (ViT o altro) comporterà una serie di sfide:

  • L’addestramento di un modello da zero richiede una grande quantità di dati etichettati;
  • I requisiti di alta risoluzione e volume richiedono un’elaborazione potente per addestrare tali modelli; e
  • La complessità dei problemi multi-classe e multi-etichetta come la diagnosi polmonare è esponenzialmente complessa a causa del numero di categorie di malattie.

Come accennato in precedenza, per il nostro scopo di dimostrazione utilizzando Hugging Face Optimum, non abbiamo bisogno di addestrare ViT da zero. Invece, utilizzeremo i pesi del modello ospitati nel model hub di Hugging Face.

Poiché un’immagine a raggi X può presentare più malattie, lavoreremo con un modello di classificazione multi-etichetta. Il modello in questione utilizza i checkpoint di google/vit-base-patch16-224-in21k. È stato convertito dal repository TIMM e pre-addestrato su 14 milioni di immagini da ImageNet-21k. Per parallelizzare e ottimizzare il lavoro per IPU, la configurazione è stata resa disponibile tramite la scheda del modello Graphcore-ViT.

Se è la prima volta che si utilizzano le IPU, leggere la Guida del programmatore IPU per apprendere i concetti di base. Per eseguire il proprio modello PyTorch su IPU, consultare il tutorial di base di PyTorch e imparare come utilizzare Optimum tramite i nostri Quaderni Hugging Face Optimum.

Addestramento di ViT sul dataset ChestXRay-14

Prima di tutto, dobbiamo scaricare il dataset di radiografie del torace del National Institutes of Health (NIH) Clinical Center. Questo dataset contiene 112.120 radiografie frontali deidentificate da 30.805 pazienti nel periodo dal 1992 al 2015. Il dataset copre una serie di 14 malattie comuni basate su etichette estratte dal testo dei referti radiologici utilizzando tecniche di NLP.

Configurazione dell’ambiente

Ecco i requisiti per eseguire questa guida:

  • Un server Jupyter Notebook con l’ultima versione di Poplar SDK e un ambiente PopTorch abilitato (vedere la nostra guida sull’utilizzo delle IPU dai notebook Jupyter)
  • Il notebook di addestramento ViT dal repository Graphcore Tutorials

Il repository Graphcore Tutorials contiene il notebook tutorial passo-passo e lo script Python discusso in questa guida. Clonare il repository e avviare il notebook walkthrough.ipynb trovato in tutorials / tutorials / pytorch / vit_model_training/.

Abbiamo reso ancora più facile e creato l’HG Optimum Gradient in modo da poter avviare il tutorial di avvio rapido in Free IPUs. Registrati e avvia l’esecuzione:

Ottenere il dataset

Scaricare la directory /images del dataset. È possibile utilizzare bash per estrarre i file: for f in images*.tar.gz; do tar xfz "$f"; done.

Inoltre, scaricare il file Data_Entry_2017_v2020.csv, che contiene le etichette. Per impostazione predefinita, il tutorial si aspetta che la cartella /images e il file .csv siano nella stessa cartella dello script in esecuzione.

Una volta che il tuo ambiente Jupyter ha i dataset, è necessario installare e importare l’ultima versione del pacchetto Hugging Face Optimum Graphcore e altre dipendenze nel file requirements.txt:

%pip install -r requirements.txt

` `

Le esami contenuti nel dataset Chest X-ray consistono in immagini a raggi X (scala di grigi, 224×224 pixel) con metadati corrispondenti: Finding Labels, Follow-up #,Patient ID, Patient Age, Patient Gender, View Position, OriginalImage[Width Height] and OriginalImagePixelSpacing[x y].

Successivamente, definiamo le posizioni delle immagini scaricate e del file con le etichette da scaricare in Ottenere il dataset:

Stiamo per addestrare il modello Graphcore Optimum ViT per prevedere le malattie (definite da “Finding Label”) dalle immagini. “Finding Label” può rappresentare qualsiasi numero di 14 malattie o un’etichetta “No Finding”, che indica che non è stata rilevata alcuna malattia. Per essere compatibili con la libreria Hugging Face, le etichette di testo devono essere trasformate in array codificati N-hot che rappresentano le etichette multiple necessarie per classificare ogni immagine. Un array codificato N-hot rappresenta le etichette come una lista di booleani, true se l’etichetta corrisponde all’immagine e false altrimenti.

Prima identifichiamo le etichette uniche nel dataset.

Ora trasformiamo le etichette in array codificati N-hot:

Quando si caricano i dati utilizzando la funzione datasets.load_dataset, le etichette possono essere fornite sia avendo cartelle per ciascuna delle etichette (vedi documentazione ” ImageFolder “) sia avendo un file metadata.jsonl (vedi documentazione ” ImageFolder with metadata “). Poiché le immagini in questo dataset possono avere etichette multiple, abbiamo scelto di utilizzare un file metadata.jsonl. Scriviamo i nomi dei file di immagine e le relative etichette nel file metadata.jsonl.

Creazione del dataset

Siamo ora pronti per creare il dataset PyTorch e dividerlo in set di addestramento e di convalida. Questo passaggio converte il dataset nel formato di file Arrow che consente il caricamento rapido dei dati durante l’addestramento e la convalida (circa Arrow e Hugging Face). Poiché l’intero dataset viene caricato e pre-elaborato, potrebbe richiedere alcuni minuti.

Stiamo importando il modello ViT dal checkpoint google/vit-base-patch16-224-in21k. Il checkpoint è un modello standard ospitato da Hugging Face e non è gestito da Graphcore.

Per affinare un modello pre-addestrato, il nuovo dataset deve avere le stesse proprietà del dataset originale utilizzato per il pre-addestramento. In Hugging Face, le informazioni originali del dataset vengono fornite in un file di configurazione caricato utilizzando l’AutoFeatureExtractor. Per questo modello, le immagini a raggi X vengono ridimensionate alla risoluzione corretta (224×224), convertite da scala di grigi a RGB e normalizzate attraverso i canali RGB con una media (0.5, 0.5, 0.5) e una deviazione standard (0.5, 0.5, 0.5).

Per far funzionare il modello in modo efficiente, le immagini devono essere raggruppate in batch. Per fare ciò, definiamo la funzione vit_data_collator che restituisce batch di immagini ed etichette in un dizionario, seguendo il pattern default_data_collator in Transformers Data Collator.

Visualizzazione del dataset

Per esaminare il dataset, visualizziamo le prime 10 righe dei metadati.

Plottiamo anche alcune immagini dal set di convalida con le relative etichette associate.

Il nostro dataset è ora pronto per essere utilizzato.

Preparazione del modello

Per addestrare un modello sull’IPU è necessario importarlo da Hugging Face Hub e definire un trainer utilizzando la classe IPUTrainer. La classe IPUTrainer prende gli stessi argomenti del trainer originale del Transformer e lavora in tandem con l’oggetto IPUConfig che specifica il comportamento per la compilazione e l’esecuzione sull’IPU.

Importiamo ora il modello ViT da Hugging Face.

Per utilizzare questo modello sull’IPU, è necessario caricare la configurazione IPU, IPUConfig, che fornisce il controllo su tutti i parametri specifici delle IPUs di Graphcore (le configurazioni IPU esistenti possono essere trovate qui). Utilizzeremo Graphcore/vit-base-ipu.

Impostiamo i nostri iperparametri di addestramento utilizzando IPUTrainingArguments. Questa sottoclasse della classe TrainingArguments di Hugging Face aggiunge parametri specifici per l’IPU e le sue caratteristiche di esecuzione.

Implementazione di una metrica di prestazione personalizzata per la valutazione

La prestazione dei modelli di classificazione multi-etichetta può essere valutata utilizzando l’area sotto la curva ROC (receiver operating characteristic) (AUC_ROC). L’AUC_ROC è un grafico del tasso di veri positivi (TPR) rispetto al tasso di falsi positivi (FPR) delle diverse classi e a diversi valori di soglia. Questa è una metrica di prestazione comunemente utilizzata per compiti di classificazione multi-etichetta perché è insensibile agli squilibri di classe e facile da interpretare.

Per questo dataset, l’AUC_ROC rappresenta la capacità del modello di separare le diverse malattie. Un punteggio di 0.5 significa che c’è il 50% di probabilità di ottenere la malattia corretta e un punteggio di 1 significa che può separare perfettamente le malattie. Questa metrica non è disponibile in Datasets, quindi dobbiamo implementarla noi stessi. Il pacchetto HuggingFace Datasets consente il calcolo di metriche personalizzate attraverso la funzione load_metric(). Definiamo una funzione compute_metrics e la esponiamo alla funzione di valutazione del Transformer proprio come le altre metriche supportate attraverso il pacchetto datasets. La funzione compute_metrics prende le etichette predette dal modello ViT e calcola l’area sotto la curva ROC. La funzione compute_metrics prende un oggetto EvalPrediction (una tupla con i campi predictions e label_ids) e deve restituire un dizionario stringa a virgola mobile.

Per addestrare il modello, definiamo un trainer utilizzando la classe IPUTrainer che si occupa della compilazione del modello per l’esecuzione su IPUs e dell’esecuzione dell’addestramento e della valutazione. La classe IPUTrainer funziona esattamente come la classe Trainer di Hugging Face, ma richiede l’argomento aggiuntivo ipu_config.

Esecuzione dell’addestramento

Per accelerare l’addestramento, caricheremo l’ultimo checkpoint se esiste.

Ora siamo pronti per l’addestramento.

Tracciamento della convergenza

Ora che abbiamo completato l’addestramento, possiamo formattare e tracciare l’output del trainer per valutare il comportamento dell’addestramento.

Tracciamo la perdita di addestramento e il tasso di apprendimento.

La curva di perdita mostra una rapida riduzione della perdita all’inizio dell’addestramento prima di stabilizzarsi intorno a 0.1, mostrando che il modello sta imparando. Il tasso di apprendimento aumenta durante il periodo di riscaldamento del 25% dell’addestramento, prima di seguire un decadimento coseno.

Esecuzione della valutazione

Ora che abbiamo addestrato il modello, possiamo valutare la sua capacità di predire le etichette dei dati non visti utilizzando il dataset di validazione.

Le metriche mostrano il punteggio AUC_ROC di validazione che il tutorial raggiunge dopo 3 epoche.

Ci sono diverse direzioni da esplorare per migliorare l’accuratezza del modello, tra cui un addestramento più lungo. Le prestazioni di validazione potrebbero essere migliorate anche attraverso il cambiamento degli ottimizzatori, del tasso di apprendimento, del programma di tasso di apprendimento, della scala della perdita o l’utilizzo dell’auto-scala della perdita.

Prova Hugging Face Optimum su IPUs gratuitamente

In questo post, abbiamo introdotto i modelli ViT e abbiamo fornito un tutorial per l’addestramento di un modello Hugging Face Optimum sull’IPU utilizzando un dataset locale.

Tutto il processo descritto sopra può ora essere eseguito end-to-end in pochi minuti gratuitamente, grazie alla nuova partnership di Graphcore con Paperspace. Lanciato oggi, il servizio fornirà accesso a una selezione di modelli Hugging Face Optimum alimentati da IPUs Graphcore all’interno di Gradient, i notebook Jupyter basati sul web di Paperspace.

Se sei interessato a provare Hugging Face Optimum con IPUs su Paperspace Gradient, inclusi ViT, BERT, RoBERTa e altro ancora, puoi registrarti qui e trovare una guida introduttiva qui.

Ulteriori risorse per Hugging Face Optimum su IPUs

  • Codice tutorial ViT Optimum su Graphcore GitHub
  • Modelli e dataset Graphcore Hugging Face
  • Optimum Graphcore su GitHub

Questa analisi approfondita non sarebbe stata possibile senza il sostegno, l’orientamento e le intuizioni di Eva Woodbridge, James Briggs, Jinchen Ge, Alexandre Payot, Thorin Farnsworth e tutti gli altri che contribuiscono da Graphcore, così come Jeff Boudier, Julien Simon e Michael Benayoun di Hugging Face.