Decodifica vLLM Strategie per potenziare al massimo le inferenze del tuo modello linguistico

Decodifica vLLM Strategie per massimizzare le inferenze del tuo modello linguistico

Introduzione

I Large Language Models (LLM) hanno rivoluzionato il modo in cui interagiamo con i computer. Tuttavia, implementare questi modelli in produzione può rappresentare una sfida a causa del loro elevato consumo di memoria e del costo computazionale. vLLM, una libreria open-source per l’elaborazione e il servizio rapido degli LLM, affronta queste sfide lavorando con un algoritmo di attenzione innovativo chiamato PagedAttention. Questo algoritmo gestisce in modo efficace le chiavi e i valori dell’attenzione, consentendo a vLLM di ottenere una maggiore velocità di elaborazione e un minor utilizzo della memoria rispetto ai metodi tradizionali di servizio degli LLM.

Obiettivi di apprendimento

In questo articolo, imparerai:

  • Ad affrontare le sfide dell’elaborazione degli LLM e le limitazioni degli approcci tradizionali.
  • Cosa è vLLM e come funziona.
  • I vantaggi di utilizzare vLLM per l’elaborazione degli LLM.
  • Come l’algoritmo PagedAttention di vLLM supera queste sfide.
  • Come integrare vLLM nel tuo flusso di lavoro esistente.

Questo articolo è stato pubblicato come parte del Data Science Blogathon.

Sfide dell’elaborazione degli LLM

Gli LLM hanno dimostrato il loro valore in compiti come la generazione di testo, la sintesi, la traduzione linguistica e molti altri. Tuttavia, implementare questi LLM con approcci tradizionali di elaborazione degli LLM presenta diverse limitazioni:

  • Alta impronta di memoria: Gli LLM richiedono grandi quantità di memoria per archiviare i loro parametri e le attivazioni intermedie (principalmente i parametri chiave e valore dei livelli di attenzione), rendendo difficile implementarli in ambienti limitati dalla disponibilità di risorse.
  • Throughput limitato: Le implementazioni tradizionali faticano a gestire elevate quantità di Richieste di Elaborazione In sequenza, limitando la scalabilità e la reattività. Ciò si riflette quando il Large Language Model viene eseguito sul server di produzione e non riesce a lavorare in modo efficace con le GPU.
  • Costo computazionale: Il carico intenso di calcoli matriciali coinvolti nell’elaborazione degli LLM può essere costoso, soprattutto su modelli di grandi dimensioni. Con l’alta memoria e il basso throughput, questo aggiungerà ulteriormente costi.

Cosa è vLLM?

vLLM è un motore di servizio LLM ad alta velocità e a bassa utilizzazione di memoria. Funziona con un algoritmo di attenzione innovativo chiamato PagedAttention, che gestisce in modo efficace le chiavi e i valori dell’attenzione suddividendoli in blocchi più piccoli e gestibili. Questo approccio riduce l’impronta di memoria di vLLM e consente di ottenere una maggiore velocità di elaborazione rispetto ai metodi tradizionali di servizio degli LLM. Durante i test, vLLM ha ottenuto un miglioramento delle prestazioni fino a 24 volte rispetto al tradizionale servizio HuggingFace e fino a 2-5 volte rispetto all’Elaborazione dell’Inferenza di Generazione di Testo (TGI) di HuggingFace. Inoltre, ottimizza continuamente il processo di inferenza tramite l’uso di batching e l’ottimizzazione dei kernel CUDA.

Vantaggi di vLLM

vLLM offre diversi vantaggi rispetto ai metodi tradizionali di servizio degli LLM:

  • Throughput più elevato: vLLM può raggiungere un throughput fino a 24 volte superiore rispetto a HuggingFace Transformers, la libreria LLM più popolare. Ciò consente di servire più utenti con meno risorse.
  • Utilizzo di memoria inferiore: vLLM ha bisogno di una quantità molto ridotta di memoria rispetto ai metodi tradizionali di servizio degli LLM, rendendolo pronto per essere implementato su piattaforme con hardware leggero.
  • API compatibile con OpenAI: vLLM fornisce un’API compatibile con OpenAI, semplificando l’integrazione con applicazioni LLM esistenti.
  • Integrazione senza soluzione di continuità con modelli Hugging Face: vLLM può essere utilizzato con diversi modelli, diventando lo strumento preferito per il servizio degli LLM.

Primi passi con vLLM

Cominciare con vLLM è molto semplice. La prima cosa da fare è installare la libreria vLLM, che può essere fatta come mostrato di seguito.

pip install vllm

Il comando precedente dovrebbe installare la libreria vllm. Nel passaggio successivo, sceglieremo il nostro modello per iniziare l’inferenza, che è

from vllm import LLM, SamplingParams# scegliere il grande modello di linguaggillm = LLM(model="gpt2-xl")# impostare i parametrisampling_params = SamplingParams(temperature=0.8, top_p=0.90,max_tokens = 50)

Libreria vLLM

Qui, prima di tutto, importiamo due classi dalla libreria vllm

  • LLM: Questa classe permette di scaricare i modelli. Attualmente, vllm supporta molti modelli di diverse famiglie, inclusi gpt, llama, vicuna, bloom e molti altri.
  • SamplingParams: Questa è la classe per definire i parametri del modello che includono cose come temperatura (quanto creativo il modello deve essere), top_p (per avere tutti i token in cima la cui probabilità complessiva è 0.9), max_tokens (il numero massimo di token che il modello può generare) e altri parametri del modello

Successivamente, istanziamo l’oggetto LLM. Qui, stiamo scegliendo il modello gpt2-xl, un modello con 1,5 miliardi di parametri. Poi, impostiamo le configurazioni per il modello come la temperatura, i max_tokens e il top_p.

Quindi, eseguendo questo codice verrà scaricato il modello gpt-xl pre-addestrato dall’HuggingFace Hub e quindi viene caricato il modello nella GPU. Ora, creeremo un prompt e cercheremo di inferire il modello. Allo stesso tempo, testeremo il tempo impiegato per generare la risposta.

%%time# definizione del nostro promptprompt = "Il Machine Learning è"# generare la rispostaanswer = llm.generate(prompt,sampling_params)# ottenere il testo generato dalla variabile di rispostaanswer[0].outputs[0].text

Prompt

Qui, diamo il prompt “Il Machine Learning è” e quindi passiamo questo Prompt insieme a SamplingParams alla classe .generate() dell’oggetto LLM. Questo genererà quindi la risposta. La risposta contiene una lista di elementi di tipo RequestOutput. Ogni componente della lista include il testo generato e altre informazioni. Ma qui, siamo interessati solo all’output generato e quindi possiamo accedervi dalla risposta tramite outputs[0].text. La risposta generata può essere visualizzata di seguito.

Possiamo vedere che il tempo impiegato per generare è in millisecondi, il che è abbastanza veloce. Inoltre, otteniamo un’uscita sonora (gpt2-xl è un modello decente e non produce ottime risposte. Lo stiamo usando a scopo dimostrativo perché si adatta alla GPU gratuita fornita da colab). Ora, proviamo a dare al modello una lista di Prompts e verifichiamo il tempo impiegato per generare le risposte.

%%time# definizione del nostro promptprompt = [    "Cosa è il Quantum Computing?",    "In che cosa differiscono gli elettroni e i protoni?",    "Cosa è il Machine Learning?",]# generare la rispostariesposte = llm.generate(prompt,sampling_params)# ottenere il testo generato dalla variabile di rispostafor i in range(3): print("\nPrompt:",prompt[i],"\nGenerazione:",answers[i].outputs[0].text) print()

Qui il codice sopra è autoesplicativo. Stiamo creando una lista di Prompts, ne abbiamo 3 e quindi stiamo passando questa lista alla funzione .generate() della classe LLM. Quindi la classe LLM genererà una lista di risposte. Successivamente attraversiamo la lista e stampiamo il testo di ogni risposta generata, ottenendo quindi il seguente output

Possiamo controllare la risposta generata dal grande modello di linguaggio gpt2-xl sopra. Le reazioni non sono molto buone e sono interrotte a metà delle frasi, ed è normale perché gpt2-xl non è il modello dalle migliori prestazioni disponibili. Vediamo qui il tempo impiegato per il grande modello di linguaggio per generare la risposta. Ha impiegato 1 secondo per creare risposte per tutte e 3 le domande combinate. Questa è una velocità di inferenza eccellente e può essere migliorata ulteriormente con risorse di calcolo aumentate.

Servire LLM tramite vLLM

In questa sezione vedremo come servire LLM tramite la libreria vLLM. Il processo per farlo è semplice. Con vLLM, è possibile creare un server molto simile al protocollo dell’API OpenAI. Hospiteremo il server in modo che sia accessibile tramite Internet. Iniziamo eseguendo i seguenti comandi.

curl ipv4.icanhazip.com

Nel codice sopra, eseguiamo il comando curl sul sito web ipv4.icanhazip.com. Questo restituirà l’indirizzo IPv4 pubblico della nostra macchina. Questo indirizzo pubblico verrà utilizzato successivamente per rendere disponibile LLM online.

Implementazione del codice

Successivamente, eseguiamo il seguente comando Python per servire il Large Language Model.

python -m vllm.entrypoints.openai.api_server \    --host 127.0.0.1 \    --port 8888 \    --model bigscience/bloomz-560m \    & \    npx localtunnel --port 8888

Nel codice sopra stiamo eseguendo il file api_server.py dalla libreria vllm. Stiamo fornendo le seguenti opzioni a questo file.

  • Host: Questo è per fornire l’host della nostra API. Qui lavoreremo con l’host locale, 127.0.0.1. L’host con cui serviamo questo LLM può raggiungere solo questo host locale. Tuttavia, in seguito lo esporremo all’esterno su Internet.
  • Porta: Questa è la porta in cui desideriamo che venga eseguita la nostra applicazione ed è la porta in cui desideriamo servire il large language model. Possiamo assegnargli una porta casuale e stiamo scegliendo la porta 8888
  • Modello: Qui forniamo il modello che vogliamo servire con vLLM. Come discusso, vLLM supporta molte famiglie di modelli come GPT, Llama e Mistral (controlla l’elenco qui). Per questo esempio, sceglieremo bloomz-560m, un modello a 560 milioni di parametri che può essere eseguito sulla GPU.

Lavorare con Local Tunnel

Fino a questo punto, vLLM scarica il modello dall’huggingface hub, lo carica sulla GPU e lo esegue. Assegnando il valore di host a localhost, le chiamate esterne al Large Language Model servito saranno rese inaccessibili; potranno essere accedute solo internamente. Quindi, per esporlo su Internet, lavoriamo con il local tunnel.

Fai clic sul link per essere reindirizzato a un nuovo sito come mostrato di seguito.

In questo nuovo sito, dobbiamo fornire l’IP pubblico che abbiamo estratto in precedenza. Quindi fare clic sul pulsante di invio. Dopo questo passaggio, il Large Language Model di Bloom diventerà finalmente disponibile online. E per accedere ad esso, possiamo lavorare con lo stesso comando curl che abbiamo usato in precedenza.

OpenAI API

Ora possiamo sfruttare lo stile dell’API OpenAI per accedere all’llm che serviamo online. Proviamolo con l’esempio qui sotto.

Qui sto usando il sito web Hopscotch, che fornisce un’utile tool online gratuito per i test delle API. Qui, inseriamo l’URL fornito dal local tunnel. Inseriamo esplicitamente l’URL dell’API completions (simile all’URL delle completions di OpenAI). Nel corpo, forniamo i seguenti coppie chiave-valore.

  • Modello: Il modello che stiamo chiamando qui è il modello bloom.
  • Prompt: Questo sarà il prompt dell’utente.
  • Max_tokens: Il numero massimo di token generati dal large language model.
  • Temperature: Imposta quanto creativo sarà il modello, con 1 che indica il livello più alto e 0 quello più basso.

La richiesta sarà un metodo POST perché inviamo i dati all’API, e il tipo di contenuto è application/json perché inviamo dati JSON. L’output per la Prompt è il seguente:

Il formato di output è molto simile al formato di output dell’API OpenAI, in cui il testo generato è presente all’interno dell’oggetto choice. La risposta generata è “è il più grande produttore di banane al mondo”, che non è vero ed è previsto poiché bloom-560 non è un llm ad alte prestazioni. Lo scopo principale è verificare come vllm rende semplice il servizio dei grandi modelli di linguaggio. In questo modo, possiamo passare facilmente dal codice OpenAI a vllm grazie al formato API simile.

Conclusione

vLLM è uno strumento potente che può rendere le inferenze LLM più efficienti in termini di memoria e avere un’elevata capacità di elaborazione. Lavorando con vLLM, è possibile distribuire modelli di linguaggio di grandi dimensioni in produzione senza preoccuparsi delle limitazioni delle risorse, consentendoti di sfruttare la potenza dei LLM per migliorare le tue applicazioni. L’API, essendo molto simile a quella di OpenAI, consente agli sviluppatori che lavorano con OpenAI di passare rapidamente ad altri modelli.

Alcuni dei punti salienti di questo articolo includono:

  • vLLM è un motore di servizio LLM ad alta capacità e memoria efficiente in grado di affrontare queste sfide
  • Si basa sul concetto di un algoritmo di attenzione innovativo chiamato PagedAttention, che gestisce in modo efficace le chiavi e i valori dell’attenzione
  • Con vLLM, possiamo ottenere una capacità di elaborazione superiore rispetto ai metodi tradizionali di servizio LLM
  • È compatibile con i modelli di Hugging Face e fornisce un’API compatibile con OpenAI
  • vLLM può essere utilizzato per servire LLM tramite un’API in stile OpenAI

Domande frequenti

I media mostrati in questo articolo non sono di proprietà di Analytics Vidhya e vengono utilizzati a discrezione dell’autore.