Come installare e distribuire LLaMA 3 in produzione?

Il modello di intelligenza artificiale generativa LLaMA 3 è stato rilasciato da Meta un paio di giorni fa e mostra già capacità impressionanti.

Scoprite come installare e distribuire LLaMA 3 in produzione con questa guida passo passo. Dai requisiti hardware all'implementazione e al ridimensionamento, vi spieghiamo tutto quello che c'è da sapere per un'implementazione senza problemi.

LLaMA 3

Introduzione al LaMa 3

Meta ha presentato le prime versioni del modello di intelligenza artificiale open-source Llama 3, che può essere utilizzato per la creazione di testi, la programmazione o i chatbot. Inoltre, Meta ha annunciato l'intenzione di incorporare LLaMA 3 nelle sue principali applicazioni per i social media. Questa mossa mira a competere con altri assistenti AI, come ChatGPT di OpenAI, Copilot di Microsoft e Gemini di Google.

Come Llama 2, Llama 3 si distingue per essere un modello linguistico di grandi dimensioni liberamente accessibile con pesi aperti, offerto da un'azienda leader nel settore dell'intelligenza artificiale (anche se non si qualifica come "open source" nel senso convenzionale del termine).

Attualmente, Llama 3 può essere scaricato gratuitamente dal sito web di Meta in due diverse dimensioni di parametri: 8 miliardi (8B) e 70 miliardi (70B). Gli utenti possono registrarsi per accedere a queste versioni. Llama 3 è offerto in due varianti: pre-trained, che è un modello di base per la previsione del prossimo token, e instruction-tuned, che è ottimizzato per aderire ai comandi dell'utente. Entrambe le versioni hanno un limite di contesto di 8.192 token.

In un'intervista con Dwarkesh Patel, Mark Zuckerberg, CEO di Meta, ha dichiarato di aver addestrato due modelli personalizzati utilizzando un cluster di 24.000 GPU. Il modello 70B è stato addestrato con circa 15 trilioni di token di dati e non ha mai raggiunto un punto di saturazione o un limite alle sue capacità. In seguito, Meta ha deciso di concentrarsi sull'addestramento di altri modelli. L'azienda ha anche rivelato di essere attualmente al lavoro su una versione di Llama 3 con 400B parametri, che secondo esperti come Jim Fan di Nvidia potrebbe avere prestazioni simili a GPT-4 Turbo, Claude 3 Opus e Gemini Ultra su benchmark come MMLU, GPQA, HumanEval e MATH.

Secondo Meta, Llama 3 è stato valutato con diversi benchmark, tra cui MMLU (conoscenze a livello universitario), GSM-8K (matematica a livello elementare), HumanEval (codifica), GPQA (domande a livello universitario) e MATH (problemi di matematica). Questi benchmark dimostrano che il modello 8B supera i modelli a pesi aperti come Gemma 7B e Mistral 7B Instruct di Google, mentre il modello 70B è competitivo rispetto a Gemini Pro 1.5 e Claude 3 Sonnet.

Meta riferisce che il modello Llama 3 è stato migliorato con la capacità di comprendere la codifica, come Llama 2, e per la prima volta è stato addestrato utilizzando sia immagini che testo. Tuttavia, il suo output attuale è limitato al testo.

Parametri di riferimento LLaMA 3 Parametri di riferimento LLaMA 3

Requisiti hardware di LLaMA 3 e selezione delle istanze giuste su AWS EC2

Poiché molte organizzazioni utilizzano AWS per i loro carichi di lavoro di produzione, vediamo come implementare LLaMA 3 su AWS EC2.

L'implementazione degli LLM presenta diversi ostacoli, come il consumo di VRAM (memoria della GPU), la velocità di inferenza, il throughput e l'utilizzo dello spazio su disco. In questo scenario, dobbiamo assicurarci di allocare un'istanza GPU su AWS EC2 con una capacità VRAM sufficiente a supportare l'esecuzione dei nostri modelli.

LLaMA 3 8B richiede circa 16 GB di spazio su disco e 20 GB di VRAM (memoria della GPU) in FP16. Naturalmente è possibile implementare LLaMA 3 su una CPU, ma la latenza sarebbe troppo elevata per un caso d'uso di produzione reale. LLaMA 3 70B richiede circa 140 GB di spazio su disco e 160 GB di VRAM in FP16.

Ottenere 20 GB di VRAM per LLaMA 3 8B è abbastanza facile. Consiglio di eseguire il provisioning di una GPU NVIDIA A10: questa GPU è dotata di 24 GB di VRAM ed è una GPU veloce basata sulla piattaforma Ampere. Su AWS EC2, è necessario selezionare un'istanza G5 per eseguire il provisioning di una GPU A10. Un'istanza g5.xlarge sarà sufficiente.

La distribuzione del modello LLaMA 3 70B è però molto più impegnativa. Nessuna GPU ha abbastanza VRAM per questo modello, quindi è necessario eseguire il provisioning di un'istanza multi-GPU. Se si effettua il provisioning di un'istanza g5.48xlarge su AWS, si otterranno 192 GB di VRAM (8 x GPU A10), sufficienti per LLaMA 3 70B.

In una configurazione di questo tipo, si possono prevedere le seguenti latenze (tempi di risposta): 50 token generati in 1 secondo per LLaMA 3 8B e 50 token generati in 5 secondi per LLaMA 3 70B.

Per ridurre il costo operativo di questi modelli e aumentare la latenza, è possibile studiare tecniche di quantizzazione, ma è bene tenere presente che tali ottimizzazioni possono danneggiare l'accuratezza del modello. La quantizzazione non rientra nello scopo di questo articolo.

Per fornire tali istanze, accedere alla console AWS EC2 e lanciare una nuova istanza: selezionare l'AMI NVIDIA deep learning, su un'istanza g5.xlarge o g5.48xlarge. Non dimenticate di fornire anche spazio su disco sufficiente.

AMI di apprendimento profondo su istanza G5 su AWS

Inferenza della produzione con vLLM

vLLM è una libreria progettata per l'inferenza e la distribuzione di LLM in modo rapido e semplice. La sua efficienza è attribuita a vari metodi sofisticati, tra cui l'attenzione paginata per una gestione ottimale della chiave di attenzione e della memoria dei valori, l'elaborazione in tempo reale delle query in arrivo in batch e kernel CUDA personalizzati.

Inoltre, vLLM offre un elevato grado di adattabilità grazie all'impiego di calcolo distribuito (utilizzando il parallelismo tensoriale), streaming in tempo reale e compatibilità con le schede grafiche NVIDIA e AMD.

In particolare, vLLM ci aiuterà notevolmente nella distribuzione di LLaMA 3, consentendoci di utilizzare istanze AWS EC2 dotate di diverse GPU NVIDIA A10 compatte. Questo è un vantaggio rispetto all'uso di una singola GPU di grandi dimensioni, come NVIDIA A100 o H100. Inoltre, vLLM migliorerà significativamente l'efficienza del nostro modello grazie all'inferenza batch continua.

La configurazione di vLLM è abbastanza semplice. Stabiliamo una connessione SSH alla nostra istanza AWS appena creata e installiamo vLLM con pip:

pip install vllm

Poiché si prevede di eseguire l'inferenza distribuita utilizzando vLLM su 8 GPU A10, è necessaria anche l'installazione di Ray:

pip install ray

Nel caso in cui si riscontrino problemi di compatibilità durante l'installazione, potrebbe essere più semplice compilare vLLM dai sorgenti o utilizzare la sua immagine Docker: consultare le istruzioni per l'installazione di vLLM.

Avviare il server di inferenza

Ora creiamo il nostro script di inferenza in Python:

from vllm import LLM

# Use LLaMA 3 8B on 1 GPU
llm = LLM("meta-llama/Meta-Llama-3-8B-Instruct")

# Use LLaMA 3 70B on 8 GPUs
# llm = LLM("meta-llama/Meta-Llama-3-70B-Instruct", tensor_parallel_size=8)

print(llm.generate("What are the most popular quantization techniques for LLMs?"))

È possibile eseguire lo script di cui sopra. Se è la prima volta che si esegue questo script, è necessario attendere che il modello venga scaricato e caricato sulla GPU, quindi si riceverà qualcosa di simile a questo:

The most popular quantization techniques for Large Language Models (LLMs) are:
1. Integer Quantization
2. Floating-Point Quantization
3. Mixed-Precision Training
4. Knowledge Distillation

È abbastanza semplice da capire. È sufficiente regolare il tensor_parallel_size in base al numero di GPU in possesso.

Si tratta ora di avviare un server di inferenza appropriato, in grado di gestire numerose richieste e di eseguire inferenze simultanee. Per iniziare, avviare il server:

Per LLaMA 3 8B:

python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Meta-Llama-3-8B-Instruct

Per la LLaMA 3 70B:

python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Meta-Llama-3-70B-Instruct
--tensor-parallel-size 8

Il modello dovrebbe impiegare fino a 1 minuto per essere caricato sulla GPU. Quindi è possibile avviare un secondo terminale e iniziare a fare qualche richiesta:

curl http://localhost:8000/v1/completions \
-H "Content-Type: application/json" \
-d '{
    "model": "meta-llama/Meta-Llama-3-8B-Instruct",
    "prompt": "What are the most popular quantization techniques for LLMs?"
}'

Ora si dispone di un server di inferenza pronto per la produzione, in grado di gestire molte richieste in parallelo grazie al batching continuo. A un certo punto, però, se il numero di richieste è troppo alto, la GPU sarà sovraccarica. In questo caso, sarà necessario replicare il modello su diverse istanze della GPU e bilanciare le richieste (ma questo non rientra nello scopo di questo articolo).

Conclusione

Come si può vedere, l'implementazione di LLaMA 3 in produzione non richiede un codice complesso grazie a server di inferenza come vLLM.

La fornitura dell'hardware giusto è tuttavia impegnativa. In primo luogo perché queste GPU sono molto costose, ma anche a causa dell'attuale carenza globale di GPU. Se è la prima volta che provate a fare il provisioning di un server GPU su AWS, potreste non avere l'autorizzazione a creare un server GPU. In questo caso è necessario contattare l'assistenza e spiegare il proprio caso d'uso. In questo articolo abbiamo utilizzato AWS EC2, ma naturalmente sono disponibili altri fornitori (Azure, GCP, OVH, Scaleway...).

Se non siete interessati a implementare LLaMA 3 da soli, vi suggeriamo di utilizzare la nostra API NLP Cloud. Questa opzione può essere più efficiente e potenzialmente molto più conveniente rispetto alla gestione di una propria infrastruttura LLaMA 3. Provate subito LLaMA 3 su NLP Cloud!

Se avete domande su LLaMA 3 e sull'implementazione dell'IA in generale, non esitate a chiedere a noi, è sempre un piacere aiutarvi!

Julien
CTO di NLP Cloud