Come accelerare l'inferenza dell'apprendimento profondo per i trasformatori di elaborazione del linguaggio naturale

Modelli avanzati di deep learning per l'elaborazione del linguaggio naturale basati sui trasformatori danno risultati impressionanti, ma ottenere prestazioni ad alta prestazioni ad alta velocità è difficile. In questo articolo riassumiamo le migliori opzioni che avete se volete diminuire la latenza delle vostre previsioni in produzione.

Utilizzare una CPU o una GPU migliore

Quando si vuole migliorare la velocità dei modelli di Natural Language Processing basati su Transformer, l'approccio "ingenuo" è quello di utilizzare un hardware più hardware avanzato.

Il più delle volte questa è una soluzione inevitabile, poiché le soluzioni pure basate sul software hanno tutte dei limiti. Immaginate di eseguire l'inferenza su una CPU. Potresti passare settimane a lavorare sull'ottimizzazione di basso livello per il tuo modello preferito basato su Transformer, è molto probabile che otterrete ancora un miglioramento della velocità semplicemente spostando il vostro modello su una NVIDIA A100 GPU.

Attualmente le GPU più utilizzate per l'inferenza in produzione sono le NVIDIA Tesla T4 e V100.

GPU NVIDIA Tesla

Ma cosa succede se avete già aggiornato il vostro hardware? O se il vostro budget è limitato e non potete permettersi di sfruttare le ultime GPU costose e all'avanguardia? Leggete quanto segue!

Inferenza in batch

L'inferenza batch consiste nell'inviare diverse richieste allo stesso tempo al vostro modello, in modo che si occupi delle vostre richieste tutte in una volta.

L'inferenza in batch è molto potente perché il vostro modello impiegherà quasi lo stesso tempo per affrontare diverse richieste di quello necessario per affrontare 1 richiesta. Sotto il cofano alcune operazioni saranno fattorizzate, così invece di fare tutto n volte, il modello deve farlo solo una volta.

Tecnicamente parlando, non diminuisce la latenza delle vostre richieste, perché le vostre richieste non saranno indirizzate più velocemente, ma migliorerà drasticamente il throughput della vostra applicazione (la vostra applicazione può gestire più richieste con lo stesso hardware).

L'inferenza batch non è però perfetta.

In primo luogo non è sempre adatto per l'inferenza online (cioè per applicazioni rivolte al cliente), perché per costruire i vostri batch dovrete bufferizzare alcune richieste degli utenti, quindi alcuni utenti dovranno aspettare più a lungo del solito.

2a sfida: l'inferenza batch funziona meglio per richieste simili. Per esempio, se si sta implementando un modello di modello di Natural Language Processing per la generazione di testo, il batching sarà più efficiente se si creano lotti di richieste che hanno la stessa lunghezza.

Infine, l'inferenza batch non viene eseguita dal modello di apprendimento profondo stesso, ma da un livello di livello superiore, come un server di inferenza dedicato. livello, come un server di inferenza dedicato. Non è sempre facile implementare un tale livello. Per esempio, Triton Inference Server di NVIDIA (vedi sotto) è molto buono per eseguire l'inferenza batch, ma dovete prima trovare un modo per rendere il vostro modello compatibile con Triton.

Una volta che riuscite ad esportare il vostro modello in Triton, l'inferenza in batch è molto semplice. Per esempio, ecco come creare batch composti da un massimo di 128 richieste, e attendere al massimo 5 secondi prima di elaborare il batch (questo dovrebbe essere messo nel file "config.pbtxt").

max_batch_size: 128
dynamic_batching {
  max_queue_delay_microseconds: 5000000
}

Sfruttare le implementazioni personalizzate

Molte persone e aziende stanno lavorando duramente su ottimizzazioni di basso livello per alcuni modelli di Natural Language Processing basati su Transformer modelli basati su Transformer. Può essere una buona idea per voi sfruttare queste implementazioni personalizzate del vostro modello.

La maggior parte delle volte queste implementazioni personalizzate sono facili da usare e non richiedono quasi nessun lavoro aggiuntivo da parte vostra. voi. Permettetemi di menzionarne alcune qui:

Ecco un esempio di come potete eseguire l'inferenza per il vostro modello GPT Neo 2.7B grazie a DeepSpeed. Non è troppo difficile, vero?

# Filename: gpt-neo-2.7b-generation.py
import os
import deepspeed
import torch
from transformers import pipeline

local_rank = int(os.getenv('LOCAL_RANK', '0'))
world_size = int(os.getenv('WORLD_SIZE', '1'))
generator = pipeline('text-generation', model='EleutherAI/gpt-neo-2.7B',
                        device=local_rank)



generator.model = deepspeed.init_inference(generator.model,
                                            mp_size=world_size,
                                            dtype=torch.float,
                                            replace_method='auto')

string = generator("DeepSpeed is", do_sample=True, min_length=50)
if not torch.distributed.is_initialized() or torch.distributed.get_rank() == 0:
    print(string)         
            

Quando si usa una di queste implementazioni personalizzate, non dimenticare di testare rigorosamente la qualità del nuovo modello perché non si può mai essere sicuri al 100% che non ci siano bug in queste nuove implementazioni.

Utilizzare un motore di inferenza dedicato

Microsoft e NVIDIA hanno entrambi lavorato su motori di inferenza avanzati al fine di migliorare le prestazioni.

ONNX Runtime ("ORT"), di Microsoft, è un acceleratore di apprendimento automatico multipiattaforma per l'inferenza e l'addestramento acceleratore (vedere qui). TensorRT ("TRT"), di NVIDIA, è un SDK per l'apprendimento profondo ad alte prestazioni inferenza. Include un ottimizzatore ed un runtime di inferenza per l'apprendimento profondo che offre bassa latenza ed alto throughput per le applicazioni di inferenza di apprendimento profondo (vedere qui).

Inoltre, NVIDIA Triton Inference Server è un software di inferenza che facilita l'inferenza AI più facile rendendo possibile l'implementazione di modelli AI da vari framework. Grazie a Triton è possibile per esempio ad esempio, eseguire facilmente l'inferenza in batch, eseguire più modelli di deep learning contemporaneamente sulla stessa GPU, distribuire i modelli su più GPU e altro ancora. Vedere qui.

ONNX Runtime
TensorRT
Triton Inference Server

Quanto sopra sembra eccitante, ma naturalmente non è così semplice... Affinché il vostro modello possa sfruttare questi motori di inferenza dedicati, è necessario prima convertire il modello esistente in un formato adeguato.

Avete diverse scelte:

Quando si gioca con i metodi di cui sopra, si dovrebbe fare molta attenzione alla qualità dei modelli esportati. Tu si potrebbe pensare di aver esportato con successo il proprio modello, ma è possibile che si sia persa un po' di precisione nel nel processo, quindi sii molto rigoroso su come stai testando il tuo nuovo modello esportato.

Conclusione

I moderni modelli di Natural Language Processing basati su trasformatori danno risultati impressionanti, tanto che sempre più aziende vogliono usarli in produzione. Ma molto spesso sembra che le prestazioni siano deludenti...

Lavorare sul miglioramento della velocità delle vostre previsioni è fondamentale ma, come avete potuto vedere sopra, non c'è una soluzione unica per tutti.

Se hai domande su come accelerare la tua inferenza, non esitare a contattarci!

Julien Salinas
CTO di NLP Cloud