Iniziare con Hugging Face Transformers per IPUs con Optimum

Iniziare con Hugging Face Transformers per IPUs con Optimum.

I modelli di Transformer si sono dimostrati estremamente efficienti in una vasta gamma di compiti di apprendimento automatico, come l’elaborazione del linguaggio naturale, l’elaborazione audio e la visione artificiale. Tuttavia, la velocità di previsione di questi modelli di grandi dimensioni può renderli impraticabili per casi d’uso sensibili alla latenza come le applicazioni di conversazione o di ricerca. Inoltre, ottimizzare le loro prestazioni nel mondo reale richiede un notevole tempo, sforzo e competenze che sono al di là della portata di molte aziende e organizzazioni.

Fortunatamente, Hugging Face ha introdotto Optimum, una libreria open source che rende molto più facile ridurre la latenza di previsione dei modelli di Transformer su una varietà di piattaforme hardware. In questo post del blog, imparerai come accelerare i modelli di Transformer per l’Intelligence Processing Unit (IPU) di Graphcore, un processore parallelo altamente flessibile e facile da usare progettato appositamente per i carichi di lavoro di intelligenza artificiale.

Optimum incontra Graphcore IPU

Attraverso questa partnership tra Graphcore e Hugging Face, introduciamo ora BERT come primo modello ottimizzato per IPU. Ne introdurremo molti altri di questi modelli ottimizzati per IPU nei prossimi mesi, che copriranno applicazioni come visione, linguaggio, traduzione e generazione di testo.

Gli ingegneri di Graphcore hanno implementato e ottimizzato BERT per i nostri sistemi IPU utilizzando i transformer di Hugging Face per aiutare gli sviluppatori a formare, perfezionare e accelerare facilmente i loro modelli all’avanguardia.

Iniziare con IPUs e Optimum

Utilizziamo BERT come esempio per aiutarti a iniziare a utilizzare Optimum e le IPUs.

In questa guida, utilizzeremo un sistema IPU-POD16 in Graphcloud, la piattaforma di apprendimento automatico basata su cloud di Graphcore, e seguiremo le istruzioni di configurazione di PyTorch trovate in “Iniziare con Graphcloud”.

Il kit di sviluppo software di Poplar di Graphcore è già installato sul server di Graphcloud. Se hai una configurazione diversa, puoi trovare le istruzioni che si applicano al tuo sistema nella “Guida utente di PyTorch per l’IPU”.

Configurare l’ambiente Poplar SDK

Dovrai eseguire i seguenti comandi per impostare diverse variabili d’ambiente che abilitano gli strumenti di Graphcore e le librerie Poplar. Sull’ultimo sistema con Poplar SDK versione 2.3 su Ubuntu 18.04, puoi trovarli nella cartella /opt/gc/poplar_sdk-ubuntu_18_04-2.3.0+774-b47c577c2a/.

Dovrai eseguire entrambi gli script di abilitazione per Poplar e PopART (Poplar Advanced Runtime) per utilizzare PyTorch:

$ cd /opt/gc/poplar_sdk-ubuntu_18_04-2.3.0+774-b47c577c2a/
$ source poplar-ubuntu_18_04-2.3.0+774-b47c577c2a/enable.sh
$ source popart-ubuntu_18_04-2.3.0+774-b47c577c2a/enable.sh

Configurare PopTorch per l’IPU

PopTorch fa parte del kit di sviluppo software Poplar. Fornisce funzioni che consentono ai modelli PyTorch di essere eseguiti sull’IPU con modifiche minime al codice. Puoi creare e attivare un ambiente PopTorch seguendo la guida “Configurazione di PyTorch per l’IPU”:

$ virtualenv -p python3 ~/workspace/poptorch_env
$ source ~/workspace/poptorch_env/bin/activate
$ pip3 install -U pip
$ pip3 install /opt/gc/poplar_sdk-ubuntu_18_04-2.3.0+774-b47c577c2a/poptorch-<sdk-version>.whl

Installare Optimum Graphcore

Ora che il tuo ambiente ha tutte le librerie Graphcore Poplar e PopTorch disponibili, devi installare l’ultima versione del pacchetto 🤗 Optimum Graphcore in questo ambiente. Questo sarà l’interfaccia tra la libreria Transformers di 🤗 e le IPUs di Graphcore.

Assicurati che l’ambiente virtuale PopTorch creato nel passaggio precedente sia attivato. Il tuo terminale dovrebbe avere un prefisso che mostra il nome dell’ambiente poptorch come mostrato di seguito:

(poptorch_env) user@host:~/workspace/poptorch_env$ pip3 install optimum[graphcore] optuna

Clona il repository Optimum Graphcore

Il repository Optimum Graphcore contiene il codice di esempio per l’utilizzo dei modelli Optimum in IPU. Dovresti clonare il repository e cambiare la directory alla cartella example/question-answering che contiene l’implementazione IPU di BERT.

$ git clone https://github.com/huggingface/optimum-graphcore.git
$ cd optimum-graphcore/examples/question-answering

Ora, utilizzeremo run_qa.py per addestrare l’implementazione IPU di BERT sul dataset SQUAD1.1.

Esegui un esempio per addestrare BERT su SQuAD1.1

Lo script run_qa.py funziona solo con modelli che hanno un tokenizer veloce (supportato dalla libreria Tokenizers di 🤗), in quanto utilizza funzionalità speciali di questi tokenizzatori. Questo è il caso del nostro modello BERT, e dovresti passarne il nome come argomento di input a --model_name_or_path. Per utilizzare l’IPU, Optimum cercherà il file ipu_config.json nel percorso passato all’argomento --ipu_config_name.

$ python3 run_qa.py \
    --ipu_config_name=./ \
    --model_name_or_path bert-base-uncased \
    --dataset_name squad \
    --do_train \
    --do_eval \
    --output_dir output \
    --overwrite_output_dir \
    --per_device_train_batch_size 2 \
    --per_device_eval_batch_size 2 \
--learning_rate 6e-5 \
--num_train_epochs 3 \
--max_seq_length 384 \
--doc_stride 128 \
--seed 1984 \
--lr_scheduler_type linear \
--loss_scaling 64 \
--weight_decay 0.01 \
--warmup_ratio 0.1 \
--output_dir /tmp/debug_squad/

Uno sguardo più approfondito su Optimum-Graphcore

Ottenere i dati

Un modo molto semplice per ottenere i dataset è utilizzare la libreria Hugging Face Datasets, che facilita il download e la condivisione di dataset sull’Hugging Face hub. Ha anche un sistema di versionamento dei dati predefinito basato su git e git-lfs, quindi è possibile iterare su versioni aggiornate dei dati semplicemente puntando allo stesso repository.

In questo caso, il dataset viene fornito con i file di addestramento e di validazione, e le configurazioni del dataset per facilitare l’uso degli input in ciascuna fase di esecuzione del modello. L’argomento --dataset_name==squad punta a SQuAD v1.1 sull’Hugging Face Hub. È anche possibile fornire i propri file di addestramento e valutazione in formato CSV/JSON/TXT, purché seguano lo stesso formato del dataset SQuAD o di un altro dataset di domande e risposte nella libreria Datasets.

Caricamento del modello preaddestrato e del tokenizzatore

Per convertire le parole in token, questo script richiede un tokenizzatore veloce. Se non ne hai passato uno, verrà visualizzato un errore. A titolo di riferimento, ecco l’elenco dei tokenizzatori supportati.

    # Verifica del tokenizzatore: questo script richiede un tokenizzatore veloce.
    if not isinstance(tokenizer, PreTrainedTokenizerFast):
        raise ValueError("Questo script di esempio funziona solo per modelli che hanno un tokenizzatore veloce. Controlla la tabella dei modelli
            "su https://huggingface.co/transformers/index.html#supported-frameworks per trovare i tipi di modelli che soddisfano questo "
            "requisito"
                    )

L’argomento “`–model_name_or_path==bert-base-uncased“` carica l’implementazione del modello bert-base-uncased disponibile nell’Hugging Face Hub.

Dalla descrizione nell’Hugging Face Hub:

“Modello base BERT (senza maiuscole): modello preaddestrato sulla lingua inglese utilizzando un obiettivo di masked language modeling (MLM). È stato introdotto in questo paper e rilasciato per la prima volta in questo repository. Questo modello non fa distinzione tra inglese e English.”

Addestramento e convalida

Ora puoi utilizzare la classe IPUTrainer disponibile in Optimum per sfruttare l’intero stack software e hardware di Graphcore e addestrare i tuoi modelli nelle IPUs con modifiche minime al codice. Grazie a Optimum, puoi collegare e utilizzare hardware all’avanguardia per addestrare i tuoi modelli all’avanguardia.

Per addestrare e convalidare il modello BERT, puoi passare gli argomenti --do_train e --do_eval allo script run_qa.py. Dopo aver eseguito lo script con gli iperparametri sopra indicati, dovresti vedere i seguenti risultati di allenamento e convalida:

"epoch": 3.0,
"train_loss": 0.9465060763888888,
"train_runtime": 368.4015,
"train_samples": 88524,
"train_samples_per_second": 720.877,
"train_steps_per_second": 2.809

La fase di convalida produce i seguenti risultati:
***** metriche di valutazione *****
  epoch            =     3.0
  eval_exact_match = 80.6623
  eval_f1          = 88.2757
  eval_samples     =   10784

Puoi vedere il resto dell’implementazione di BERT su IPU in Optimum-Graphcore: Esempi SQuAD.

Risorse per i Transformer Ottimali su Sistemi IPU

  • Optimum-Graphcore: Esempi SQuAD
  • Modelli e Dataset Graphcore Hugging Face
  • Tutorial GitHub: Fine-tuning di BERT su IPU utilizzando Hugging Face transformers
  • Portale Sviluppatori Graphcore
  • GitHub Graphcore
  • Container SDK Graphcore su Docker Hub