Inferenza LLM

Il calcolo della memoria RAM per l’inferenza degli LLM

Come calcolare la memoria necessaria e quindi il numero di unità da riservare all’esecuzione di un determinato AI workload
Indice dei contenuti

La diffusione delle intelligenze artificiali di tipo generativo ha portato alla grande disponibilità di servizi del tipo prompt in, result out. Il numero di risultati disponibili si sta ampliando a dismisura, e oltre a testi in varie lingue (compresi linguaggi di programmazione) troviamo immagini, video, audio, modelli 3D e molti altri. 

L’accesso a modelli AI preinstallati viene oggi chiamato model serving.

Questi servizi sono al momento basati su LLM (Large Language Models) proprietari, come GPT, Claude, Gemini, Groq, Perplexity, Midjourney, Stable Diffusion e molti altri, e modelli open source come quelli della famiglia Llama.

La fruizione di questi modelli comporta alcune scelte che influenzano prestazioni, risultati e la stessa eseguibilità. Per descriverli in maniera estremamente semplificata, per “comprendere” e poi “generare” testi in linguaggio naturale (e altri tipi di dato) questi sistemi hanno un modello che si basa su un elevato numero di parametri (svariati miliardi, billions in inglese) sui quali eseguono una gran quantità di calcoli. Questi calcoli possono essere eseguiti con diverse precisioni, espresse in bit, che definiscono quanto accurata è la rappresentazione numerica di ogni operazione.

Cos’è la precisione in bit?

In questo caso, quindi, la precisione è il numero di bit che rappresentano i numeri e per eseguire operazioni aritmetiche. Le precisioni più usate sono:

  1. FP32 (precisione a 32 bit). La rappresentazione classica dei numeri a virgola mobile su 32 bit, ossia 4 byte per numero. Questa è la precisione standard per molti calcoli in deep learning.
  2. FP16 (precisione a 16 bit). I numeri sono rappresentati con 16 bit, cioè la metà della precisione rispetto a FP32. FP16 è diventata sempre più popolare grazie alla sua capacità di ridurre il consumo di memoria e migliorare le prestazioni senza una perdita significativa di accuratezza nei modelli ben ottimizzati.
  3. INT8 (precisione con interi a 8 bit). I numeri sono rappresentati con 8 bit interi, anziché a virgola mobile. È utilizzata principalmente per modelli post-addestramento, quando si cerca di comprimere i modelli per esecuzioni più efficienti, riducendo significativamente la memoria e i costi computazionali.
  4. INT4 (precisione con interi a 8 bit). E’ questa una delle tecniche di quantizzazione più avanzate nel campo del deep learning. Al momento è molto usata in dispositivi di ridotte prestazioni hardware, come il mobile o l’edge

Come influisce la precisione sulle prestazioni degli LLM?

1. Uso della memoria

La precisione influisce direttamente sulla quantità di memoria necessaria per immagazzinare e processare i dati. Un modello con rappresentazione FP32 richiede il doppio della memoria rispetto a uno che usa FP16 e quattro volte quella di un modello che utilizza INT8. Di conseguenza, abbassare la precisione consente di gestire modelli più grandi o più batch di dati in memoria contemporaneamente.

2. Velocità di calcolo

La riduzione della precisione può velocizzare i calcoli. Le GPU e TPU attuali sono ottimizzate per eseguire operazioni a 16 bit o 8 bit molto più velocemente rispetto a quelle a 32 bit. Ciò porta a miglioramenti significativi nelle prestazioni durante l’inferenza e l’addestramento. FP16, ad esempio, è particolarmente popolare perché offre un buon equilibrio tra velocità e accuratezza.

3. Accuratezza e stabilità

La riduzione della precisione, però, può comportare una perdita di accuratezza. In FP16, ad esempio, la gamma di numeri rappresentabili è più limitata rispetto a FP32, e questo può introdurre errori di arrotondamento e instabilità numerica in alcuni calcoli, specialmente durante l’addestramento di modelli complessi come gli LLM. Per ovviare a questo c’è l’approccio misto, in cui alcune parti critiche del modello usano FP32, mentre altre usano FP16.

Con INT8, le perdite di precisione sono ancora più marcate. Tuttavia, grazie alle tecniche di quantizzazione e alla ricerca di ottimizzazioni specifiche, è possibile utilizzare INT8 durante la fase di inferenza senza compromettere troppo le prestazioni del modello.

Su dispositivi a basse prestazioni, con particolari attenzioni si può lavorare anche in INT4.

4. Efficienza energetica

Le precisioni più basse riducono il consumo energetico delle GPU e TPU, rendendo l’esecuzione dei modelli più sostenibile dal punto di vista energetico. Questo aspetto è cruciale quando si considerano grandi modelli come GPT-4, che possono richiedere enormi risorse computazionali.

Come calcolo la memoria richiesta?

L’hardware di esecuzione degli LLM, quindi GPU o TPU, comprende principalmente un chip di esecuzione e una certa quantità di memoria veloce. Poiché gli LLM occupano molta memoria, per poter fare inferenza è necessario avere a disposizione la quantità necessaria. È quindi indispensabile poter calcolare la quantità di memoria da allocare per non rischiare il blocco dell’esecuzione.

Come si calcola la memoria GPU necessaria per eseguire un LLM?

Sam Stoelinga su Substratus fornisce una semplice formula per calcolare la quantità di memoria usata:

Memoria GPU

M = 1.2*(P∗4B)/(32/Q)

  • P (parametri): Il numero di parametri nel modello. Ad esempio, GPT-3 ha 175 miliardi di parametri, mentre Llama-70B ne ha 70 miliardi. Mettendo il valore dei parametri in miliardi, il risultato in memoria sarà in miliardi di byte, quindi in GB.
  • Q (Precisione o Dimensione per parametro): Il tipo di dato usato per memorizzare i parametri del modello. I tipi di dati comuni già visti sono FP32 (4 byte per parametro), FP16 (2 byte), INT8 (1 byte) ed INT4 (mezzo byte).
  • Fattore di overhead: Tiene conto della memoria aggiuntiva utilizzata durante l’inferenza, come la memorizzazione delle attivazioni (risultati intermedi) del modello. Un fattore di overhead tipico è del 20%, un valore ampio.

Vediamo degli esempi.

  1. Llama 70B, P = 70, con precisione Q = 16 bit

M = 1.2*(P∗4B)/(32/Q)

M = 168 GB

70*4=280

32/16=2

280/2=140

140*1.2= 168

Secondo questo calcolo, per eseguire questo modello con la dotazione standard di 80 GB per GPU servirebbero 3 GPU. Il fattore di overhead è però un numero empirico, per cui ha una tolleranza: si può infatti provare a far girare il modello su 2 moduli, per complessivi 160 GB.

2. Llama 8B, P = 8, con precisione Q = 4 bit

M = 1.2*(P∗4B)/(32/Q)

M = 4,8 GB

8*4=32

32/4=8

32/8=4

4*1.2= 4.8

La riduzione della precisione diminuisce la necessità di risorse, ma influisce sulla precisione dei risultati. L’approccio migliore va quindi valutato caso per caso.

CONDIVIDI SUI SOCIAL

Lascia un commento

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

75 − 67 =