Meta Llama 3 Inferenza CPU ottimizzata con Hugging Face e PyTorch |  di Eduardo Alvarez |  Aprile 2024

 | Intelligenza-Artificiale

Creato con Nightcafe — Proprietà dell'immagine dell'autore

Scopri come ridurre la latenza del modello durante la distribuzione di Meta* Llama 3 sulle CPU

Il tanto atteso pubblicazione del lotto di Llama di terza generazione di Meta è qui e voglio assicurarmi che tu sappia come distribuire questo LLM all'avanguardia (SoTA) in modo ottimale. In questo tutorial, ci concentreremo sull'esecuzione della quantizzazione di solo peso (WOQ) per comprimere il modello di parametri 8B e migliorare la latenza di inferenza, ma prima parliamo di Meta Llama 3.

Ad oggi, la famiglia Llama 3 comprende modelli che vanno dai parametri 8B a 70B, con ulteriori versioni in arrivo. I modelli sono dotati di un Meta Llama 3 permissivo licenzasei invitato a rivedere prima di accettare i termini richiesti per utilizzarli. Questo segna un capitolo entusiasmante per la famiglia di modelli Llama e l'intelligenza artificiale open source.

Architettura

Il Llama 3 è un LLM autoregressivo basato su un trasformatore solo decoder. Rispetto a Llama 2, il team Meta ha apportato i seguenti notevoli miglioramenti:

  • Adozione dell'attenzione alle query raggruppate (GQA), che migliora l'efficienza dell'inferenza.
  • Tokenizzatore ottimizzato con un vocabolario di 128.000 token progettati per codificare il linguaggio in modo più efficiente.
  • Addestrato su un set di dati di 15 trilioni di token, è 7 volte più grande del set di dati di addestramento di Llama 2 e include 4 volte più codice.

La figura seguente (Figura 1) è il risultato di print(model) Dove model È meta-llama/Meta-Llama-3–8B-Istruire. In questa figura, possiamo vedere che il modello comprende 32 LlamaDecoderLayers composti da componenti di autoattenzione di Llama Attention. Inoltre, ha LlamaMLP, LlamaRMSNorm e una testa lineare. Speriamo di saperne di più una volta pubblicato il documento di ricerca di Llama 3.

Figura 1. Output di “print(model)” che mostra la distribuzione dei livelli nell'architettura di llama-3–8B-instruct — Immagine dell'autore

Prestazioni di modellazione del linguaggio

Il modello è stato valutato su vari benchmark di modellazione linguistica standard del settore, come MMLU, GPQA, HumanEval, GSM-8K, MATH e altri. Ai fini di questo tutorial, esamineremo le prestazioni dei “modelli ottimizzati per le istruzioni” (Figura 2). L'aspetto più notevole di queste cifre è che il modello con parametri Llama 3 8B supera Llama 2 70B dal 62% al 143% rispetto ai benchmark riportati pur essendo un modello più piccolo dell'88%!

Figura 2 . Riepilogo delle metriche prestazionali del modello di istruzioni Llama 3 nei benchmark MMLU, GPQA, HumanEval, GSM-8K e MATH LLM. — Immagine dell'autore (fonte)

Le maggiori prestazioni di modellazione del linguaggio, le licenze permissive e le efficienze architetturali incluse in quest'ultima generazione di Llama segnano l'inizio di un capitolo molto entusiasmante nello spazio dell'intelligenza artificiale generativa. Esploriamo come possiamo ottimizzare l'inferenza sulle CPU per distribuzioni scalabili e a bassa latenza di Llama 3.

In un articolo precedenteHo trattato l'importanza della compressione del modello e dell'ottimizzazione complessiva dell'inferenza nello sviluppo di applicazioni basate su LLM. In questo tutorial, ci concentreremo sull'applicazione della quantizzazione di solo peso (WOQ). meta-llama/Meta-Llama-3–8B-Istruire. WOQ offre un equilibrio tra prestazioni, latenza e precisione, con opzioni per quantizzare su int4 o int8. Una componente chiave di WOQ è la fase di dequantizzazione, che riconverte i pesi int4/in8 in bf16 prima del calcolo.

Fig 3. Semplice illustrazione della quantizzazione del solo peso, con i pesi prequantizzati in arancione e i pesi quantizzati in verde. Si noti che questo descrive la quantizzazione iniziale in int4/int8 e la dequantizzazione in fp16/bf16 per la fase di calcolo. — Immagine dell'autore (fonte)

Configurazione dell'ambiente

Avrai bisogno di circa 60 GB di RAM per eseguire WOQ su Llama-3-8B-Instruct. Ciò include circa 30 GB per caricare il modello completo e circa 30 GB per il picco di memoria durante la quantizzazione. Il WOQ Llama 3 consumerà solo ~10GB di RAM, il che significa che possiamo liberare ~50GB di RAM liberando il modello completo dalla memoria.

Puoi eseguire questo tutorial su Intel® Tevere® Nuvola per sviluppatori ambiente JupyterLab* gratuito. Questo ambiente offre un processore Intel di quarta generazione® Xeon® CPU con 224 thread e 504 GB di memoria, più che sufficienti per eseguire questo codice.

Se lo esegui nel tuo IDE, potrebbe essere necessario risolvere dipendenze aggiuntive come l'installazione di Jupyter e/o la configurazione di un ambiente conda/python. Prima di iniziare, assicurati di aver installato le seguenti dipendenze.

intel-extension-for-pytorch==2.2
transformers==4.35.2
torch==2.2.0
huggingface_hub

Accesso e configurazione di Llama 3

Avrai bisogno di un account Hugging Face* per accedere al modello e al tokenizzatore di Llama 3.

Per fare ciò, seleziona “Token di accesso” dal menu delle impostazioni (Figura 4) e crea un token.

Figura 4. Istantanea della console di configurazione del token Hugging Face: immagine per autore

Copia il tuo token di accesso e incollalo nel campo “Token” generato all'interno della tua cella Jupyter dopo aver eseguito il seguente codice.

from huggingface_hub import notebook_login, Repository

# Login to Hugging Face
notebook_login()

Vai a meta-llama/Meta-Llama-3–8B-Istruire e valuta attentamente i termini e la licenza prima di fornire le tue informazioni e inviare la richiesta di accesso a Llama 3. Accettare i termini del modello e fornire le tue informazioni è tuo e solo tuo.

Quantizzare Llama-3–8B-Istruire con WOQ

Sfrutteremo il Estensione Intel® per PyTorch* per applicare WOQ a Llama 3. Questa estensione contiene le ultime ottimizzazioni PyTorch per l'hardware Intel. Segui questi passaggi per quantizzare ed eseguire l'inferenza con un modello Llama 3 ottimizzato:

  1. Modello e tokenizzatore di Lama 3: Importa i pacchetti richiesti e utilizza il file AutoModelForCausalLM.from_pretrained() E AutoTokenizer.from_pretrained() metodi per caricare i pesi specifici e il tokenizzatore Llama-3–8B-Instruct.
import torch
import intel_extension_for_pytorch as ipex
from transformers import AutoTokenizer, AutoModelForCausalLM, TextStreamer

Model = 'meta-llama/Meta-Llama-3-8B-Instruct'

model = AutoModelForCausalLM.from_pretrained(Model)
tokenizer = AutoTokenizer.from_pretrained(Model)

2. Configurazione della ricetta di quantizzazione: Configura la ricetta di quantizzazione WOQ. Possiamo impostare il weight_dtype variabile ai tipi di dati in memoria desiderati, scegliendo tra torch.quint4x2 O torch.qint8 rispettivamente per int4 e in8. Inoltre possiamo usare lowp_model per definire la precisione della dequantizzazione. Per ora, lo manterremo come ipex.quantization.WoqLowpMode.None per mantenere la precisione di calcolo bf16 predefinita.

qconfig = ipex.quantization.get_weight_only_quant_qconfig_mapping(
weight_dtype=torch.quint4x2, # or torch.qint8
lowp_mode=ipex.quantization.WoqLowpMode.NONE, # or FP16, BF16, INT8
)
checkpoint = None # optionally load int4 or int8 checkpoint

# PART 3: Model optimization and quantization
model_ipex = ipex.llm.optimize(model, quantization_config=qconfig, low_precision_checkpoint=checkpoint)

del model

Noi usiamo ipex.llm.optimize() per applicare WOQ e poi del model per eliminare il modello completo dalla memoria e liberare circa 30 GB di RAM.

3. Suggerimenti per Lama 3: Llama 3, come Llama 2, ha un modello di suggerimenti predefinito per i suoi modelli ottimizzati per le istruzioni. Utilizzando questo modello, gli sviluppatori possono definire istruzioni specifiche sul comportamento del modello e fornire suggerimenti all'utente e cronologia delle conversazioni.

system= """\n\n You are a helpful, respectful and honest assistant. Always answer as helpfully as possible, while being safe. If you don't know the answer to a question, please don't share false information."""
user= "\n\n You are an expert in astronomy. Can you tell me 5 fun facts about the universe?"
model_answer_1 = 'None'

llama_prompt_tempate = f"""
<|begin_of_text|>\n<|start_header_id|>system<|end_header_id|>{system}
<|eot_id|>\n<|start_header_id|>user<|end_header_id|>{user}
<|eot_id|>\n<|start_header_id|>assistant<|end_header_id|>{model_answer_1}<|eot_id|>
"""

inputs = tokenizer(llama_prompt_tempate, return_tensors="pt").input_ids

Forniamo i campi richiesti e quindi utilizziamo il tokenizzatore per convertire l'intero modello in token per il modello.

4. Lama 3 Inferenza: Per la generazione del testo, facciamo leva TextStreamer per generare un flusso di inferenza in tempo reale invece di stampare l'intero output in una sola volta. Ciò si traduce in un'esperienza di generazione del testo più naturale per i lettori. Forniamo lo streamer configurato a model_ipex.generate() e altri parametri di generazione del testo.

with torch.inference_mode():
tokens = model_ipex.generate(
inputs,
streamer=streamer,
pad_token_id=128001,
eos_token_id=128001,
max_new_tokens=300,
repetition_penalty=1.5,
)

Dopo aver eseguito questo codice, il modello inizierà a generare output. Tieni presente che si tratta di uscite non filtrate e non protette. Per i casi d'uso reali, dovrai effettuare ulteriori considerazioni di post-elaborazione.

Figura 5. Inferenza in streaming di Llama-3–8B-Instruct con compressione in modalità WOQ su int4 in esecuzione sull'ambiente JupyterLab di Intel Tiber Developer Cloud: Gif per autore

Questo è tutto. Con meno di 20 righe di codice, ora disponi di una versione ottimizzata per CPU a bassa latenza dell'ultimo SoTA LLM nell'ecosistema.

Considerazioni per la distribuzione

A seconda della strategia di distribuzione del servizio di inferenza, ci sono alcune cose che dovresti considerare:

  • Se si distribuiscono istanze di Llama 3 in contenitori, WOQ offrirà un ingombro di memoria inferiore e consentirà di servire più servizi di inferenza del modello su un singolo nodo hardware.
  • Quando si distribuiscono più servizi di inferenza, è necessario ottimizzare i thread e la memoria riservata per ogni istanza del servizio. Lasciare memoria aggiuntiva sufficiente (~4 GB) e thread (~4 thread) per gestire i processi in background.
  • Prendi in considerazione la possibilità di salvare la versione WOQ del modello e di archiviarla in un registro del modello per eliminare la necessità di riquantizzare il modello per distribuzione di istanza.

La famiglia Llama 3 LLM di Meta offre notevoli miglioramenti rispetto alle generazioni precedenti con una vasta gamma di configurazioni (da 8B a 70B). In questo tutorial, abbiamo esplorato il miglioramento dell'inferenza della CPU con la quantizzazione di solo peso (WOQ), una tecnica che riduce al minimo la latenza preservando la precisione.

Integrando la nuova generazione di LLM Llama 3 orientati alle prestazioni con tecniche di ottimizzazione come WOQ, gli sviluppatori possono sbloccare nuove possibilità per GenAI applicazioni. Questa combinazione semplifica i requisiti hardware per ottenere risultati ad alta fedeltà e bassa latenza da LLM integrati in sistemi nuovi ed esistenti.

Alcune cose interessanti da provare dopo sarebbero:

  1. Sperimenta con i livelli di quantizzazione: Dovresti testare la quantizzazione int4 e int8 per identificare il miglior compromesso tra prestazioni e precisione per le tue applicazioni specifiche.
  2. Monitoraggio delle prestazioni: È fondamentale valutare continuamente le prestazioni e l’accuratezza del modello Llama 3 in diversi scenari del mondo reale per garantire che la quantizzazione mantenga l’efficacia desiderata.
  3. Prova altri lama: Esplora l'intera famiglia Llama 3 e valuta l'impatto di WOQ e di altri PyTorch ricette di quantizzazione.

Fonte: towardsdatascience.com

Lascia un commento

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