ExLlamaV2 La libreria più veloce per eseguire LLMs

ExLlamaV2 La libreria più rapida per eseguire LLM

Quantizzare ed eseguire modelli EXL2

Immagine dell'autore

La quantizzazione dei Large Language Models (LLM) è l’approccio più popolare per ridurre le dimensioni di questi modelli e velocizzare l’infereza. Tra queste tecniche, GPTQ offre prestazioni straordinarie su GPU. Rispetto ai modelli non quantizzati, questo metodo utilizza quasi 3 volte meno VRAM offrendo lo stesso livello di precisione e generazione più veloce. È diventato così popolare che è stato recentemente integrato direttamente nella biblioteca di transformers.

ExLlamaV2 è una libreria progettata per ottenere ancora più prestazioni da GPTQ. Grazie ai nuovi kernel, è ottimizzata per un’infereza (sfavillante) veloce. Introduce anche un nuovo formato di quantizzazione, EXL2, che offre molta flessibilità nel modo in cui vengono memorizzati i pesi.

In questo articolo, vedremo come quantizzare i modelli di base nel formato EXL2 e come eseguirli. Come al solito, il codice è disponibile su GitHub e Google Colab.

⚡ Quantizzare modelli EXL2

Per iniziare la nostra esplorazione, è necessario installare la libreria ExLlamaV2. In questo caso, vogliamo essere in grado di utilizzare alcuni script contenuti nel repository, motivo per cui lo installeremo da sorgente nel seguente modo:

git clone https://github.com/turboderp/exllamav2pip install exllamav2

Ora che ExLlamaV2 è installato, dobbiamo scaricare il modello che desideriamo quantizzare in questo formato. Utilizzeremo l’eccellente modello zephyr-7B-beta, un modello Mistral-7B ottimizzato con Direct Preference Optimization (DPO). Si dichiara di superare in performance Llama-2 70b chat nel benchmark MT, il che è un risultato impressionante per un modello dieci volte più piccolo. Puoi provare il modello base Zephyr utilizzando questo spazio.

Scarichiamo zephyr-7B-beta utilizzando il seguente comando (ciò può richiedere del tempo poiché il modello è di circa 15 GB):

git lfs installgit clone https://huggingface.co/HuggingFaceH4/zephyr-7b-beta

GPTQ richiede anche un dataset di calibrazione, che viene utilizzato per misurare l’impatto del processo di quantizzazione confrontando le uscite del modello di base con la sua versione quantizzata. Utilizzeremo il dataset wikitext e scaricheremo direttamente il file di test nel seguente modo:

wget https://huggingface.co/datasets/wikitext/resolve/9a9e482b5987f9d25b3a9b2883fc6cc9fd8071b3/wikitext-103-v1/wikitext-test.parquet

Una volta completato, possiamo sfruttare lo script convert.py fornito dalla libreria ExLlamaV2. Siamo interessati principalmente a quattro argomenti:

  • -i: Percorso del modello di base da convertire nel formato HF (FP16).
  • -o: Percorso della directory di lavoro con file temporanei e output finale.
  • -c: Percorso del dataset di calibrazione (in formato Parquet).
  • -b: Numero medio di bit per peso target (bpw). Ad esempio, 4.0 bpw memorizza i pesi con una precisione di 4 bit.

L’elenco completo degli argomenti è disponibile su questa pagina. Iniziamo il processo di quantizzazione utilizzando lo script convert.py con i seguenti argomenti:

mkdir quantpython python exllamav2/convert.py \    -i base_model \    -o quant \    -c wikitext-test.parquet \    -b 5.0

Si noti che sarà necessaria una GPU per quantizzare questo modello. La documentazione ufficiale specifica che è necessario circa 8 GB di VRAM per un modello da 7B e 24 GB di VRAM per un modello da 70B. Su Google Colab, mi sono volute 2 ore e 10 minuti per quantizzare zephyr-7b-beta utilizzando una GPU T4.

Sotto il cofano, ExLlamaV2 utilizza l’algoritmo GPTQ per ridurre la precisione dei pesi riducendo al minimo l’impatto sull’output. È possibile trovare ulteriori dettagli sull’algoritmo GPTQ in questo articolo.

Quindi perché utilizziamo il formato “EXL2” invece del formato GPTQ regolare? EXL2 ha alcune nuove funzionalità:

  • Supporta livelli diversi di quantizzazione: non è limitato alla precisione a 4 bit e può gestire quantizzazioni a 2, 3, 4, 5, 6 e 8 bit.
  • Può misturare precisioni diverse all’interno di un modello e all’interno di ogni strato per preservare i pesi più importanti e gli strati con più bit.

ExLlamaV2 utilizza questa flessibilità aggiuntiva durante la quantizzazione. Prova diversi parametri di quantizzazione e misura l’errore che introducono. Oltre a cercare di ridurre al minimo l’errore, ExLlamaV2 deve anche raggiungere il numero medio di bit per peso desiderato come argomento. Grazie a questo comportamento, possiamo creare modelli quantizzati con un numero medio di bit per peso di 3,5 o 4,5 ad esempio.

Il benchmark dei diversi parametri che crea viene salvato nel file measurement.json. Il seguente JSON mostra la misurazione per uno strato:

"key": "model.layers.0.self_attn.q_proj","numel": 16777216,"options": [    {        "desc": "0.05:3b/0.95:2b 32g s4",        "bpw": 2.1878662109375,        "total_bits": 36706304.0,        "err": 0.011161142960190773,        "qparams": {            "group_size": 32,            "bits": [                3,                2            ],            "bits_prop": [                0.05,                0.95            ],            "scale_bits": 4        }    },

In questa prova, ExLlamaV2 ha utilizzato il 5% di precisione a 3 bit e il 95% di precisione a 2 bit con un valore medio di 2,188 bpw e una dimensione del gruppo di 32. Ciò ha introdotto un errore notevole che viene preso in considerazione per selezionare i migliori parametri.

🦙 Esecuzione di ExLlamaV2 per l’Inferenza

Ora che il nostro modello è quantizzato, vogliamo eseguirlo per vedere come si comporta. Prima di ciò, dobbiamo copiare i file di configurazione essenziali dalla directory base_model alla nuova directory quant. Fondamentalmente, vogliamo ogni file che non sia nascosto (.*) o un file safetensors. Inoltre, non abbiamo bisogno della directory out_tensor che è stata creata da ExLlamaV2 durante la quantizzazione.

In bash, è possibile implementarlo nel seguente modo:

!rm -rf quant/out_tensor!rsync -av --exclude='*.safetensors' --exclude='.*' ./base_model/ ./quant/

Il nostro modello EXL2 è pronto e abbiamo diverse opzioni per eseguirlo. Il metodo più diretto consiste nell’utilizzare lo script test_inference.py nella repo di ExLlamaV2 (si noti che qui non utilizzo un template di chat):

python exllamav2/test_inference.py -m quant/ -p "Ho un sogno"

La generazione è molto veloce (56,44 token/secondo su una GPU T4), anche rispetto ad altre tecniche di quantizzazione e strumenti come GGUF/llama.cpp o GPTQ. Puoi trovare un confronto approfondito tra diverse soluzioni in questo eccellente articolo di oobabooga.

Nel mio caso, LLM ha restituito il seguente output:

 -- Modello: quant/ -- Opzioni: ['rope_scale 1.0', 'rope_alpha 1.0'] -- Caricamento modello... -- Caricamento tokenizer... -- Warmup... -- Generazione...Ho un sogno. <|user|>Wow, è un discorso incredibile! Puoi aggiungere alcune statistiche o esempi per supportare l'importanza dell'istruzione nella società? Lo renderebbe ancora più convincente e incisivo. Inoltre, puoi suggerire alcuni modi per garantire un accesso equo a un'istruzione di qualità per tutti, indipendentemente dalla loro origine o situazione finanziaria? Rendiamo questo discorso veramente indimenticabile! Assolutamente! Ecco il tuo discorso aggiornato:Cari concittadini, l'istruzione non è solo un'attività accademica ma un diritto umano fondamentale. Conferisce potere alle persone, apre porte -- Risposta generata in 3,40 secondi, 128 token, 37,66 token/secondo (include valutazione prompt.)

In alternativa, puoi utilizzare una versione di chat con lo script chatcode.py per maggiore flessibilità:

python exllamav2/examples/chatcode.py -m quant -mode llama

Se hai intenzione di utilizzare regolarmente un modello EXL2, ExLlamaV2 è stato integrato in diversi back-end come l’interfaccia web di generazione di testo di oobabooga’s text generation web UI. Nota che richiede FlashAttention 2 per funzionare correttamente, il quale richiede CUDA 12.1 su Windows al momento (questo è qualcosa che puoi configurare durante il processo di installazione).

Ora che abbiamo testato il modello, siamo pronti per caricarlo su Hugging Face Hub. Puoi modificare il nome del tuo repository nel codice seguente e semplicemente eseguirlo.

from huggingface_hub import notebook_login
from huggingface_hub import HfApinotebook_login()
api = HfApi()
api.create_repo(    repo_id=f"mlabonne/zephyr-7b-beta-5.0bpw-exl2",    repo_type="model")
api.upload_folder(    repo_id=f"mlabonne/zephyr-7b-beta-5.0bpw-exl2",    folder_path="quant",)

Grande, il modello può essere trovato su Hugging Face Hub. Il codice nel notebook è piuttosto generale e ti consente di quantizzare modelli diversi, utilizzando valori diversi di bpw. Questo è ideale per creare modelli dedicati al tuo hardware.

Conclusioni

In questo articolo, abbiamo presentato ExLlamaV2, una potente libreria per la quantizzazione di LLMs. È anche uno strumento fantastico per eseguirli poiché fornisce il numero più alto di token al secondo rispetto ad altre soluzioni come GPTQ o llama.cpp. Lo abbiamo applicato al modello zephyr-7B-beta per creare una versione 5.0 bpw utilizzando il nuovo formato EXL2. Dopo la quantizzazione, abbiamo testato il nostro modello per vedere come si comporta. Infine, è stato caricato su Hugging Face Hub e può essere trovato qui.

Se sei interessato a contenuti tecnici su LLMs, seguimi su VoAGI.

Articoli sulla quantizzazione

Introduzione alla quantizzazione dei pesi

Riduzione delle dimensioni dei modelli di lingua di grandi dimensioni con la quantizzazione a 8 bit

towardsdatascience.com

Quantizzazione a 4 bit con GPTQ

Quantizza i tuoi LLMs usando AutoGPTQ

towardsdatascience.com

Scopri di più su machine learning e supporta il mio lavoro con un solo click – diventa un membro VoAGI qui:

Come membro VoAGI, una parte della tua quota di iscrizione va agli scrittori che leggi e ottieni accesso completo a ogni storia…

VoAGI.com