Distribuzione di modelli linguistici di grandi dimensioni: vLLM e quantizzazione |  di Ayoola Olafenwa |  Aprile 2024

 | Intelligenza-Artificiale

Guida passo passo su come accelerare modelli linguistici di grandi dimensioni

fonte

Distribuzione di modelli linguistici di grandi dimensioni (LLM)

Viviamo in un'epoca straordinaria di modelli linguistici di grandi dimensioni come ChatGPT, GPT-4 e Claude che possono eseguire molteplici attività straordinarie. Praticamente in ogni campo, dall’istruzione, alla sanità, alle arti e agli affari, i modelli linguistici di grandi dimensioni vengono utilizzati per facilitare l’efficienza nella fornitura di servizi. Nell'ultimo anno sono stati rilasciati molti brillanti modelli linguistici di grandi dimensioni open source, come Llama, Mistral, Falcon e Gemma. Questi LLM open source sono disponibili per l'utilizzo da parte di tutti, ma la loro distribuzione può essere molto impegnativa in quanto possono essere molto lenti e richiedere molta potenza di calcolo della GPU per l'esecuzione per la distribuzione in tempo reale. Sono stati creati diversi strumenti e approcci per semplificare l'implementazione di modelli linguistici di grandi dimensioni.

Sono stati creati molti strumenti di distribuzione per servire LLM con inferenza più rapida, come vLLM, c2translate, TensorRT-LLM e llama.cpp. Le tecniche di quantizzazione vengono utilizzate anche per ottimizzare le GPU per il caricamento di modelli linguistici molto grandi. In questo articolo spiegherò come distribuire modelli linguistici di grandi dimensioni con vLLM e quantizzazione.

Latenza e throughput

Alcuni dei principali fattori che influiscono sulle prestazioni di velocità di un modello linguistico di grandi dimensioni sono i requisiti hardware della GPU e le dimensioni del modello. Maggiore è la dimensione del modello, maggiore sarà la potenza di calcolo della GPU necessaria per eseguirlo. Le metriche di riferimento comuni utilizzate per misurare le prestazioni di velocità di un modello linguistico di grandi dimensioni sono Latenza E Portata.

Latenza: Questo è il tempo necessario affinché un modello linguistico di grandi dimensioni generi una risposta. Di solito viene misurato in secondi o millisecondi.

Portata: Questo è il numero di token generati al secondo o millisecondo da un modello di linguaggio di grandi dimensioni.

Installa i pacchetti richiesti

Di seguito sono riportati i due pacchetti richiesti per l'esecuzione di un modello linguistico di grandi dimensioni: Hugging Face trasformatori E accelerare.

pip3 install transformers
pip3 install accelerate

Cos'è Phi-2?

Phi-2 è un modello di fondazione all'avanguardia di Microsoft con 2,7 miliardi di parametri. È stato pre-addestrato con una varietà di origini dati, dal codice ai libri di testo. Impara di più riguardo Phi-2 da Qui.

Analisi comparativa della latenza e del throughput LLM con i trasformatori Hugging Face

Output generato

Latency: 2.739394464492798 seconds
Throughput: 32.36171766303386 tokens/second
Generate a python code that accepts a list of numbers and returns the sum. (1, 2, 3, 4, 5)
A: def sum_list(numbers):
total = 0
for num in numbers:
total += num
return total

print(sum_list((1, 2, 3, 4, 5)))

Ripartizione del codice passo dopo passo

Linea 6–10: Caricato Phi-2 modello e tokenizzato il prompt “Genera un codice Python che accetta un elenco di numeri e restituisce la somma.

Linea 12-18: Generato una risposta dal modello e ottenuto il file latenza calcolando il tempo necessario per generare la risposta.

Linea 21–23: Ottenuto la lunghezza totale dei token nella risposta generata, divisa per il latenza e calcolato il portata.

Questo modello è stato eseguito su un A1000 (GPU da 16 GB) e raggiunge un latenza Di 2,7 secondi e un rendimento di 32 gettoni/secondo.

vLLM è una libreria LLM open source per servire modelli linguistici di grandi dimensioni a basso costo latenza e alto portata.

Come funziona vLLM

Il trasformatore è l'elemento costitutivo dei modelli linguistici di grandi dimensioni. La rete del trasformatore utilizza un meccanismo chiamato meccanismo di attenzioneche viene utilizzato dalla rete per studiare e comprendere il contesto delle parole. IL meccanismo di attenzione è costituito da una serie di calcoli matematici di matrici note come chiavi e valori di attenzione. La memoria utilizzata dall'interazione di questi tasti e valori di attenzione influisce sulla velocità del modello. vLLM ha introdotto un nuovo meccanismo di attenzione chiamato Attenzione che gestisce in modo efficiente l'allocazione della memoria per le chiavi e i valori di attenzione del trasformatore durante la generazione dei token. L'efficienza della memoria di vLLM si è rivelata molto utile nell'esecuzione di modelli linguistici di grandi dimensioni a bassa latenza e throughput elevato.

Questa è una spiegazione di alto livello di come funziona vLLM. Per conoscere dettagli tecnici più approfonditi, visita la documentazione vLLM.

Installa vLLM

pip3 install vllm==0.3.3

Esegui Phi-2 con vLLM

Output generato

Latency: 1.218436622619629seconds
Throughput: 63.15334836428132tokens/second
(1, 2, 3, 4, 5)
A: def sum_list(numbers):
total = 0
for num in numbers:
total += num
return total

numbers = (1, 2, 3, 4, 5)
print(sum_list(numbers))

Ripartizione del codice passo dopo passo

Riga 1–3: Pacchetti richiesti importati da vLLM per l'esecuzione Phi-2.

Riga 5–8: Caricato Phi-2 con vLLM, definito il prompt e impostato parametri importanti per l'esecuzione del modello.

Linea 10–16: Generata la risposta del modello utilizzando llm.generate e calcolato il latenza.

Linea 19–21: Ottenuta la lunghezza totale dei token generati dalla risposta, divisa la lunghezza dei token per la latenza per ottenere il file portata.

Linea 23–24: Ottenuto il testo generato.

Ho corso Phi-2 con vLLM sullo stesso prompt, “Genera un codice Python che accetta un elenco di numeri e restituisce la somma.” Sulla stessa GPU, un A1000 (GPU da 16 GB), vLLM produce a latenza Di 1,2 secondi e un portata Di 63 gettoni/secondorispetto ai trasformatori Hugging Face' latenza Di 2,85 secondi e un portata Di 32 gettoni/secondo. L'esecuzione di un modello linguistico di grandi dimensioni con vLLM produce lo stesso risultato accurato dell'utilizzo di Hugging Face, con una latenza molto inferiore e un throughput più elevato.

Nota: Le metriche (latenza e throughput) che ho ottenuto per vLLM sono parametri di riferimento stimati per le prestazioni vLLM. La velocità di generazione del modello dipende da molti fattori, come la lunghezza della richiesta di input e la dimensione della GPU. Secondo il rapporto ufficiale vLLM, l'esecuzione di un modello LLM su una potente GPU come l'A100 in un ambiente di produzione con vLLM consente di ottenere Produttività 24 volte superiore che Hugging Face Transformers.

Benchmarking di latenza e throughput in tempo reale

Il modo in cui ho calcolato la latenza e il throughput per l'esecuzione di Phi-2 è sperimentale e l'ho fatto per spiegare come vLLM accelera le prestazioni di un modello linguistico di grandi dimensioni. Nel caso d'uso reale degli LLM, come un sistema basato su chat in cui il modello genera un token non appena viene generato, misurare la latenza e il throughput è più complesso.

Un sistema basato su chat si basa su token di output in streaming. Alcuni dei principali fattori che influenzano le metriche LLM sono È ora del primo gettone (il tempo necessario affinché un modello generi il primo token), Tempo per token di output (il tempo impiegato per token di output generato), la lunghezza della sequenza di input, l'output previsto, il totale dei token di output previstiE la dimensione del modello. In un sistema basato su chat, la latenza è solitamente una combinazione di È ora del primo gettone E Tempo per token di output moltiplicato per il totale dei token di output previsti.

Maggiore è la lunghezza della sequenza di input passata in un modello, più lenta è la risposta. Alcuni degli approcci utilizzati nell'esecuzione di LLM in tempo reale prevedono il raggruppamento in batch delle richieste di input degli utenti o dei prompt per eseguire l'inferenza sulle richieste contemporaneamente, il che aiuta a migliorare il throughput. In generale, l'utilizzo di una GPU potente e il servizio LLM con strumenti efficienti come vLLM migliora sia la latenza che il throughput in tempo reale.

Esegui la distribuzione vLLM su Google Colab

La quantizzazione è la conversione di un modello di machine learning da una precisione maggiore a una precisione inferiore riducendo i pesi del modello in bit più piccoli, solitamente 8 bit O 4 bit. Gli strumenti di distribuzione come vLLM sono molto utili per l'inferenza di modelli linguistici di grandi dimensioni con una latenza molto bassa e un throughput elevato. Siamo in grado di correre Phi-2 con Hugging Face e vLLM comodamente sulla GPU T4 su Google Colab perché è un LLM più piccolo con 2,7 miliardi di parametri. Ad esempio, un modello da 7 miliardi di parametri come Maestrale 7B non può essere eseguito su Colab con Hugging Face o vLLM. La quantizzazione è la soluzione migliore per gestire i requisiti hardware della GPU per modelli linguistici di grandi dimensioni. Quando la disponibilità della GPU è limitata e dobbiamo eseguire un modello linguistico molto ampio, la quantizzazione è l'approccio migliore per caricare LLM su dispositivi vincolati.

Bit e byte

È una libreria Python creata con funzioni di quantizzazione personalizzate per ridurre i pesi del modello in bit più bassi (8 bit E 4 bit).

Installa BitsandBytes

pip3 install bitsandbytes

Quantizzazione del modello Mistral 7B

Maestrale 7Bun modello da 7 miliardi di parametri di MistralAI, è uno dei migliori modelli linguistici di grandi dimensioni open source all'avanguardia. Seguirò un processo passo passo di corsa Maestrale 7B con diverse tecniche di quantizzazione che possono essere eseguite sulla GPU T4 su Google Colab.

Quantizzazione con precisione a 8 bit: questa è la conversione del peso di un modello di machine learning in una precisione a 8 bit. Bit e byte è stato integrato con i trasformatori Hugging Face per caricare un modello linguistico utilizzando lo stesso codice Hugging Face, ma con piccole modifiche per la quantizzazione.

Linea 1: Importati i pacchetti necessari per l'esecuzione del modello, incluso il file BitsandBytesConfig biblioteca.

Riga 3–4: Definita la configurazione di quantizzazione e impostato il parametro carica_in_8bit su true per caricare i pesi del modello 8 bit precisione.

Linea 7–9: Passata la configurazione di quantizzazione nella funzione di caricamento del modello, impostare il parametro mappa_dispositivo per bitsandbytes per allocare automaticamente la memoria GPU appropriata per il caricamento del modello. Infine ho caricato i pesi del tokenizzatore.

Quantizzazione con precisione a 4 bit: questa è la conversione del peso di un modello di machine learning in 4-biprecisione.

Il codice per il caricamento Maestrale 7B nella precisione a 4 bit è simile a quella di 8 bit precisione tranne alcune modifiche:

  • cambiato carica_in_8bit A carica_in_4bit.
  • Un nuovo parametro bnb_4bit_compute_dtype viene introdotto nel BitsandBytesConfig per eseguire il calcolo del modello in bfloat16. bfloat16 è il tipo di dati di calcolo per caricare i pesi del modello per un'inferenza più rapida. Può essere utilizzato con entrambi 4 bit E 8 bit precisazioni. Se è dentro 8 bit devi solo cambiare il parametro da bnb_4bit_compute_dtype A bnb_8bit_compute_dtype.

NF4 (virgola mobile normale a 4 bit) e Doppia quantizzazione

NF4 (virgola mobile normale a 4 bit) di QLoRA è un approccio di quantizzazione ottimale che produce risultati migliori rispetto alla quantizzazione standard a 4 bit. È integrato con la doppia quantizzazione, dove la quantizzazione avviene due volte; i pesi quantizzati dal primo stadio di quantizzazione vengono passati allo stadio di quantizzazione successivo, producendo valori di intervallo float ottimali per i pesi del modello. Secondo il rapporto del documento QLoRA, NF4 con doppia quantizzazione non soffre di un calo delle prestazioni di precisione. Leggi dettagli tecnici più approfonditi su NF4 e doppia quantizzazione dal documento QLoRA:

Linea 4–9: Sono stati impostati parametri aggiuntivi BitsandBytesConfig:

  • carico_4bit: il modello di caricamento con precisione a 4 bit è impostato su true.
  • bnb_4bit_quant_type: Il tipo di quantizzazione è impostato su nf4.
  • bnb_4bit_use_double_quant: La doppia quantizzazione è impostata su True.
  • bnb_4_bit_compute_dtype: bfloat16 il tipo di dati di calcolo viene utilizzato per un'inferenza più rapida.

Linea 11–13: Caricati i pesi e il tokenizzatore del modello.

Codice completo per la quantizzazione del modello

Output generato

<s> (INST) What is Natural Language Processing? (/INST) Natural Language Processing (NLP) is a subfield of artificial intelligence (AI) and
computer science that deals with the interaction between computers and human language. Its main objective is to read, decipher,
understand, and make sense of the human language in a valuable way. It can be used for various tasks such as speech recognition,
text-to-speech synthesis, sentiment analysis, machine translation, part-of-speech tagging, name entity recognition,
summarization, and question-answering systems. NLP technology allows machines to recognize, understand,
and respond to human language in a more natural and intuitive way, making interactions more accessible and efficient.</s>

La quantizzazione è un ottimo approccio per ottimizzare l'esecuzione di modelli linguistici molto grandi su GPU più piccole e può essere applicata a qualsiasi modello, come Llama 70B, Falcon 40B e mpt-30b. Secondo quanto riferito dall' Documento LLM.int8I modelli linguistici molto grandi soffrono meno di cali di precisione quando quantizzati rispetto a quelli più piccoli. La quantizzazione si applica meglio a modelli linguistici molto grandi e non funziona bene per i modelli più piccoli a causa della perdita di prestazioni di precisione.

Esegui la quantizzazione Mixtral 7B su Google Colab

Conclusione

In questo articolo ho fornito un approccio passo passo per misurare le prestazioni di velocità di un modello linguistico di grandi dimensioni, ho spiegato come funziona vLLM e come può essere utilizzato per migliorare la latenza e il rendimento di un modello linguistico di grandi dimensioni. Infine, ho spiegato la quantizzazione e come viene utilizzata per caricare modelli linguistici di grandi dimensioni su GPU su piccola scala.

Raggiungimi tramite:

E-mail: olafenwaayoola@gmail.com

Linkedin: https://www.linkedin.com/in/ayoola-olafenwa-003b901a9/

Riferimenti

Fonte: towardsdatascience.com

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *