Fine-Tuning · LLM LoRA On-Premise

Esempio di fine-tuning LoRA: dal dataset al modello on-premise

Come personalizzare un modello linguistico di grandi dimensioni con una GPU standard, pochi dati aziendali e senza inviare nulla in cloud — con un esempio concreto di dataset, parametri e risultato. Guida pratica per PMI italiane.

Addestrare un modello AI da zero richiede migliaia di GPU e mesi di tempo — fuori dalla portata di qualsiasi PMI. Ma personalizzare un modello già esistente sul proprio dominio aziendale è un'altra storia. LoRA (Low-Rank Adaptation) è la tecnica che ha reso questo possibile su hardware accessibile: una singola GPU da gaming, pochi gigabyte di dati, qualche ora di addestramento. Il risultato è un modello che parla il linguaggio della tua azienda — letteralmente.

L'esempio in 4 passi (il caso: un assistente tecnico per i macchinari di un'azienda manifatturiera)

  • Il dataset: 300–500 coppie domanda/risposta in un file JSONL
  • L'addestramento: QLoRA su Qwen3 8B con rango 16, una sola GPU da 16–24 GB
  • La verifica: le stesse domande con e senza adapter, su esempi mai visti
  • Il risultato: le risposte prima e dopo il fine-tuning

Prima dell'esempio trovi il significato di fine-tuning e come funziona LoRA; se ti interessa solo il codice, vai direttamente all'esempio.

Fine-tuning: significato

Fine-tuning significa letteralmente "regolazione fine". Nel machine learning indica il proseguimento dell'addestramento di un modello già addestrato su un insieme di dati più piccolo e mirato, in modo che si adatti a un compito o a un dominio specifico. Il modello di partenza ha già imparato la lingua e una grande quantità di conoscenze generali; il fine-tuning gli insegna come rispondere in un contesto preciso.

Un modello linguistico come quelli che usiamo nei progetti passa in genere da tre fasi:

Esistono più modi di fare fine-tuning. Il full fine-tuning aggiorna tutti i parametri del modello; le tecniche PEFT (Parameter-Efficient Fine-Tuning), di cui LoRA e la sua variante QLoRA sono le più usate, ne aggiornano una piccola parte o aggiungono pochi parametri nuovi. Il fine-tuning può insegnare un compito (classificare ticket, estrarre dati da documenti), uno stile (il tono delle risposte ai clienti) o un formato (JSON per un gestionale), mentre è poco adatto a far "memorizzare" fatti che cambiano spesso: per quelli si usa il RAG, come vedremo più avanti.

Transfer learning vs fine-tuning

I due termini si usano spesso come sinonimi, ma non lo sono. Il transfer learning è il principio generale: riutilizzare ciò che un modello ha imparato su un compito per risolverne un altro, invece di partire da zero. Il fine-tuning è uno dei modi di metterlo in pratica, quello in cui i pesi del modello preaddestrato vengono effettivamente aggiornati.

L'altro modo classico è la feature extraction: il modello preaddestrato resta congelato e si addestra solo un piccolo strato finale. È l'approccio storico della visione artificiale, dove una rete addestrata su milioni di immagini generiche viene riutilizzata, ad esempio, per riconoscere i difetti di un prodotto. LoRA si colloca a metà strada: il modello originale resta congelato come nella feature extraction, ma le piccole matrici aggiunte modificano il comportamento di tutti gli strati come nel fine-tuning.

ApproccioCosa si addestraDati e hardwareQuando si usa
Feature extractionSolo un nuovo strato finale; il modello resta congelatoPochi dati, hardware minimoClassificazione e compiti semplici, molto usata nella visione artificiale
Full fine-tuningTutti i parametri del modelloMolti dati, più GPU professionaliLaboratori e grandi aziende con budget di calcolo elevato
LoRA / QLoRAPiccole matrici aggiuntive (meno dell'1% dei parametri)Da qualche centinaio di esempi, una GPU da 16–24 GBSpecializzare un LLM su un dominio aziendale, on-premise

Il problema che LoRA risolve

I grandi modelli linguistici (LLM) come Qwen3, Gemma o Mistral vengono addestrati su enormi quantità di testo generico. Conoscono quasi tutto, ma non il tuo specifico dominio: il gergo tecnico dei tuoi macchinari, le clausole contrattuali standard del tuo settore, le procedure operative specifiche della tua azienda.

Il metodo tradizionale per specializzare un modello — il full fine-tuning — richiede di aggiornare tutti i miliardi di parametri del modello. Per un modello da 7 miliardi di parametri, questo significa:

LoRA risolve tutto questo con un'idea matematicamente elegante: invece di modificare i pesi originali del modello, aggiunge una piccola struttura ausiliaria che impara l'adattamento necessario.

Come funziona: la matematica semplificata

Ogni strato di un modello trasformer contiene matrici di pesi che trasformano i dati in ingresso. Queste matrici sono grandi — per un modello da 7B parametri, alcune possono avere dimensioni di 4096×4096, cioè oltre 16 milioni di valori per singolo strato.

L'intuizione chiave di LoRA: gli aggiornamenti necessari per l'adattamento a un nuovo dominio hanno una struttura a basso rango. Non serve modificare tutti i 16 milioni di valori — basta aggiungere due piccole matrici il cui prodotto approssima l'aggiornamento necessario.

W' = W + ΔW = W + B × A

L'aggiornamento ΔW viene scomposto nel prodotto di due matrici di rango ridotto

W = pesi originali (congelati, non modificati) A = matrice di proiezione discendente (d × r) B = matrice di proiezione ascendente (r × d) r = rango (tipicamente 4–64, molto minore di d)

Se il modello originale ha una matrice 4096×4096 (≈16M parametri), con rango r=16 bastano due matrici: 4096×16 + 16×4096 = circa 131K parametri. Una riduzione di oltre il 99% dei parametri da addestrare, con risultati spesso indistinguibili dal full fine-tuning.

I numeri concreti: hardware necessario

<1%

parametri addestrabili rispetto al full fine-tuning

16 GB

VRAM sufficienti per fine-tuning LoRA su modello 7B

2–8h

tempo tipico di addestramento su RTX 4090 con dataset aziendale

Metodo Full Fine-Tuning LoRA (r=16)
Parametri addestrabili (7B model)7.000.000.000~4.700.000
VRAM minima80+ GB (A100)16–24 GB (RTX 4090)
Tempo (500 esempi)Giorni2–8 ore
Costo hardware indicativo15.000–50.000€Hardware già disponibile
Rischio catastrophic forgettingAltoBasso (pesi originali intatti)
Deploy: dimensioni aggiuntiveNuovo modello completoSolo adapter (~50–200 MB)

Un esempio pratico di fine-tuning LoRA

Prendiamo uno scenario concreto: un'azienda manifatturiera vuole un assistente che risponda alle domande tecniche dei clienti usando la terminologia esatta dei propri macchinari, non un italiano generico da manuale.

1. Il dataset: esempi istruzione → risposta

Si parte da un file con coppie domanda/risposta nel formato che il modello deve imparare a riprodurre. Un estratto realistico:

Istruzione (input)Risposta attesa (output)
"Il pressostato PZ-40 va in allarme, cosa controllo?""Verifica prima la taratura del pressostato PZ-40 a 6 bar; se l'allarme persiste, controlla la valvola di sfiato a monte del gruppo compressore."
"Qual è l'intervallo di manutenzione del riduttore RG-12?""Il riduttore RG-12 richiede sostituzione olio ogni 2.000 ore di esercizio e controllo giochi assiali ogni 500 ore."

Per questo caso d'uso servono in genere 300–500 coppie di questo tipo, estratte da manuali interni, ticket di assistenza risolti e verbali di manutenzione.

2. I parametri usati

r=16

rango della matrice LoRA

α=32

alpha (scala dell'adattamento)

3 epoche

passaggi sul dataset completo

3. Il codice: l'addestramento in una trentina di righe

Il dataset si salva in un file JSONL, una conversazione per riga (qui la riga va a capo solo per leggibilità):

{"messages": [{"role": "user", "content": "Il pressostato PZ-40 va in allarme, cosa controllo?"}, {"role": "assistant", "content": "Verifica prima la taratura del pressostato PZ-40 a 6 bar; se l'allarme persiste, controlla la valvola di sfiato a monte del gruppo compressore."}]}

Lo script seguente, scritto con le librerie open source di Hugging Face (transformers, peft, trl), addestra l'adapter su un modello base Qwen3 8B caricato in 4 bit (la variante chiamata QLoRA). In questo modo l'intero addestramento sta su una singola GPU da 16–24GB:

import torch
from datasets import load_dataset
from peft import LoraConfig
from transformers import (AutoModelForCausalLM, AutoTokenizer,
                          BitsAndBytesConfig)
from trl import SFTConfig, SFTTrainer

# Modello base open source (licenza Apache 2.0)
BASE = "Qwen/Qwen3-8B"
tok = AutoTokenizer.from_pretrained(BASE)

# Pesi del modello base caricati in 4 bit: molta meno VRAM
quant = BitsAndBytesConfig(
    load_in_4bit=True, bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16)
model = AutoModelForCausalLM.from_pretrained(
    BASE, quantization_config=quant, device_map="auto")

dataset = load_dataset("json", data_files="manutenzione.jsonl",
                       split="train")

# Gli stessi parametri visti sopra: rango 16, alpha 32
lora = LoraConfig(r=16, lora_alpha=32, lora_dropout=0.05,
                  target_modules="all-linear",
                  task_type="CAUSAL_LM")

args = SFTConfig(output_dir="adapter-manutenzione",
                 num_train_epochs=3,
                 per_device_train_batch_size=2,
                 gradient_accumulation_steps=8,
                 learning_rate=2e-4,
                 bf16=True,
                 gradient_checkpointing=True)

# Si addestrano solo le matrici A e B dell'adapter
trainer = SFTTrainer(model=model, processing_class=tok,
                     train_dataset=dataset,
                     peft_config=lora, args=args)
trainer.train()

# Salva solo l'adapter (poche centinaia di MB)
trainer.save_model("adapter-manutenzione")

Il risultato è la cartella adapter-manutenzione, che contiene solo le matrici LoRA. In produzione si carica sopra lo stesso modello base, ad esempio con vLLM:

vllm serve Qwen/Qwen3-8B \
  --enable-lora \
  --lora-modules manutenzione=./adapter-manutenzione

4. La verifica: con e senza adapter

Prima dell'addestramento si mettono da parte 30–50 domande, nello stesso formato JSONL, che non entrano nel dataset di training (qui il file verifica.jsonl). Dopo l'addestramento si fanno le stesse domande al modello base e al modello con l'adapter, e si confrontano le risposte:

import torch
from datasets import load_dataset
from peft import PeftModel
from transformers import (AutoModelForCausalLM, AutoTokenizer,
                          BitsAndBytesConfig)

BASE = "Qwen/Qwen3-8B"
tok = AutoTokenizer.from_pretrained(BASE)
quant = BitsAndBytesConfig(
    load_in_4bit=True, bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16)
base = AutoModelForCausalLM.from_pretrained(
    BASE, quantization_config=quant, device_map="auto")

# L'adapter si aggancia al modello base senza modificarlo
model = PeftModel.from_pretrained(base, "adapter-manutenzione")

verifica = load_dataset("json", data_files="verifica.jsonl",
                        split="train")

def rispondi(domanda):
    inp = tok.apply_chat_template(
        [{"role": "user", "content": domanda}],
        add_generation_prompt=True, enable_thinking=False,
        return_dict=True, return_tensors="pt").to(model.device)
    out = model.generate(**inp, max_new_tokens=200, do_sample=False)
    n = inp["input_ids"].shape[1]
    return tok.decode(out[0][n:], skip_special_tokens=True)

for riga in verifica:
    domanda = riga["messages"][0]["content"]
    attesa = riga["messages"][1]["content"]
    with model.disable_adapter():      # modello base, senza LoRA
        prima = rispondi(domanda)
    dopo = rispondi(domanda)           # modello con adapter
    print(f"DOMANDA: {domanda}\nATTESA:  {attesa}\n"
          f"PRIMA:   {prima}\nDOPO:    {dopo}\n")

Con do_sample=False le risposte sono ripetibili, quindi il confronto è onesto. Se le risposte "dopo" sono giuste sulle domande di training ma sbagliate su quelle di verifica, il modello ha imparato a memoria (overfitting): di solito basta ridurre le epoche o aggiungere esempi più vari.

5. Il risultato: prima e dopo

Modello base (senza fine-tuning): "Per un allarme di pressione, controlla il sensore di pressione e verifica che sia collegato correttamente. Consulta il manuale del produttore per i valori di taratura corretti."

Modello con adapter LoRA: "Verifica prima la taratura del pressostato PZ-40 a 6 bar; se l'allarme persiste, controlla la valvola di sfiato a monte del gruppo compressore."

La differenza non è la correttezza generica — è la precisione specifica: il modello con adapter cita il componente esatto (PZ-40), il valore di taratura reale dell'impianto e la procedura di verifica usata effettivamente dai tecnici dell'azienda, perché li ha "visti" durante l'addestramento sui dati aziendali.

È un esempio volutamente minimo. In un progetto reale la parte che richiede più lavoro non è lo script ma il resto: preparare e ripulire le coppie domanda/risposta e far giudicare le risposte di verifica a chi conosce il dominio, cioè i tecnici che quelle domande le ricevono davvero.

Perché Gaulin.ai usa LoRA

Non proponiamo il fine-tuning a tutti: per la maggior parte dei progetti bastano un buon sistema RAG e istruzioni ben scritte. Quando invece serve un modello che parli davvero la lingua dell'azienda, usiamo LoRA per motivi precisi:

LoRA vs RAG: quando usare quale

Prima di decidere se fare fine-tuning con LoRA, è importante capire la differenza con RAG (Retrieval Augmented Generation) — l'altro approccio principale per specializzare un modello su dati aziendali.

Regola pratica: se hai bisogno che il modello trovi e citi informazioni dai tuoi documenti, usa RAG. Se hai bisogno che il modello ragioni e risponda come un esperto del tuo dominio, considera LoRA. Spesso la combinazione ottimale è LoRA + RAG.

Aspetto RAG LoRA Fine-Tuning
Cosa faRecupera documenti rilevanti e li passa al modello come contestoModifica i pesi del modello per incorporare la conoscenza del dominio
Aggiornamento datiAggiorna il database vettoriale (veloce, nessun riaddestramente)Richiede nuovo addestramento LoRA (ore)
Citazione fontiCita sempre la fonte esattaNon cita, "sa" il dominio
Dataset necessarioDocumenti aziendali (qualsiasi quantità)Esempi input/output (min. 200–500)
Caso d'uso idealeRicerca in archivi, chatbot su documentiTono aziendale, gergo specifico, ragionamento su dominio
Complessità implementazioneBassa–MediaMedia–Alta

Prima del fine-tuning: i tre gradini della personalizzazione

Personalizzare un modello non vuol dire per forza addestrarlo. Ci sono tre livelli, e conviene salire di un gradino solo quando quello precedente non basta più:

  1. Istruzioni scritte bene (prompt engineering). Nessun costo aggiuntivo e risultati spesso sorprendenti: è sempre il punto di partenza.
  2. RAG sui documenti aziendali. Il modello non cambia, ma risponde usando contratti, manuali, listini e normative dell'azienda. Risolve la maggior parte dei casi d'uso di una PMI e dà risultati in settimane.
  3. Fine-tuning (con LoRA). Serve quando il linguaggio del settore è troppo specialistico per un modello generico, o quando ci sono centinaia di esempi di input e output da cui il modello può imparare un comportamento preciso e ripetibile.

Quando il terzo gradino serve davvero, il risultato vale l'investimento. Un modello medio addestrato su un compito ben definito spesso eguaglia modelli molto più grandi e costosi, e gira su hardware accessibile. Inoltre l'adapter addestrato sui dati dell'azienda diventa un patrimonio proprio: procedure, terminologia ed esperienza accumulate non sono replicabili da chi usa gli stessi strumenti generici.

Casi d'uso LoRA per PMI italiane

Ecco quando il fine-tuning con LoRA porta un vantaggio reale rispetto al solo RAG:

Il processo pratico con Gaulin

Un progetto di fine-tuning LoRA on-premise segue questi passi:

1. Raccolta e preparazione del dataset

Il dataset di addestramento è la parte più critica. Servono esempi nel formato istruzione → risposta ideale. Per la maggior parte dei casi d'uso aziendali, bastano 200–1.000 esempi di alta qualità. Gaulin supporta la preparazione del dataset a partire dai vostri documenti esistenti.

2. Scelta del modello base e dei parametri LoRA

Si seleziona il modello base più adatto (ad esempio Qwen3, Gemma 4 o Mistral Small, in base all'hardware disponibile) e si configurano i parametri LoRA: rango r, alpha, layer target. Per la maggior parte dei casi, r=16 con alpha=32 è un buon punto di partenza.

3. Addestramento on-premise

L'addestramento avviene interamente sui server dell'azienda usando tool come LLaMA-Factory o Axolotl. I dati aziendali non escono mai dalla rete. La durata tipica va da 2 a 8 ore su una RTX 4090.

4. Valutazione e deploy dell'adapter

Il risultato dell'addestramento è un piccolo adapter LoRA (file da 50–200 MB) che si carica sopra il modello base in Ollama o vLLM. Il modello base rimane invariato — l'adapter può essere aggiornato o rimosso senza impattare il resto del sistema.

Vuoi personalizzare un modello AI sul tuo dominio?

Valutiamo insieme se LoRA, RAG o una combinazione dei due è la scelta giusta per il tuo caso specifico. Analisi gratuita in 30 minuti.

Prenota una chiamata →

Il servizio è rivolto ad aziende, professionisti ed enti.

Domande frequenti su LoRA

LoRA è una tecnica di fine-tuning efficiente per modelli AI di grandi dimensioni. Invece di aggiornare tutti i miliardi di parametri del modello, LoRA introduce due piccole matrici di rango ridotto (A e B) per ogni strato da addestrare. Il prodotto A×B approssima l'aggiornamento necessario con una frazione dei parametri originali — tipicamente meno dell'1% — riducendo drasticamente la VRAM e il tempo di addestramento.

Fine-tuning significa proseguire l'addestramento di un modello già addestrato su un insieme di dati più piccolo e mirato, così che si adatti a un compito o a un dominio specifico. Il modello conserva le conoscenze generali e impara il gergo, lo stile o il formato di risposta richiesti. Può aggiornare tutti i parametri (full fine-tuning) o solo una piccola parte, come nelle tecniche LoRA e QLoRA.

Il transfer learning è il principio generale di riutilizzare un modello preaddestrato per un nuovo compito. Il fine-tuning è uno dei modi di applicarlo, quello in cui i pesi del modello vengono aggiornati. L'alternativa è la feature extraction, in cui il modello resta congelato e si addestra solo uno strato finale. LoRA sta a metà: il modello originale resta congelato, ma piccole matrici aggiuntive ne modificano il comportamento.

Con LoRA è possibile fare fine-tuning di modelli da 7–8B parametri (come Qwen3 8B o Llama 3.1 8B) con una singola GPU da 16–24GB VRAM, come una NVIDIA RTX 4090 o una A10G. Modelli da 13B richiedono circa 24–48GB VRAM. Senza LoRA, gli stessi modelli richiederebbero hardware 4–8 volte più costoso. Per piccoli dataset aziendali e modelli 7B, una RTX 4090 è spesso sufficiente.

LoRA conviene quando hai almeno 200–500 esempi di alta qualità nel tuo dominio e vuoi che il modello risponda con il gergo e il ragionamento specifico della tua azienda. Per la ricerca in documenti aziendali e la citazione delle fonti, RAG è più semplice da implementare e manutenere. LoRA ha senso quando il modello deve "pensare" nel linguaggio dell'azienda, non solo trovare informazioni. Spesso la combinazione ottimale è un modello fine-tunato con LoRA + RAG per i dati più aggiornati.

RAG aggiunge contesto al modello al momento della query recuperando documenti rilevanti e passandoli come input. LoRA modifica i pesi del modello durante una fase di addestramento preliminare. RAG è più flessibile e aggiornabile senza riaddestrare; LoRA produce un modello che incorpora la conoscenza del dominio nei propri parametri. Per i dati che cambiano spesso (normative, listini) usa RAG. Per il tono, il gergo e il ragionamento settoriale, LoRA è spesso superiore.

Sì, se l'addestramento avviene on-premise. Gaulin esegue il fine-tuning LoRA direttamente sui server del cliente: il dataset aziendale non viene mai inviato a server cloud di terze parti. Né durante l'addestramento né durante l'inferenza i dati escono dalla rete aziendale. Questa è la differenza fondamentale rispetto ai servizi di fine-tuning cloud di OpenAI, Google o AWS.