Fine-tuning: La guida completa

19 Ottobre 2023
Se vuoi ottenere il massimo dalle tue applicazioni AI, la personalizzazione del modello è il passo successivo. Questa guida è destinata agli utenti della nuova API OpenAI per il fine-tuning. Se sei un utente con esperienza nel fine-tuning, ti preghiamo di fare riferimento alla nostra guida al fine-tuning legacy.
Il fine-tuning consente di ottenere il massimo dai modelli disponibili attraverso l’API, offrendo:
- Risultati di qualità superiore rispetto al prompting
- Capacità di addestrare il modello su più esempi rispetto a quelli che possono essere inseriti in un prompt
- Risparmio di token grazie a prompt più corti
- Richieste a latenza più bassa
I modelli GPT
I modelli GPT sono stati pre-addestrati su una vasta quantità di testo. Per utilizzare efficacemente i modelli, includiamo istruzioni e a volte diversi esempi in un prompt. L’uso di dimostrazioni per mostrare come eseguire un compito viene spesso chiamato “apprendimento con pochi esempi”.
Il fine-tuning migliora l’apprendimento con pochi esempi addestrando il modello su molti più esempi di quelli che possono essere inseriti nel prompt, consentendo di ottenere risultati migliori su un ampio numero di compiti. Una volta che un modello è stato ottimizzato, non avrai bisogno di fornire tanti esempi nel prompt. Questo consente di risparmiare sui costi e di avere richieste a latenza più bassa.
A un livello elevato, il fine-tuning coinvolge i seguenti passaggi:
- Preparare e caricare i dati di addestramento
- Addestrare un nuovo modello ottimizzato
- Utilizzare il tuo modello ottimizzato
Visita la pagina dei prezzi per saperne di più su come viene fatturato l’addestramento e l’utilizzo del modello ottimizzato.
Quali modelli possono essere ottimizzati?
Il fine-tuning è attualmente disponibile per i seguenti modelli:
gpt-3.5-turbo-0613
(raccomandato)babbage-002
davinci-002
Ci aspettiamo che gpt-3.5-turbo
sia il modello giusto per la maggior parte degli utenti in termini di risultati e facilità d’uso, a meno che tu non stia migrando un modello ottimizzato legacy.
Il fine-tuning dei modelli GPT può renderli migliori per applicazioni specifiche, ma richiede un investimento attento di tempo e sforzo. Consigliamo prima di tentare di ottenere buoni risultati con l’ingegneria del prompt, concatenazione di prompt (suddividendo compiti complessi in più prompt), e chiamata di funzione, per i seguenti motivi:
- Ci sono molti compiti in cui i nostri modelli potrebbero non sembrare inizialmente performanti, ma i risultati possono essere migliorati con i prompt giusti – quindi il fine-tuning potrebbe non essere necessario
- Iterare su prompt e altre tattiche ha un ciclo di feedback molto più veloce rispetto all’iterazione con il fine-tuning, che richiede la creazione di set di dati e l’esecuzione di lavori di addestramento
- Nei casi in cui il fine-tuning è ancora necessario, il lavoro iniziale di ingegneria del prompt non è sprecato – di solito vediamo i migliori risultati quando si utilizza un buon prompt nei dati di fine-tuning (o combinando concatenazione di prompt / utilizzo di strumenti con il fine-tuning)
La nostra guida alle migliori pratiche per GPT fornisce una panoramica di alcune delle strategie e tattiche più efficaci per ottenere una migliore performance senza fine-tuning. Potresti trovare utile iterare rapidamente sui prompt nel nostro playground.
Alcuni casi d’uso comuni in cui il fine-tuning può migliorare i risultati includono:
- Impostare lo stile, il tono, il formato o altri aspetti qualitativi
- Migliorare l’affidabilità nel produrre un output desiderato
- Correggere i fallimenti nel seguire prompt complessi
- Gestire molti casi limite in modi specifici
- Eseguire una nuova abilità o compito che è difficile da articolare in un prompt
Un modo di pensare a questi casi a un livello alto è quando è più facile “mostrare, non raccontare”. Nelle sezioni seguenti, esploreremo come impostare i dati per il fine-tuning e vari esempi in cui il fine-tuning migliora le performance rispetto al modello di base.
Un altro scenario in cui il fine-tuning è efficace è nella riduzione dei costi e/o della latenza, sostituendo GPT-4 o utilizzando prompt più corti, senza sacrificare la qualità. Se riesci a ottenere buoni risultati con GPT-4, è spesso possibile raggiungere una qualità simile con un modello gpt-3.5-turbo
ottimizzato, addestrandolo sulle completamenti di GPT-4, possibilmente con un prompt di istruzione accorciato.
Una volta che hai determinato che il fine-tuning è la soluzione giusta (cioè, hai ottimizzato il tuo prompt fino a dove può portarti e hai identificato problemi che il modello ha ancora), avrai bisogno di preparare i dati per addestrare il modello. Dovresti creare un insieme diversificato di conversazioni dimostrative che sono simili alle conversazioni che chiederai al modello di rispondere al momento dell’inferenza in produzione.
Ogni esempio nel set di dati dovrebbe essere una conversazione nello stesso formato della nostra API di completamento chat, in particolare una lista di messaggi in cui ogni messaggio ha un ruolo, un contenuto, e un nome opzionale. Almeno alcuni degli esempi di addestramento dovrebbero mirare direttamente ai casi in cui il modello guidato non si comporta come desiderato, e i messaggi dell’assistente forniti nei dati dovrebbero essere le risposte ideali che vuoi che il modello fornisca.
In questo esempio, il nostro obiettivo è creare un chatbot che occasionalmente dia risposte sarcastiche, questi sono tre esempi di addestramento (conversazioni) che potremmo creare per un set di dati:
Il formato di chat conversazionale è necessario per ottimizzare gpt-3.5-turbo
. Per babbage-002
e davinci-002
, puoi seguire il formato di coppia di completamento prompt utilizzato per il fine-tuning legacy come mostrato di seguito.
In generale, consigliamo di prendere l’insieme di istruzioni e prompt che hai trovato funzionano meglio per il modello prima del fine-tuning, e di includerli in ogni esempio di addestramento. Questo dovrebbe permetterti di raggiungere i migliori e più generali risultati, soprattutto se hai relativamente pochi (per esempio, meno di cento) esempi di addestramento.
Preparazione e caricamento dei dati di addestramento
Se desideri accorciare le istruzioni o i prompt che sono ripetuti in ogni esempio per risparmiare sui costi, tieni presente che il modello si comporterà probabilmente come se queste istruzioni fossero incluse, e potrebbe essere difficile far ignorare al modello quelle istruzioni “incorporate” al momento dell’inferenza.
Potrebbe essere necessario più esempi di addestramento per arrivare a buoni risultati, poiché il modello deve imparare interamente attraverso la dimostrazione e senza istruzioni guidate.
Per ottimizzare un modello, è necessario fornire almeno 10 esempi. Di solito vediamo miglioramenti evidenti dall’ottimizzazione su 50 a 100 esempi di addestramento con gpt-3.5-turbo
, ma il numero giusto varia molto in base al caso d’uso specifico.
Consigliamo di iniziare con 50 dimostrazioni ben fatte e vedere se il modello mostra segni di miglioramento dopo l’ottimizzazione. In alcuni casi, questo potrebbe essere sufficiente, ma anche se il modello non è ancora di qualità produttiva, i miglioramenti evidenti sono un buon segno che fornire più dati continuerà a migliorare il modello. Nessun miglioramento suggerisce che potrebbe essere necessario ripensare a come impostare il compito per il modello o ristrutturare i dati prima di andare oltre un set limitato di esempi.
Creazione di un lavoro di fine-tuning
Dopo aver raccolto il set di dati iniziale, consigliamo di dividerlo in una parte di addestramento e una di test. Quando si invia un lavoro di fine-tuning con file di addestramento e di test, forniremo statistiche su entrambi durante il corso dell’addestramento. Queste statistiche saranno il tuo primo segnale di quanto il modello sta migliorando. Inoltre, costruire un set di test all’inizio sarà utile per assicurarti di essere in grado di valutare il modello dopo l’addestramento, generando campioni sul set di test.
Ogni esempio di addestramento è limitato a 4096 token. Gli esempi più lunghi di questo saranno troncati ai primi 4096 token durante l’addestramento. Per essere sicuro che tutto il tuo esempio di addestramento si adatti al contesto, considera di controllare che il totale dei conteggi dei token nei contenuti dei messaggi sia inferiore a 4000.
Puoi calcolare il conteggio dei token utilizzando il nostro notebook per il conteggio dei token dal cookbook di OpenAI.
Fai riferimento alla pagina dei prezzi per i dettagli sul costo per 1k di token di input e output (non addebitiamo per i token che fanno parte dei dati di validazione). Per stimare i costi per un specifico lavoro di fine-tuning, usa la seguente formula:
costo base per 1k di token * numero di token nel file di input * numero di epoche addestrate
Per un file di addestramento con 100.000 token addestrato su 3 epoche, il costo previsto sarebbe di circa $2.40 USD.
Verifica del formato dei dati di addestramento
Una volta compilato un set di dati e prima di creare un lavoro di fine-tuning, è importante controllare il formato dei dati. Per fare questo, abbiamo creato un semplice script Python che puoi utilizzare per trovare eventuali errori, rivedere i conteggi dei token e stimare il costo di un lavoro di fine-tuning.
Una volta che i dati sono stati validati, il file deve essere caricato utilizzando l’API Files per poter essere utilizzato con un lavoro di fine-tuning:
Dopo aver caricato il file, potrebbe essere necessario un po’ di tempo per elaborarlo. Mentre il file è in elaborazione, puoi comunque creare un lavoro di fine-tuning, ma non inizierà fino a quando l’elaborazione del file non sarà completata.
Dopo aver assicurato di avere la giusta quantità e struttura per il tuo set di dati, e aver caricato il file, il passo successivo è creare un lavoro di fine-tuning.
Avvia il tuo lavoro di fine-tuning utilizzando l’SDK OpenAI:
In questo esempio, model
è il nome del modello che vuoi ottimizzare (gpt-3.5-turbo
, babbage-002
, davinci-002
, o un modello ottimizzato esistente) e training_file
è l’ID del file che è stato restituito quando il file di addestramento è stato caricato sull’API OpenAI. Puoi personalizzare il nome del tuo modello ottimizzato utilizzando il parametro suffisso.
Per impostare ulteriori parametri di fine-tuning come il validation_file
o i hyperparameters
, si prega di fare riferimento alla specifica API per il fine-tuning.
Dopo aver avviato un lavoro di fine-tuning, potrebbe essere necessario un po’ di tempo per completarlo. Il tuo lavoro potrebbe essere messo in coda dietro ad altri lavori nel nostro sistema, e addestrare un modello può richiedere minuti o ore a seconda della dimensione del modello e del set di dati. Dopo che l’addestramento del modello è completato, l’utente che ha creato il lavoro di fine-tuning riceverà una conferma via email.
In aggiunta alla creazione di un lavoro di fine-tuning, è possibile anche elencare i lavori esistenti, recuperare lo stato di un lavoro, o annullare un lavoro.
Utilizzo del modello fine-tuned
Quando un lavoro ha avuto successo, vedrai il campo fine_tuned_model
popolato con il nome del modello quando recuperi i dettagli del lavoro. Ora puoi specificare questo modello come parametro nell’API di completamento Chat (per gpt-3.5-turbo
) o nell’API di completamento legacy (per babbage-002
e davinci-002
), e fare richieste ad esso utilizzando il Playground.
Dopo che il tuo lavoro è completato, il modello dovrebbe essere disponibile immediatamente per l’uso in inferenza. In alcuni casi, potrebbe essere necessario qualche minuto perché il tuo modello sia pronto a gestire le richieste. Se le richieste al tuo modello vanno in timeout o il nome del modello non può essere trovato, è probabile che il tuo modello sia ancora in fase di caricamento. Se succede, prova di nuovo tra qualche minuto.
Puoi iniziare a fare richieste passando il nome del modello come mostrato sopra e nella nostra guida GPT.
Forniamo le seguenti metriche di addestramento calcolate nel corso dell’addestramento: perdita di addestramento, accuratezza dei token di addestramento, perdita di test, e accuratezza dei token di test. Queste statistiche sono destinate a fornire un controllo di sanità che l’addestramento sia andato liscio (la perdita dovrebbe diminuire, l’accuratezza dei token dovrebbe aumentare). Mentre un lavoro di fine-tuning attivo è in esecuzione, puoi visualizzare un oggetto evento che contiene alcune metriche utili:
Dopo che un lavoro di fine-tuning è finito, puoi anche vedere le metriche su come è andato il processo di addestramento interrogando un lavoro di fine-tuning, estraendo un ID di file dai result_files
, e poi recuperando il contenuto di quel file. Ogni file di risultati CSV ha le seguenti colonne: step
, train_loss
, train_accuracy
, valid_loss
, e valid_mean_token_accuracy
.
Valutazione del modello fine-tuned
Sebbene le metriche possano essere utili, la valutazione dei campioni dal modello fine-tuned fornisce il senso più rilevante della qualità del modello. Consigliamo di generare campioni sia dal modello base che dal modello fine-tuned su un set di test, e di confrontare i campioni fianco a fianco. Il set di test dovrebbe idealmente includere la piena distribuzione di input che potresti inviare al modello in un caso d’uso di produzione. Se la valutazione manuale è troppo dispendiosa in termini di tempo, considera di utilizzare la nostra libreria Evals per automatizzare le future valutazioni.
Se i risultati di un lavoro di fine-tuning non sono buoni come ti aspettavi, considera i seguenti modi per regolare il set di dati di addestramento:
- Raccogli esempi per affrontare i problemi rimanenti
- Se il modello non è ancora bravo in certi aspetti, aggiungi esempi di addestramento che mostrano direttamente al modello come fare correttamente questi aspetti
- Esamina gli esempi esistenti per problemi
- Se il tuo modello ha problemi di grammatica, logica o stile, controlla se i tuoi dati hanno qualcuno dei problemi. Per esempio, se il modello ora dice “Programmerò questa riunione per te” (quando non dovrebbe), vedi se gli esempi esistenti insegnano al modello a dire che può fare cose nuove che non può fare
- Considera l’equilibrio e la diversità dei dati
- Se il 60% delle risposte dell’assistente nei dati dice “Non posso rispondere a questo“, ma al momento dell’inferenza solo il 5% delle risposte dovrebbe dire questo, è probabile che otterrai un sovrabbondanza di rifiuti
- Assicurati che i tuoi esempi di addestramento contengano tutte le informazioni necessarie per la risposta
- Se vogliamo che il modello faccia un complimento a un utente basandosi sulle sue caratteristiche personali e un esempio di addestramento include complimenti dell’assistente per caratteristiche non trovate nella conversazione precedente, il modello potrebbe imparare a allucinare informazioni
- Guarda l’accordo / coerenza negli esempi di addestramento
- Se più persone hanno creato i dati di addestramento, è probabile che le prestazioni del modello saranno limitate dal livello di accordo / coerenza tra le persone. Per esempio, in un compito di estrazione di testo, se le persone erano d’accordo solo sul 70% degli estratti, è probabile che il modello non sarà in grado di fare meglio di questo
- Assicurati che tutti i tuoi esempi di addestramento siano nello stesso formato, come previsto per l’inferenza
Ottimizzazione del modello
Una volta che sei soddisfatto della qualità e della distribuzione degli esempi, puoi considerare di aumentare il numero di esempi di addestramento. Questo aiuta in genere il modello a imparare meglio il compito, soprattutto riguardo ai possibili “casi limite”. Ci aspettiamo un miglioramento simile ogni volta che raddoppi il numero di esempi di addestramento. Puoi stimare approssimativamente il guadagno di qualità atteso dall’aumento della dimensione dei dati di addestramento facendo:
- Fine-tuning sul tuo set di dati attuale
- Fine-tuning sulla metà del tuo set di dati attuale
- Osservando il divario di qualità tra i due
In generale, se devi fare un compromesso, una quantità minore di dati di alta qualità è generalmente più efficace di una quantità maggiore di dati di bassa qualità.
Ti permettiamo di specificare il numero di epoche per le quali ottimizzare un modello. Consigliamo inizialmente di addestrare senza specificare il numero di epoche, permettendoci di scegliere un valore predefinito per te in base alla dimensione del set di dati, poi di regolare se osservi quanto segue:
- Se il modello non segue i dati di addestramento tanto quanto ti aspettavi, aumenta il numero di 1 o 2 epoche
- Questo è più comune per compiti per cui c’è una singola completamento ideale (o un piccolo set di completamenti ideali che sono simili). Alcuni esempi includono classificazione, estrazione di entità, o parsing strutturato. Questi sono spesso compiti per i quali puoi calcolare una metrica di accuratezza finale rispetto a una risposta di riferimento.
- Se il modello diventa meno diverso di quanto ti aspettavi, diminuisci il numero di 1 o 2 epoche
- Questo è più comune per compiti per i quali ci sono una vasta gamma di possibili buoni completamenti
Ora che abbiamo esplorato le basi dell’API di fine-tuning, diamo un’occhiata a come passare attraverso il ciclo di vita del fine-tuning per alcuni diversi casi d’uso.
Casi d’uso di fine-tuning
Per gli utenti che stanno migrando da /v1/fine-tunes
all’aggiornata API /v1/fine_tuning/jobs
e ai modelli più recenti, la principale differenza che puoi aspettarti è l’API aggiornata. Il formato di dati di coppia di completamento prompt legacy è stato mantenuto per i modelli aggiornati babbage-002
e davinci-002
per garantire una transizione fluida. I nuovi modelli supporteranno il fine-tuning con un contesto di 4k token e avranno un cut-off di conoscenza di settembre 2021.
Per la maggior parte dei compiti, dovresti aspettarti di ottenere prestazioni migliori da gpt-3.5-turbo
rispetto ai modelli base GPT.
L’incorporazione con il recupero è meglio adatta per i casi in cui è necessario avere un grande database di documenti con contesto e informazioni pertinenti.
Di default, i modelli OpenAI sono addestrati per essere assistenti generalisti utili. Il fine-tuning può essere utilizzato per creare un modello che è focalizzato in modo ristretto, e mostra specifici modelli di comportamento radicati. Le strategie di recupero possono essere utilizzate per rendere disponibili nuove informazioni a un modello fornendogli il contesto rilevante prima di generare la sua risposta. Le strategie di recupero non sono un’alternativa al fine-tuning e possono in effetti essere complementari ad esso.
Abbiamo in programma di rilasciare il supporto per l’ottimizzazione di entrambi questi modelli più avanti quest’anno.
Conclusione
Raccomandiamo di generare campioni sia dal modello base che dal modello fine-tuned su un set di test di conversazioni in chat, e di confrontare i campioni fianco a fianco. Per valutazioni più complete, considera di utilizzare il framework OpenAI evals per creare un eval specifico per il tuo caso d’uso.
Sì, puoi passare il nome di un modello fine-tuned nel parametro model
quando crei un lavoro di fine-tuning. Questo avvierà un nuovo lavoro di fine-tuning utilizzando il modello fine-tuned come punto di partenza.
Fai riferimento alla sezione stima dei costi.
No, attualmente non supportiamo questa integrazione ma stiamo lavorando per abilitarla nel prossimo futuro.
Fai riferimento alla nostra guida ai limiti di frequenza per le informazioni più aggiornate sui limiti.
Un modello fine-tuned attinge dallo stesso limite di frequenza condiviso del modello da cui deriva. Ad esempio, se utilizzi metà del tuo limite TPM in un determinato periodo di tempo con il modello standard gpt-3.5-turbo
, qualsiasi modello(o modelli) che hai ottimizzato da gpt-3.5-turbo
avrà solo la metà rimanente del limite TPM disponibile, poiché la capacità è condivisa tra tutti i modelli dello stesso tipo.
In altre parole, avere modelli fine-tuned non ti dà più capacità di utilizzare i nostri modelli da un punto di vista della capacità totale.