Seguici sui social

Intelligenza Artificiale

Comprensione dei parametri del modello linguistico di grandi dimensioni e dei requisiti di memoria: un'immersione profonda

mm

Pubblicato il

 on

Calcolo dei parametri negli LLM basati su trasformatore

Grandi modelli linguistici (LLM) ha visto notevoli progressi negli ultimi anni. Modelli come GPT-4, Gemini di Google e Claude 3 stanno stabilendo nuovi standard in termini di capacità e applicazioni. Questi modelli non solo migliorano la generazione e la traduzione del testo, ma stanno anche aprendo nuove strade all’elaborazione multimodale, combinando input di testo, immagini, audio e video per fornire soluzioni di intelligenza artificiale più complete.

Ad esempio, GPT-4 di OpenAI ha mostrato miglioramenti significativi nella comprensione e nella generazione di testo simile a quello umano, mentre i modelli Gemini di Google eccellono nella gestione di diversi tipi di dati, inclusi testo, immagini e audio, consentendo interazioni più fluide e contestualmente rilevanti. Allo stesso modo, i modelli Claude 3 di Anthropic sono noti per le loro capacità multilingue e le prestazioni migliorate nelle attività di intelligenza artificiale.

Poiché lo sviluppo degli LLM continua ad accelerare, diventa cruciale comprendere le complessità di questi modelli, in particolare i loro parametri e i requisiti di memoria. Questa guida mira a demistificare questi aspetti, offrendo una spiegazione dettagliata e di facile comprensione.

Le basi dei modelli linguistici di grandi dimensioni

Cosa sono i modelli linguistici di grandi dimensioni?

I modelli linguistici di grandi dimensioni sono reti neurali addestrate su enormi set di dati per comprendere e generare il linguaggio umano. Si affidano ad architetture come Transformers, che utilizzano meccanismi come l'autoattenzione per elaborare e produrre testo.

Importanza dei parametri negli LLM

I parametri sono i componenti principali di questi modelli. Includono pesi e distorsioni, che il modello adatta durante l'addestramento per ridurre al minimo gli errori nelle previsioni. Il numero di parametri è spesso correlato alla capacità e alle prestazioni del modello, ma ne influenza anche i requisiti computazionali e di memoria.

Comprendere l'architettura del trasformatore

Architettura dei trasformatori

Architettura dei trasformatori

Panoramica

L'architettura Transformer, introdotta nel documento “Attention Is All You Need” di Vaswani et al. (2017), è diventato il fondamento di molti LLM. È costituito da un codificatore e un decodificatore, ciascuno composto da più strati identici.

Componenti codificatori e decodificatori

  • Codificatore: elabora la sequenza di input e crea una rappresentazione sensibile al contesto.
  • decoder: Genera la sequenza di output utilizzando la rappresentazione del codificatore e i token precedentemente generati.

Elementi fondamentali

  1. Attenzione multi-testa: consente al modello di concentrarsi simultaneamente su diverse parti della sequenza di input.
  2. Reti neurali feed-forward: Aggiunge non linearità e complessità al modello.
  3. Normalizzazione dei livelli: Stabilizza e accelera l'allenamento normalizzando i risultati intermedi.

Calcolo del numero di parametri

Formazione sui trasformatori

Modelli preaddestrati per un addestramento efficiente dei trasformatori

Calcolo dei parametri negli LLM basati su trasformatore

Analizziamo il calcolo dei parametri per ciascun componente di un LLM basato su Transformer. Utilizzeremo la notazione dell'articolo originale, dove d_model rappresenta la dimensione degli stati nascosti del modello.

  1. Livello di incorporamento:
    • Parametri = vocab_size * d_model
  2. Attenzione multi-testa:
    • Nel h teste, con d_k = d_v = d_model / h:
    • Parametri = 4 * d_model^2 (per Q, K, V e proiezioni di output)
  3. Rete feed-forward:
    • Parametri = 2 * d_model * d_ff + d_model + d_ff
    • Dove d_ff in genere è 4 * d_model
  4. Normalizzazione dei livelli:
    • Parametri = 2 * d_model (per scala e bias)

Parametri totali per uno strato Transformer:

  • Parameters_layer = Parameters_attention + Parameters_ffn +2 * Parameters_layernorm

Per un modello con N strati:

  • Parametri totali = N * Parameters_layer + Parameters_embedding + Parameters_output

Calcolo di esempio

Consideriamo un modello con le seguenti specifiche:

  • d_model = 768
  • h (numero di teste di attenzione) = 12
  • N (numero di strati) = 12
  • vocab_size = 50,000
  1. Livello di incorporamento:
    • 50,000 * 768 = 38,400,000
  2. Attenzione multi-testa:
    • 4*768^2 = 2,359,296
  3. Rete feed-forward:
    • 2 * 768 * (4 * 768) + 768 + (4 * 768) = 4,719,616
  4. Normalizzazione dei livelli:
    • 2 * 768 = 1,536

Parametri totali per strato:

  • 2,359,296 + 4,719,616 + (2 * 1,536) = 7,081,984

Parametri totali per 12 strati:

  • 12 * 7,081,984 = 84,983,808

Parametri totali del modello:

  • 84,983,808 + 38,400,000 = 123,383,808

Questo modello avrebbe circa 123 milioni di parametri.

Tipi di utilizzo della memoria

Quando lavoriamo con gli LLM, dobbiamo considerare due tipi principali di utilizzo della memoria:

  1. Memoria del modello: La memoria richiesta per memorizzare i parametri del modello.
  2. Memoria di lavoro: la memoria necessaria durante l'inferenza o l'addestramento per archiviare attivazioni intermedie, gradienti e stati dell'ottimizzatore.

Calcolo della memoria del modello

La memoria del modello è direttamente correlata al numero di parametri. Ogni parametro viene in genere archiviato come numero a virgola mobile a 32 bit, sebbene alcuni modelli utilizzino un addestramento a precisione mista con numeri in virgola mobile a 16 bit.

Memoria del modello (byte) = Numero di parametri * Byte per parametro

Per il nostro modello di esempio con 123 milioni di parametri:

  • Memoria del modello (32 bit) = 123,383,808 * 4 byte = 493,535,232 byte ≈ 494 MB
  • Memoria del modello (16 bit) = 123,383,808 * 2 byte = 246,767,616 byte ≈ 247 MB

Stima della memoria di lavoro

I requisiti di memoria di lavoro possono variare in modo significativo in base all'attività specifica, alle dimensioni del batch e alla lunghezza della sequenza. Una stima approssimativa della memoria di lavoro durante l'inferenza è:

Memoria di lavoro ≈ 2 * Memoria del modello

Ciò tiene conto della memorizzazione sia dei parametri del modello che delle attivazioni intermedie. Durante l'allenamento, i requisiti di memoria possono essere ancora più elevati a causa della necessità di memorizzare gradienti e stati dell'ottimizzatore:

Memoria di allenamento ≈ 4 * Memoria del modello

Per il nostro modello di esempio:

  • Memoria di lavoro per inferenza ≈ 2 * 494 MB = 988 MB ≈ 1 GB
  • Memoria di allenamento ≈ 4 * 494 MB = 1,976 MB ≈ 2 GB

Utilizzo della memoria allo stato stazionario e utilizzo massimo della memoria

Quando si addestrano modelli linguistici di grandi dimensioni basati sull'architettura Transformer, comprendere l'utilizzo della memoria è fondamentale per un'allocazione efficiente delle risorse. Suddividiamo i requisiti di memoria in due categorie principali: utilizzo della memoria allo stato stazionario e utilizzo della memoria di picco.

Utilizzo della memoria allo stato stazionario

L'utilizzo della memoria allo stato stazionario comprende i seguenti componenti:

  1. Pesi del modello: copie FP32 dei parametri del modello, che richiedono 4N byte, dove N è il numero di parametri.
  2. Stati dell'ottimizzatore: Per l'ottimizzatore Adam, ciò richiede 8N byte (2 stati per parametro).
  3. Sfumature: Copie FP32 dei gradienti, che richiedono 4N byte.
  4. Dati in ingresso: Supponendo input int64, ciò richiede 8BD byte, dove B è la dimensione del batch e D è la dimensione di input.

L'utilizzo totale della memoria allo stato stazionario può essere approssimato da:

  • M_stabile = 16N + 8BD byte

Peak Memory Usage

Il picco di utilizzo della memoria si verifica durante il passaggio all'indietro quando le attivazioni vengono archiviate per il calcolo del gradiente. I principali contributori al picco di memoria sono:

  1. Normalizzazione dei livelli: Richiede 4E byte per norma livello, dove E = BSH (B: dimensione batch, S: lunghezza sequenza, H: dimensione nascosta).
  2. Blocco dell'attenzione:
    • Calcolo QKV: 2E byte
    • Matrice di attenzione: 4BSS byte (S: lunghezza della sequenza)
    • Uscita di attenzione: 2E byte
  3. Blocco feed-forward:
    • Primo strato lineare: 2E byte
    • Attivazione GELU: 8E byte
    • Secondo livello lineare: 2E byte
  4. Perdita di entropia incrociata:
    • Logit: 6BSV byte (V: dimensione del vocabolario)

La memoria di attivazione totale può essere stimata come:

  • M_act = L * (14E + 4BSS) + 6BSV byte

Dove L è il numero di strati del trasformatore.

Utilizzo massimo della memoria totale

L'utilizzo massimo della memoria durante l'allenamento può essere approssimato combinando la memoria allo stato stazionario e la memoria di attivazione:

  • M_picco = M_stabile + M_atto + 4BSV byte

Il termine aggiuntivo 4BSV rappresenta un'assegnazione extra all'inizio del passaggio all'indietro.

Comprendendo questi componenti, possiamo ottimizzare l'utilizzo della memoria durante l'addestramento e l'inferenza, garantendo un'allocazione efficiente delle risorse e prestazioni migliorate di modelli linguistici di grandi dimensioni.

Leggi di scala e considerazioni sull'efficienza

 Leggi di scala per LLM

La ricerca ha dimostrato che le prestazioni degli LLM tendono a seguire determinate leggi di scala all'aumentare del numero di parametri. Kaplan et al. (2020) hanno osservato che le prestazioni del modello migliorano come legge di potenza del numero di parametri, del budget di calcolo e delle dimensioni del set di dati.

La relazione tra prestazioni del modello e numero di parametri può essere approssimata da:

Prestazioni ∝ N^α

Dove N è il numero di parametri e α è un esponente di scala tipicamente intorno a 0.07 per le attività di modellazione del linguaggio.

Ciò implica che per ottenere un miglioramento delle prestazioni del 10%, dobbiamo aumentare il numero di parametri di un fattore 10^(1/α) ≈ 3.7.

Tecniche di efficienza

Man mano che gli LLM continuano a crescere, ricercatori e professionisti hanno sviluppato varie tecniche per migliorare l'efficienza:

a) Allenamento di precisione mista: utilizzo di numeri a virgola mobile a 16 bit o anche a 8 bit per determinate operazioni per ridurre l'utilizzo della memoria e i requisiti di calcolo.

b) Parallelismo del modello: distribuzione del modello su più GPU o TPU per gestire modelli più grandi di quelli che possono essere inseriti in un singolo dispositivo.

c) Checkpoint del gradiente: scambiare il calcolo con la memoria ricalcolando determinate attivazioni durante il passaggio all'indietro invece di memorizzarle.

d) Potatura e quantizzazione: Rimuovere i pesi meno importanti o ridurne la precisione dopo l'allenamento per creare modelli più piccoli ed efficienti.

e) Distillazione: Addestramento di modelli più piccoli per imitare il comportamento di quelli più grandi, preservando potenzialmente gran parte delle prestazioni con meno parametri.

Esempio pratico e calcoli

GPT-3, uno dei modelli linguistici più grandi, ha 175 miliardi di parametri. Utilizza la parte decoder dell'architettura Transformer. Per comprenderne la scala, scomponiamo il conteggio dei parametri con valori ipotetici:

  • d_model = 12288
  • d_ff = 4 * 12288 = 49152
  • Numero di strati = 96

Per un livello decodificatore:

Parametri totali = 8 * 12288^2 + 8 * 12288 * 49152 + 2 * 12288 ≈ 1.1 miliardo

Totale per 96 strati:

1.1 miliardi * 96 = 105.6 miliardi

I restanti parametri provengono dall'incorporamento e da altri componenti.

Conclusione

Comprendere i parametri e i requisiti di memoria di modelli linguistici di grandi dimensioni è fondamentale per progettare, addestrare e distribuire in modo efficace questi potenti strumenti. Scomponendo i componenti dell'architettura Transformer ed esaminando esempi pratici come GPT, otteniamo una visione più approfondita della complessità e della portata di questi modelli.

Per comprendere ulteriormente gli ultimi progressi nei modelli linguistici di grandi dimensioni e le loro applicazioni, consulta queste guide complete:

Ho trascorso gli ultimi cinque anni immergendomi nell'affascinante mondo del Machine Learning e del Deep Learning. La mia passione e competenza mi hanno portato a contribuire a oltre 50 diversi progetti di ingegneria del software, con un focus particolare su AI/ML. La mia continua curiosità mi ha anche attirato verso l'elaborazione del linguaggio naturale, un campo che non vedo l'ora di esplorare ulteriormente.