Implementazione di GPT-NeoX 20B in produzione e focus su Deepspeed

L'implementazione di GPT-NeoX 20B in produzione è una sfida e l'abbiamo imparato nel modo più duro alla NLP Cloud... In questo articolo vi diremo di più su diversi trucchi relativi all'uso di GPT-NeoX 20B, e soprattutto su come affrontare DeepSpeed in produzione.

GPT-NeoX

GPT-NeoX 20B

GPT-NeoX 20B è il più grande modello open-source di elaborazione del linguaggio naturale al momento della scrittura.

È stato rilasciato da EleutherAI 2 settimane fa. È stato addestrato su 20 miliardi di parametri, dopo 1 anno di duro lavoro pieno di sfide. Una delle loro principali difficoltà sembra essere la capacità di impostare un'architettura parallela adeguata in modo che il modello possa essere addestrato in modo efficiente su più GPU.

Il loro modello precedente, GPT-J, è stato addestrato su Google TPUs ed è stato progettato per essere utilizzato su TPUs. L'architettura interna di GPT-NeoX 20B è radicalmente diversa ed è fatta per essere usata sulle GPU. L'idea è che dovrebbe essere il primo di una serie di modelli ancora più grandi (l'obiettivo è quello di raggiungere GPT-3).

GPT-NeoX 20 è un modello di generazione di testo, il che significa che può scrivere testo per voi e in realtà raggiungere quasi tutti i casi d'uso di Natural Language Processing con una grande precisione: generazione di post di blog, chatbot, classificazione del testo, analisi del sentimento, estrazione di parole chiave, generazione di codice, estrazione di entità, classificazione dell'intento, risposta alle domande, e altro...

Senza dubbio molti ricercatori e aziende sfrutteranno questo nuovo modello e otterranno grandi risultati. Ma c'è una sfida: come distribuire GPT-NeoX 20B?

Requisiti hardware

La prima sfida che si affronta quando si cerca di implementare GPT-NeoX 20B in produzione, è l'hardware avanzato che richiede.

Era ancora possibile implementare GPT-J su hardware consumer, anche se era molto costoso. Ad esempio, si poteva implementare su una CPU molto buona (anche se il risultato era dolorosamente lento) o su una GPU da gioco avanzata come la NVIDIA RTX 3090. Ma GPT-NeoX 20B è così grande che non è più possibile.

Fondamentalmente GPT-NeoX richiede almeno 42 GB di VRAM e 40 GB di spazio su disco (e sì, stiamo parlando della versione slim fp16 qui). Poche GPU soddisfano questi requisiti. Le principali sono le NVIDIA A100, A40 e RTX A6000.

Non solo queste GPU sono molto costose, ma è anche difficile mettere le mani su una di esse in questi giorni a causa della carenza globale di semiconduttori.

La soluzione migliore è quella di optare per un'architettura multi-GPU.

Multi-GPU con Deepspeed

Se non riuscite a far stare il vostro modello in una sola GPU, potete provare a dividerlo in più GPU.

È un'opzione interessante per 2 motivi. In primo luogo, scalare un'infrastruttura orizzontalmente è spesso più economico che scalare verticalmente. È vero per i server ed è vero anche per le GPU. In secondo luogo, è più facile mettere le mani su diverse piccole GPU come la NVIDIA Tesla T4 che su GPU più grandi come la NVIDIA A40.

Sfortunatamente, dividere un modello di apprendimento automatico in diverse GPU è una sfida tecnica. Hugging Face ha fatto un grande articolo sul parallelismo dei modelli e le scelte che avete. Leggi qui. Ma per fortuna, EleutherAI ha progettato GPT-NeoX 20B in modo che sia facilmente parallelizzabile su diverse GPU, sia per l'addestramento che per l'inferenza.

L'architettura GPT-NeoX è basata su Deepspeed. Deepspeed è un framework di Microsoft che è stato originariamente progettato per parallelizzare gli allenamenti tra diverse GPU, ed è sempre più utilizzato anche per l'inferenza. EleutherAI ha fatto tutto il lavoro duro, quindi parallelizzare GPT-NeoX è semplice come cambiare un numero in un file di configurazione.

Parallelismo GPT-NeoX
Extract from the GPT-NeoX docs about parallelism

Tuttavia, implementare Deepspeed in produzione per l'inferenza online attraverso un'API è difficile... Deepspeed non è stato progettato per essere facilmente integrato nei server web. Noi di NLP Cloud l'abbiamo imparato a nostre spese, ma dopo un po' di duro lavoro siamo finalmente riusciti a trovare un modo efficiente per far funzionare Deepspeed e GPT-NeoX dietro le nostre API.

Trucchi d'uso

Quindi supponiamo che siate riusciti ad approvvigionare l'hardware adeguato e a distribuire correttamente GPT-NeoX 20B con Deepspeed. Ci sono ora un paio di avvertenze di cui dovresti essere consapevole.

Innanzitutto, rispetto a GPT-J, i parametri (top k, top p e temperatura) non hanno gli stessi effetti sul modello. Quindi, se sei riuscito a trovare una buona configurazione per GPT-J, non darlo per scontato: dovrai fare nuovi test con GPT-NeoX.

Infine, anche se la dimensione dell'input può andare fino a 2048 token, richiederà più memoria dei 42GB di base menzionati sopra...

Inferenza in batch?

I modelli GPT sono piuttosto lenti, e GPT-NeoX 20B non fa eccezione. Quindi, al fine di migliorare il throughput della vostra applicazione, potreste voler lavorare su una soluzione di inferenza batch.

Per il momento non abbiamo trovato una buona soluzione per questo in NLP Cloud.

Il codice GPT-NeoX è fatto in modo che si possano eseguire diverse inferenze allo stesso tempo in una singola richiesta. Ma nei nostri test, il tempo di risposta è cresciuto linearmente con il numero di inferenze, il che vanifica lo scopo dell'inferenza in batch...

Conclusione

GPT-NeoX 20B è sicuramente difficile da distribuire in produzione. La qualità della generazione del testo è sorprendente, ma pochi avranno la capacità di installare effettivamente questo modello.

Più che mai, sembra che la soluzione sarà quella di affidarsi a un servizio Cloud come NLP Cloud per utilizzare questo modello.

Se hai dei feedback su questo articolo non esitare a contattarci, sarà bello sentire la tua opinione su questo!

Julien Salinas
CTO di NLP Cloud