Condividi tramite


Personalizzare un modello con l'ottimizzazione

Informazioni su come ottimizzare i modelli in Microsoft Foundry per i set di dati e i casi d'uso. L'ottimizzazione consente di:

  • Risultati di qualità più elevati rispetto a ciò che è possibile ottenere solo dalla progettazione del prompt
  • La possibilità di eseguire il training su più esempi di quanto possa rientrare nel limite massimo di contesto di richiesta di un modello.
  • Risparmio di token dovuto a richieste più brevi
  • Richieste a bassa latenza, in particolare quando si usano modelli più piccoli.

A differenza dell'apprendimento few-shot, l'ottimizzazione migliora il modello eseguendo il training su più esempi rispetto a quanto possibile in un prompt. Poiché i pesi si adattano al compito specifico, si includono meno esempi o istruzioni, riducendo il numero di token per chiamata con una riduzione potenziale dei costi e della latenza.

Usiamo LoRA, o adattamento con classificazione bassa, per ottimizzare i modelli in modo da ridurre la complessità senza influire significativamente sulle prestazioni. Questo metodo funziona approssimando la matrice originale di rango elevato con un rango inferiore, ottimizzando quindi solo un sottoinsieme più piccolo di parametri importanti durante la fase di training supervisionata, rendendo il modello più gestibile ed efficiente. Per gli utenti, questo processo rende il training più veloce e più conveniente rispetto ad altre tecniche.

In questo articolo verrà spiegato come:

  • Scegliere set di dati e formati appropriati per l'ottimizzazione
  • Attivare un processo di ottimizzazione, monitorare lo stato e recuperare i risultati.
  • Distribuire e valutare un modello ottimizzato.
  • Iterare sulla base del feedback di valutazione.

Prerequisiti

Modelli supportati

Consultare la pagina dei modelli per verificare quali aree supportano attualmente l'ottimizzazione.

In alternativa, è possibile ottimizzare un modello ottimizzato in precedenza, formattato come base-model.ft-{jobid}.

Preparare i dati

I dati di training e i set di dati di convalida sono costituiti da esempi di input e output per il modo in cui si vuole eseguire il modello.

I dati di training e convalida che utilizzi devono essere formattati come documento JSON Lines (JSONL) e nel formato conversazionale utilizzato dall'API Chat completions.

È consigliabile utilizzare le istruzioni e i prompt che si sono rivelati migliori in ogni esempio di formazione. Ciò consente di ottenere i risultati migliori, soprattutto se si hanno meno di cento esempi.

Se non si dispone di un set di dati esistente preparato, è possibile usare le funzionalità di generazione dei dati per crearne una nuova.

Formato del file di esempio

{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who discovered Antarctica?"}, {"role": "assistant", "content": "Some chaps named Fabian Gottlieb von Bellingshausen and Mikhail Lazarev, as if they don't teach that in every school!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the biggest ocean?"}, {"role": "assistant", "content": "The Pacific Ocean. It's not like it's a small pond or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest planet?"}, {"role": "assistant", "content": "It's called Jupiter, you might have heard of it...or not."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who painted the Mona Lisa?"}, {"role": "assistant", "content": "Oh, some obscure artist named Leonardo da Vinci. Not that he is famous or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the boiling point of water?"}, {"role": "assistant", "content": "Exciting fact of the day: it's 100 degrees Celsius. Life-changing, isn't it?"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'The Odyssey'?"}, {"role": "assistant", "content": "Oh, just some poet named Homer. Nothing special, really."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest mammal?"}, {"role": "assistant", "content": "Blue Whale. Quite a big fish isn't it? Oh wait, it's not a fish!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the highest mountain peak?"}, {"role": "assistant", "content": "Everest. Brace yourself, it's not a walk in the park."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who invented the telephone?"}, {"role": "assistant", "content": "A guy named Alexander Graham Bell. Bet you didn't guess that one!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the distance from Earth to the Sun?"}, {"role": "assistant", "content": "About 93 million miles. Just a quick drive, really."}]}

Formato di file chat multiturn

Sono inoltre supportati diversi turn di una conversazione in una singola riga del file di training jsonl. Per ignorare l'ottimizzazione su messaggi di assistente specifici, aggiungere la coppia di valori di chiave weight facoltativa. Attualmente è possibile impostare weight su 0 o 1.

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the biggest city in France?"}, {"role": "assistant", "content": "Paris", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already.", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "William Shakespeare", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "384,400 kilometers", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters.", "weight": 1}]}

Completamento della chat con Visione

{"messages": [{"role": "user", "content": [{"type": "text", "text": "What's in this image?"}, {"type": "image_url", "image_url": {"url": "https://raw.githubusercontent.com/MicrosoftDocs/azure-ai-docs/main/articles/ai-services/openai/media/how-to/generated-seattle.png"}}]}, {"role": "assistant", "content": "The image appears to be a watercolor painting of a city skyline, featuring tall buildings and a recognizable structure often associated with Seattle, like the Space Needle. The artwork uses soft colors and brushstrokes to create a somewhat abstract and artistic representation of the cityscape."}]}

Oltre al formato JSONL, i file di dati di training e convalida devono essere codificati in UTF-8 e includere un byte order mark (BOM). Il file deve avere dimensioni inferiori a 512 MB.

Considerazioni sulle dimensioni dei set di dati

Più esempi di training sono disponibili, meglio è. L'ottimizzazione dei processi non procederà senza almeno 10 esempi di training; tuttavia, un numero così ridotto non è sufficiente per influenzare notevolmente le risposte del modello. È consigliabile fornire centinaia, se non migliaia, di esempi di training per avere successo. È consigliabile iniziare con 50 dati di training ben creati.

In generale, il raddoppio delle dimensioni del set di dati può comportare un aumento lineare della qualità del modello. Tenere tuttavia presente che gli esempi di bassa qualità possono influire negativamente sulle prestazioni. Se si esegue il training del modello su una grande quantità di dati interni, senza prima eseguire l'eliminazione del set di dati solo per gli esempi di qualità più elevata, è possibile che si verifichi un modello che comporta prestazioni peggiori del previsto.

Creare il modello ottimizzato

Per ottimizzare un modello in un progetto Foundry esistente, seguire questa procedura:

  1. Accedere a Foundry e selezionare il progetto. Se non si ha già un progetto, crearne prima di tutto uno.

  2. Passare alla pagina Ottimizzazione> compilazione e selezionare il pulsante Ottimizza in alto a destra.

  3. Viene in genere visualizzata l'esperienza di ottimizzazione di un modello per la creazione di un nuovo processo di ottimizzazione. Usare le sezioni seguenti per facilitare la configurazione del processo e selezionare Invia per avviare il training del nuovo modello ottimizzato.

Selezione del modello di base

I modelli disponibili potrebbero essere limitati dall'area del progetto. La scelta del modello influisce sia sulle prestazioni che sul costo del modello.

Quando si seleziona il modello, è anche possibile selezionare un modello ottimizzato in precedenza.

Metodo di personalizzazione

È possibile supportare metodi di personalizzazione diversi in base al modello selezionato:

  • Supervisionato (SFT): esegue il training del modello su coppie di input-output etichettate. Ideale per la maggior parte degli scenari, inclusa la specializzazione delle attività.

  • Ottimizzazione delle preferenze dirette (DPO): allinea il modello con le risposte preferite dall'utente. Ideale per migliorare la qualità della risposta.

  • Rinforzo (RFT): usa i segnali di ricompensa dei classificatori del modello per ottimizzare comportamenti complessi.

Annotazioni

Il resto di questo documento illustra i passaggi per il metodo di ottimizzazione con supervisione. Per istruzioni specifiche per altri metodi di personalizzazione, vedere gli articoli per DPO o RFT.

Tipo di training

Selezionare il livello di training in base al caso d'uso e al budget.

  • Standard: il training viene eseguito nell'area della risorsa Fonderia attuale, fornendo garanzie di residenza dei dati. Ideale per i carichi di lavoro in cui i dati devono rimanere in un'area specifica.

  • Globale: offre prezzi più convenienti rispetto a Standard usando capacità oltre l'area corrente. I dati e i pesi vengono copiati nella regione in cui avviene l'addestramento. Ideale se la residenza dei dati non è una restrizione e si vogliono tempi di coda più rapidi.

  • Sviluppatore (anteprima): offre significativi risparmi sui costi usando la capacità inattiva per la formazione. Non ci sono garanzie di latenza o di accordo sul livello del servizio, quindi i processi in questo livello possono essere sospesi automaticamente e ripresi in un secondo momento. Non esistono garanzie di residenza dei dati. Ideale per la sperimentazione e i carichi di lavoro sensibili ai prezzi.

Dati di training e convalida

Se nel progetto Foundry sono presenti set di dati esistenti, scegliere Set di dati esistente per l'origine dati e quindi selezionare il set di dati.

Per caricare i set di dati appena preparati, scegliere Carica nuovo set di dati per l'origine dati e quindi caricare il file JSONL.

Dopo aver selezionato o caricato i file di dati, i controlli di convalida vengono eseguiti automaticamente per verificare che siano nel formato corretto.

Annotazioni

I file di dati di training devono essere formattati come file JSONL, codificati in UTF-8 con un byte order mark (BOM). Il file deve avere dimensioni inferiori a 512 MB. Sebbene 10 sia il numero minimo di campioni necessari nel set di dati, è consigliabile disporre di almeno centinaia di campioni di addestramento per allenare il modello per una nuova abilità.

Parametri facoltativi

Suffisso

È consigliabile compilare il campo Suffisso per semplificare la distinzione tra iterazioni diverse del modello ottimizzato. Un suffisso accetta una stringa di un massimo di 18 caratteri e viene usata quando si assegna un nome al modello ottimizzato risultante.

Seed

Controlla la riproducibilità del processo. Il passaggio degli stessi parametri per l'inizializzazione e il processo dovrebbe produrre gli stessi risultati, ma in rari casi può differire. Se non viene specificato un valore di inizializzazione, ne viene generato uno automaticamente.

Iperparametri

Gli iperparametri per il processo di ottimizzazione fine possono essere configurati manualmente o lasciati come valori predefiniti.

Sono disponibili gli iperparametri seguenti:

Nome Tipo Descrizione
batch_size integer Dimensioni del batch da usare per il training. Le dimensioni del batch sono il numero di esempi di training usati per eseguire il training di un singolo passaggio avanti e indietro. In generale, si scopre che le dimensioni dei batch più grandi tendono a funzionare meglio per i set di dati più grandi. Il valore predefinito e quello massimo per questa proprietà sono specifici di un modello di base. Una dimensione batch maggiore indica che i parametri del modello vengono aggiornati meno frequentemente, ma con varianza inferiore. Se impostato su -1, batch_size viene calcolato come 0,2% degli esempi nel set di training e il valore massimo è 256.
learning_rate_multiplier d'acquisto Moltiplicatore della frequenza di apprendimento da usare per il training. La velocità di apprendimento di ottimizzazione è la velocità di apprendimento originale usata per il training preliminare moltiplicata per questo valore. I tassi di apprendimento più elevati tendono a ottenere prestazioni migliori con dimensioni batch maggiori. È consigliabile provare con i valori compresi nell'intervallo da 0,02 a 0,2 per vedere quali risultati producono i risultati migliori. Un tasso di apprendimento inferiore potrebbe essere utile per evitare il sovradattamento.
n_epochs integer Numero di periodi per cui eseguire il training del modello. Un periodo fa riferimento a un ciclo completo attraverso il set di dati di training. Se impostato su -1, il numero di periodi è determinato in modo dinamico in base ai dati di input.

Abilitare la distribuzione automatica

Per risparmiare tempo, è possibile abilitare la distribuzione automatica per il modello risultante. Se il training termina correttamente, il modello viene distribuito usando il tipo di distribuzione selezionato. Il nome della distribuzione si basa sul nome univoco generato per il modello personalizzato e sul suffisso facoltativo fornito in precedenza.

Annotazioni

La distribuzione automatica è supportata solo per i modelli OpenAI.

Monitorare e analizzare i risultati

Dopo aver inviato il processo di ottimizzazione, verrà visualizzata una visualizzazione tabella che elenca tutti gli invii di processi di ottimizzazione. Fare clic nella pagina dei dettagli del processo per visualizzare altre informazioni sui singoli risultati.

Il processo potrebbe essere in coda dietro altri processi nel sistema. Il training del modello può richiedere alcuni minuti a seconda delle dimensioni del modello e del set di dati.

Metriche

È possibile monitorare le metriche seguenti passando al pivot Monitoraggio :

  • train_loss: perdita del batch di training. Ogni passo di addestramento sull'asse x rappresenta un singolo passaggio, in avanti e indietro, su un batch di dati di addestramento.
  • full_valid_loss: la perdita di convalida calcolata alla fine di ogni epoca. Quando il training va bene, la perdita dovrebbe diminuire.
  • train_mean_token_accuracy: percentuale di token nel batch di training stimata correttamente dal modello.
    Ad esempio, se le dimensioni del batch sono impostate su 3 e i dati contengono completamenti [[1, 2], [0, 5], [4, 2]], questo valore viene impostato su 0,83 (5 di 6) se il modello ha previsto [[1, 1], [0, 5], [4, 2]].
  • full_valid_mean_token_accuracy: accuratezza valida del token calcolata alla fine di ogni periodo. Quando il training va bene, l'accuratezza del token dovrebbe aumentare.

Cercare la perdita da ridurre nel tempo e l'accuratezza da aumentare. Se viene visualizzata una divergenza tra i dati di training e di convalida, ciò potrebbe indicare un overfitting. Provare a eseguire il training con meno periodi o a un moltiplicatore di frequenza di trading più piccolo.

Punti di controllo

Al completamento di ogni periodo di training, viene generato un checkpoint. I checkpoint possono essere visualizzati passando alla scheda Checkpoint.

Un checkpoint è una versione completamente funzionale di un modello, che può essere distribuita e usata come modello di destinazione per i successivi processi di ottimizzazione. I checkpoint possono essere utili, in quanto possono fornire snapshot prima dell'overfitting. Al termine di un processo di ottimizzazione, saranno disponibili le tre versioni più recenti del modello da distribuire. È possibile copiare punti di controllo tra risorse e sottoscrizioni attraverso l'API REST.

Annotazioni

Durante il training è possibile visualizzare le metriche e sospendere il processo in base alle esigenze. La sospensione può essere utile se le metriche non sono convergenti o se si ritiene che il modello non stia imparando al ritmo corretto. Una volta sospeso il processo di training, al termine delle valutazioni di sicurezza verrà creato un checkpoint distribuibile. Questo checkpoint è disponibile per la distribuzione e l'utilizzo per l'inferenza o per riprendere il processo fino al completamento. L'operazione di sospensione è applicabile solo per i processi sottoposti a training per almeno un passaggio e che siano in stato In esecuzione. La sospensione è supportata solo per i modelli OpenAI.

Distribuire il modello ottimizzato

Dopo aver soddisfatto le metriche del processo di ottimizzazione, è possibile distribuire il modello facendo clic sul pulsante Distribuisci nella parte superiore destra della pagina dei dettagli e configurando le impostazioni di distribuzione.

Per altri dettagli, vedere la guida all'ottimizzazione della distribuzione.

Usare un modello ottimizzato per la distribuzione

Dopo la distribuzione del modello ottimizzato, è possibile usarlo come qualsiasi altro modello distribuito. È possibile usare Playground in Foundry per sperimentare la nuova distribuzione. È anche possibile usare l'API REST per chiamare il modello ottimizzato dall'applicazione. È anche possibile iniziare a usare questo nuovo modello ottimizzato nel prompt flow per compilare l'applicazione di intelligenza artificiale generativa.

Annotazioni

Per i modelli di chat, il messaggio di sistema usato per guidare il modello ottimizzato (sia distribuito sia disponibile per i test nel playground) deve essere lo stesso del messaggio di sistema usato per l'addestramento. Se si usa un messaggio di sistema differente, il modello potrebbe non funzionare come previsto.

Ottimizzazione continua

Dopo aver creato un modello ottimizzato, è possibile continuare a perfezionare il modello nel tempo tramite un'ulteriore ottimizzazione. L'ottimizzazione continua è il processo iterativo per selezionare un modello già ottimizzato come modello di base e ottimizzarlo ulteriormente sui nuovi set di esempi di training.

Per eseguire l'ottimizzazione su un modello ottimizzato in precedenza, è necessario usare lo stesso processo descritto nella creazione di un modello ottimizzato, ma invece di specificare il nome di un modello di base generico, è necessario specificare il modello già ottimizzato. Un modello personalizzato ottimizzato apparirebbe come gpt-4o-2024-08-06.ft-d93dda6110004b4da3472d96f4dd4777-ft.

Annotazioni

L'ottimizzazione continua è supportata solo per i modelli OpenAI.

Pulisci le tue risorse

Al termine del modello ottimizzato, è possibile eliminare la distribuzione e il modello. È anche possibile eliminare i file di training e convalida caricati nel servizio, se necessario.

Eliminare la distribuzione del modello ottimizzato

Importante

Dopo la distribuzione di un modello personalizzato, se in qualsiasi momento la distribuzione rimane inattiva per più di quindici (15) giorni, la distribuzione verrà eliminata. La distribuzione di un modello personalizzato è inattiva se il modello è stato distribuito più di quindici (15) giorni prima e non sono stati effettuati completamenti o chiamate di completamento della chat per un periodo continuativo di 15 giorni.

L'eliminazione di una distribuzione inattiva non elimina o influisce sul modello personalizzato sottostante e il modello personalizzato può essere ridistribuito in qualsiasi momento. Come descritto nei prezzi di Azure OpenAI in Modelli di Fonderia Microsoft, ogni modello personalizzato, ottimizzato e distribuito comporta un costo di hosting orario indipendentemente dal fatto che vengano effettuate chiamate di completamento o di completamento della chat al modello. Per altre informazioni sulla pianificazione e la gestione dei costi con Azure OpenAI, vedere le linee guida in Pianificare la gestione dei costi per Azure OpenAI.

È possibile eliminare la distribuzione per il modello ottimizzato nella pagina Compila> Modelli nel portale Fonderia.

Eliminare il modello ottimizzato

È possibile eliminare un modello ottimizzato nella pagina Fine-tuning sul portale Foundry. Selezionare il modello ottimizzato da eliminare, quindi selezionare Elimina per eliminarlo.

Annotazioni

Non è possibile eliminare un modello ottimizzato se ha una distribuzione esistente. Prima di poter eliminare la distribuzione modello, è necessario eliminare il modello ottimizzato.

Prerequisiti

Modelli supportati

Consultare la pagina dei modelli per verificare quali aree supportano attualmente l'ottimizzazione.

In alternativa, è possibile ottimizzare un modello ottimizzato in precedenza, formattato come base-model.ft-{jobid}.

Esaminare il flusso di lavoro per Python SDK

Esaminare il flusso di lavoro di ottimizzazione per l'uso di Python SDK con Azure OpenAI:

  1. Preparare i dati di training e convalida.
  2. Selezionare un modello di base.
  3. Caricare i dati di training.
  4. Eseguire il training del nuovo modello personalizzato.
  5. Controllare lo stato del modello personalizzato.
  6. Distribuire il modello personalizzato per l'uso.
  7. Usare il modello personalizzato.
  8. Facoltativamente, analizzare prestazioni e adattamento del modello personalizzato.

Preparare i dati di training e convalida

I dati di training e i set di dati di convalida sono costituiti da esempi di input e output per il modo in cui si vuole eseguire il modello.

I dati di training e convalida che utilizzi devono essere formattati come documento JSON Lines (JSONL) e nel formato conversazionale utilizzato dall'API Chat completions.

Per una procedura dettagliata sull'ottimizzazione, gpt-4o-mini-2024-07-18 vedere l'esercitazione sull'ottimizzazione di Azure OpenAI

Formato del file di esempio

{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who discovered Antarctica?"}, {"role": "assistant", "content": "Some chaps named Fabian Gottlieb von Bellingshausen and Mikhail Lazarev, as if they don't teach that in every school!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the biggest ocean?"}, {"role": "assistant", "content": "The Pacific Ocean. It's not like it's a small pond or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest planet?"}, {"role": "assistant", "content": "It's called Jupiter, you might have heard of it...or not."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who painted the Mona Lisa?"}, {"role": "assistant", "content": "Oh, some obscure artist named Leonardo da Vinci. Not that he is famous or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the boiling point of water?"}, {"role": "assistant", "content": "Exciting fact of the day: it's 100 degrees Celsius. Life-changing, isn't it?"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'The Odyssey'?"}, {"role": "assistant", "content": "Oh, just some poet named Homer. Nothing special, really."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest mammal?"}, {"role": "assistant", "content": "Blue Whale. Quite a big fish isn't it? Oh wait, it's not a fish!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the highest mountain peak?"}, {"role": "assistant", "content": "Everest. Brace yourself, it's not a walk in the park."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who invented the telephone?"}, {"role": "assistant", "content": "A guy named Alexander Graham Bell. Bet you didn't guess that one!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the distance from Earth to the Sun?"}, {"role": "assistant", "content": "About 93 million miles. Just a quick drive, really."}]}

Formato di file chat multiturn

Sono inoltre supportati diversi turn di una conversazione in una singola riga del file di training jsonl. Per ignorare l'ottimizzazione su messaggi di assistente specifici, aggiungere la coppia di valori di chiave weight facoltativa. Attualmente è possibile impostare weight su 0 o 1.

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already.", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "William Shakespeare", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "384,400 kilometers", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters.", "weight": 1}]}

Completamento della chat con Visione

{"messages": [{"role": "user", "content": [{"type": "text", "text": "What's in this image?"}, {"type": "image_url", "image_url": {"url": "https://raw.githubusercontent.com/MicrosoftDocs/azure-ai-docs/main/articles/ai-services/openai/media/how-to/generated-seattle.png"}}]}, {"role": "assistant", "content": "The image appears to be a watercolor painting of a city skyline, featuring tall buildings and a recognizable structure often associated with Seattle, like the Space Needle. The artwork uses soft colors and brushstrokes to create a somewhat abstract and artistic representation of the cityscape."}]}

Oltre al formato JSONL, i file di dati di training e convalida devono essere codificati in UTF-8 e includere un byte order mark (BOM). Il file deve avere dimensioni inferiori a 512 MB.

Creare i set di dati di training e convalida

Più esempi di training sono disponibili, meglio è. L'ottimizzazione dei processi non procederà senza almeno 10 esempi di training; tuttavia, un numero così ridotto non è sufficiente per influenzare notevolmente le risposte del modello. È consigliabile fornire centinaia, se non migliaia, di esempi di training per avere successo.

In generale, il raddoppio delle dimensioni del set di dati può comportare un aumento lineare della qualità del modello. Tenere tuttavia presente che gli esempi di bassa qualità possono influire negativamente sulle prestazioni. Se si esegue il training del modello su una grande quantità di dati interni, senza prima eliminare il set di dati solo degli esempi di qualità più elevati, è possibile ottenere un modello che comporta prestazioni molto peggiori del previsto.

Caricare i dati di training

Il passaggio successivo consiste nella scelta dei dati di training preparati esistenti o nel caricamento di nuovi dati di training preparati da usare durante la personalizzazione del modello. Dopo aver preparato i dati di training, è possibile caricare i file nel servizio. Sono disponibili due modi per caricare i dati di training:

Per i file di dati di grandi dimensioni, è consigliabile eseguire l'importazione da un archivio BLOB di Azure. I file di grandi dimensioni possono diventare instabili quando vengono caricati tramite moduli in più parti, perché le richieste sono atomiche e non possono essere ritentate o riprese. Per altre informazioni su Archiviazione BLOB di Azure, vedere Che cos’è l’archiviazione BLOB di Azure?

Annotazioni

I file di dati di training devono essere formattati come file JSONL, codificati in UTF-8 con un byte order mark (BOM). Il file deve avere dimensioni inferiori a 512 MB.

L'esempio Python seguente carica i file di training e convalida locali usando Python SDK e recupera gli ID file restituiti.

import os
from openai import OpenAI

# Load the OpenAI client
client = OpenAI(
  api_key = os.getenv("AZURE_OPENAI_API_KEY"),  
  base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/"
)

# Upload the training and validation dataset files to Microsoft Foundry with the SDK.
training_file_name = 'training_set.jsonl'
validation_file_name = 'validation_set.jsonl'

training_response = client.files.create(file=open(training_file_name, "rb"), purpose="fine-tune")
validation_response = client.files.create(file=open(validation_file_name, "rb"), purpose="fine-tune")
training_file_id = training_response.id
validation_file_id = validation_response.id

print("Training file ID:", training_file_id)
print("Validation file ID:", validation_file_id)

Creare un modello personalizzato

Dopo aver caricato i file di training e convalida, si è pronti per avviare il processo di ottimizzazione.

Il codice Python seguente illustra un esempio di come creare un nuovo processo di ottimizzazione con Python SDK:

response = client.fine_tuning.jobs.create(
    training_file=training_file_id,
    validation_file=validation_file_id,
    model="gpt-4.1-2025-04-14", # Enter base model name.
    suffix="my-model", # Custom suffix for naming the resulting model. Note that in Microsoft Foundry the model cannot contain dot/period characters.
    seed=105, # Seed parameter controls reproducibility of the fine-tuning job. If no seed is specified one will be generated automatically.
    extra_body={ "trainingType": "GlobalStandard" } # Change this to your preferred training type. Other options are `Standard` and `Developer`.
)

job_id = response.id

# You can use the job ID to monitor the status of the fine-tuning job.
# The fine-tuning job will take some time to start and complete.

print("Job ID:", response.id)
print(response.model_dump_json(indent=2))

Annotazioni

È consigliabile usare il livello Standard globale per il tipo di training, perché offre risparmi sui costi e sfrutta la capacità globale per tempi di accodamento più rapidi. Tuttavia, copia i dati e i pesi fuori dall'area di risorse corrente. Se la residenza dei dati è un requisito, usare un modello che supporta l'addestramento al livello Standard.

È anche possibile passare parametri facoltativi aggiuntivi, ad esempio gli iperparametri, per assumere un maggiore controllo del processo di ottimizzazione. Per il training iniziale, è consigliabile usare le impostazioni predefinite automatiche presenti senza specificare questi parametri.

Gli iperparametri attualmente supportati per i Fine-Tuning con supervisione sono:

Nome Tipo Descrizione
batch_size integer Dimensioni del batch da usare per il training. Le dimensioni del batch sono il numero di esempi di training usati per eseguire il training di un singolo passaggio avanti e indietro. In generale, è stato rilevato che le dimensioni dei batch più grandi tendono a funzionare meglio per set di dati di dimensioni maggiori. Il valore predefinito e il valore massimo per questa proprietà sono specifici di un modello di base. Una dimensione batch maggiore indica che i parametri del modello vengono aggiornati meno frequentemente, ma con varianza inferiore.
learning_rate_multiplier d'acquisto Moltiplicatore della frequenza di apprendimento da usare per il training. La velocità di apprendimento di ottimizzazione è la velocità di apprendimento originale usata per il training preliminare moltiplicata per questo valore. I tassi di apprendimento più elevati tendono a ottenere prestazioni migliori con dimensioni batch maggiori. È consigliabile provare con i valori compresi nell'intervallo da 0,02 a 0,2 per vedere quali risultati producono i risultati migliori. Un tasso di apprendimento inferiore può essere utile per evitare l'overfitting.
n_epochs integer Numero di periodi per cui eseguire il training del modello. Un periodo fa riferimento a un ciclo completo attraverso il set di dati di training.
seed integer Il seme controlla la riproducibilità del lavoro. Il passaggio degli stessi parametri di inizializzazione e processo dovrebbe produrre gli stessi risultati, ma in rari casi può differire. Se non viene specificato un valore di inizializzazione, ne verrà generato uno automaticamente.

Per impostare iperparametri personalizzati con la versione 1.x dell'API Python OpenAI, specificarli come parte di method:

client.fine_tuning.jobs.create(
  training_file="file-abc123", 
  model="gpt-4.1-2025-04-14",
  suffix="my-model",
  seed=105,
  method={
    "type": "supervised", # In this case, the job will be using Supervised Fine Tuning.
    "supervised": {
      "hyperparameters": {
        "n_epochs": 2
      }
    }
  },
  extra_body={ "trainingType": "GlobalStandard" }
)

Annotazioni

Per altre informazioni sugli iperparametri supportati, vedere le guide per l'ottimizzazione delle preferenze dirette e l'ottimizzazione del rinforzo .

Tipo di training

Selezionare il livello di training in base al caso d'uso e al budget.

  • Standard: il training viene eseguito nell'area della risorsa Fonderia attuale, fornendo garanzie di residenza dei dati. Ideale per i carichi di lavoro in cui i dati devono rimanere in un'area specifica.

  • Globale: offre prezzi più convenienti rispetto a Standard sfruttando la capacità oltre l'area corrente. I dati e i pesi vengono copiati nella regione in cui avviene l'addestramento. Ideale se la residenza dei dati non è una restrizione e si vogliono tempi di coda più rapidi.

  • Sviluppatore (anteprima): fornisce significativi risparmi sfruttando la capacità inattiva per il training. Non ci sono garanzie di latenza o di accordo sul livello del servizio, quindi i processi in questo livello possono essere sospesi automaticamente e ripresi in un secondo momento. Non esistono garanzie di residenza dei dati. Ideale per la sperimentazione e i carichi di lavoro sensibili ai prezzi.

import openai
from openai import AzureOpenAI

base_uri = "https://<ACCOUNT-NAME>.services.ai.azure.com"
api_key = "<API-KEY>"
api_version = "2025-04-01-preview"
client = AzureOpenAI(
azure_endpoint=base_uri,
api_key=api_key,
api_version=api_version
)
try:
    client.fine_tuning.jobs.create(
    model="gpt-4.1-mini",
    training_file="<FILE-ID>",
    extra_body={"trainingType": "developerTier"}
    )
except openai.APIConnectionError as e:
    print("The server could not be reached")
    print(e.__cause__) # an underlying Exception, likely raised within httpx.
except openai.RateLimitError as e:
    print("A 429 status code was received; we should back off a bit.")
except openai.APIStatusError as e:
    print("Another non-200-range status code was received")
    print(e.status_code)
    print(e.response)
    print(e.body)

Controllare lo stato del processo di ottimizzazione

response = client.fine_tuning.jobs.retrieve(job_id)

print("Job ID:", response.id)
print("Status:", response.status)
print(response.model_dump_json(indent=2))

Elencare gli eventi di ottimizzazione

Per esaminare i singoli eventi di ottimizzazione generati durante il training, potrebbe essere necessario aggiornare la libreria client OpenAI alla versione più recente con per pip install openai --upgrade eseguire questo comando.

response = client.fine_tuning.jobs.list_events(fine_tuning_job_id=job_id, limit=10)
print(response.model_dump_json(indent=2))

Punti di controllo

Al completamento di ogni periodo di training, viene generato un checkpoint. Un checkpoint è una versione completamente funzionale di un modello che può essere distribuita e usata come modello di destinazione per i processi di ottimizzazione successivi. I checkpoint possono essere particolarmente utili, in quanto possono fornire snapshot prima dell'overfitting. Al termine di un processo di ottimizzazione, le tre versioni più recenti del modello saranno disponibili per la distribuzione. L'epoca finale sarà rappresentata dal modello ottimizzato, le due epoche precedenti saranno disponibili come checkpoint.

È possibile eseguire il comando list checkpoints per recuperare l'elenco di checkpoint associati a un singolo processo di ottimizzazione. Per eseguire questo comando potrebbe essere necessario aggiornare la libreria client OpenAI all'ultima versione con pip install openai --upgrade.

response = client.fine_tuning.jobs.checkpoints.list(job_id)
print(response.model_dump_json(indent=2))

Analizzare il modello personalizzato

Azure OpenAI collega un file di risultato, denominato results.csv a ogni processo di ottimizzazione dopo il completamento. È possibile usare il file dei risultati per analizzare le prestazioni del training e convalidare del modello personalizzato. L'ID file per il file dei risultati è elencato per ogni modello personalizzato ed è possibile usare Python SDK per recuperare l'ID file e scaricare il file di risultato per l'analisi.

L'esempio python seguente recupera l'ID file del primo file di risultato allegato al processo di ottimizzazione per il modello personalizzato e quindi usa Python SDK per scaricare il file nella directory di lavoro corrente per l'analisi.

# Retrieve the file ID of the first result file from the fine-tuning job
# for the customized model.
response = client.fine_tuning.jobs.retrieve(job_id)
if response.status == 'succeeded':
    result_file_id = response.result_files[0]

retrieve = client.files.retrieve(result_file_id)

# Download the result file.
print(f'Downloading result file: {result_file_id}')

with open(retrieve.filename, "wb") as file:
    result = client.files.content(result_file_id).read()
    file.write(result)

Il file dei risultati è un file CSV contenente una riga di intestazione e una riga per ogni passaggio di training eseguito dal processo di ottimizzazione. Il file dei risultati contiene le colonne seguenti:

Nome della colonna Descrizione
step Numero del passaggio di training. Un passaggio di training rappresenta un singolo passaggio, avanti e indietro, in un batch di dati di training.
train_loss Perdita per il batch di training.
train_mean_token_accuracy Percentuale di token nel batch di training stimati correttamente dal modello.
Ad esempio, se le dimensioni del batch sono impostate su 3 e i dati contengono completamenti [[1, 2], [0, 5], [4, 2]], questo valore viene impostato su 0,83 (5 di 6) se il modello ha previsto [[1, 1], [0, 5], [4, 2]].
valid_loss Perdita per il batch di convalida.
validation_mean_token_accuracy Percentuale di token nel batch di convalida stimati correttamente dal modello.
Ad esempio, se le dimensioni del batch sono impostate su 3 e i dati contengono completamenti [[1, 2], [0, 5], [4, 2]], questo valore viene impostato su 0,83 (5 di 6) se il modello ha previsto [[1, 1], [0, 5], [4, 2]].
full_valid_loss Perdita di convalida calcolata alla fine di ogni epoca. Quando il training va bene, la perdita dovrebbe diminuire.
full_valid_mean_token_accuracy Accuratezza del token media valida calcolata alla fine di ogni epoca. Quando il training va bene, l'accuratezza del token dovrebbe aumentare.

È anche possibile visualizzare i dati nel file results.csv come tracciati nel portale di Microsoft Foundry. Selezionare il collegamento per il modello sottoposto a training; verranno visualizzati tre grafici: perdita, accuratezza del token media e accuratezza del token. Se sono stati forniti dati di convalida, entrambi i set di dati verranno visualizzati nello stesso tracciato.

Cercare la perdita da ridurre nel tempo e l'accuratezza da aumentare. Una divergenza tra i dati di training e i dati di convalida potrebbe indicare un overfitting. Provare a eseguire il training con meno periodi o a un moltiplicatore di frequenza di trading più piccolo.

Distribuire un modello ottimizzato

Dopo aver soddisfatto le metriche del processo di ottimizzazione, oppure si vuole semplicemente passare all'inferenza, è necessario distribuire il modello.

Se si esegue la distribuzione per un'ulteriore convalida, valutare la possibilità di eseguire la distribuzione per i test usando una distribuzione per sviluppatori.

A differenza dei comandi SDK precedenti, la distribuzione deve essere eseguita usando l'API del piano di controllo che richiede un'autorizzazione separata, un percorso API diverso e una versione differente dell'API.

Variabile Definizione
token Esistono diversi modi per generare un token di autorizzazione. Il metodo più semplice per i test iniziali consiste nell'avviare Cloud Shell dal portale di Azure. Quindi eseguire az account get-access-token. È possibile usare questo token come token di autorizzazione temporaneo per il test dell'API. È consigliabile archiviare questo valore in una nuova variabile di ambiente.
abbonamento ID sottoscrizione per la risorsa Azure OpenAI associata.
gruppo di risorse Nome del gruppo di risorse per la risorsa Azure OpenAI.
nome_risorsa Nome della risorsa di Azure OpenAI.
model_deployment_name Nome personalizzato per la nuova distribuzione del modello ottimizzata. Questo è il nome a cui verrà fatto riferimento nel codice quando si effettuano chiamate di completamento della chat.
fine_tuned_model Recuperare questo valore dai risultati del processo di ottimizzazione nel passaggio precedente. Sarà simile a gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83. Sarà necessario aggiungere tale valore al deploy_data json. In alternativa, è anche possibile distribuire un checkpoint passando l'ID del checkpoint, che verrà visualizzato nel formato ftchkpt-e559c011ecc04fc68eaa339d8227d02d
import json
import os
import requests

token= os.getenv("<TOKEN>") 
subscription = "<YOUR_SUBSCRIPTION_ID>"  
resource_group = "<YOUR_RESOURCE_GROUP_NAME>"
resource_name = "<YOUR_AZURE_OPENAI_RESOURCE_NAME>"
model_deployment_name ="gpt-41-ft" # custom deployment name that you will use to reference the model when making inference calls.

deploy_params = {'api-version': "2024-10-01"} # control plane API version rather than dataplane API for this call 
deploy_headers = {'Authorization': 'Bearer {}'.format(token), 'Content-Type': 'application/json'}

deploy_data = {
    "sku": {"name": "standard", "capacity": 1}, 
    "properties": {
        "model": {
            "format": "OpenAI",
            "name": <"fine_tuned_model">, #retrieve this value from the previous call, it will look like gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83
            "version": "1"
        }
    }
}
deploy_data = json.dumps(deploy_data)

request_url = f'https://management.azure.com/subscriptions/{subscription}/resourceGroups/{resource_group}/providers/Microsoft.CognitiveServices/accounts/{resource_name}/deployments/{model_deployment_name}'

print('Creating a new deployment...')

r = requests.put(request_url, params=deploy_params, headers=deploy_headers, data=deploy_data)

print(r)
print(r.reason)
print(r.json())

Altre informazioni sulla distribuzione tra aree e sull'uso del modello distribuito sono disponibili qui.

Se si è pronti per la distribuzione per la produzione o si hanno specifiche esigenze di residenza dei dati, seguire la guida alla distribuzione.

Ottimizzazione continua

Dopo aver creato un modello ottimizzato, si può desiderare di continuare a perfezionare il modello nel tempo tramite un'ulteriore ottimizzazione. L'ottimizzazione continua è il processo iterativo per selezionare un modello già ottimizzato come modello di base e ottimizzarlo ulteriormente sui nuovi set di esempi di training.

Annotazioni

L'ottimizzazione continua è supportata solo per i modelli OpenAI.

Per eseguire l'ottimizzazione su un modello ottimizzato in precedenza, è necessario usare lo stesso processo descritto in Creare un modello personalizzato, ma invece di specificare il nome di un modello di base generico, è necessario specificare l'ID del modello già ottimizzato. L'ID modello ottimizzato è simile al seguente gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7

response = client.fine_tuning.jobs.create(
    training_file=training_file_id,
    validation_file=validation_file_id,
    model="gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7"
)
job_id = response.id

# You can use the job ID to monitor the status of the fine-tuning job.
# The fine-tuning job will take some time to start and complete.

print("Job ID:", response.id)
print("Status:", response.id)
print(response.model_dump_json(indent=2))

È anche consigliabile includere il parametro suffix per semplificare la distinzione tra iterazioni differenti del modello ottimizzato. suffix accetta una stringa ed è impostato per identificare il modello ottimizzato. Con l'API Python OpenAI è supportata una stringa di un massimo di 18 caratteri che verrà aggiunta al nome del modello ottimizzato.

Se non si è certi dell'ID del modello ottimizzato esistente, queste informazioni sono disponibili nella pagina Modelli di Microsoft Foundry oppure è possibile generare un elenco di modelli per una determinata risorsa OpenAI di Azure usando l'API REST.

Pulire le distribuzioni, i modelli personalizzati e i file di training

Al termine del modello personalizzato, è possibile eliminare la distribuzione e il modello. È anche possibile eliminare i file di training e convalida caricati nel servizio, se necessario.

Eliminare la distribuzione del modello

Importante

Dopo la distribuzione di un modello personalizzato, se in qualsiasi momento la distribuzione rimane inattiva per più di quindici (15) giorni, la distribuzione verrà eliminata. La distribuzione di un modello personalizzato è inattiva se il modello è stato distribuito più di quindici (15) giorni prima e non sono stati effettuati completamenti o chiamate di completamento della chat per un periodo continuativo di 15 giorni.

L'eliminazione di una distribuzione inattiva non elimina o influisce sul modello personalizzato sottostante e il modello personalizzato può essere ridistribuito in qualsiasi momento. Come descritto nei prezzi di Azure OpenAI in Modelli di Fonderia Microsoft, ogni modello personalizzato, ottimizzato e distribuito comporta un costo di hosting orario indipendentemente dal fatto che vengano effettuate chiamate di completamento o di completamento della chat al modello. Per altre informazioni sulla pianificazione e la gestione dei costi con Azure OpenAI, vedere le linee guida in Pianificare la gestione dei costi per Azure OpenAI.

È possibile usare vari metodi per eliminare la distribuzione per il modello personalizzato:

Eliminare il modello personalizzato

Analogamente, è possibile usare vari metodi per eliminare il modello personalizzato:

Annotazioni

Non è possibile eliminare un modello personalizzato se ha una distribuzione esistente. Prima di poter eliminare il modello personalizzato, è necessario eliminare la distribuzione del modello.

Eliminare i file di training

Facoltativamente, è possibile eliminare i file di training e convalida caricati per il training e i file di risultato generati durante il training dall'abbonamento a Azure OpenAI. È possibile usare i metodi seguenti per eliminare i file di training, convalida e risultato:

L'esempio Python seguente usa Python SDK per eliminare i file di training, convalida e risultato per il modello personalizzato:

print('Checking for existing uploaded files.')
results = []

# Get the complete list of uploaded files in our subscription.
files = openai.File.list().data
print(f'Found {len(files)} total uploaded files in the subscription.')

# Enumerate all uploaded files, extracting the file IDs for the
# files with file names that match your training dataset file and
# validation dataset file names.
for item in files:
    if item["filename"] in [training_file_name, validation_file_name, result_file_name]:
        results.append(item["id"])
print(f'Found {len(results)} already uploaded files that match our files')

# Enumerate the file IDs for our files and delete each file.
print(f'Deleting already uploaded files.')
for id in results:
    openai.File.delete(sid = id)

Prerequisiti

Modelli supportati

Consultare la pagina dei modelli per verificare quali aree supportano attualmente l'ottimizzazione.

In alternativa, è possibile ottimizzare un modello ottimizzato in precedenza, formattato come base-model.ft-{jobid}.

Esaminare il flusso di lavoro per l'API REST

Esaminare il flusso di lavoro di ottimizzazione per l'uso delle API REST e Python con Azure OpenAI:

  1. Preparare i dati di training e convalida.
  2. Selezionare un modello di base.
  3. Caricare i dati di training.
  4. Eseguire il training del nuovo modello personalizzato.
  5. Controllare lo stato del modello personalizzato.
  6. Distribuire il modello personalizzato per l'uso.
  7. Usare il modello personalizzato.
  8. Facoltativamente, analizzare prestazioni e adattamento del modello personalizzato.

Preparare i dati di training e convalida

I dati di training e i set di dati di convalida sono costituiti da esempi di input e output per il modo in cui si vuole eseguire il modello.

I dati di training e convalida che utilizzi devono essere formattati come documento JSON Lines (JSONL) e nel formato conversazionale utilizzato dall'API Chat completions.

Per una procedura dettagliata sull'ottimizzazione di un modello gpt-4o-mini-2024-07-18, vedere l'esercitazione sull'ottimizzazione di OpenAI di Azure.

Formato del file di esempio

{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who discovered Antarctica?"}, {"role": "assistant", "content": "Some chaps named Fabian Gottlieb von Bellingshausen and Mikhail Lazarev, as if they don't teach that in every school!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the biggest ocean?"}, {"role": "assistant", "content": "The Pacific Ocean. It's not like it's a small pond or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest planet?"}, {"role": "assistant", "content": "It's called Jupiter, you might have heard of it...or not."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who painted the Mona Lisa?"}, {"role": "assistant", "content": "Oh, some obscure artist named Leonardo da Vinci. Not that he is famous or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the boiling point of water?"}, {"role": "assistant", "content": "Exciting fact of the day: it's 100 degrees Celsius. Life-changing, isn't it?"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'The Odyssey'?"}, {"role": "assistant", "content": "Oh, just some poet named Homer. Nothing special, really."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest mammal?"}, {"role": "assistant", "content": "Blue Whale. Quite a big fish isn't it? Oh wait, it's not a fish!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the highest mountain peak?"}, {"role": "assistant", "content": "Everest. Brace yourself, it's not a walk in the park."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who invented the telephone?"}, {"role": "assistant", "content": "A guy named Alexander Graham Bell. Bet you didn't guess that one!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the distance from Earth to the Sun?"}, {"role": "assistant", "content": "About 93 million miles. Just a quick drive, really."}]}

Formato di file chat multiturn

Sono inoltre supportati diversi turn di una conversazione in una singola riga del file di training jsonl. Per ignorare l'ottimizzazione su messaggi di assistente specifici, aggiungere la coppia di valori di chiave weight facoltativa. Attualmente è possibile impostare weight su 0 o 1.

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already.", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "William Shakespeare", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "384,400 kilometers", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters.", "weight": 1}]}

Completamento della chat con Visione

{"messages": [{"role": "user", "content": [{"type": "text", "text": "What's in this image?"}, {"type": "image_url", "image_url": {"url": "https://raw.githubusercontent.com/MicrosoftDocs/azure-ai-docs/main/articles/ai-services/openai/media/how-to/generated-seattle.png"}}]}, {"role": "assistant", "content": "The image appears to be a watercolor painting of a city skyline, featuring tall buildings and a recognizable structure often associated with Seattle, like the Space Needle. The artwork uses soft colors and brushstrokes to create a somewhat abstract and artistic representation of the cityscape."}]}

Oltre al formato JSONL, i file di dati di training e convalida devono essere codificati in UTF-8 e includere un byte order mark (BOM). Il file deve avere dimensioni inferiori a 512 MB.

Creare i set di dati di training e convalida

Più esempi di training sono disponibili, meglio è. L'ottimizzazione dei processi non procederà senza almeno 10 esempi di training; tuttavia, un numero così ridotto non è sufficiente per influenzare notevolmente le risposte del modello. È consigliabile fornire centinaia, se non migliaia, di esempi di training per avere successo.

In generale, il raddoppio delle dimensioni del set di dati può comportare un aumento lineare della qualità del modello. Tenere tuttavia presente che gli esempi di bassa qualità possono influire negativamente sulle prestazioni. Se si esegue il training del modello su una grande quantità di dati interni, senza prima eliminare il set di dati solo degli esempi di qualità più elevati, è possibile ottenere un modello che comporta prestazioni molto peggiori del previsto.

Caricare i dati di training

Il passaggio successivo consiste nella scelta dei dati di training preparati esistenti o nel caricamento di nuovi dati di training preparati da usare durante l'ottimizzazione del modello. Dopo aver preparato i dati di training, è possibile caricare i file nel servizio. Sono disponibili due modi per caricare i dati di training:

Per i file di dati di grandi dimensioni, è consigliabile eseguire l'importazione da un archivio BLOB di Azure. I file di grandi dimensioni possono diventare instabili quando vengono caricati tramite moduli in più parti, perché le richieste sono atomiche e non possono essere ritentate o riprese. Per altre informazioni su Archiviazione BLOB di Azure, vedere Che cos’è l’archiviazione BLOB di Azure?

Annotazioni

I file di dati di training devono essere formattati come file JSONL, codificati in UTF-8 con un byte order mark (BOM). Il file deve avere dimensioni inferiori a 512 MB.

Carica dati di training

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/files \
  -H "Content-Type: multipart/form-data" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -F "purpose=fine-tune" \
  -F "file=@C:\\fine-tuning\\training_set.jsonl;type=application/json"

Caricare i dati di convalida

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/files \
  -H "Content-Type: multipart/form-data" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -F "purpose=fine-tune" \
  -F "file=@C:\\fine-tuning\\validation_set.jsonl;type=application/json"

Creare un modello personalizzato

Dopo aver caricato i file di training e convalida, si è pronti per avviare il processo di ottimizzazione. Il codice seguente mostra un esempio di come creare un nuovo processo di ottimizzazione con l'API REST.

In questo esempio viene passato anche il parametro per il inizializzazione. Il seme controlla la riproducibilità del lavoro. Il passaggio degli stessi parametri di inizializzazione e processo dovrebbe produrre gli stessi risultati, ma in rari casi può differire. Se non viene specificato un valore di inizializzazione, ne verrà generato uno automaticamente.

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -d '{
    "model": "gpt-4.1-2025-04-14",
    "training_file": "<TRAINING_FILE_ID>",
    "validation_file": "<VALIDATION_FILE_ID>",
    "seed": 105
}'

Se si ottimizza finemente un modello che supporta Training Globale, è possibile specificare il tipo di training usando l'argomento denominato extra_body e la versione API 2025-04-01-preview:

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/fine_tuning/jobs?api-version=2025-04-01-preview \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -d '{
    "model": "gpt-4.1-2025-04-14",
    "training_file": "<TRAINING_FILE_ID>",
    "validation_file": "<VALIDATION_FILE_ID>",
    "seed": 105,
    "trainingType": "globalstandard"
}'

È anche possibile passare parametri facoltativi aggiuntivi, ad esempio gli iperparametri, per assumere un maggiore controllo del processo di ottimizzazione. Per il training iniziale, è consigliabile usare le impostazioni predefinite automatiche presenti senza specificare questi parametri.

Gli iperparametri attualmente supportati per i Fine-Tuning con supervisione sono:

Nome Tipo Descrizione
batch_size integer Dimensioni del batch da usare per il training. Le dimensioni del batch sono il numero di esempi di training usati per eseguire il training di un singolo passaggio avanti e indietro. In generale, è stato rilevato che le dimensioni dei batch più grandi tendono a funzionare meglio per set di dati di dimensioni maggiori. Il valore predefinito e il valore massimo per questa proprietà sono specifici di un modello di base. Una dimensione batch maggiore indica che i parametri del modello vengono aggiornati meno frequentemente, ma con varianza inferiore.
learning_rate_multiplier d'acquisto Moltiplicatore della frequenza di apprendimento da usare per il training. La velocità di apprendimento di ottimizzazione è la velocità di apprendimento originale usata per il training preliminare moltiplicata per questo valore. I tassi di apprendimento più elevati tendono a ottenere prestazioni migliori con dimensioni batch maggiori. È consigliabile provare con i valori compresi nell'intervallo da 0,02 a 0,2 per vedere quali risultati producono i risultati migliori. Un tasso di apprendimento inferiore può essere utile per evitare l'overfitting.
n_epochs integer Numero di periodi per cui eseguire il training del modello. Un periodo fa riferimento a un ciclo completo attraverso il set di dati di training.
seed integer Il seme controlla la riproducibilità del lavoro. Il passaggio degli stessi parametri di inizializzazione e processo dovrebbe produrre gli stessi risultati, ma in rari casi può differire. Se non viene specificato un valore di inizializzazione, ne verrà generato uno automaticamente.

Annotazioni

Per altre informazioni sugli iperparametri supportati, vedere le guide per l'ottimizzazione delle preferenze dirette e l'ottimizzazione del rinforzo .

Tipo di training

Selezionare il livello di training in base al caso d'uso e al budget.

  • Standard: il training viene eseguito nell'area della risorsa Fonderia attuale, fornendo garanzie di residenza dei dati. Ideale per i carichi di lavoro in cui i dati devono rimanere in un'area specifica.

  • Globale: offre prezzi più convenienti rispetto a Standard sfruttando la capacità oltre l'area corrente. I dati e i pesi vengono copiati nella regione in cui avviene l'addestramento. Ideale se la residenza dei dati non è una restrizione e si vogliono tempi di coda più rapidi.

  • Sviluppatore (anteprima): offre risparmi significativi sui costi sfruttando la capacità inattiva per la formazione. Non ci sono garanzie di latenza o di accordo sul livello del servizio, quindi i processi in questo livello possono essere sospesi automaticamente e ripresi in un secondo momento. Non esistono garanzie di residenza dei dati. Ideale per la sperimentazione e i carichi di lavoro sensibili ai prezzi.

curl -X POST "https://<ACCOUNT-NAME>.openai.azure.com/openai/fine_tuning/jobs?api-version=2025-04-01-preview" -H "Content-Type: application/json" -H "api-key: <API-KEY>" -d "{"model": "gpt-4.1", "training_file": "<FILE_ID>", "hyperparameters": {"prompt_loss_weight": 0.1}, "trainingType": "developerTier"}"

Controllare lo stato del modello personalizzato

Dopo aver avviato un processo di ottimizzazione, il completamento può richiedere del tempo. Il processo potrebbe essere in coda dietro altri processi nel sistema. Il training del modello può richiedere minuti o ore, a seconda delle dimensioni del modello e del set di dati. L'esempio seguente usa l'API REST per controllare lo stato del processo di ottimizzazione. L'esempio recupera informazioni sul processo usando l'ID processo restituito dall'esempio precedente:

curl -X GET $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/<YOUR-JOB-ID> \
  -H "api-key: $AZURE_OPENAI_API_KEY"

Sospendere e riprendere

Durante il training è possibile visualizzare i log e le metriche e sospendere il processo in base alle esigenze. La sospensione può essere utile se le metriche non sono convergenti o se si ritiene che il modello non stia imparando al ritmo corretto. Una volta sospeso il processo di addestramento, verrà creato un checkpoint distribuibile al termine delle valutazioni di sicurezza. Questo checkpoint è disponibile per la distribuzione e l'utilizzo per l'inferenza o per riprendere il processo fino al completamento. L'operazione di sospensione è applicabile solo per i processi sottoposti a training per almeno un passaggio e che siano in stato In esecuzione.

Pausa

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/pause \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

Riprendi

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/resume \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

Elencare gli eventi di ottimizzazione

Per esaminare i singoli eventi di ottimizzazione generati durante il training:

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/events \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

Copia modello (anteprima)

È ora possibile copiare un modello con checkpoint ottimizzato da un'area a un'altra, in sottoscrizioni differenti, ma all'interno dello stesso tenant. Il processo usa API dedicate per garantire trasferimenti efficienti e sicuri. Questa funzionalità è attualmente disponibile solo con l'API e non tramite il portale Fonderia. Dopo aver copiato il modello dall'area A all'area B, è possibile ottimizzare continuamente il modello nell'area B e distribuire il modello da questa posizione.

Annotazioni

L'eliminazione del checkpoint del modello nell'area di origine non causerà l'eliminazione del modello nell'area di destinazione. Per eliminare il modello in entrambe le aree dopo che è stato copiato, è necessario eliminare il modello separatamente in ogni area.

Prerequisiti

  • La risorsa/l'account di destinazione deve avere almeno un processo di ottimizzazione.
  • La risorsa/l'account di destinazione non deve disabilitare l'accesso alla rete pubblica. (almeno durante l'invio della richiesta di copia).
  • È possibile copiare nell'account di destinazione solo se l'account che avvia la copia dispone di autorizzazioni sufficienti per accedere all'account di destinazione.

Configurazione delle autorizzazioni

  1. Creare un'identità gestita assegnata dall'utente.
  2. Assegna il ruolo utente di Azure AI all'identità gestita assegnata dall'utente sulla risorsa o sull'account di destinazione.
  3. Assegnare l'identità gestita assegnata dall'utente all'account della risorsa di origine.

Copiare il modello

curl --request POST \
  --url 'https://<aoai-resource>.openai.azure.com/openai/v1/fine_tuning/jobs/<ftjob>/checkpoints/<checkpoint-name>/copy' \
  --header 'Content-Type: application/json' \
  --header 'api-key: <api-key>' \
  --header 'aoai-copy-ft-checkpoints: preview' \
  --data '{
  "destinationResourceId": "<resourceId>",
  "region": "<region>"
}'

Poiché si tratta di un'operazione a esecuzione prolungata, controllare lo stato della copia del modello ottimizzata specificando l'ID checkpoint dell'account di origine usato nella chiamata POST.

Verificare lo stato della copia

curl --request GET \
  --url 'https://<aoai-resource>.openai.azure.com//openai/v1/fine_tuning/jobs/<ftjob>/checkpoints/<checkpoint-name>/copy' \
  --header 'Content-Type: application/json' \
  --header 'api-key: <api-key>' \
  --header 'aoai-copy-ft-checkpoints: preview' 

Annotazioni

Quando si copia un checkpoint da un account di origine, lo stesso nome del checkpoint viene mantenuto nell'account di destinazione. Assicurarsi di usare lo stesso nome per l'ottimizzazione, la distribuzione o per qualsiasi altra operazione nell'account di destinazione. Questo checkpoint non viene visualizzato nell'interfaccia utente o nell'API list checkpoints .

Punti di controllo

Al completamento di ogni periodo di training, viene generato un checkpoint. Un checkpoint è una versione completamente funzionale di un modello che può essere distribuita e usata come modello di destinazione per i processi di ottimizzazione successivi. I checkpoint possono essere particolarmente utili, in quanto possono fornire snapshot prima dell'overfitting. Al termine di un processo di ottimizzazione, le tre versioni più recenti del modello saranno disponibili per la distribuzione. L'epoca finale sarà rappresentata dal modello ottimizzato, le due epoche precedenti saranno disponibili come checkpoint.

È possibile eseguire il comando list checkpoints per recuperare l'elenco dei checkpoint associati a un singolo processo di ottimizzazione:

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/checkpoints \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

Analizzare il modello personalizzato

Azure OpenAI collega un file di risultato, denominato results.csv a ogni processo di ottimizzazione dopo il completamento. È possibile usare il file dei risultati per analizzare le prestazioni del training e convalidare del modello personalizzato. L'ID file per il file dei risultati è elencato per ogni modello personalizzato ed è possibile usare l’API REST per recuperare l'ID file e scaricare il file di risultato per l'analisi.

L'esempio Python seguente usa l'API REST per recuperare l'ID file del primo file dei risultati allegato al processo di ottimizzazione per il modello personalizzato e quindi scaricare il file nella directory di lavoro per l'analisi.

curl -X GET "$AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/<JOB_ID>" \
  -H "api-key: $AZURE_OPENAI_API_KEY")
curl -X GET "$AZURE_OPENAI_ENDPOINT/openai/v1/files/<RESULT_FILE_ID>/content" \
    -H "api-key: $AZURE_OPENAI_API_KEY" > <RESULT_FILENAME>

Il file dei risultati è un file CSV contenente una riga di intestazione e una riga per ogni passaggio di training eseguito dal processo di ottimizzazione. Il file dei risultati contiene le colonne seguenti:

Nome della colonna Descrizione
step Numero del passaggio di training. Un passaggio di training rappresenta un singolo passaggio, avanti e indietro, in un batch di dati di training.
train_loss Perdita per il batch di training.
train_mean_token_accuracy Percentuale di token nel batch di training stimati correttamente dal modello.
Ad esempio, se le dimensioni del batch sono impostate su 3 e i dati contengono completamenti [[1, 2], [0, 5], [4, 2]], questo valore viene impostato su 0,83 (5 di 6) se il modello ha previsto [[1, 1], [0, 5], [4, 2]].
valid_loss Perdita per il batch di convalida.
validation_mean_token_accuracy Percentuale di token nel batch di convalida stimati correttamente dal modello.
Ad esempio, se le dimensioni del batch sono impostate su 3 e i dati contengono completamenti [[1, 2], [0, 5], [4, 2]], questo valore viene impostato su 0,83 (5 di 6) se il modello ha previsto [[1, 1], [0, 5], [4, 2]].
full_valid_loss Perdita di convalida calcolata alla fine di ogni epoca. Quando il training va bene, la perdita dovrebbe diminuire.
full_valid_mean_token_accuracy Accuratezza del token media valida calcolata alla fine di ogni epoca. Quando il training va bene, l'accuratezza del token dovrebbe aumentare.

È anche possibile visualizzare i dati nel file results.csv come grafici nel portale Foundry. Selezionare il collegamento per il modello sottoposto a training; verranno visualizzati tre grafici: perdita, accuratezza del token media e accuratezza del token. Se sono stati forniti dati di convalida, entrambi i set di dati verranno visualizzati nello stesso tracciato.

Cercare la perdita da ridurre nel tempo e l'accuratezza da aumentare. Se viene visualizzata una divergenza tra i dati di training e di convalida, ciò potrebbe indicare un overfitting. Provare a eseguire il training con meno periodi o a un moltiplicatore di frequenza di trading più piccolo.

Distribuire un modello ottimizzato

Dopo aver soddisfatto le metriche del processo di ottimizzazione, oppure si vuole semplicemente passare all'inferenza, è necessario distribuire il modello.

Se si esegue la distribuzione per un'ulteriore convalida, valutare la possibilità di eseguire la distribuzione per i test usando una distribuzione per sviluppatori.

Se si è pronti per la distribuzione per la produzione o si hanno specifiche esigenze di residenza dei dati, seguire la guida alla distribuzione.

Variabile Definizione
token Esistono diversi modi per generare un token di autorizzazione. Il metodo più semplice per i test iniziali consiste nell'avviare Cloud Shell dal portale di Azure. Quindi eseguire az account get-access-token. È possibile usare questo token come token di autorizzazione temporaneo per il test dell'API. È consigliabile archiviare questo valore in una nuova variabile di ambiente.
abbonamento ID sottoscrizione per la risorsa Azure OpenAI associata.
gruppo di risorse Nome del gruppo di risorse per la risorsa Azure OpenAI.
nome_risorsa Nome della risorsa di Azure OpenAI.
model_deployment_name Nome personalizzato per la nuova distribuzione del modello ottimizzata. Questo è il nome a cui verrà fatto riferimento nel codice quando si effettuano chiamate di completamento della chat.
fine_tuned_model Recuperare questo valore dai risultati del processo di ottimizzazione nel passaggio precedente. Sarà simile a gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83. Sarà necessario aggiungere tale valore al deploy_data json. In alternativa, è anche possibile distribuire un checkpoint passando l'ID del checkpoint, che verrà visualizzato nel formato ftchkpt-e559c011ecc04fc68eaa339d8227d02d
curl -X POST "https://management.azure.com/subscriptions/<SUBSCRIPTION>/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.CognitiveServices/accounts/<RESOURCE_NAME>/deployments/<MODEL_DEPLOYMENT_NAME>?api-version=2024-10-21" \
  -H "Authorization: Bearer <TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "sku": {"name": "standard", "capacity": 1},
    "properties": {
        "model": {
            "format": "OpenAI",
            "name": "<FINE_TUNED_MODEL>",
            "version": "1"
        }
    }
}'

Altre informazioni sulla distribuzione tra aree e sull'uso del modello distribuito sono disponibili qui.

Ottimizzazione continua

Dopo aver creato un modello ottimizzato, si può desiderare di continuare a perfezionare il modello nel tempo tramite un'ulteriore ottimizzazione. L'ottimizzazione continua è il processo iterativo per selezionare un modello già ottimizzato come modello di base e ottimizzarlo ulteriormente sui nuovi set di esempi di training.

Annotazioni

L'ottimizzazione continua è supportata solo per i modelli OpenAI.

Per eseguire l'ottimizzazione su un modello ottimizzato in precedenza, è necessario usare lo stesso processo descritto in Creare un modello personalizzato, ma invece di specificare il nome di un modello di base generico, è necessario specificare l'ID del modello già ottimizzato. L'ID modello ottimizzato è simile al seguente gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -d '{
    "model": "gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7",
    "training_file": "<TRAINING_FILE_ID>",
    "validation_file": "<VALIDATION_FILE_ID>",
    "suffix": "<additional text used to help identify fine-tuned models>"
}'

È anche consigliabile includere il parametro suffix per semplificare la distinzione tra iterazioni differenti del modello ottimizzato. suffix accetta una stringa ed è impostato per identificare il modello ottimizzato. Il suffisso può contenere fino a 40 caratteri (a-z, A-Z, 0-9 e _) che verranno aggiunti al nome del modello ottimizzato.

Se non si è certi dell'ID del modello ottimizzato, queste informazioni sono disponibili nella pagina Modelli di Foundry oppure è possibile generare un elenco di modelli per una determinata risorsa OpenAI di Azure usando l'API REST.

Pulire le distribuzioni, i modelli personalizzati e i file di training

Al termine del modello personalizzato, è possibile eliminare la distribuzione e il modello. È anche possibile eliminare i file di training e convalida caricati nel servizio, se necessario.

Eliminare la distribuzione del modello

È possibile usare vari metodi per eliminare la distribuzione per il modello personalizzato:

Eliminare il modello personalizzato

Analogamente, è possibile usare vari metodi per eliminare il modello personalizzato:

Annotazioni

Non è possibile eliminare un modello personalizzato se ha una distribuzione esistente. Prima di poter eliminare il modello personalizzato, è necessario eliminare la distribuzione del modello.

Eliminare i file di training

Facoltativamente, è possibile eliminare i file di training e convalida caricati per il training e i file di risultato generati durante il training dall'abbonamento a Azure OpenAI. È possibile usare i metodi seguenti per eliminare i file di training, convalida e risultato:

Nel portale di Microsoft Foundry sono disponibili due esperienze di ottimizzazione univoche:

Se si ottimizzano solo i modelli di Azure OpenAI, è consigliabile usare l'esperienza di ottimizzazione orientata ad Azure OpenAI disponibile passando a https://ai.azure.com/resource/overview.

Importante

Gli elementi contrassegnati (anteprima) in questo articolo sono attualmente disponibili in anteprima pubblica. Questa anteprima viene fornita senza un contratto di servizio e non è consigliabile per i carichi di lavoro di produzione. Alcune funzionalità potrebbero non essere supportate o potrebbero presentare funzionalità limitate. Per altre informazioni, vedere le Condizioni supplementari per l'uso delle anteprime di Microsoft Azure.

Prerequisiti

Modelli supportati

Consultare la pagina dei modelli per verificare quali aree supportano attualmente l'ottimizzazione.

In alternativa, è possibile ottimizzare un modello ottimizzato in precedenza, formattato come base-model.ft-{jobid}.

Esaminare il flusso di lavoro per il portale foundry

Dedicare un istante a rivedere il flusso di lavoro di ottimizzazione per l'uso del portale Fonderia:

  1. Preparare i dati di training e convalida.
  2. Usare la finestra di dialogo Crea un modello ottimizzato nel portale di Foundry per eseguire il training del modello personalizzato.
    1. Selezionare un metodo di training.
    2. Selezionare un modello di base.
    3. Scegliere il tipo di training
    4. Scegliere i dati del training.
    5. Facoltativamente, scegliere i dati di convalida.
    6. Facoltativamente, configurare i parametri delle attività per il processo di ottimizzazione.
    7. Facoltativamente, abilitare la distribuzione automatica per il modello personalizzato risultante.
    8. Esaminare le scelte ed eseguire il training del nuovo modello personalizzato.
  3. Controllare lo stato del modello personalizzato ottimizzato.
  4. Distribuire il modello personalizzato da usare.
  5. Usare il modello personalizzato.
  6. Facoltativamente, analizzare prestazioni e adattamento del modello personalizzato.

Preparare i dati di training e convalida

I dati di training e i set di dati di convalida sono costituiti da esempi di input e output per il modo in cui si vuole eseguire il modello.

I dati di training e convalida che utilizzi devono essere formattati come documento JSON Lines (JSONL) e nel formato conversazionale utilizzato dall'API Chat completions.

È in genere consigliabile usare le istruzioni e i suggerimenti che hanno funzionato meglio in ogni esempio di training. Ciò consentirà di ottenere i risultati migliori, soprattutto se si hanno meno di un centinaio di esempi.

Formato del file di esempio

{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who discovered Antarctica?"}, {"role": "assistant", "content": "Some chaps named Fabian Gottlieb von Bellingshausen and Mikhail Lazarev, as if they don't teach that in every school!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the biggest ocean?"}, {"role": "assistant", "content": "The Pacific Ocean. It's not like it's a small pond or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest planet?"}, {"role": "assistant", "content": "It's called Jupiter, you might have heard of it...or not."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who painted the Mona Lisa?"}, {"role": "assistant", "content": "Oh, some obscure artist named Leonardo da Vinci. Not that he is famous or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the boiling point of water?"}, {"role": "assistant", "content": "Exciting fact of the day: it's 100 degrees Celsius. Life-changing, isn't it?"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'The Odyssey'?"}, {"role": "assistant", "content": "Oh, just some poet named Homer. Nothing special, really."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest mammal?"}, {"role": "assistant", "content": "Blue Whale. Quite a big fish isn't it? Oh wait, it's not a fish!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the highest mountain peak?"}, {"role": "assistant", "content": "Everest. Brace yourself, it's not a walk in the park."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who invented the telephone?"}, {"role": "assistant", "content": "A guy named Alexander Graham Bell. Bet you didn't guess that one!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the distance from Earth to the Sun?"}, {"role": "assistant", "content": "About 93 million miles. Just a quick drive, really."}]}

Formato di file di chat a più turni in Azure OpenAI

Sono inoltre supportati diversi turn di una conversazione in una singola riga del file di training jsonl. Per ignorare l'ottimizzazione su messaggi di assistente specifici, aggiungere la coppia di valori di chiave weight facoltativa. Attualmente è possibile impostare weight su 0 o 1.

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already.", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "William Shakespeare", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "384,400 kilometers", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters.", "weight": 1}]}

Completamento della chat con Visione

{"messages": [{"role": "user", "content": [{"type": "text", "text": "What's in this image?"}, {"type": "image_url", "image_url": {"url": "https://raw.githubusercontent.com/MicrosoftDocs/azure-ai-docs/main/articles/ai-services/openai/media/how-to/generated-seattle.png"}}]}, {"role": "assistant", "content": "The image appears to be a watercolor painting of a city skyline, featuring tall buildings and a recognizable structure often associated with Seattle, like the Space Needle. The artwork uses soft colors and brushstrokes to create a somewhat abstract and artistic representation of the cityscape."}]}

Oltre al formato JSONL, i file di dati di training e convalida devono essere codificati in UTF-8 e includere un byte order mark (BOM). Il file deve avere dimensioni inferiori a 512 MB.

Considerazioni sulle dimensioni dei set di dati

Più esempi di training sono disponibili, meglio è. L'ottimizzazione dei processi non procederà senza almeno 10 esempi di training, ma un numero così ridotto non è sufficiente per influenzare notevolmente le risposte del modello. È consigliabile fornire centinaia, se non migliaia, di esempi di training per avere successo. È consigliabile iniziare con 50 dati di training ben creati.

In generale, il raddoppio delle dimensioni del set di dati può comportare un aumento lineare della qualità del modello. Tenere tuttavia presente che gli esempi di bassa qualità possono influire negativamente sulle prestazioni. Se si esegue il training del modello su una grande quantità di dati interni, senza prima eliminare il set di dati solo degli esempi di qualità più elevati, è possibile ottenere un modello che comporta prestazioni molto peggiori del previsto.

Creazione di un modello ottimizzato

Il portale di Foundry fornisce la finestra di dialogo Crea un modello ottimizzato , quindi in un'unica posizione è possibile creare ed eseguire facilmente il training di un modello ottimizzato per la risorsa di Azure.

  1. Passare al portale foundry all'indirizzo https://ai.azure.com/ e accedere con le credenziali che hanno accesso alla risorsa OpenAI di Azure. Durante il flusso di lavoro di accesso, selezionare la directory appropriata, la sottoscrizione di Azure e la risorsa OpenAI di Azure.

  2. Nel portale di Foundry passare al riquadro Strumenti > Ottimizzazione e selezionare Ottimizza modello.

    Screenshot che mostra come accedere alla procedura guidata per la creazione di un modello personalizzato nel portale di Foundry.

  3. Selezionare un modello da ottimizzare e quindi selezionare Avanti per continuare.

    Screenshot della finestra di dialogo per la selezione del modello nel portale Foundry.

Verrà visualizzata la finestra di dialogo Crea un modello ottimizzato .

Screenshot della finestra di dialogo Crea un modello ottimizzato.

Scegliere il metodo di training

Il primo passaggio consiste nel confermare la scelta del modello e il metodo di training. Non tutti i modelli supportano tutti i metodi di training.

  • Ottimizzazione supervisionata (SFT): supportata da tutti i modelli che non richiedono ragionamento.
  • Ottimizzazione delle preferenze dirette (anteprima) (DPO): supportato da GPT-4o.
  • Ottimizzazione per Rinforzo (Anteprima) (RFT): supportata da modelli di ragionamento come o4-mini.

Quando si seleziona il modello, è anche possibile selezionare un modello ottimizzato in precedenza.

Scegliere il tipo di training

Foundry offre tre livelli di training progettati per soddisfare diverse esigenze dei clienti:

Livello di formazione standard

Offre capacità dedicata per l'ottimizzazione con prestazioni prevedibili e contratti di servizio. Ideale per i carichi di lavoro di produzione che richiedono una velocità effettiva garantita.

Livello standard globale di formazione

La Formazione Globale amplia la portata della personalizzazione del modello con i prezzi più convenienti delle altre offerte Globali. Non offre la residenza dei dati. Se è necessaria la residenza dei dati, consultare le aree elencate sulla disponibilità del modello per il modello scelto.

I dati di training e i pesi del modello risultanti possono essere copiati in un'altra area di Azure.

  • Addestrare i modelli OpenAI più recenti da oltre una dozzina di aree OpenAI di Azure.
  • Trarre vantaggio dalle tariffe di addestramento per token inferiori rispetto al livello Standard.

Livello di formazione per sviluppatori

Opzione conveniente che usa capacità inattiva per carichi di lavoro non urgenti o esplorativi.
I processi in questo livello possono essere annullati e ripresi in un secondo momento, rendendoli ideali per la sperimentazione e i casi d'uso sensibili ai costi.

Scegli i dati di allenamento

Il passaggio successivo consiste nel scegliere i dati di training preparati esistenti o caricare nuovi dati di training preparati da usare durante la personalizzazione del modello selezionando Aggiungi dati di training.

La finestra di dialogo Dati di training visualizza tutti i set di dati caricati in precedenza esistenti e offre anche opzioni per caricare nuovi dati di training.

Screenshot del riquadro Dati di training per la procedura guidata Crea modello personalizzato nel portale Fonderia.

  • Se i dati di training sono già caricati nel servizio, selezionare File dalla risorsa di intelligenza artificiale connessa.

    • Selezionare il file dall'elenco a discesa visualizzato.
  • Per caricare nuovi dati di training, usare una delle opzioni seguenti:

    • Selezionare Carica file per caricare i dati di training da un file locale.
    • Selezionare BLOB di Azure o altri percorsi Web condivisi per importare i dati di training dal BLOB di Azure o da un altro percorso Web condiviso.

Per i file di dati di grandi dimensioni, è consigliabile eseguire l'importazione da un archivio BLOB di Azure. I file di grandi dimensioni possono diventare instabili quando vengono caricati tramite moduli in più parti, perché le richieste sono atomiche e non possono essere ritentate o riprese. Per altre informazioni su Archiviazione BLOB di Azure, vedere Che cos'è l'archiviazione BLOB di Azure?

Annotazioni

I file di dati di training devono essere formattati come file JSONL, codificati in UTF-8 con un byte order mark (BOM). Il file deve avere dimensioni inferiori a 512 MB.

Scegliere i dati di convalida (facoltativo)

Se si dispone di un set di dati di convalida, selezionare Aggiungi dati di training. È possibile scegliere i dati di convalida preparati esistenti o caricare nuovi dati di convalida preparati da usare durante la personalizzazione del modello.

La finestra di dialogo Dati di convalida visualizza tutti i set di dati di training e convalida caricati in precedenza esistenti e fornisce opzioni in base alle quali è possibile caricare nuovi dati di convalida.

Screenshot del pannello Dati di convalida per la procedura guidata per la creazione di un modello personalizzato nel portale di Foundry.

  • Se i dati di convalida sono già caricati nel servizio, selezionare Scegli set di dati.

    • Selezionare il file nell'elenco visualizzato nel riquadro Dati di convalida.
  • Per caricare nuovi dati di convalida, usare una delle opzioni seguenti:

    • Selezionare File locale per caricare i dati di convalida da un file locale.
    • Selezionare BLOB di Azure o altri percorsi Web condivisi per importare i dati di convalida dal BLOB di Azure o da un altro percorso Web condiviso.

Per i file di dati di grandi dimensioni, è consigliabile eseguire l'importazione da un archivio BLOB di Azure. I file di grandi dimensioni possono diventare instabili quando vengono caricati tramite moduli in più parti, perché le richieste sono atomiche e non possono essere ritentate o riprese.

Annotazioni

Come i file di dati di training, anche i file di dati di convalida devono essere formattati come file JSONL, codificati in UTF-8 con un byte order mark (BOM) e devono avere dimensioni inferiori a 200 MB. Il file deve avere dimensioni inferiori a 512 MB.

Rendere il modello identificabile (facoltativo)

È anche consigliabile includere un suffix parametro per semplificare la distinzione tra iterazioni diverse del modello ottimizzato. Un suffix accetta una stringa di un massimo di 18 caratteri e viene usata quando si assegna un nome al modello ottimizzato risultante.

Configurare i parametri di training (facoltativo)

È possibile fornire un seme facoltativo e regolare ulteriori iperparametri.

Il seme controlla la riproducibilità del compito. Il passaggio degli stessi parametri di inizializzazione e processo dovrebbe produrre gli stessi risultati, ma in rari casi può differire. Se non viene specificato un seme, ne verrà generato uno in modo casuale.

Screenshot da vicino della sezione parametri della creazione guidata di un modello personalizzato nel portale di Foundry.

Gli iperparametri seguenti sono disponibili per l'ottimizzazione tramite il portale foundry:

Nome Tipo Descrizione
Dimensioni del batch integer Dimensioni del batch da usare per il training. Le dimensioni del batch sono il numero di esempi di training usati per eseguire il training di un singolo passaggio avanti e indietro. In generale, è stato rilevato che le dimensioni dei batch più grandi tendono a funzionare meglio per set di dati di dimensioni maggiori. Il valore predefinito e il valore massimo per questa proprietà sono specifici di un modello di base. Una dimensione batch maggiore indica che i parametri del modello vengono aggiornati meno frequentemente, ma con varianza inferiore.
Moltiplicatore della frequenza di apprendimento d'acquisto Moltiplicatore della frequenza di apprendimento da usare per il training. La velocità di apprendimento di ottimizzazione è la velocità di apprendimento originale usata per il training preliminare moltiplicata per questo valore. I tassi di apprendimento più elevati tendono a ottenere prestazioni migliori con dimensioni batch maggiori. È consigliabile provare con i valori compresi nell'intervallo da 0,02 a 0,2 per vedere quali risultati producono i risultati migliori. Una frequenza di apprendimento più piccola può essere utile per evitare l'overfitting.
Numero di periodi integer Numero di periodi per cui eseguire il training del modello. Un periodo fa riferimento a un ciclo completo attraverso il set di dati di training.

Abilitare la distribuzione automatica (facoltativo)

Per risparmiare tempo, è possibile abilitare facoltativamente la distribuzione automatica per il modello risultante. Se il training viene completato correttamente, il modello verrà distribuito usando il tipo di distribuzione selezionato. La distribuzione verrà denominata in base al nome univoco generato per il modello personalizzato e al suffisso facoltativo specificato in precedenza.

Screenshot dell'interruttore di distribuzione automatica nella procedura guidata per la creazione di un modello personalizzato nel portale di Foundry.

Annotazioni

Per la distribuzione automatica sono attualmente supportate solo le distribuzioni standard globali e per gli sviluppatori. Nessuna di queste opzioni fornisce la residenza dei dati. Per altri dettagli, vedere la documentazione sul tipo di distribuzione .

Esaminare le scelte ed eseguire il training del modello

Esaminare le scelte effettuate e selezionare Invia per avviare il training del nuovo modello ottimizzato.

Controllare lo stato del modello personalizzato

Dopo aver inviato il processo di ottimizzazione, verrà visualizzata una pagina con i dettagli sul modello ottimizzato. È possibile trovare lo stato e altre informazioni sul modello adattato nella pagina Ottimizzazione del portale Foundry.

Il processo potrebbe essere in coda dietro altri processi nel sistema. Il training del modello può richiedere minuti o ore, a seconda delle dimensioni del modello e del set di dati.

Punti di controllo

Al completamento di ogni periodo di training, viene generato un checkpoint. Un checkpoint è una versione completamente funzionale di un modello che può essere distribuita e usata come modello di destinazione per i processi di ottimizzazione successivi. I checkpoint possono essere particolarmente utili, in quanto possono fornire snapshot prima dell'overfitting. Al termine di un processo di ottimizzazione, le tre versioni più recenti del modello saranno disponibili per la distribuzione. È possibile copiare punti di controllo tra risorse e sottoscrizioni attraverso l'API REST.

Sospendere e riprendere

È possibile tenere traccia dello stato di avanzamento in entrambe le visualizzazioni di affinamento del portale Fonderia. Si noterà che il processo passa attraverso gli stessi stati dei normali processi di ottimizzazione (in coda, in esecuzione, completato).

È anche possibile esaminare i file dei risultati durante l'addestramento per dare un'occhiata ai progressi e vedere se l'addestramento sta procedendo come previsto.

Annotazioni

Durante il training è possibile visualizzare i log e le metriche e sospendere il processo in base alle esigenze. La sospensione può essere utile se le metriche non sono convergenti o se si ritiene che il modello non stia imparando al ritmo corretto. Una volta sospeso il processo di addestramento, verrà creato un checkpoint distribuibile al termine delle valutazioni di sicurezza. Questo checkpoint è disponibile per la distribuzione e l'utilizzo per l'inferenza o per riprendere il processo fino al completamento. L'operazione di sospensione è applicabile solo per i processi sottoposti a training per almeno un passaggio e che siano in stato In esecuzione.

Screenshot dell'ottimizzazione per rinforzo con un processo in esecuzione.

Analizzare il modello personalizzato

Azure OpenAI collega un file di risultato, denominato results.csv a ogni processo di ottimizzazione dopo il completamento. È possibile usare il file dei risultati per analizzare le prestazioni del training e convalidare del modello personalizzato. L'ID file per il file di risultato è elencato per ogni modello personalizzato nella colonna ID file risultato nel riquadro Modelli per il portale di Foundry. È possibile usare l'ID file per identificare e scaricare il file di risultato dal riquadro File di dati del portale foundry.

Il file dei risultati è un file CSV contenente una riga di intestazione e una riga per ogni passaggio di training eseguito dal processo di ottimizzazione. Il file dei risultati contiene le colonne seguenti:

Nome della colonna Descrizione
step Numero del passaggio di training. Un passaggio di training rappresenta un singolo passaggio, avanti e indietro, in un batch di dati di training.
train_loss Perdita per il batch di training.
train_mean_token_accuracy Percentuale di token nel batch di training stimati correttamente dal modello.
Ad esempio, se le dimensioni del batch sono impostate su 3 e i dati contengono completamenti [[1, 2], [0, 5], [4, 2]], questo valore viene impostato su 0,83 (5 di 6) se il modello ha previsto [[1, 1], [0, 5], [4, 2]].
valid_loss Perdita per il batch di convalida.
validation_mean_token_accuracy Percentuale di token nel batch di convalida stimati correttamente dal modello.
Ad esempio, se le dimensioni del batch sono impostate su 3 e i dati contengono completamenti [[1, 2], [0, 5], [4, 2]], questo valore viene impostato su 0,83 (5 di 6) se il modello ha previsto [[1, 1], [0, 5], [4, 2]].
full_valid_loss Perdita di convalida calcolata alla fine di ogni epoca. Quando il training va bene, la perdita dovrebbe diminuire.
full_valid_mean_token_accuracy Accuratezza del token media valida calcolata alla fine di ogni epoca. Quando il training va bene, l'accuratezza del token dovrebbe aumentare.

È anche possibile visualizzare i dati nel file results.csv come grafici nel portale Foundry. Selezionare il collegamento per il modello sottoposto a training; verranno visualizzati tre grafici: perdita, accuratezza del token media e accuratezza del token. Se sono stati forniti dati di convalida, entrambi i set di dati verranno visualizzati nello stesso tracciato.

Cercare la perdita da ridurre nel tempo e l'accuratezza da aumentare. Se viene visualizzata una divergenza tra i dati di training e di convalida, ciò potrebbe indicare un overfitting. Provare a eseguire il training con meno periodi o a un moltiplicatore di frequenza di trading più piccolo.

Distribuire un modello ottimizzato

Dopo essere stati soddisfatti delle metriche del processo di ottimizzazione o semplicemente si vuole passare all'inferenza, è necessario distribuire il modello.

Se si esegue la distribuzione per un'ulteriore convalida, valutare la possibilità di eseguire la distribuzione per i test usando una distribuzione per sviluppatori.

Se si è pronti per la distribuzione per la produzione o si hanno specifiche esigenze di residenza dei dati, seguire la guida alla distribuzione.

Usare un modello ottimizzato per la distribuzione

Dopo la distribuzione del modello ottimizzato, è possibile usarlo come qualsiasi altro modello distribuito. È possibile usare Playground in Foundry per sperimentare la nuova distribuzione. È anche possibile usare l'API REST per chiamare il modello ottimizzato dall'applicazione. È anche possibile iniziare a usare questo nuovo modello ottimizzato nel prompt flow per compilare l'applicazione di intelligenza artificiale generativa.

Annotazioni

Per i modelli di chat, il messaggio di sistema usato per guidare il modello ottimizzato ( distribuito o disponibile per i test nel playground) deve corrispondere al messaggio di sistema usato per il training. Se si usa un messaggio di sistema differente, il modello potrebbe non funzionare come previsto.

Ottimizzazione continua

Dopo aver creato un modello ottimizzato, è possibile continuare a perfezionare il modello nel tempo tramite un'ulteriore ottimizzazione. L'ottimizzazione continua è il processo iterativo per selezionare un modello già ottimizzato come modello di base e ottimizzarlo ulteriormente sui nuovi set di esempi di training.

Per eseguire l'ottimizzazione su un modello ottimizzato in precedenza, è necessario usare lo stesso processo descritto nella creazione di un modello ottimizzato, ma invece di specificare il nome di un modello di base generico, è necessario specificare il modello già ottimizzato. Un modello personalizzato ottimizzato sarà simile al seguente gpt-4o-2024-08-06.ft-d93dda6110004b4da3472d96f4dd4777-ft

Screenshot dell'interfaccia utente Creare un modello personalizzato con un modello ottimizzato evidenziato.

Pulire le distribuzioni, i modelli personalizzati e i file di training

Al termine del modello personalizzato, è possibile eliminare la distribuzione e il modello. È anche possibile eliminare i file di training e convalida caricati nel servizio, se necessario.

Eliminare la distribuzione del modello

Importante

Dopo la distribuzione di un modello personalizzato, se in qualsiasi momento la distribuzione rimane inattiva per più di quindici (15) giorni, la distribuzione verrà eliminata. La distribuzione di un modello personalizzato è inattiva se il modello è stato distribuito più di quindici (15) giorni prima e non sono stati effettuati completamenti o chiamate di completamento della chat per un periodo continuativo di 15 giorni.

L'eliminazione di una distribuzione inattiva non elimina o influisce sul modello personalizzato sottostante e il modello personalizzato può essere ridistribuito in qualsiasi momento. Come descritto nei prezzi di Azure OpenAI in Modelli di Fonderia Microsoft, ogni modello personalizzato, ottimizzato e distribuito comporta un costo di hosting orario indipendentemente dal fatto che vengano effettuate chiamate di completamento o di completamento della chat al modello. Per altre informazioni sulla pianificazione e la gestione dei costi con Azure OpenAI, vedere le linee guida in Pianificare la gestione dei costi per Azure OpenAI.

È possibile eliminare la distribuzione per il modello personalizzato nel riquadro Distribuzioni nel portale di Foundry. Selezionare la distribuzione da eliminare, quindi selezionare Elimina per eliminare la distribuzione.

Eliminare il modello personalizzato

È possibile eliminare un modello personalizzato nel riquadro Modelli nel portale di Foundry. Selezionare il modello personalizzato da eliminare dalla scheda Modelli personalizzati, quindi selezionare Elimina per eliminare il modello personalizzato.

Annotazioni

Non è possibile eliminare un modello personalizzato se ha una distribuzione esistente. Prima di poter eliminare il modello personalizzato, è necessario eliminare la distribuzione del modello.

Eliminare i file di training

Facoltativamente, è possibile eliminare i file di training e convalida caricati per il training e i file di risultato generati durante il training nel riquadro Dati di gestione>e indici nel portale di Foundry. Selezionare il file da eliminare, quindi selezionare Elimina per eliminare il file.

Prerequisiti

Modelli supportati

Consultare la pagina dei modelli per verificare quali aree supportano attualmente l'ottimizzazione.

In alternativa, è possibile ottimizzare un modello ottimizzato in precedenza, formattato come base-model.ft-{jobid}.

Esaminare il flusso di lavoro per Python SDK

Esaminare il flusso di lavoro di ottimizzazione per l'uso di Python SDK con Azure OpenAI:

  1. Preparare i dati di training e convalida.
  2. Selezionare un modello di base.
  3. Caricare i dati di training.
  4. Eseguire il training del nuovo modello personalizzato.
  5. Controllare lo stato del modello personalizzato.
  6. Distribuire il modello personalizzato per l'uso.
  7. Usare il modello personalizzato.
  8. Facoltativamente, analizzare prestazioni e adattamento del modello personalizzato.

Preparare i dati di training e convalida

I dati di training e i set di dati di convalida sono costituiti da esempi di input e output per il modo in cui si vuole eseguire il modello.

I dati di training e convalida che utilizzi devono essere formattati come documento JSON Lines (JSONL) e nel formato conversazionale utilizzato dall'API Chat completions.

Per una procedura dettagliata sull'ottimizzazione, gpt-4o-mini-2024-07-18 vedere l'esercitazione sull'ottimizzazione di Azure OpenAI

Formato del file di esempio

{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who discovered Antarctica?"}, {"role": "assistant", "content": "Some chaps named Fabian Gottlieb von Bellingshausen and Mikhail Lazarev, as if they don't teach that in every school!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the biggest ocean?"}, {"role": "assistant", "content": "The Pacific Ocean. It's not like it's a small pond or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest planet?"}, {"role": "assistant", "content": "It's called Jupiter, you might have heard of it...or not."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who painted the Mona Lisa?"}, {"role": "assistant", "content": "Oh, some obscure artist named Leonardo da Vinci. Not that he is famous or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the boiling point of water?"}, {"role": "assistant", "content": "Exciting fact of the day: it's 100 degrees Celsius. Life-changing, isn't it?"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'The Odyssey'?"}, {"role": "assistant", "content": "Oh, just some poet named Homer. Nothing special, really."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest mammal?"}, {"role": "assistant", "content": "Blue Whale. Quite a big fish isn't it? Oh wait, it's not a fish!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the highest mountain peak?"}, {"role": "assistant", "content": "Everest. Brace yourself, it's not a walk in the park."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who invented the telephone?"}, {"role": "assistant", "content": "A guy named Alexander Graham Bell. Bet you didn't guess that one!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the distance from Earth to the Sun?"}, {"role": "assistant", "content": "About 93 million miles. Just a quick drive, really."}]}

Formato di file chat multiturn

Sono inoltre supportati diversi turn di una conversazione in una singola riga del file di training jsonl. Per ignorare l'ottimizzazione su messaggi di assistente specifici, aggiungere la coppia di valori di chiave weight facoltativa. Attualmente è possibile impostare weight su 0 o 1.

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already.", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "William Shakespeare", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "384,400 kilometers", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters.", "weight": 1}]}

Completamento della chat con Visione

{"messages": [{"role": "user", "content": [{"type": "text", "text": "What's in this image?"}, {"type": "image_url", "image_url": {"url": "https://raw.githubusercontent.com/MicrosoftDocs/azure-ai-docs/main/articles/ai-services/openai/media/how-to/generated-seattle.png"}}]}, {"role": "assistant", "content": "The image appears to be a watercolor painting of a city skyline, featuring tall buildings and a recognizable structure often associated with Seattle, like the Space Needle. The artwork uses soft colors and brushstrokes to create a somewhat abstract and artistic representation of the cityscape."}]}

Oltre al formato JSONL, i file di dati di training e convalida devono essere codificati in UTF-8 e includere un byte order mark (BOM). Il file deve avere dimensioni inferiori a 512 MB.

Creare i set di dati di training e convalida

Più esempi di training sono disponibili, meglio è. L'ottimizzazione dei processi non procederà senza almeno 10 esempi di training; tuttavia, un numero così ridotto non è sufficiente per influenzare notevolmente le risposte del modello. È consigliabile fornire centinaia, se non migliaia, di esempi di training per avere successo.

In generale, il raddoppio delle dimensioni del set di dati può comportare un aumento lineare della qualità del modello. Tenere tuttavia presente che gli esempi di bassa qualità possono influire negativamente sulle prestazioni. Se si esegue il training del modello su una grande quantità di dati interni, senza prima eliminare il set di dati solo degli esempi di qualità più elevati, è possibile ottenere un modello che comporta prestazioni molto peggiori del previsto.

Caricare i dati di training

Il passaggio successivo consiste nella scelta dei dati di training preparati esistenti o nel caricamento di nuovi dati di training preparati da usare durante la personalizzazione del modello. Dopo aver preparato i dati di training, è possibile caricare i file nel servizio. Sono disponibili due modi per caricare i dati di training:

Per i file di dati di grandi dimensioni, è consigliabile eseguire l'importazione da un archivio BLOB di Azure. I file di grandi dimensioni possono diventare instabili quando vengono caricati tramite moduli in più parti, perché le richieste sono atomiche e non possono essere ritentate o riprese. Per altre informazioni su Archiviazione BLOB di Azure, vedere Che cos’è l’archiviazione BLOB di Azure?

Annotazioni

I file di dati di training devono essere formattati come file JSONL, codificati in UTF-8 con un byte order mark (BOM). Il file deve avere dimensioni inferiori a 512 MB.

L'esempio Python seguente carica i file di training e convalida locali usando Python SDK e recupera gli ID file restituiti.

import os
from openai import OpenAI

# Load the OpenAI client
client = OpenAI(
  api_key = os.getenv("AZURE_OPENAI_API_KEY"),  
  base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/"
)

# Upload the training and validation dataset files to Microsoft Foundry with the SDK.
training_file_name = 'training_set.jsonl'
validation_file_name = 'validation_set.jsonl'

training_response = client.files.create(file=open(training_file_name, "rb"), purpose="fine-tune")
validation_response = client.files.create(file=open(validation_file_name, "rb"), purpose="fine-tune")
training_file_id = training_response.id
validation_file_id = validation_response.id

print("Training file ID:", training_file_id)
print("Validation file ID:", validation_file_id)

Creare un modello personalizzato

Dopo aver caricato i file di training e convalida, si è pronti per avviare il processo di ottimizzazione.

Il codice Python seguente illustra un esempio di come creare un nuovo processo di ottimizzazione con Python SDK:

response = client.fine_tuning.jobs.create(
    training_file=training_file_id,
    validation_file=validation_file_id,
    model="gpt-4.1-2025-04-14", # Enter base model name.
    suffix="my-model", # Custom suffix for naming the resulting model. Note that in Microsoft Foundry the model cannot contain dot/period characters.
    seed=105, # Seed parameter controls reproducibility of the fine-tuning job. If no seed is specified one will be generated automatically.
    extra_body={ "trainingType": "GlobalStandard" } # Change this to your preferred training type. Other options are `Standard` and `Developer`.
)

job_id = response.id

# You can use the job ID to monitor the status of the fine-tuning job.
# The fine-tuning job will take some time to start and complete.

print("Job ID:", response.id)
print(response.model_dump_json(indent=2))

Annotazioni

È consigliabile usare il livello Standard globale per il tipo di training, perché offre risparmi sui costi e sfrutta la capacità globale per tempi di accodamento più rapidi. Tuttavia, copia i dati e i pesi fuori dall'area di risorse corrente. Se la residenza dei dati è un requisito, usare un modello che supporta l'addestramento al livello Standard.

È anche possibile passare parametri facoltativi aggiuntivi, ad esempio gli iperparametri, per assumere un maggiore controllo del processo di ottimizzazione. Per il training iniziale, è consigliabile usare le impostazioni predefinite automatiche presenti senza specificare questi parametri.

Gli iperparametri attualmente supportati per i Fine-Tuning con supervisione sono:

Nome Tipo Descrizione
batch_size integer Dimensioni del batch da usare per il training. Le dimensioni del batch sono il numero di esempi di training usati per eseguire il training di un singolo passaggio avanti e indietro. In generale, è stato rilevato che le dimensioni dei batch più grandi tendono a funzionare meglio per set di dati di dimensioni maggiori. Il valore predefinito e il valore massimo per questa proprietà sono specifici di un modello di base. Una dimensione batch maggiore indica che i parametri del modello vengono aggiornati meno frequentemente, ma con varianza inferiore.
learning_rate_multiplier d'acquisto Moltiplicatore della frequenza di apprendimento da usare per il training. La velocità di apprendimento di ottimizzazione è la velocità di apprendimento originale usata per il training preliminare moltiplicata per questo valore. I tassi di apprendimento più elevati tendono a ottenere prestazioni migliori con dimensioni batch maggiori. È consigliabile provare con i valori compresi nell'intervallo da 0,02 a 0,2 per vedere quali risultati producono i risultati migliori. Un tasso di apprendimento inferiore può essere utile per evitare l'overfitting.
n_epochs integer Numero di periodi per cui eseguire il training del modello. Un periodo fa riferimento a un ciclo completo attraverso il set di dati di training.
seed integer Il seme controlla la riproducibilità del lavoro. Il passaggio degli stessi parametri di inizializzazione e processo dovrebbe produrre gli stessi risultati, ma in rari casi può differire. Se non viene specificato un valore di inizializzazione, ne verrà generato uno automaticamente.

Per impostare iperparametri personalizzati con la versione 1.x dell'API Python OpenAI, specificarli come parte di method:

client.fine_tuning.jobs.create(
  training_file="file-abc123", 
  model="gpt-4.1-2025-04-14",
  suffix="my-model",
  seed=105,
  method={
    "type": "supervised", # In this case, the job will be using Supervised Fine Tuning.
    "supervised": {
      "hyperparameters": {
        "n_epochs": 2
      }
    }
  },
  extra_body={ "trainingType": "GlobalStandard" }
)

Annotazioni

Per altre informazioni sugli iperparametri supportati, vedere le guide per l'ottimizzazione delle preferenze dirette e l'ottimizzazione del rinforzo .

Tipo di training

Selezionare il livello di training in base al caso d'uso e al budget.

  • Standard: il training viene eseguito nell'area della risorsa Fonderia attuale, fornendo garanzie di residenza dei dati. Ideale per i carichi di lavoro in cui i dati devono rimanere in un'area specifica.

  • Globale: offre prezzi più convenienti rispetto a Standard sfruttando la capacità oltre l'area corrente. I dati e i pesi vengono copiati nella regione in cui avviene l'addestramento. Ideale se la residenza dei dati non è una restrizione e si vogliono tempi di coda più rapidi.

  • Sviluppatore (anteprima): fornisce significativi risparmi sfruttando la capacità inattiva per il training. Non ci sono garanzie di latenza o di accordo sul livello del servizio, quindi i processi in questo livello possono essere sospesi automaticamente e ripresi in un secondo momento. Non esistono garanzie di residenza dei dati. Ideale per la sperimentazione e i carichi di lavoro sensibili ai prezzi.

import openai
from openai import AzureOpenAI

base_uri = "https://<ACCOUNT-NAME>.services.ai.azure.com"
api_key = "<API-KEY>"
api_version = "2025-04-01-preview"
client = AzureOpenAI(
azure_endpoint=base_uri,
api_key=api_key,
api_version=api_version
)
try:
    client.fine_tuning.jobs.create(
    model="gpt-4.1-mini",
    training_file="<FILE-ID>",
    extra_body={"trainingType": "developerTier"}
    )
except openai.APIConnectionError as e:
    print("The server could not be reached")
    print(e.__cause__) # an underlying Exception, likely raised within httpx.
except openai.RateLimitError as e:
    print("A 429 status code was received; we should back off a bit.")
except openai.APIStatusError as e:
    print("Another non-200-range status code was received")
    print(e.status_code)
    print(e.response)
    print(e.body)

Controllare lo stato del processo di ottimizzazione

response = client.fine_tuning.jobs.retrieve(job_id)

print("Job ID:", response.id)
print("Status:", response.status)
print(response.model_dump_json(indent=2))

Elencare gli eventi di ottimizzazione

Per esaminare i singoli eventi di ottimizzazione generati durante il training, potrebbe essere necessario aggiornare la libreria client OpenAI alla versione più recente con per pip install openai --upgrade eseguire questo comando.

response = client.fine_tuning.jobs.list_events(fine_tuning_job_id=job_id, limit=10)
print(response.model_dump_json(indent=2))

Punti di controllo

Al completamento di ogni periodo di training, viene generato un checkpoint. Un checkpoint è una versione completamente funzionale di un modello che può essere distribuita e usata come modello di destinazione per i processi di ottimizzazione successivi. I checkpoint possono essere particolarmente utili, in quanto possono fornire snapshot prima dell'overfitting. Al termine di un processo di ottimizzazione, le tre versioni più recenti del modello saranno disponibili per la distribuzione. L'epoca finale sarà rappresentata dal modello ottimizzato, le due epoche precedenti saranno disponibili come checkpoint.

È possibile eseguire il comando list checkpoints per recuperare l'elenco di checkpoint associati a un singolo processo di ottimizzazione. Per eseguire questo comando potrebbe essere necessario aggiornare la libreria client OpenAI all'ultima versione con pip install openai --upgrade.

response = client.fine_tuning.jobs.checkpoints.list(job_id)
print(response.model_dump_json(indent=2))

Analizzare il modello personalizzato

Azure OpenAI collega un file di risultato, denominato results.csv a ogni processo di ottimizzazione dopo il completamento. È possibile usare il file dei risultati per analizzare le prestazioni del training e convalidare del modello personalizzato. L'ID file per il file dei risultati è elencato per ogni modello personalizzato ed è possibile usare Python SDK per recuperare l'ID file e scaricare il file di risultato per l'analisi.

L'esempio python seguente recupera l'ID file del primo file di risultato allegato al processo di ottimizzazione per il modello personalizzato e quindi usa Python SDK per scaricare il file nella directory di lavoro corrente per l'analisi.

# Retrieve the file ID of the first result file from the fine-tuning job
# for the customized model.
response = client.fine_tuning.jobs.retrieve(job_id)
if response.status == 'succeeded':
    result_file_id = response.result_files[0]

retrieve = client.files.retrieve(result_file_id)

# Download the result file.
print(f'Downloading result file: {result_file_id}')

with open(retrieve.filename, "wb") as file:
    result = client.files.content(result_file_id).read()
    file.write(result)

Il file dei risultati è un file CSV contenente una riga di intestazione e una riga per ogni passaggio di training eseguito dal processo di ottimizzazione. Il file dei risultati contiene le colonne seguenti:

Nome della colonna Descrizione
step Numero del passaggio di training. Un passaggio di training rappresenta un singolo passaggio, avanti e indietro, in un batch di dati di training.
train_loss Perdita per il batch di training.
train_mean_token_accuracy Percentuale di token nel batch di training stimati correttamente dal modello.
Ad esempio, se le dimensioni del batch sono impostate su 3 e i dati contengono completamenti [[1, 2], [0, 5], [4, 2]], questo valore viene impostato su 0,83 (5 di 6) se il modello ha previsto [[1, 1], [0, 5], [4, 2]].
valid_loss Perdita per il batch di convalida.
validation_mean_token_accuracy Percentuale di token nel batch di convalida stimati correttamente dal modello.
Ad esempio, se le dimensioni del batch sono impostate su 3 e i dati contengono completamenti [[1, 2], [0, 5], [4, 2]], questo valore viene impostato su 0,83 (5 di 6) se il modello ha previsto [[1, 1], [0, 5], [4, 2]].
full_valid_loss Perdita di convalida calcolata alla fine di ogni epoca. Quando il training va bene, la perdita dovrebbe diminuire.
full_valid_mean_token_accuracy Accuratezza del token media valida calcolata alla fine di ogni epoca. Quando il training va bene, l'accuratezza del token dovrebbe aumentare.

È anche possibile visualizzare i dati nel file results.csv come tracciati nel portale di Microsoft Foundry. Selezionare il collegamento per il modello sottoposto a training; verranno visualizzati tre grafici: perdita, accuratezza del token media e accuratezza del token. Se sono stati forniti dati di convalida, entrambi i set di dati verranno visualizzati nello stesso tracciato.

Cercare la perdita da ridurre nel tempo e l'accuratezza da aumentare. Una divergenza tra i dati di training e i dati di convalida potrebbe indicare un overfitting. Provare a eseguire il training con meno periodi o a un moltiplicatore di frequenza di trading più piccolo.

Distribuire un modello ottimizzato

Dopo aver soddisfatto le metriche del processo di ottimizzazione, oppure si vuole semplicemente passare all'inferenza, è necessario distribuire il modello.

Se si esegue la distribuzione per un'ulteriore convalida, valutare la possibilità di eseguire la distribuzione per i test usando una distribuzione per sviluppatori.

A differenza dei comandi SDK precedenti, la distribuzione deve essere eseguita usando l'API del piano di controllo che richiede un'autorizzazione separata, un percorso API diverso e una versione differente dell'API.

Variabile Definizione
token Esistono diversi modi per generare un token di autorizzazione. Il metodo più semplice per i test iniziali consiste nell'avviare Cloud Shell dal portale di Azure. Quindi eseguire az account get-access-token. È possibile usare questo token come token di autorizzazione temporaneo per il test dell'API. È consigliabile archiviare questo valore in una nuova variabile di ambiente.
abbonamento ID sottoscrizione per la risorsa Azure OpenAI associata.
gruppo di risorse Nome del gruppo di risorse per la risorsa Azure OpenAI.
nome_risorsa Nome della risorsa di Azure OpenAI.
model_deployment_name Nome personalizzato per la nuova distribuzione del modello ottimizzata. Questo è il nome a cui verrà fatto riferimento nel codice quando si effettuano chiamate di completamento della chat.
fine_tuned_model Recuperare questo valore dai risultati del processo di ottimizzazione nel passaggio precedente. Sarà simile a gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83. Sarà necessario aggiungere tale valore al deploy_data json. In alternativa, è anche possibile distribuire un checkpoint passando l'ID del checkpoint, che verrà visualizzato nel formato ftchkpt-e559c011ecc04fc68eaa339d8227d02d
import json
import os
import requests

token= os.getenv("<TOKEN>") 
subscription = "<YOUR_SUBSCRIPTION_ID>"  
resource_group = "<YOUR_RESOURCE_GROUP_NAME>"
resource_name = "<YOUR_AZURE_OPENAI_RESOURCE_NAME>"
model_deployment_name ="gpt-41-ft" # custom deployment name that you will use to reference the model when making inference calls.

deploy_params = {'api-version': "2024-10-01"} # control plane API version rather than dataplane API for this call 
deploy_headers = {'Authorization': 'Bearer {}'.format(token), 'Content-Type': 'application/json'}

deploy_data = {
    "sku": {"name": "standard", "capacity": 1}, 
    "properties": {
        "model": {
            "format": "OpenAI",
            "name": <"fine_tuned_model">, #retrieve this value from the previous call, it will look like gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83
            "version": "1"
        }
    }
}
deploy_data = json.dumps(deploy_data)

request_url = f'https://management.azure.com/subscriptions/{subscription}/resourceGroups/{resource_group}/providers/Microsoft.CognitiveServices/accounts/{resource_name}/deployments/{model_deployment_name}'

print('Creating a new deployment...')

r = requests.put(request_url, params=deploy_params, headers=deploy_headers, data=deploy_data)

print(r)
print(r.reason)
print(r.json())

Altre informazioni sulla distribuzione tra aree e sull'uso del modello distribuito sono disponibili qui.

Se si è pronti per la distribuzione per la produzione o si hanno specifiche esigenze di residenza dei dati, seguire la guida alla distribuzione.

Ottimizzazione continua

Dopo aver creato un modello ottimizzato, si può desiderare di continuare a perfezionare il modello nel tempo tramite un'ulteriore ottimizzazione. L'ottimizzazione continua è il processo iterativo per selezionare un modello già ottimizzato come modello di base e ottimizzarlo ulteriormente sui nuovi set di esempi di training.

Annotazioni

L'ottimizzazione continua è supportata solo per i modelli OpenAI.

Per eseguire l'ottimizzazione su un modello ottimizzato in precedenza, è necessario usare lo stesso processo descritto in Creare un modello personalizzato, ma invece di specificare il nome di un modello di base generico, è necessario specificare l'ID del modello già ottimizzato. L'ID modello ottimizzato è simile al seguente gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7

response = client.fine_tuning.jobs.create(
    training_file=training_file_id,
    validation_file=validation_file_id,
    model="gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7"
)
job_id = response.id

# You can use the job ID to monitor the status of the fine-tuning job.
# The fine-tuning job will take some time to start and complete.

print("Job ID:", response.id)
print("Status:", response.id)
print(response.model_dump_json(indent=2))

È anche consigliabile includere il parametro suffix per semplificare la distinzione tra iterazioni differenti del modello ottimizzato. suffix accetta una stringa ed è impostato per identificare il modello ottimizzato. Con l'API Python OpenAI è supportata una stringa di un massimo di 18 caratteri che verrà aggiunta al nome del modello ottimizzato.

Se non si è certi dell'ID del modello ottimizzato esistente, queste informazioni sono disponibili nella pagina Modelli di Microsoft Foundry oppure è possibile generare un elenco di modelli per una determinata risorsa OpenAI di Azure usando l'API REST.

Pulire le distribuzioni, i modelli personalizzati e i file di training

Al termine del modello personalizzato, è possibile eliminare la distribuzione e il modello. È anche possibile eliminare i file di training e convalida caricati nel servizio, se necessario.

Eliminare la distribuzione del modello

Importante

Dopo la distribuzione di un modello personalizzato, se in qualsiasi momento la distribuzione rimane inattiva per più di quindici (15) giorni, la distribuzione verrà eliminata. La distribuzione di un modello personalizzato è inattiva se il modello è stato distribuito più di quindici (15) giorni prima e non sono stati effettuati completamenti o chiamate di completamento della chat per un periodo continuativo di 15 giorni.

L'eliminazione di una distribuzione inattiva non elimina o influisce sul modello personalizzato sottostante e il modello personalizzato può essere ridistribuito in qualsiasi momento. Come descritto nei prezzi di Azure OpenAI in Modelli di Fonderia Microsoft, ogni modello personalizzato, ottimizzato e distribuito comporta un costo di hosting orario indipendentemente dal fatto che vengano effettuate chiamate di completamento o di completamento della chat al modello. Per altre informazioni sulla pianificazione e la gestione dei costi con Azure OpenAI, vedere le linee guida in Pianificare la gestione dei costi per Azure OpenAI.

È possibile usare vari metodi per eliminare la distribuzione per il modello personalizzato:

Eliminare il modello personalizzato

Analogamente, è possibile usare vari metodi per eliminare il modello personalizzato:

Annotazioni

Non è possibile eliminare un modello personalizzato se ha una distribuzione esistente. Prima di poter eliminare il modello personalizzato, è necessario eliminare la distribuzione del modello.

Eliminare i file di training

Facoltativamente, è possibile eliminare i file di training e convalida caricati per il training e i file di risultato generati durante il training dall'abbonamento a Azure OpenAI. È possibile usare i metodi seguenti per eliminare i file di training, convalida e risultato:

L'esempio Python seguente usa Python SDK per eliminare i file di training, convalida e risultato per il modello personalizzato:

print('Checking for existing uploaded files.')
results = []

# Get the complete list of uploaded files in our subscription.
files = openai.File.list().data
print(f'Found {len(files)} total uploaded files in the subscription.')

# Enumerate all uploaded files, extracting the file IDs for the
# files with file names that match your training dataset file and
# validation dataset file names.
for item in files:
    if item["filename"] in [training_file_name, validation_file_name, result_file_name]:
        results.append(item["id"])
print(f'Found {len(results)} already uploaded files that match our files')

# Enumerate the file IDs for our files and delete each file.
print(f'Deleting already uploaded files.')
for id in results:
    openai.File.delete(sid = id)

Prerequisiti

Modelli supportati

Consultare la pagina dei modelli per verificare quali aree supportano attualmente l'ottimizzazione.

In alternativa, è possibile ottimizzare un modello ottimizzato in precedenza, formattato come base-model.ft-{jobid}.

Esaminare il flusso di lavoro per l'API REST

Esaminare il flusso di lavoro di ottimizzazione per l'uso delle API REST e Python con Azure OpenAI:

  1. Preparare i dati di training e convalida.
  2. Selezionare un modello di base.
  3. Caricare i dati di training.
  4. Eseguire il training del nuovo modello personalizzato.
  5. Controllare lo stato del modello personalizzato.
  6. Distribuire il modello personalizzato per l'uso.
  7. Usare il modello personalizzato.
  8. Facoltativamente, analizzare prestazioni e adattamento del modello personalizzato.

Preparare i dati di training e convalida

I dati di training e i set di dati di convalida sono costituiti da esempi di input e output per il modo in cui si vuole eseguire il modello.

I dati di training e convalida che utilizzi devono essere formattati come documento JSON Lines (JSONL) e nel formato conversazionale utilizzato dall'API Chat completions.

Per una procedura dettagliata sull'ottimizzazione di un modello gpt-4o-mini-2024-07-18, vedere l'esercitazione sull'ottimizzazione di OpenAI di Azure.

Formato del file di esempio

{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who discovered Antarctica?"}, {"role": "assistant", "content": "Some chaps named Fabian Gottlieb von Bellingshausen and Mikhail Lazarev, as if they don't teach that in every school!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the biggest ocean?"}, {"role": "assistant", "content": "The Pacific Ocean. It's not like it's a small pond or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest planet?"}, {"role": "assistant", "content": "It's called Jupiter, you might have heard of it...or not."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who painted the Mona Lisa?"}, {"role": "assistant", "content": "Oh, some obscure artist named Leonardo da Vinci. Not that he is famous or anything."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the boiling point of water?"}, {"role": "assistant", "content": "Exciting fact of the day: it's 100 degrees Celsius. Life-changing, isn't it?"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'The Odyssey'?"}, {"role": "assistant", "content": "Oh, just some poet named Homer. Nothing special, really."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the largest mammal?"}, {"role": "assistant", "content": "Blue Whale. Quite a big fish isn't it? Oh wait, it's not a fish!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the highest mountain peak?"}, {"role": "assistant", "content": "Everest. Brace yourself, it's not a walk in the park."}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who invented the telephone?"}, {"role": "assistant", "content": "A guy named Alexander Graham Bell. Bet you didn't guess that one!"}]}
{"messages": [{"role": "system", "content": "Clippy is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What is the distance from Earth to the Sun?"}, {"role": "assistant", "content": "About 93 million miles. Just a quick drive, really."}]}

Formato di file chat multiturn

Sono inoltre supportati diversi turn di una conversazione in una singola riga del file di training jsonl. Per ignorare l'ottimizzazione su messaggi di assistente specifici, aggiungere la coppia di valori di chiave weight facoltativa. Attualmente è possibile impostare weight su 0 o 1.

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital of France?"}, {"role": "assistant", "content": "Paris", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already.", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "William Shakespeare", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "384,400 kilometers", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters.", "weight": 1}]}

Completamento della chat con Visione

{"messages": [{"role": "user", "content": [{"type": "text", "text": "What's in this image?"}, {"type": "image_url", "image_url": {"url": "https://raw.githubusercontent.com/MicrosoftDocs/azure-ai-docs/main/articles/ai-services/openai/media/how-to/generated-seattle.png"}}]}, {"role": "assistant", "content": "The image appears to be a watercolor painting of a city skyline, featuring tall buildings and a recognizable structure often associated with Seattle, like the Space Needle. The artwork uses soft colors and brushstrokes to create a somewhat abstract and artistic representation of the cityscape."}]}

Oltre al formato JSONL, i file di dati di training e convalida devono essere codificati in UTF-8 e includere un byte order mark (BOM). Il file deve avere dimensioni inferiori a 512 MB.

Creare i set di dati di training e convalida

Più esempi di training sono disponibili, meglio è. L'ottimizzazione dei processi non procederà senza almeno 10 esempi di training; tuttavia, un numero così ridotto non è sufficiente per influenzare notevolmente le risposte del modello. È consigliabile fornire centinaia, se non migliaia, di esempi di training per avere successo.

In generale, il raddoppio delle dimensioni del set di dati può comportare un aumento lineare della qualità del modello. Tenere tuttavia presente che gli esempi di bassa qualità possono influire negativamente sulle prestazioni. Se si esegue il training del modello su una grande quantità di dati interni, senza prima eliminare il set di dati solo degli esempi di qualità più elevati, è possibile ottenere un modello che comporta prestazioni molto peggiori del previsto.

Caricare i dati di training

Il passaggio successivo consiste nella scelta dei dati di training preparati esistenti o nel caricamento di nuovi dati di training preparati da usare durante l'ottimizzazione del modello. Dopo aver preparato i dati di training, è possibile caricare i file nel servizio. Sono disponibili due modi per caricare i dati di training:

Per i file di dati di grandi dimensioni, è consigliabile eseguire l'importazione da un archivio BLOB di Azure. I file di grandi dimensioni possono diventare instabili quando vengono caricati tramite moduli in più parti, perché le richieste sono atomiche e non possono essere ritentate o riprese. Per altre informazioni su Archiviazione BLOB di Azure, vedere Che cos’è l’archiviazione BLOB di Azure?

Annotazioni

I file di dati di training devono essere formattati come file JSONL, codificati in UTF-8 con un byte order mark (BOM). Il file deve avere dimensioni inferiori a 512 MB.

Carica dati di training

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/files \
  -H "Content-Type: multipart/form-data" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -F "purpose=fine-tune" \
  -F "file=@C:\\fine-tuning\\training_set.jsonl;type=application/json"

Caricare i dati di convalida

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/files \
  -H "Content-Type: multipart/form-data" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -F "purpose=fine-tune" \
  -F "file=@C:\\fine-tuning\\validation_set.jsonl;type=application/json"

Creare un modello personalizzato

Dopo aver caricato i file di training e convalida, si è pronti per avviare il processo di ottimizzazione. Il codice seguente mostra un esempio di come creare un nuovo processo di ottimizzazione con l'API REST.

In questo esempio viene passato anche il parametro per il inizializzazione. Il seme controlla la riproducibilità del lavoro. Il passaggio degli stessi parametri di inizializzazione e processo dovrebbe produrre gli stessi risultati, ma in rari casi può differire. Se non viene specificato un valore di inizializzazione, ne verrà generato uno automaticamente.

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -d '{
    "model": "gpt-4.1-2025-04-14",
    "training_file": "<TRAINING_FILE_ID>",
    "validation_file": "<VALIDATION_FILE_ID>",
    "seed": 105
}'

Se si ottimizza finemente un modello che supporta Training Globale, è possibile specificare il tipo di training usando l'argomento denominato extra_body e la versione API 2025-04-01-preview:

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/fine_tuning/jobs?api-version=2025-04-01-preview \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -d '{
    "model": "gpt-4.1-2025-04-14",
    "training_file": "<TRAINING_FILE_ID>",
    "validation_file": "<VALIDATION_FILE_ID>",
    "seed": 105,
    "trainingType": "globalstandard"
}'

È anche possibile passare parametri facoltativi aggiuntivi, ad esempio gli iperparametri, per assumere un maggiore controllo del processo di ottimizzazione. Per il training iniziale, è consigliabile usare le impostazioni predefinite automatiche presenti senza specificare questi parametri.

Gli iperparametri attualmente supportati per i Fine-Tuning con supervisione sono:

Nome Tipo Descrizione
batch_size integer Dimensioni del batch da usare per il training. Le dimensioni del batch sono il numero di esempi di training usati per eseguire il training di un singolo passaggio avanti e indietro. In generale, è stato rilevato che le dimensioni dei batch più grandi tendono a funzionare meglio per set di dati di dimensioni maggiori. Il valore predefinito e il valore massimo per questa proprietà sono specifici di un modello di base. Una dimensione batch maggiore indica che i parametri del modello vengono aggiornati meno frequentemente, ma con varianza inferiore.
learning_rate_multiplier d'acquisto Moltiplicatore della frequenza di apprendimento da usare per il training. La velocità di apprendimento di ottimizzazione è la velocità di apprendimento originale usata per il training preliminare moltiplicata per questo valore. I tassi di apprendimento più elevati tendono a ottenere prestazioni migliori con dimensioni batch maggiori. È consigliabile provare con i valori compresi nell'intervallo da 0,02 a 0,2 per vedere quali risultati producono i risultati migliori. Un tasso di apprendimento inferiore può essere utile per evitare l'overfitting.
n_epochs integer Numero di periodi per cui eseguire il training del modello. Un periodo fa riferimento a un ciclo completo attraverso il set di dati di training.
seed integer Il seme controlla la riproducibilità del lavoro. Il passaggio degli stessi parametri di inizializzazione e processo dovrebbe produrre gli stessi risultati, ma in rari casi può differire. Se non viene specificato un valore di inizializzazione, ne verrà generato uno automaticamente.

Annotazioni

Per altre informazioni sugli iperparametri supportati, vedere le guide per l'ottimizzazione delle preferenze dirette e l'ottimizzazione del rinforzo .

Tipo di training

Selezionare il livello di training in base al caso d'uso e al budget.

  • Standard: il training viene eseguito nell'area della risorsa Fonderia attuale, fornendo garanzie di residenza dei dati. Ideale per i carichi di lavoro in cui i dati devono rimanere in un'area specifica.

  • Globale: offre prezzi più convenienti rispetto a Standard sfruttando la capacità oltre l'area corrente. I dati e i pesi vengono copiati nella regione in cui avviene l'addestramento. Ideale se la residenza dei dati non è una restrizione e si vogliono tempi di coda più rapidi.

  • Sviluppatore (anteprima): offre risparmi significativi sui costi sfruttando la capacità inattiva per la formazione. Non ci sono garanzie di latenza o di accordo sul livello del servizio, quindi i processi in questo livello possono essere sospesi automaticamente e ripresi in un secondo momento. Non esistono garanzie di residenza dei dati. Ideale per la sperimentazione e i carichi di lavoro sensibili ai prezzi.

curl -X POST "https://<ACCOUNT-NAME>.openai.azure.com/openai/fine_tuning/jobs?api-version=2025-04-01-preview" -H "Content-Type: application/json" -H "api-key: <API-KEY>" -d "{"model": "gpt-4.1", "training_file": "<FILE_ID>", "hyperparameters": {"prompt_loss_weight": 0.1}, "trainingType": "developerTier"}"

Controllare lo stato del modello personalizzato

Dopo aver avviato un processo di ottimizzazione, il completamento può richiedere del tempo. Il processo potrebbe essere in coda dietro altri processi nel sistema. Il training del modello può richiedere minuti o ore, a seconda delle dimensioni del modello e del set di dati. L'esempio seguente usa l'API REST per controllare lo stato del processo di ottimizzazione. L'esempio recupera informazioni sul processo usando l'ID processo restituito dall'esempio precedente:

curl -X GET $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/<YOUR-JOB-ID> \
  -H "api-key: $AZURE_OPENAI_API_KEY"

Sospendere e riprendere

Durante il training è possibile visualizzare i log e le metriche e sospendere il processo in base alle esigenze. La sospensione può essere utile se le metriche non sono convergenti o se si ritiene che il modello non stia imparando al ritmo corretto. Una volta sospeso il processo di addestramento, verrà creato un checkpoint distribuibile al termine delle valutazioni di sicurezza. Questo checkpoint è disponibile per la distribuzione e l'utilizzo per l'inferenza o per riprendere il processo fino al completamento. L'operazione di sospensione è applicabile solo per i processi sottoposti a training per almeno un passaggio e che siano in stato In esecuzione.

Pausa

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/pause \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

Riprendi

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/resume \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

Elencare gli eventi di ottimizzazione

Per esaminare i singoli eventi di ottimizzazione generati durante il training:

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/events \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

Copia modello (anteprima)

È ora possibile copiare un modello con checkpoint ottimizzato da un'area a un'altra, in sottoscrizioni differenti, ma all'interno dello stesso tenant. Il processo usa API dedicate per garantire trasferimenti efficienti e sicuri. Questa funzionalità è attualmente disponibile solo con l'API e non tramite il portale Fonderia. Dopo aver copiato il modello dall'area A all'area B, è possibile ottimizzare continuamente il modello nell'area B e distribuire il modello da questa posizione.

Annotazioni

L'eliminazione del checkpoint del modello nell'area di origine non causerà l'eliminazione del modello nell'area di destinazione. Per eliminare il modello in entrambe le aree dopo che è stato copiato, è necessario eliminare il modello separatamente in ogni area.

Prerequisiti

  • La risorsa/l'account di destinazione deve avere almeno un processo di ottimizzazione.
  • La risorsa/l'account di destinazione non deve disabilitare l'accesso alla rete pubblica. (almeno durante l'invio della richiesta di copia).
  • È possibile copiare nell'account di destinazione solo se l'account che avvia la copia dispone di autorizzazioni sufficienti per accedere all'account di destinazione.

Configurazione delle autorizzazioni

  1. Creare un'identità gestita assegnata dall'utente.
  2. Assegna il ruolo utente di Azure AI all'identità gestita assegnata dall'utente sulla risorsa o sull'account di destinazione.
  3. Assegnare l'identità gestita assegnata dall'utente all'account della risorsa di origine.

Copiare il modello

curl --request POST \
  --url 'https://<aoai-resource>.openai.azure.com/openai/v1/fine_tuning/jobs/<ftjob>/checkpoints/<checkpoint-name>/copy' \
  --header 'Content-Type: application/json' \
  --header 'api-key: <api-key>' \
  --header 'aoai-copy-ft-checkpoints: preview' \
  --data '{
  "destinationResourceId": "<resourceId>",
  "region": "<region>"
}'

Poiché si tratta di un'operazione a esecuzione prolungata, controllare lo stato della copia del modello ottimizzata specificando l'ID checkpoint dell'account di origine usato nella chiamata POST.

Verificare lo stato della copia

curl --request GET \
  --url 'https://<aoai-resource>.openai.azure.com//openai/v1/fine_tuning/jobs/<ftjob>/checkpoints/<checkpoint-name>/copy' \
  --header 'Content-Type: application/json' \
  --header 'api-key: <api-key>' \
  --header 'aoai-copy-ft-checkpoints: preview' 

Annotazioni

Quando si copia un checkpoint da un account di origine, lo stesso nome del checkpoint viene mantenuto nell'account di destinazione. Assicurarsi di usare lo stesso nome per l'ottimizzazione, la distribuzione o per qualsiasi altra operazione nell'account di destinazione. Questo checkpoint non viene visualizzato nell'interfaccia utente o nell'API list checkpoints .

Punti di controllo

Al completamento di ogni periodo di training, viene generato un checkpoint. Un checkpoint è una versione completamente funzionale di un modello che può essere distribuita e usata come modello di destinazione per i processi di ottimizzazione successivi. I checkpoint possono essere particolarmente utili, in quanto possono fornire snapshot prima dell'overfitting. Al termine di un processo di ottimizzazione, le tre versioni più recenti del modello saranno disponibili per la distribuzione. L'epoca finale sarà rappresentata dal modello ottimizzato, le due epoche precedenti saranno disponibili come checkpoint.

È possibile eseguire il comando list checkpoints per recuperare l'elenco dei checkpoint associati a un singolo processo di ottimizzazione:

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/checkpoints \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

Analizzare il modello personalizzato

Azure OpenAI collega un file di risultato, denominato results.csv a ogni processo di ottimizzazione dopo il completamento. È possibile usare il file dei risultati per analizzare le prestazioni del training e convalidare del modello personalizzato. L'ID file per il file dei risultati è elencato per ogni modello personalizzato ed è possibile usare l’API REST per recuperare l'ID file e scaricare il file di risultato per l'analisi.

L'esempio Python seguente usa l'API REST per recuperare l'ID file del primo file dei risultati allegato al processo di ottimizzazione per il modello personalizzato e quindi scaricare il file nella directory di lavoro per l'analisi.

curl -X GET "$AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/<JOB_ID>" \
  -H "api-key: $AZURE_OPENAI_API_KEY")
curl -X GET "$AZURE_OPENAI_ENDPOINT/openai/v1/files/<RESULT_FILE_ID>/content" \
    -H "api-key: $AZURE_OPENAI_API_KEY" > <RESULT_FILENAME>

Il file dei risultati è un file CSV contenente una riga di intestazione e una riga per ogni passaggio di training eseguito dal processo di ottimizzazione. Il file dei risultati contiene le colonne seguenti:

Nome della colonna Descrizione
step Numero del passaggio di training. Un passaggio di training rappresenta un singolo passaggio, avanti e indietro, in un batch di dati di training.
train_loss Perdita per il batch di training.
train_mean_token_accuracy Percentuale di token nel batch di training stimati correttamente dal modello.
Ad esempio, se le dimensioni del batch sono impostate su 3 e i dati contengono completamenti [[1, 2], [0, 5], [4, 2]], questo valore viene impostato su 0,83 (5 di 6) se il modello ha previsto [[1, 1], [0, 5], [4, 2]].
valid_loss Perdita per il batch di convalida.
validation_mean_token_accuracy Percentuale di token nel batch di convalida stimati correttamente dal modello.
Ad esempio, se le dimensioni del batch sono impostate su 3 e i dati contengono completamenti [[1, 2], [0, 5], [4, 2]], questo valore viene impostato su 0,83 (5 di 6) se il modello ha previsto [[1, 1], [0, 5], [4, 2]].
full_valid_loss Perdita di convalida calcolata alla fine di ogni epoca. Quando il training va bene, la perdita dovrebbe diminuire.
full_valid_mean_token_accuracy Accuratezza del token media valida calcolata alla fine di ogni epoca. Quando il training va bene, l'accuratezza del token dovrebbe aumentare.

È anche possibile visualizzare i dati nel file results.csv come grafici nel portale Foundry. Selezionare il collegamento per il modello sottoposto a training; verranno visualizzati tre grafici: perdita, accuratezza del token media e accuratezza del token. Se sono stati forniti dati di convalida, entrambi i set di dati verranno visualizzati nello stesso tracciato.

Cercare la perdita da ridurre nel tempo e l'accuratezza da aumentare. Se viene visualizzata una divergenza tra i dati di training e di convalida, ciò potrebbe indicare un overfitting. Provare a eseguire il training con meno periodi o a un moltiplicatore di frequenza di trading più piccolo.

Distribuire un modello ottimizzato

Dopo aver soddisfatto le metriche del processo di ottimizzazione, oppure si vuole semplicemente passare all'inferenza, è necessario distribuire il modello.

Se si esegue la distribuzione per un'ulteriore convalida, valutare la possibilità di eseguire la distribuzione per i test usando una distribuzione per sviluppatori.

Se si è pronti per la distribuzione per la produzione o si hanno specifiche esigenze di residenza dei dati, seguire la guida alla distribuzione.

Variabile Definizione
token Esistono diversi modi per generare un token di autorizzazione. Il metodo più semplice per i test iniziali consiste nell'avviare Cloud Shell dal portale di Azure. Quindi eseguire az account get-access-token. È possibile usare questo token come token di autorizzazione temporaneo per il test dell'API. È consigliabile archiviare questo valore in una nuova variabile di ambiente.
abbonamento ID sottoscrizione per la risorsa Azure OpenAI associata.
gruppo di risorse Nome del gruppo di risorse per la risorsa Azure OpenAI.
nome_risorsa Nome della risorsa di Azure OpenAI.
model_deployment_name Nome personalizzato per la nuova distribuzione del modello ottimizzata. Questo è il nome a cui verrà fatto riferimento nel codice quando si effettuano chiamate di completamento della chat.
fine_tuned_model Recuperare questo valore dai risultati del processo di ottimizzazione nel passaggio precedente. Sarà simile a gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83. Sarà necessario aggiungere tale valore al deploy_data json. In alternativa, è anche possibile distribuire un checkpoint passando l'ID del checkpoint, che verrà visualizzato nel formato ftchkpt-e559c011ecc04fc68eaa339d8227d02d
curl -X POST "https://management.azure.com/subscriptions/<SUBSCRIPTION>/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.CognitiveServices/accounts/<RESOURCE_NAME>/deployments/<MODEL_DEPLOYMENT_NAME>?api-version=2024-10-21" \
  -H "Authorization: Bearer <TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "sku": {"name": "standard", "capacity": 1},
    "properties": {
        "model": {
            "format": "OpenAI",
            "name": "<FINE_TUNED_MODEL>",
            "version": "1"
        }
    }
}'

Altre informazioni sulla distribuzione tra aree e sull'uso del modello distribuito sono disponibili qui.

Ottimizzazione continua

Dopo aver creato un modello ottimizzato, si può desiderare di continuare a perfezionare il modello nel tempo tramite un'ulteriore ottimizzazione. L'ottimizzazione continua è il processo iterativo per selezionare un modello già ottimizzato come modello di base e ottimizzarlo ulteriormente sui nuovi set di esempi di training.

Annotazioni

L'ottimizzazione continua è supportata solo per i modelli OpenAI.

Per eseguire l'ottimizzazione su un modello ottimizzato in precedenza, è necessario usare lo stesso processo descritto in Creare un modello personalizzato, ma invece di specificare il nome di un modello di base generico, è necessario specificare l'ID del modello già ottimizzato. L'ID modello ottimizzato è simile al seguente gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" \
  -d '{
    "model": "gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7",
    "training_file": "<TRAINING_FILE_ID>",
    "validation_file": "<VALIDATION_FILE_ID>",
    "suffix": "<additional text used to help identify fine-tuned models>"
}'

È anche consigliabile includere il parametro suffix per semplificare la distinzione tra iterazioni differenti del modello ottimizzato. suffix accetta una stringa ed è impostato per identificare il modello ottimizzato. Il suffisso può contenere fino a 40 caratteri (a-z, A-Z, 0-9 e _) che verranno aggiunti al nome del modello ottimizzato.

Se non si è certi dell'ID del modello ottimizzato, queste informazioni sono disponibili nella pagina Modelli di Foundry oppure è possibile generare un elenco di modelli per una determinata risorsa OpenAI di Azure usando l'API REST.

Pulire le distribuzioni, i modelli personalizzati e i file di training

Al termine del modello personalizzato, è possibile eliminare la distribuzione e il modello. È anche possibile eliminare i file di training e convalida caricati nel servizio, se necessario.

Eliminare la distribuzione del modello

È possibile usare vari metodi per eliminare la distribuzione per il modello personalizzato:

Eliminare il modello personalizzato

Analogamente, è possibile usare vari metodi per eliminare il modello personalizzato:

Annotazioni

Non è possibile eliminare un modello personalizzato se ha una distribuzione esistente. Prima di poter eliminare il modello personalizzato, è necessario eliminare la distribuzione del modello.

Eliminare i file di training

Facoltativamente, è possibile eliminare i file di training e convalida caricati per il training e i file di risultato generati durante il training dall'abbonamento a Azure OpenAI. È possibile usare i metodi seguenti per eliminare i file di training, convalida e risultato: