Affinamento di un LLM Open-Source con Axolotl utilizzando l’Ottimizzazione Diretta delle Preferenze (DPO)

Gli LLM hanno sbloccato innumerevoli nuove opportunità per le applicazioni di intelligenza artificiale. Se hai mai desiderato perfezionare il tuo modello, questa guida ti mostrerà come farlo facilmente e senza scrivere codice. Utilizzando strumenti come Axolotl e DPO, passeremo attraverso il processo passo dopo passo.

Cos’è un LLM?

Un Large Language Model (LLM) è un potente modello di intelligenza artificiale addestrato su vaste quantità di dati testuali, decine di trilioni di caratteri, per prevedere il prossimo insieme di parole in una sequenza. Ciò è stato reso possibile solo negli ultimi 2-3 anni grazie ai progressi compiuti nel calcolo GPU, che hanno permesso di addestrare modelli così enormi in poche settimane.

Probabilmente hai interagito con gli LLM attraverso prodotti come ChatGPT o Claude in precedenza e hai sperimentato di persona la loro capacità di comprendere e generare risposte simili a quelle umane.

Perché Perfezionare un LLM?

Non possiamo semplicemente utilizzare GPT-4o per tutto? Bene, anche se è il modello più potente che abbiamo al momento della stesura di questo articolo, non è sempre la scelta più pratica. Perfezionare un modello più piccolo, che varia da 3 a 14 miliardi di parametri, può produrre risultati comparabili a una frazione minima del costo. Inoltre, il perfezionamento ti permette di possedere la tua proprietà intellettuale e ridurre la tua dipendenza da terzi.

Comprensione dei Modelli Base, Instruct e Chat

Prima di addentrarti nel perfezionamento, è essenziale comprendere i diversi tipi di LLM che esistono:

  • Modelli di Base: Questi sono preaddestrati su grandi quantità di testo non strutturato, come libri o dati internet. Pur avendo una comprensione intrinseca del linguaggio, non sono ottimizzati per l’infrazione e produrranno output incoerenti. I modelli di base sono sviluppati per servire come punto di partenza per lo sviluppo di modelli più specializzati.
  • Modelli Istruiti: Costruiti sopra ai modelli di base, i modelli istruiti vengono perfezionati utilizzando dati strutturati come coppie di prompt-risposta. Sono progettati per seguire istruzioni specifiche o rispondere a domande.
  • Modelli di Chat: Anche costruiti sui modelli di base, ma a differenza dei modelli istruiti, i modelli di chat vengono addestrati su dati conversazionali, consentendo loro di partecipare a dialoghi a due vie.

Cosa sono il Reinforcement Learning e il DPO?

Il Reinforcement Learning (RL) è una tecnica in cui i modelli imparano ricevendo feedback sulle proprie azioni. Viene applicato ai modelli istruiti o di chat per raffinare ulteriormente la qualità dei loro output. Tipicamente, l’RL non viene eseguito sopra ai modelli di base poiché utilizza un tasso di apprendimento molto più basso che non sposterà abbastanza l’ago della bilancia.

Il DPO è una forma di RL in cui il modello viene addestrato utilizzando coppie di buone e cattive risposte allo stesso prompt/conversazione. Presentando queste coppie, il modello impara a favorire gli esempi buoni e evitare quelli cattivi.

Quando Usare il DPO

Il DPO è particolarmente utile quando si desidera regolare lo stile o il comportamento del proprio modello, ad esempio:

  • Regolazioni di Stile: Modificare la lunghezza delle risposte, il livello di dettaglio o il grado di fiducia espresso dal modello.
  • Misure di Sicurezza: Addestrare il modello a rifiutare risposte a richieste potenzialmente pericolose o inappropriate.

Tuttavia, il DPO non è adatto per insegnare al modello nuove conoscenze o fatti. A tale scopo, le tecniche di Supervised Fine-Tuning (SFT) o Retrieval-Augmented Generation (RAG) sono più appropriate.

Creazione di un Dataset DPO

In un ambiente di produzione, di solito genereresti un dataset DPO utilizzando il feedback degli utenti, ad esempio:

  • Feedback degli Utenti: Implementare un meccanismo di valutazione con pollice su/pollice giù sulle risposte.
  • Scelte Comparativa: Presentare agli utenti due output diversi e chiedere loro di scegliere quello migliore.

Se non hai dati degli utenti, puoi anche creare un dataset sintetico sfruttando LLM più grandi e capaci. Ad esempio, puoi generare risposte sbagliate utilizzando un modello più piccolo e poi usare GPT-4o per correggerle.

Per semplificare, utilizzeremo un dataset già pronto da HuggingFace: olivermolenschot/alpaca_messages_dpo_test. Se ispezioni il dataset, noterai che contiene richieste con risposte scelte e rifiutate—queste sono le buone e le cattive esempi. Questi dati sono stati creati sinteticamente utilizzando GPT-3.5-turbo e GPT-4.

In generale, avrai bisogno di un minimo di 500 a 1.000 coppie di dati per un addestramento efficace senza overfitting. I più grandi dataset DPO contengono fino a 15.000–20.000 coppie.

Fine-Tuning Qwen2.5 3B Instruct con Axolotl

Utilizzeremo Axolotl per affinare il modello Qwen2.5 3B Instruct, che attualmente è al vertice della OpenLLM Leaderboard per la sua classe di dimensione. Con Axolotl, puoi affinare un modello senza scrivere una sola riga di codice, basta un file di configurazione YAML. Qui di seguito c’è il config.yml che utilizzeremo:

base_model: Qwen/Qwen2.5-3B-Instruct
strict: false

# Axolotl will automatically map the dataset from HuggingFace to the prompt template of Qwen 2.5
chat_template: qwen_25
rl: dpo
datasets:
  - path: olivermolenschot/alpaca_messages_dpo_test
    type: chat_template.default
    field_messages: conversation
    field_chosen: chosen
    field_rejected: rejected
    message_field_role: role
    message_field_content: content

# We pick a directory inside /workspace since that's typically where cloud hosts mount the volume
output_dir: /workspace/dpo-output

# Qwen 2.5 supports up to 32,768 tokens with a max generation of 8,192 tokens
sequence_len: 8192

# Sample packing does not currently work with DPO. Pad to sequence length is added to avoid a Torch bug
sample_packing: false
pad_to_sequence_len: true

# Add your WanDB account if you want to get nice reporting on your training performance
wandb_project:
wandb_entity:
wandb_watch:
wandb_name:
wandb_log_model:

# Can make training more efficient by batching multiple rows together
gradient_accumulation_steps: 1
micro_batch_size: 1

# Do one pass on the dataset. Can set to a higher number like 2 or 3 to do multiple
num_epochs: 1

# Optimizers don't make much of a difference when training LLMs. Adam is the standard
optimizer: adamw_torch

# DPO requires a smaller learning rate than regular SFT
lr_scheduler: constant
learning_rate: 0.00005

# Train in bf16 precision since the base model is also bf16
bf16: auto

# Reduces memory requirements
gradient_checkpointing: true

# Makes training faster (only suported on Ampere, Ada, or Hopper GPUs)
flash_attention: true

# Can save multiple times per epoch to get multiple checkpoint candidates to compare
saves_per_epoch: 1

logging_steps: 1
warmup_steps: 0

Impostazione dell’Ambiente Cloud

Per eseguire l’addestramento, utilizzeremo un servizio di hosting cloud come Runpod o Vultr. Ecco cosa ti servirà:

  • Immagine Docker: Clona l’immagine Docker winglian/axolotl-cloud:main fornita dal team di Axolotl.
  • *Requisiti Hardware: Una GPU con 80GB di VRAM (come un nodo 1×A100 PCIe) sarà più che sufficiente per questa dimensione di modello.
  • Storage: 200GB di spazio di archiviazione per contenere tutti i file necessari.
  • Versione CUDA: La tua versione CUDA dovrebbe essere almeno 12.1.

*Questo tipo di addestramento è considerato un affinamento completo del LLM e quindi è molto intensivo in VRAM. Se desideri eseguire un addestramento localmente, senza fare affidamento su host cloud, potresti provare a utilizzare QLoRA, che è una forma di Affinamento Supervisionato. Anche se è teoricamente possibile combinare DPO & QLoRA, questo viene fatto molto raramente.

Passi per Iniziare l’Addestramento

  1. Imposta la Directory Cache di HuggingFace:
export HF_HOME=/workspace/hf

Questo assicura che il modello originale venga scaricato nel nostro spazio di archiviazione, che è persistente.

  1. Crea il File di Configurazione: Salva il file config.yml che abbiamo creato in precedenza in /workspace/config.yml.
  1. Inizia l’Addestramento:
python -m axolotl.cli.train /workspace/config.yml

Ecco fatto! Il tuo allenamento dovrebbe iniziare. Dopo che Axolotl ha scaricato il modello e i dati di addestramento, dovresti vedere un output simile a questo:

[2024-12-02 11:22:34,798] [DEBUG] [axolotl.train.train:98] [PID:3813] [RANK:0] loading model

[2024-12-02 11:23:17,925] [INFO] [axolotl.train.train:178] [PID:3813] [RANK:0] Starting trainer...

L’addestramento dovrebbe richiedere solo pochi minuti per completarsi poiché si tratta di un piccolo dataset di sole 264 righe. Il modello affinato sarà salvato in /workspace/dpo-output.

Caricamento del modello su HuggingFace

Puoi caricare il tuo modello su HuggingFace usando la CLI:

  1. Installa la CLI di HuggingFace Hub:
pip install huggingface_hub[cli]
  1. Carica il modello:
huggingface-cli upload /workspace/dpo-output yourname/yourrepo

Sostituisci yourname/yourrepo con il tuo effettivo nome utente e nome del repository HuggingFace.

Valutazione del tuo modello affinato

Per la valutazione, è consigliabile ospitare sia i modelli originali che quelli affinati utilizzando uno strumento come Text Generation Inference (TGI). Quindi, esegui inferenze su entrambi i modelli con un’impostazione di temperatura di 0 (per garantire output deterministici) e confronta manualmente le risposte dei due modelli.

Questo approccio pratico fornisce migliori approfondimenti rispetto al fare affidamento esclusivamente su metriche di perdita di valutazione dell’addestramento, che potrebbero non catturare le sfumature della generazione di linguaggio nei LLM.

Conclusione

L’affinamento di un LLM utilizzando il DPO ti consente di personalizzare i modelli per soddisfare meglio le esigenze della tua applicazione, mantenendo al contempo i costi gestibili. Seguendo i passaggi delineati in questo articolo, puoi sfruttare la potenza degli strumenti e dei dataset open-source per creare un modello che si allinei con i tuoi requisiti specifici. Che tu stia cercando di modificare lo stile delle risposte o di implementare misure di sicurezza, il DPO offre un approccio pratico per perfezionare il tuo LLM.

Buon affinamento!

Source:
https://www.sitepoint.com/fine-tuning-llm-with-direct-preference-optimization-dpo/