Partage via


Personnaliser un modèle avec l’ajustement

Découvrez comment affiner les modèles dans Microsoft Foundry pour vos jeux de données et cas d’usage. Le réglage précis permet de :

  • Des résultats de qualité supérieure à ce que vous pouvez obtenir à partir de l’ingénierie rapide.
  • Capacité de permettre de s'entraîner sur plus d’exemples que ce qui peut être contenu dans la limite de contexte de requête d’un modèle.
  • Économies de jetons en raison d'invites plus courtes.
  • Demandes à latence inférieure, en particulier lorsque vous utilisez des modèles plus petits.

Contrairement à l'apprentissage par petits lots, l'affinage améliore le modèle en s'entraînant sur plus d'exemples qu'il n'est possible d'inclure dans une invite. Étant donné que les pondérations s’adaptent à votre tâche, vous incluez moins d’exemples ou d’instructions. Inclure moins de jetons par appel et potentiellement réduire les coûts et la latence.

Nous utilisons l’adaptation de faible rang (LoRA) pour affiner les modèles d’une manière qui réduit leur complexité sans affecter considérablement leurs performances. Cette méthode fonctionne en approximant la matrice de haut rang d'origine par une matrice de rang inférieur. L’optimisation d’un sous-ensemble plus petit de paramètres importants pendant la phase d’entraînement supervisée rend le modèle plus gérable et plus efficace. Pour les utilisateurs, il rend également l’entraînement plus rapide et plus abordable que d’autres techniques.

Dans cet article, vous allez apprendre à :

  • Choisissez les jeux de données et les formats appropriés pour le réglage précis.
  • Déclenchez un travail de réglage précis, surveillez l’état et extrayez les résultats.
  • Déployez et évaluez un modèle affiné.
  • Itérer en fonction des commentaires d’évaluation.

Conditions préalables

Modèles pris en charge

Pour vérifier quelles régions prennent actuellement en charge le réglage précis, consultez l’article sur les modèles.

Ou vous pouvez ajuster un modèle précédemment affiné, mis en forme comme base-model.ft-{jobid}.

Préparer vos données

Vos jeux de données d’entraînement et de validation se composent d’exemples d’entrée et de sortie montrant comment vous souhaitez que le modèle fonctionne.

Les données d’apprentissage et de validation que vous utilisez doivent être mises en forme sous forme de document JSON Lines (JSONL). Elle doit également être mise en forme selon le format conversationnel que l'API Chat Completions utilise.

Outre le format JSONL, les fichiers de données d’apprentissage et de validation doivent être encodés en UTF-8 et inclure une marque d’ordre d’octet (BOM). Chaque fichier doit avoir une taille inférieure à 512 Mo.

Nous vous recommandons d’utiliser les instructions et les invites que vous avez trouvées optimales dans chaque exemple de formation. Cette approche vous aide à obtenir les meilleurs résultats, en particulier si vous avez moins d’une centaine d’exemples.

Si vous n’avez pas de jeu de données existant préparé, vous pouvez utiliser les fonctionnalités de génération de données pour en créer une.

Exemple de format de fichier

{"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."}]}

Format de fichier de conversation à plusieurs tours

Plusieurs tours d’une conversation dans une seule ligne de votre fichier d’entraînement JSONL sont également pris en charge. Pour ignorer le réglage précis sur des messages d’assistant spécifiques, ajoutez la paire clé/valeur facultative weight. Actuellement, weight peut être défini sur 0 ou 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}]}

Saisies semi-automatiques de conversation avec vision

{"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."}]}

Considérations relatives à la taille du jeu de données

Plus vous avez d’exemples de formation, mieux c’est. Les travaux de réglage précis ne se dérouleront pas sans au moins 10 exemples d’apprentissage, mais un si petit nombre n’est pas suffisant pour influencer de façon notable les réponses du modèle. Une bonne pratique pour la réussite de l’optimisation est de fournir des centaines, voire des milliers, d’exemples d’entraînement. Nous vous recommandons de commencer par 50 exemples bien conçus.

En général, le doublement de la taille du jeu de données peut entraîner une augmentation linéaire de la qualité du modèle. Mais gardez à l’esprit que les exemples de faible qualité peuvent affecter négativement les performances. Si vous entraînez le modèle sur une grande quantité de données internes sans d’abord élaguer le jeu de données en ne conservant que les exemples de la plus haute qualité, votre modèle pourrait avoir de moins bonnes performances que prévu.

Créer votre modèle ajusté

Pour affiner un modèle dans un projet Foundry existant, procédez comme suit :

  1. Connectez-vous à Foundry et sélectionnez votre projet. Si vous n’avez pas encore de projet, commencez par en créer un.

  2. Accédez à la page Build>Fine-tune, puis sélectionnez le bouton Fine-tune en haut à droite.

  3. Vous devriez maintenant voir l’expérience Ajuster un modèle permettant de créer un nouveau travail d’ajustement. Utilisez les sections suivantes pour vous aider à configurer le travail, puis sélectionnez Envoyer pour commencer à former votre nouveau modèle affiné.

Sélection du modèle de base

La région du projet peut limiter les modèles disponibles. Votre choix de modèle influence à la fois les performances et le coût de votre modèle.

Vous pouvez également sélectionner un modèle précédemment affiné.

Méthode de personnalisation

Les méthodes de personnalisation prises en charge dépendent du modèle sélectionné :

  • Réglage précis supervisé (SFT) : entraîne le modèle sur des paires d’entrée/sortie étiquetées. Idéal pour la plupart des scénarios, y compris la spécialisation des tâches.

  • Optimisation directe des préférences (DPO) : aligne le modèle avec les réponses préférées de l’homme. Idéal pour améliorer la qualité de la réponse.

  • Réglage précis du renforcement (RFT) : utilise les signaux de récompense des évaluateurs de modèle pour optimiser les comportements complexes.

Remarque

Le reste de cet article décrit les étapes de la méthode SFT. Pour obtenir des instructions spécifiques à d’autres méthodes de personnalisation, consultez le guide pour le DPO et le guide pour RFT.

Type d’entraînement

Sélectionnez le niveau d’entraînement en fonction de votre cas d’usage et de votre budget :

  • Standard : l’entraînement a lieu dans la région actuelle de la ressource Foundry et fournit des garanties pour la résidence des données. Idéal pour les charges de travail où les données doivent rester dans une région spécifique.

  • Global : Offre des tarifs plus abordables par rapport à Standard en utilisant la capacité au-delà de votre région actuelle. Les données et les pondérations sont copiées dans la région où l’entraînement se produit. Idéal si la résidence des données n’est pas une restriction et que vous souhaitez accélérer les temps de file d’attente.

  • Développeur (version préliminaire) : offre des économies significatives en utilisant la capacité inactive pour la formation. Il n’existe aucune garantie de latence ou de contrat SLA. Les travaux de ce niveau peuvent donc être automatiquement préemptés et repris ultérieurement. Il n’existe aucune garantie pour la résidence des données. Idéal pour l’expérimentation et les charges de travail sensibles aux prix.

Données de formation et de validation

Si vous avez des jeux de données existants dans le projet Foundry, sélectionnez Jeu de données existant pour la source de données, puis sélectionnez votre jeu de données.

Pour charger les jeux de données nouvellement préparés, sélectionnez Charger un nouveau jeu de données pour la source de données, puis chargez votre fichier JSONL.

Une fois que vous avez sélectionné ou téléchargé vos fichiers de données, les vérifications de validation se produisent automatiquement pour confirmer que les fichiers sont formatés au format JSONL, sont encodés en UTF-8 avec un boM et sont de moins de 512 Mo de taille.

Paramètres facultatifs

Suffixe

Nous vous recommandons de fournir une valeur de suffixe pour faciliter la distinction entre différentes itérations de votre modèle affiné. Un suffixe prend une chaîne allant jusqu’à 18 caractères et est utilisé pour nommer le modèle affiné résultant.

Seed

Une graine contrôle la reproductibilité du travail. La transmission des mêmes paramètres de départ et de travail doit produire les mêmes résultats, mais peut différer dans de rares cas. Si vous ne spécifiez pas de valeur initiale, une valeur est générée de manière aléatoire pour vous.

Hyperparamètres

Vous pouvez configurer manuellement des hyperparamètres pour votre travail de réglage précis ou les laisser comme valeurs par défaut.

Les hyperparamètres suivants sont disponibles :

Nom Type Descriptif
batch_size Nombre entier Taille de lot à utiliser pour la formation. La taille du lot est le nombre d’exemples de formation utilisés pour entraîner un seul passage avant et arrière. En général, nous constatons que les tailles de lots plus grandes ont tendance à fonctionner mieux pour les jeux de données plus volumineux.

La valeur par défaut et la valeur maximale de cette propriété sont spécifiques à un modèle de base. Une taille de lot plus grande signifie que les paramètres de modèle sont mis à jour moins souvent, mais avec une variance plus faible. Si la valeur est définie à -1, la taille du lot est calculée à 0,2 % des exemples dans le jeu d’entraînement. La valeur maximale est 256.
learning_rate_multiplier Number Multiplicateur de taux de formation à utiliser pour la formation. Le taux d’apprentissage de réglage précis est le taux d’apprentissage d’origine utilisé pour la pré-formation, multiplié par cette valeur.

Les taux d’apprentissage plus importants ont tendance à mieux fonctionner que les tailles de lot plus grandes. Nous vous recommandons d’expérimenter des valeurs dans la plage de 0.02 à 0.2 pour voir ce qui produit les meilleurs résultats. Un taux d’apprentissage plus faible peut être utile pour éviter un surajustement.
n_epochs Nombre entier Nombre d’époques pour lesquelles le modèle doit être entraîné. Une époque fait référence à un cycle complet dans le jeu de données de formation. Si la valeur est définie -1sur , le nombre d’époques est déterminé dynamiquement en fonction des données d’entrée.

Déploiement automatique

[!IMPORTANT] Pour le déploiement automatique, vous devez avoir un rôle Azure AI owner ou tout rôle comprenant l’action « Microsoft.CognitiveServices/accounts/deployments/write ».

Pour gagner du temps, vous pouvez activer le déploiement automatique pour votre modèle résultant. Si l’entraînement se termine correctement, le modèle est déployé en fonction du type de déploiement sélectionné. Le nom de déploiement est basé sur le nom unique généré pour votre modèle personnalisé et le suffixe facultatif que vous avez peut-être fourni précédemment.

Le déploiement automatique est pris en charge uniquement pour les modèles OpenAI.

Surveiller et analyser les résultats

Une fois que vous avez soumis votre travail d'affinement, une vue en tableau répertorie toutes vos soumissions de travaux d'affinement. Pour plus d’informations sur les résultats individuels, ouvrez la page détails du travail .

Votre tâche peut être mise en file d’attente derrière d’autres tâches sur le système. L’entraînement de votre modèle peut prendre des minutes à heures, en fonction du modèle et de la taille du jeu de données.

Metrics

Vous pouvez surveiller les métriques suivantes en accédant à l'onglet Monitor :

  • train_loss : perte du lot d’entraînement. Chaque étape d’entraînement sur l’axe x représente une seule passe, avant et arrière, sur un lot de données d’apprentissage.

  • full_valid_loss: perte de validation calculée à la fin de chaque époque. Lorsque la formation va bien, la perte doit diminuer.

  • train_mean_token_accuracy : pourcentage de jetons dans le lot d’entraînement qui ont été correctement prédits par le modèle.

    Par exemple, si la taille du lot est définie 3 et que vos données contiennent des achèvements [[1, 2], [0, 5], [4, 2]], cette valeur est définie 0.83 sur (5 sur 6) si le modèle prédit [[1, 1], [0, 5], [4, 2]].

  • full_valid_mean_token_accuracy: Précision moyenne des tokens valide calculée à la fin de chaque epoch. Lorsque l’entraînement se déroule bien, la précision des jetons doit augmenter.

Les pertes devraient diminuer avec le temps et la précision augmenter. Si vos données d’entraînement et de validation diffèrent, vous risquez d’être surajusté. Essayez une formation avec moins d’époques ou un multiplicateur de taux d’apprentissage plus petit.

Points de contrôle

Une fois chaque époque d’apprentissage terminée, un point de contrôle est généré. Vous pouvez afficher les points de contrôle en accédant à l'onglet Checkpoints.

Un point de contrôle est une version entièrement fonctionnelle d’un modèle qui peut être déployé et utilisé comme modèle cible pour les travaux de réglage précis suivants. Les points de contrôle peuvent être particulièrement utiles, car ils peuvent fournir des instantanés avant le surajustement. Quand un travail de réglage précis se termine, vous disposez des trois versions les plus récentes du modèle disponibles pour le déploiement. Vous pouvez copier des points de contrôle entre les ressources et les abonnements via l’API REST.

Remarque

Pendant l’entraînement, vous pouvez afficher les métriques et suspendre le travail en fonction des besoins. La suspension peut être utile si les métriques ne convergent pas ou si vous pensez que le modèle n’apprend pas au bon rythme. Lorsque vous suspendez un travail de formation, un point de contrôle déployable est créé une fois les évaluations de sécurité terminées. Ce point de contrôle est disponible pour vous permettre de déployer et d’utiliser pour l’inférence, ou vous pouvez reprendre le travail pour le terminer.

L’opération de pause s’applique uniquement aux travaux entraînés pour au moins une étape et qui se trouvent dans un état En cours d'exécution . La suspension est prise en charge uniquement pour les modèles OpenAI.

Déployer le modèle affiné

[!IMPORTANT] Pour déployer des modèles, vous devez avoir le rôle Azure AI owner ou tout rôle comprenant l’autorisation « Microsoft.CognitiveServices/accounts/deployments/write ».

Lorsque vous êtes satisfait des métriques de votre travail de réglage précis, vous pouvez déployer le modèle en sélectionnant le bouton Déployer dans la page détails, puis en configurant vos paramètres de déploiement.

Pour plus d’informations, consultez le guide de déploiement de réglage précis.

Utiliser un modèle ajusté déployé

Après avoir déployé votre modèle affiné, vous pouvez l’utiliser comme n’importe quel autre modèle déployé. Vous pouvez utiliser le terrain de jeu dans Foundry pour expérimenter votre nouveau déploiement. Vous pouvez également utiliser l’API REST pour appeler votre modèle ajusté à partir de votre application. Vous pouvez même commencer à utiliser ce nouveau modèle ajusté dans votre flux d’invite pour générer votre application d’IA générative.

Remarque

Pour les modèles de conversation, le message système que vous utilisez pour guider votre modèle affiné (qu’il soit déployé ou disponible pour les tests dans le terrain de jeu) doit être identique au message système que vous avez utilisé pour l’entraînement. Si vous utilisez un autre message système, il est possible que le modèle ne fonctionne pas comme prévu.

Effectuer un réglage précis continu

Après avoir créé un modèle affiné, vous souhaiterez peut-être continuer à affiner le modèle au fil du temps grâce à un réglage plus précis. L’ajustement continu correspond au processus itératif de sélection d’un modèle déjà affiné comme modèle de base et à l’ajuster davantage sur de nouveaux ensembles d’exemples d’apprentissage.

Pour effectuer un réglage précis sur un modèle que vous avez précédemment affiné, vous utilisez le même processus décrit dans Créer votre modèle affiné. Mais au lieu de spécifier le nom d’un modèle de base générique, vous spécifiez votre modèle déjà affiné. Un modèle affiné personnalisé ressemble à gpt-4o-2024-08-06.ft-d93dda6110004b4da3472d96f4dd4777-ft.

L'ajustement fin continu est pris en charge uniquement pour les modèles OpenAI.

Nettoyage des ressources

Lorsque vous n’avez plus besoin de votre modèle affiné, vous pouvez supprimer le déploiement et le modèle. Vous pouvez également supprimer les fichiers d’entraînement et de validation que vous avez chargés sur le service, si nécessaire.

Supprimer le déploiement de votre modèle ajusté

Important

Après avoir déployé un modèle personnalisé, si à tout moment le déploiement reste inactif pendant plus de 15 jours, le déploiement est supprimé. Le déploiement d’un modèle personnalisé est inactif si le modèle a été déployé il y a plus de 15 jours et qu’aucun appel d’API pour des conversations ou des réponses n’a été effectué sur une période continue de 15 jours.

La suppression d’un déploiement inactif ne supprime pas ou n’affecte pas le modèle personnalisé sous-jacent. Le modèle personnalisé peut être redéployé à tout moment.

Comme décrit dans la tarification d’Azure OpenAI dans Microsoft Foundry Models, chaque modèle personnalisé (réglé) déployé entraîne un coût d’hébergement horaire, même si aucun appel d’API pour des conversations ou des réponses n'est effectué sur le modèle. Pour en savoir plus sur la planification et la gestion des coûts avec Azure OpenAI, consultez Planifier et gérer les coûts pour Azure OpenAI.

Vous pouvez supprimer le déploiement de votre modèle affiné sur la page Build>Modèles dans le portail Foundry.

Supprimer votre modèle ajusté

Vous pouvez supprimer un modèle affiné sur la page Réglage précis dans le portail Foundry. Sélectionnez le modèle affiné à supprimer, puis sélectionnez Supprimer.

Remarque

Vous ne pouvez pas supprimer un modèle ajusté s’il a un déploiement existant. Vous devez supprimer votre déploiement de modèle avant de pouvoir supprimer votre modèle affiné.

Conditions préalables

Modèles pris en charge

Pour vérifier quelles régions prennent actuellement en charge le réglage précis, consultez l’article sur les modèles.

Ou vous pouvez ajuster un modèle précédemment affiné, mis en forme comme base-model.ft-{jobid}.

Vérifier le flux de travail du Kit de développement logiciel (SDK) Python

Prenez un moment pour vérifier le flux de travail d’ajustement de l’utilisation du SDK Python avec Azure OpenAI :

  1. Préparez vos données d’apprentissage et de validation.
  2. Sélectionnez un modèle de base.
  3. Chargez vos données d’apprentissage.
  4. Entraînez votre nouveau modèle personnalisé.
  5. Vérifiez l’état de votre modèle personnalisé.
  6. Déployez votre modèle personnalisé pour l’utilisation.
  7. Utilisez votre modèle personnalisé.
  8. Éventuellement, analysez votre modèle personnalisé pour en évaluer les performances et l’adaptation.

Préparer vos données d’entraînement et de validation

Vos jeux de données d’entraînement et de validation se composent d’exemples d’entrée et de sortie montrant comment vous souhaitez que le modèle fonctionne.

Les données d’apprentissage et de validation que vous utilisez doivent être mises en forme sous forme de document JSON Lines (JSONL). Elle doit également être mise en forme selon le format conversationnel que l'API Chat Completions utilise.

Outre le format JSONL, les fichiers de données d’apprentissage et de validation doivent être encodés en UTF-8 et inclure une marque d’ordre d’octet (BOM). Chaque fichier doit avoir une taille inférieure à 512 Mo.

Si vous souhaitez une procédure pas à pas de réglage gpt-4o-mini-2024-07-18précis, consultez le didacticiel d’optimisation d’Azure OpenAI.

Exemple de format de fichier

{"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."}]}

Format de fichier de conversation à plusieurs tours

Plusieurs tours d’une conversation dans une seule ligne de votre fichier d’entraînement JSONL sont également pris en charge. Pour ignorer le réglage précis sur des messages d’assistant spécifiques, ajoutez la paire clé/valeur facultative weight. Actuellement, weight peut être défini sur 0 ou 1.

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital/major city 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}]}

Saisies semi-automatiques de conversation avec vision

{"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."}]}

Créer vos jeux de données d’apprentissage et de validation

Plus vous avez d’exemples de formation, mieux c’est. Les travaux de réglage précis ne se dérouleront pas sans au moins 10 exemples d’apprentissage, mais un si petit nombre n’est pas suffisant pour influencer de façon notable les réponses du modèle. Une bonne pratique pour la réussite de l’optimisation est de fournir des centaines, voire des milliers, d’exemples d’entraînement.

En général, le doublement de la taille du jeu de données peut entraîner une augmentation linéaire de la qualité du modèle. Mais gardez à l’esprit que les exemples de faible qualité peuvent affecter négativement les performances. Si vous entraînez le modèle sur une grande quantité de données internes sans d’abord élaguer le jeu de données en ne conservant que les exemples de la plus haute qualité, votre modèle pourrait avoir de moins bonnes performances que prévu.

Charger vos données d’entraînement

L’étape suivante consiste à choisir des données d’apprentissage préparées existantes ou à charger de nouvelles données d’apprentissage préparées à utiliser lorsque vous personnalisez votre modèle. Après avoir préparé vos données d’apprentissage, vous pouvez charger vos fichiers dans le service. Il existe deux façons de charger des données d’apprentissage :

Pour les fichiers de données volumineux, nous vous recommandons d’importer à partir du stockage Blob. Les fichiers volumineux peuvent devenir instables lorsque vous les chargez via des formulaires multipart, car les requêtes sont atomiques et ne peuvent pas être retentées ou reprise. Pour plus d’informations sur Azure Blob Storage, consultez la section Qu’est-ce qu’Azure Blob Storage ?.

L’exemple Python suivant charge les fichiers de formation et de validation locaux à l’aide du Kit de développement logiciel (SDK) Python et récupère les ID de fichier retournés :

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)

Créer un modèle personnalisé

Après avoir chargé vos fichiers d’entraînement et de validation, vous êtes prêt à démarrer la tâche de réglage précis.

Le code Python suivant montre un exemple de création d’un travail de réglage précis à l’aide du Kit de développement logiciel (SDK) Python :

response = client.fine_tuning.jobs.create(
    training_file=training_file_id,
    validation_file=validation_file_id,
    model="gpt-4.1-2025-04-14", # Enter the base model name.
    suffix="my-model", # Custom suffix for naming the resulting model. Note that in Microsoft Foundry, the model can't contain dot/period characters.
    seed=105, # Seed parameter controls reproducibility of the fine-tuning job. If you don't specify a seed, one is generated automatically.
    extra_body={ "trainingType": "GlobalStandard" } # Change this value 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 takes some time to start and finish.

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

Remarque

Nous vous recommandons d’utiliser le niveau Global Standard pour le type d’entraînement, car il offre des économies de coûts et utilise la capacité globale pour des temps de mise en file d’attente plus rapides. Toutefois, il copie les données et les pondérations en dehors de la région de ressource actuelle. Si la résidence des données est requise, utilisez un modèle qui prend en charge la formation de niveau Standard.

Vous pouvez également passer des paramètres facultatifs supplémentaires, comme les hyperparamètres, pour prendre un meilleur contrôle du processus de réglage précis. Pour l’apprentissage initial, nous vous recommandons d’utiliser les valeurs automatiques par défaut présentes sans spécifier ces paramètres.

Les hyperparamètres actuellement pris en charge pour le réglage précis supervisé sont les suivants :

Nom Type Descriptif
batch_size Nombre entier Taille de lot à utiliser pour la formation. La taille du lot est le nombre d’exemples de formation utilisés pour entraîner un seul passage avant et arrière. En général, nous constatons que les tailles de lots plus grandes ont tendance à fonctionner mieux pour les jeux de données plus volumineux.

La valeur par défaut et la valeur maximale de cette propriété sont spécifiques à un modèle de base. Une taille de lot plus grande signifie que les paramètres de modèle sont mis à jour moins souvent, mais avec une variance plus faible.
learning_rate_multiplier Number Multiplicateur de taux de formation à utiliser pour la formation. Le taux d’apprentissage de réglage précis est le taux d’apprentissage d’origine utilisé pour la pré-formation, multiplié par cette valeur.

Les taux d’apprentissage plus importants ont tendance à mieux fonctionner que les tailles de lot plus grandes. Nous vous recommandons d’expérimenter des valeurs dans la plage de 0.02 à 0.2 pour voir ce qui produit les meilleurs résultats. Un taux d’apprentissage plus faible peut être utile pour éviter un surajustement.
n_epochs Nombre entier Nombre d’époques pour lesquelles le modèle doit être entraîné. Une époque fait référence à un cycle complet dans le jeu de données de formation.
seed Nombre entier La graine qui contrôle la reproductibilité de la tâche. La transmission des mêmes paramètres de départ et de travail doit produire les mêmes résultats, mais peut différer dans de rares cas. Si vous ne spécifiez pas de graine, une graine est générée pour vous.

Pour définir des hyperparamètres personnalisés avec la version 1.x de l’API Python OpenAI, fournissez-les dans le cadre de 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 is using supervised fine-tuning.
    "supervised": {
      "hyperparameters": {
        "n_epochs": 2
      }
    }
  },
  extra_body={ "trainingType": "GlobalStandard" }
)

Pour en savoir plus sur les hyperparamètres pris en charge pour les autres méthodes de personnalisation, consultez le guide d’optimisation des préférences directes et le guide pour le réglage précis du renforcement.

Type d’entraînement

Sélectionnez le niveau d’entraînement en fonction de votre cas d’usage et de votre budget :

  • Standard : l’entraînement a lieu dans la région actuelle de la ressource Foundry et fournit des garanties pour la résidence des données. Idéal pour les charges de travail où les données doivent rester dans une région spécifique.

  • Global : Offre des tarifs plus abordables par rapport à Standard en utilisant la capacité au-delà de votre région actuelle. Les données et les pondérations sont copiées dans la région où l’entraînement se produit. Idéal si la résidence des données n’est pas une restriction et que vous souhaitez accélérer les temps de file d’attente.

  • Développeur (version préliminaire) : offre des économies significatives en utilisant la capacité inactive pour la formation. Il n’existe aucune garantie de latence ou de contrat SLA. Les travaux de ce niveau peuvent donc être automatiquement préemptés et repris ultérieurement. Il n’existe aucune garantie pour la résidence des données. Idéal pour l’expérimentation et les charges de travail sensibles aux prix.

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)

Vérifier l’état du travail d’ajustement

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

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

Lister des événements ajustés

Pour examiner les événements de réglage précis individuels générés pendant l’entraînement, exécutez la commande suivante. Avant d’exécuter la commande, vous devrez peut-être mettre à niveau votre bibliothèque cliente OpenAI vers la dernière version à l’aide de pip install openai --upgrade.

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

Utiliser des points de contrôle

L’achèvement de chaque époque d’apprentissage génère un point de contrôle. Un point de contrôle est une version entièrement fonctionnelle d’un modèle qui peut être déployé et utilisé comme modèle cible pour les travaux de réglage précis suivants. Les points de contrôle peuvent être particulièrement utiles, car ils peuvent fournir des instantanés avant le surajustement.

Quand un travail de réglage précis se termine, vous disposez des trois versions les plus récentes du modèle disponibles pour le déploiement. Votre modèle affiné représente l’époque finale. Les deux époques précédentes sont disponibles en tant que points de contrôle.

Vous pouvez exécuter la commande suivante pour récupérer la liste des points de contrôle associés à un travail de réglage précis individuel. Avant d’exécuter la commande, vous devrez peut-être mettre à niveau votre bibliothèque cliente OpenAI vers la dernière version à l’aide de pip install openai --upgrade.

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

Analysez votre modèle personnalisé

Azure OpenAI attache un fichier de résultats nommé results.csv à chaque travail de réglage précis une fois terminé. Vous pouvez utiliser le fichier de résultats pour analyser les performances d’entraînement et de validation de votre modèle personnalisé. L’ID de fichier du fichier de résultats est répertorié pour chaque modèle personnalisé. Vous pouvez utiliser le Kit de développement logiciel (SDK) Python pour récupérer l’ID de fichier et télécharger le fichier de résultats à des fins d’analyse.

L’exemple Python suivant récupère l’ID de fichier du premier fichier de résultat attaché au travail de réglage précis de votre modèle personnalisé. Il utilise ensuite le Kit de développement logiciel (SDK) Python pour télécharger le fichier dans votre répertoire de travail actuel pour l’analyse.

# 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)

Le fichier de résultats est un fichier CSV qui contient une ligne d’en-tête et une ligne pour chaque étape d’apprentissage effectuée par le travail d’optimisation. Le fichier de résultats contient les colonnes suivantes :

Nom de colonne Descriptif
step Numéro de l’étape d’entraînement. Une étape d’entraînement représente une seule passe, avant et arrière, sur un lot de données d’entraînement.
train_loss Perte du lot d’entraînement.
train_mean_token_accuracy Pourcentage de jetons dans le lot d’entraînement qui ont été correctement prédits par le modèle.

Par exemple, si la taille du lot est définie 3 et que vos données contiennent des achèvements [[1, 2], [0, 5], [4, 2]], cette valeur est définie 0.83 sur (5 sur 6) si le modèle prédit [[1, 1], [0, 5], [4, 2]].
valid_loss Perte du lot de validation.
validation_mean_token_accuracy Pourcentage de jetons dans le lot de validation que le modèle a correctement prédit.

Par exemple, si la taille du lot est définie 3 et que vos données contiennent des achèvements [[1, 2], [0, 5], [4, 2]], cette valeur est définie 0.83 sur (5 sur 6) si le modèle prédit [[1, 1], [0, 5], [4, 2]].
full_valid_loss La perte de validation calculée à la fin de chaque époque. Lorsque la formation va bien, la perte doit diminuer.
full_valid_mean_token_accuracy La précision moyenne valide des jetons calculée à la fin de chaque époque. Lorsque l’entraînement se déroule bien, la précision des jetons doit augmenter.

Vous pouvez également afficher les données de votre results.csv fichier sous forme de tracés dans le portail Microsoft Foundry. Lorsque vous sélectionnez le lien pour votre modèle entraîné, trois graphiques apparaissent : perte, précision moyenne du jeton et précision du jeton. Si vous avez fourni des données de validation, les deux jeux de données apparaissent sur le même tracé.

Les pertes devraient diminuer avec le temps et la précision augmenter. Si vos données d’entraînement et de validation diffèrent, vous risquez d’être surajusté. Essayez une formation avec moins d’époques ou un multiplicateur de taux d’apprentissage plus petit.

Déployer un modèle affiné

Lorsque vous êtes satisfait des métriques de votre travail de réglage précis ou que vous souhaitez simplement passer à l’inférence, vous devez déployer le modèle.

Si vous effectuez un déploiement pour une validation supplémentaire, envisagez de déployer des tests à l’aide d’un déploiement Développeur.

Contrairement aux commandes précédentes du Kit de développement logiciel (SDK), vous devez utiliser l’API du plan de contrôle pour le déploiement. Cette tâche nécessite une autorisation distincte, un chemin d’ACCÈS d’API différent et une autre version de l’API.

Variable Définition
token Jeton d’autorisation. Il existe plusieurs façons de générer un jeton d’autorisation. La méthode la plus simple pour les tests initiaux consiste à ouvrir Azure Cloud Shell à partir du portail Azure. Exécutez ensuite az account get-access-token. Vous pouvez utiliser ce jeton comme jeton d’autorisation temporaire pour le test d’API. Nous vous recommandons de stocker ce jeton dans une nouvelle variable d’environnement.
subscription ID d’abonnement de la ressource Azure OpenAI associée.
resource_group Nom du groupe de ressources de votre ressource Azure OpenAI.
resource_name Le nom de ressource Azure OpenAI.
model_deployment_name Nom personnalisé de votre nouveau modèle de déploiement ajusté. Ce nom est référencé dans votre code pendant les appels de complétion de conversation.
fine_tuned_model Votre modèle optimisé. Récupérez cette valeur à partir de votre travail d’optimisation des résultats à l’étape précédente. Il ressemble à gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83. Vous devez ajouter la valeur au deploy_data JSON. Vous pouvez également déployer un point de contrôle en passant l’ID de point de contrôle, qui apparaît au format 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 use to reference the model when making inference calls.

deploy_params = {'api-version': "2024-10-01"} # Control plane API version rather than the data plane 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 looks 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())

Pour en savoir plus sur le déploiement interrégion et sur l’utilisation du modèle déployé, consultez Utiliser votre modèle affiné déployé.

Si vous êtes prêt à déployer pour la production ou si vous avez des besoins particuliers en matière de résidence des données, suivez le guide de déploiement.

Effectuer un réglage précis continu

Après avoir créé un modèle affiné, vous souhaiterez peut-être continuer à affiner le modèle au fil du temps grâce à un réglage plus précis. L’ajustement continu correspond au processus itératif de sélection d’un modèle déjà affiné comme modèle de base et à l’ajuster davantage sur de nouveaux ensembles d’exemples d’apprentissage. L'ajustement fin continu est pris en charge uniquement pour les modèles OpenAI.

Pour effectuer un réglage précis sur un modèle que vous avez précédemment affiné, vous utilisez le même processus décrit dans Créer un modèle personnalisé. Mais au lieu de spécifier le nom d’un modèle de base générique, vous spécifiez l’ID de votre modèle affiné. L’ID du modèle affiné ressemble à 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 takes some time to start and finish.

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

Nous vous recommandons également d’inclure le suffix paramètre pour distinguer plus facilement les itérations de votre modèle affiné. Le suffix paramètre prend une chaîne et est défini pour identifier le modèle affiné. Avec l’API Python OpenAI, vous pouvez ajouter une chaîne allant jusqu’à 18 caractères au nom de votre modèle affiné.

Si vous n’êtes pas sûr de l’ID de votre modèle affiné existant, vous trouverez ces informations sur la page Modèles de Microsoft Foundry. Vous pouvez également générer une liste de modèles pour une ressource Azure OpenAI à l’aide de l’API REST.

Nettoyez vos déploiements, modèles personnalisés et fichiers d’entraînement

Lorsque vous n’avez plus besoin de votre modèle personnalisé, vous pouvez supprimer le déploiement et le modèle. Vous pouvez également supprimer les fichiers d’entraînement et de validation que vous avez chargés sur le service, si nécessaire.

Supprimer votre modèle de déploiement

Important

Après avoir déployé un modèle personnalisé, si à tout moment le déploiement reste inactif pendant plus de 15 jours, le déploiement est supprimé. Le déploiement d’un modèle personnalisé est inactif si le modèle a été déployé il y a plus de 15 jours et qu’aucun appel d’API pour des conversations ou des réponses n’a été effectué sur une période continue de 15 jours.

La suppression d’un déploiement inactif ne supprime pas ou n’affecte pas le modèle personnalisé sous-jacent. Le modèle personnalisé peut être redéployé à tout moment.

Comme décrit dans la tarification d’Azure OpenAI dans Microsoft Foundry Models, chaque modèle personnalisé (réglé) déployé entraîne un coût d’hébergement horaire, même si aucun appel d’API pour des conversations ou des réponses n'est effectué sur le modèle. Pour en savoir plus sur la planification et la gestion des coûts avec Azure OpenAI, consultez Planifier et gérer les coûts pour Azure OpenAI.

Vous pouvez utiliser l’une de ces méthodes pour supprimer le déploiement de votre modèle personnalisé :

Supprimer votre modèle personnalisé

Vous pouvez supprimer votre modèle personnalisé à l’aide de Foundry.

Remarque

Vous ne pouvez pas supprimer un modèle personnalisé s’il a un déploiement existant. Vous devez supprimer votre déploiement de modèle avant de pouvoir supprimer votre modèle personnalisé.

Supprimer vos fichiers de formation

Vous pouvez éventuellement supprimer des fichiers d’apprentissage et de validation que vous avez chargés pour l’apprentissage, ainsi que les fichiers de résultats générés pendant l’apprentissage, à partir de votre abonnement Azure OpenAI. Vous pouvez utiliser les méthodes suivantes pour supprimer vos fichiers d’entraînement, de validation et de résultats :

L’exemple Python suivant utilise le SDK Python pour supprimer les fichiers d’apprentissage, de validation et de résultats pour votre modèle personnalisé :

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

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

# Enumerate all uploaded files. Extract the IDs for the
# files with file names that match your training dataset file and
# validation dataset file.
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 your files and delete each file.
print(f'Deleting already uploaded files.')
for id in results:
    openai.File.delete(sid = id)

Conditions préalables

Modèles pris en charge

Pour vérifier quelles régions prennent actuellement en charge le réglage précis, consultez l’article sur les modèles.

Ou vous pouvez ajuster un modèle précédemment affiné, mis en forme comme base-model.ft-{jobid}.

Vérifier le flux de travail pour l’API REST

Prenez un moment pour passer en revue le flux de travail d’optimisation de l’utilisation de l’API REST et de Python avec Azure OpenAI :

  1. Préparez vos données d’apprentissage et de validation.
  2. Sélectionnez un modèle de base.
  3. Chargez vos données d’apprentissage.
  4. Entraînez votre nouveau modèle personnalisé.
  5. Vérifiez l’état de votre modèle personnalisé.
  6. Déployez votre modèle personnalisé pour l’utilisation.
  7. Utilisez votre modèle personnalisé.
  8. Éventuellement, analysez votre modèle personnalisé pour en évaluer les performances et l’adaptation.

Préparer vos données d’entraînement et de validation

Vos jeux de données d’entraînement et de validation se composent d’exemples d’entrée et de sortie montrant comment vous souhaitez que le modèle fonctionne.

Les données d’apprentissage et de validation que vous utilisez doivent être mises en forme sous forme de document JSON Lines (JSONL). Elle doit également être mise en forme selon le format conversationnel que l'API Chat Completions utilise.

Outre le format JSONL, les fichiers de données d’apprentissage et de validation doivent être encodés en UTF-8 et inclure une marque d’ordre d’octet (BOM). Chaque fichier doit avoir une taille inférieure à 512 Mo.

Si vous souhaitez une procédure pas à pas de réglage gpt-4o-mini-2024-07-18précis, consultez le didacticiel d’optimisation d’Azure OpenAI.

Exemple de format de fichier

{"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."}]}

Format de fichier de conversation à plusieurs tours

Plusieurs tours d’une conversation dans une seule ligne de votre fichier d’entraînement JSONL sont également pris en charge. Pour ignorer le réglage précis sur des messages d’assistant spécifiques, ajoutez la paire clé/valeur facultative weight. Actuellement, weight peut être défini sur 0 ou 1.

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital/major city 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}]}

Saisies semi-automatiques de conversation avec vision

{"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."}]}

Créer vos jeux de données d’apprentissage et de validation

Plus vous avez d’exemples de formation, mieux c’est. Les travaux de réglage précis ne se dérouleront pas sans au moins 10 exemples d’apprentissage, mais un si petit nombre n’est pas suffisant pour influencer de façon notable les réponses du modèle. Une bonne pratique pour la réussite de l’optimisation est de fournir des centaines, voire des milliers, d’exemples d’entraînement.

En général, le doublement de la taille du jeu de données peut entraîner une augmentation linéaire de la qualité du modèle. Mais gardez à l’esprit que les exemples de faible qualité peuvent affecter négativement les performances. Si vous entraînez le modèle sur une grande quantité de données internes sans d’abord élaguer le jeu de données en ne conservant que les exemples de la plus haute qualité, votre modèle pourrait avoir de moins bonnes performances que prévu.

Charger vos données d’entraînement

L’étape suivante consiste à choisir des données d’apprentissage préparées existantes ou à charger de nouvelles données d’apprentissage préparées à utiliser lorsque vous personnalisez votre modèle. Après avoir préparé vos données d’apprentissage, vous pouvez charger vos fichiers dans le service. Il existe deux façons de charger des données d’apprentissage :

Pour les fichiers de données volumineux, nous vous recommandons d’importer à partir du stockage Blob. Les fichiers volumineux peuvent devenir instables lorsque vous les chargez via des formulaires multipart, car les requêtes sont atomiques et ne peuvent pas être retentées ou reprise. Pour plus d’informations sur Azure Blob Storage, consultez la section Qu’est-ce qu’Azure Blob Storage ?.

Charger des données d’entraînement

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"

Charger des données de validation

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"

Créer un modèle personnalisé

Après avoir chargé vos fichiers d’entraînement et de validation, vous êtes prêt à démarrer la tâche de réglage précis. Le code suivant montre un exemple de comment lancer un travail de fine-tuning à l'aide de l'API REST.

Cet exemple inclut le passage du paramètre seed. La graine contrôle la reproductibilité du travail. La transmission des mêmes paramètres de départ et de travail doit produire les mêmes résultats, mais peut différer dans de rares cas. Si vous ne spécifiez pas de graine, une graine est générée pour vous.

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
}'

Si vous réglez un modèle qui prend en charge l’entraînement global, vous pouvez spécifier le type d’entraînement en utilisant l'argument nommé extra_body et api-version=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"
}'

Vous pouvez également passer d’autres paramètres facultatifs tels que des hyperparamètres pour mieux contrôler le processus d’ajustement. Pour l’apprentissage initial, nous vous recommandons d’utiliser les valeurs automatiques par défaut présentes sans spécifier ces paramètres.

Les hyperparamètres actuellement pris en charge pour le réglage précis supervisé sont les suivants :

Nom Type Descriptif
batch_size Nombre entier Taille de lot à utiliser pour la formation. La taille du lot est le nombre d’exemples de formation utilisés pour entraîner un seul passage avant et arrière. En général, nous constatons que les tailles de lots plus grandes ont tendance à fonctionner mieux pour les jeux de données plus volumineux.

La valeur par défaut et la valeur maximale de cette propriété sont spécifiques à un modèle de base. Une taille de lot plus grande signifie que les paramètres de modèle sont mis à jour moins souvent, mais avec une variance plus faible.
learning_rate_multiplier Number Multiplicateur de taux de formation à utiliser pour la formation. Le taux d’apprentissage de réglage précis est le taux d’apprentissage d’origine utilisé pour la pré-formation, multiplié par cette valeur.

Les taux d’apprentissage plus importants ont tendance à mieux fonctionner que les tailles de lot plus grandes. Nous vous recommandons d’expérimenter des valeurs dans la plage de 0.02 à 0.2 pour voir ce qui produit les meilleurs résultats. Un taux d’apprentissage plus faible peut être utile pour éviter un surajustement.
n_epochs Nombre entier Nombre d’époques pour lesquelles le modèle doit être entraîné. Une époque fait référence à un cycle complet dans le jeu de données de formation.
seed Nombre entier La graine qui contrôle la reproductibilité de la tâche.

Pour en savoir plus sur les hyperparamètres pris en charge pour les autres méthodes de personnalisation, consultez le guide d’optimisation des préférences directes et le guide pour le réglage précis du renforcement.

Sélectionner un type d’entraînement

Sélectionnez le niveau d’entraînement en fonction de votre cas d’usage et de votre budget :

  • Standard : l’entraînement a lieu dans la région actuelle de la ressource Foundry et fournit des garanties pour la résidence des données. Idéal pour les charges de travail où les données doivent rester dans une région spécifique.

  • Global : Offre des tarifs plus abordables par rapport à Standard en utilisant la capacité au-delà de votre région actuelle. Les données et les pondérations sont copiées dans la région où l’entraînement se produit. Idéal si la résidence des données n’est pas une restriction et que vous souhaitez accélérer les temps de file d’attente.

  • Développeur (version préliminaire) : offre des économies significatives en utilisant la capacité inactive pour la formation. Il n’existe aucune garantie de latence ou de contrat SLA. Les travaux de ce niveau peuvent donc être automatiquement préemptés et repris ultérieurement. Il n’existe aucune garantie de résidence des données non plus. Idéal pour l’expérimentation et les charges de travail sensibles aux prix.

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"}"

Vérifier l’état de votre modèle personnalisé

Une fois que vous avez démarré un travail de réglage précis, il peut prendre un certain temps pour terminer. Votre tâche peut être mise en file d’attente derrière d’autres tâches sur le système. L’entraînement de votre modèle peut prendre des minutes ou des heures, en fonction de la taille du modèle et du jeu de données.

L’exemple suivant utilise l’API REST pour vérifier l’état de votre travail d’ajustement. L’exemple récupère des informations sur votre travail à l’aide de l’ID de travail retourné par l’exemple précédent.

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

Lister des événements ajustés

Pour examiner les événements ajustés individuels générés lors de la formation :

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" 

Utiliser des points de contrôle

L’achèvement de chaque époque d’apprentissage génère un point de contrôle. Un point de contrôle est une version entièrement fonctionnelle d’un modèle qui peut être déployé et utilisé comme modèle cible pour les travaux de réglage précis suivants. Les points de contrôle peuvent être particulièrement utiles, car ils peuvent fournir des instantanés avant le surajustement.

Quand un travail de réglage précis se termine, vous disposez des trois versions les plus récentes du modèle disponibles pour le déploiement. Votre modèle affiné représente l’époque finale. Les deux époques précédentes sont disponibles en tant que points de contrôle.

Vous pouvez exécuter la commande suivante pour récupérer la liste des points de contrôle associés à un travail de réglage précis individuel :

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" 

Suspension et reprise

Pendant l’entraînement, vous pouvez afficher les journaux et les métriques, et suspendre le travail en fonction des besoins. La suspension peut être utile si les métriques ne convergent pas ou si vous pensez que le modèle n’apprend pas au bon rythme.

Une fois le travail de formation suspendu et les évaluations de sécurité terminées, un point de contrôle déployable est créé. Ce point de contrôle est disponible pour vous permettre de déployer et d’utiliser pour l’inférence, ou vous pouvez reprendre le travail pour le terminer.

L’opération de pause s’applique uniquement aux travaux entraînés pour au moins une étape et qui se trouvent dans un état En cours d'exécution .

Suspendre

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" 

Reprendre

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" 

Copier un modèle (aperçu)

Vous pouvez maintenant copier un modèle point de contrôle affiné d’une région à l’autre, entre différents abonnements, mais dans le même locataire. Le processus utilise des API dédiées pour garantir des transferts efficaces et sécurisés. Cette fonctionnalité est actuellement disponible uniquement avec l’API et non via le portail Foundry.

Une fois le modèle copié de la région A à la région B, vous pouvez ajuster continuellement le modèle dans la région B et déployer le modèle à partir de cet emplacement.

Remarque

La suppression du point de contrôle du modèle dans la région source n’entraîne pas la suppression du modèle dans la région de destination. Pour supprimer le modèle dans les deux régions après sa copie, vous devez déployer le modèle séparément dans chaque région.

Conditions préalables

  • La ressource ou le compte de destination doit avoir au moins un travail de réglage précis.
  • La ressource de destination ou le compte ne doit pas désactiver l’accès au réseau public (au moins pendant l’envoi de la demande de copie).
  • Vous ne pouvez copier que vers le compte de destination, si le compte qui lance la copie dispose des autorisations suffisantes pour accéder au compte de destination.

Configurer les autorisations

  1. Créez une identité managée affectée à l’utilisateur.
  2. Attribuez le rôle Utilisateur Azure AI à votre identité managée affectée par l'utilisateur sur votre ressource ou compte de destination.
  3. Affecter l’identité managée affectée par l’utilisateur à votre compte de ressource source.

Copier le modèle

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>"
}'

Étant donné qu’il s’agit d’une opération longue, vérifiez l’état de la copie de modèle affinée en fournissant l’ID de point de contrôle du compte source utilisé dans l’appel POST .

Vérifier l’état de copie

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' 

Remarque

Lorsque vous copiez un point de contrôle à partir d’un compte source, le même nom de point de contrôle est conservé dans le compte de destination. Assurez-vous d'utiliser exactement ce même nom pour l'ajustement, le déploiement ou toute autre opération dans le compte de destination. Ce point de contrôle n’apparaît pas dans l’interface utilisateur ou dans l’API list checkpoints .

Analysez votre modèle personnalisé

Azure OpenAI attache un fichier de résultats nommé results.csv à chaque travail de réglage précis une fois terminé. Vous pouvez utiliser le fichier de résultats pour analyser les performances d’entraînement et de validation de votre modèle personnalisé. L’ID de fichier du fichier de résultats est répertorié pour chaque modèle personnalisé. Vous pouvez utiliser l’API REST pour récupérer l’ID de fichier et télécharger le fichier de résultats à des fins d’analyse.

L’exemple Python suivant utilise l’API REST pour récupérer l’ID de fichier du premier fichier de résultat attaché au travail de réglage précis de votre modèle personnalisé. Il télécharge ensuite le fichier dans votre répertoire de travail à des fins d’analyse.

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>

Le fichier de résultats est un fichier CSV qui contient une ligne d’en-tête et une ligne pour chaque étape d’apprentissage effectuée par le travail d’optimisation. Le fichier de résultats contient les colonnes suivantes :

Nom de colonne Descriptif
step Numéro de l’étape d’entraînement. Une étape d’entraînement représente une seule passe, avant et arrière, sur un lot de données d’entraînement.
train_loss Perte du lot d’entraînement.
train_mean_token_accuracy Pourcentage de jetons dans le lot d’entraînement qui ont été correctement prédits par le modèle.

Par exemple, si la taille du lot est définie 3 et que vos données contiennent des achèvements [[1, 2], [0, 5], [4, 2]], cette valeur est définie 0.83 sur (5 sur 6) si le modèle prédit [[1, 1], [0, 5], [4, 2]].
valid_loss Perte du lot de validation.
validation_mean_token_accuracy Pourcentage de jetons dans le lot de validation que le modèle a correctement prédit.

Par exemple, si la taille du lot est définie 3 et que vos données contiennent des achèvements [[1, 2], [0, 5], [4, 2]], cette valeur est définie 0.83 sur (5 sur 6) si le modèle prédit [[1, 1], [0, 5], [4, 2]].
full_valid_loss La perte de validation calculée à la fin de chaque époque. Lorsque la formation va bien, la perte doit diminuer.
full_valid_mean_token_accuracy La précision moyenne valide des jetons calculée à la fin de chaque époque. Lorsque l’entraînement se déroule bien, la précision des jetons doit augmenter.

Vous pouvez également afficher les données de votre results.csv fichier sous forme de tracés dans le portail Foundry. Lorsque vous sélectionnez le lien pour votre modèle entraîné, trois graphiques apparaissent : perte, précision moyenne du jeton et précision du jeton. Si vous avez fourni des données de validation, les deux jeux de données apparaissent sur le même tracé.

Les pertes devraient diminuer avec le temps et la précision augmenter. Si vos données d’entraînement et de validation diffèrent, vous risquez d’être surajusté. Essayez une formation avec moins d’époques ou un multiplicateur de taux d’apprentissage plus petit.

Déployer un modèle affiné

Lorsque vous êtes satisfait des métriques de votre travail de réglage précis ou que vous souhaitez simplement passer à l’inférence, vous devez déployer le modèle.

Si vous effectuez un déploiement pour une validation supplémentaire, envisagez de déployer des tests à l’aide d’un déploiement Développeur.

Si vous êtes prêt à déployer pour la production ou si vous avez des besoins particuliers en matière de résidence des données, suivez le guide de déploiement.

Variable Définition
token Jeton d’autorisation. Il existe plusieurs façons de générer un jeton d’autorisation. La méthode la plus simple pour les tests initiaux consiste à ouvrir Azure Cloud Shell à partir du portail Azure. Exécutez ensuite az account get-access-token. Vous pouvez utiliser ce jeton comme jeton d’autorisation temporaire pour le test d’API. Nous vous recommandons de stocker ce jeton dans une nouvelle variable d’environnement.
subscription ID d’abonnement de la ressource Azure OpenAI associée.
resource_group Nom du groupe de ressources de votre ressource Azure OpenAI.
resource_name Le nom de ressource Azure OpenAI.
model_deployment_name Nom personnalisé de votre nouveau modèle de déploiement ajusté. Ce nom est référencé dans votre code pendant les appels de complétion de conversation.
fine_tuned_model Votre modèle optimisé. Récupérez cette valeur à partir de votre travail d’optimisation des résultats à l’étape précédente. Il ressemble à gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83. Vous devez ajouter la valeur au deploy_data JSON. Vous pouvez également déployer un point de contrôle en passant l’ID de point de contrôle, qui apparaît au format 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"
        }
    }
}'

Pour en savoir plus sur le déploiement interrégion et sur l’utilisation du modèle déployé, consultez Utiliser votre modèle affiné déployé.

Effectuer un réglage précis continu

Après avoir créé un modèle affiné, vous souhaiterez peut-être continuer à affiner le modèle au fil du temps grâce à un réglage plus précis. L’ajustement continu correspond au processus itératif de sélection d’un modèle déjà affiné comme modèle de base et à l’ajuster davantage sur de nouveaux ensembles d’exemples d’apprentissage. L'ajustement fin continu est pris en charge uniquement pour les modèles OpenAI.

Pour effectuer un réglage précis sur un modèle que vous avez précédemment affiné, vous utilisez le même processus décrit dans Créer un modèle personnalisé. Mais au lieu de spécifier le nom d’un modèle de base générique, vous spécifiez l’ID de votre modèle affiné. L’ID du modèle affiné ressemble à 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>"
}'

Nous vous recommandons également d’inclure le suffix paramètre pour distinguer plus facilement les itérations de votre modèle affiné. Le suffix paramètre prend une chaîne et est défini pour identifier le modèle affiné. Le suffixe peut contenir jusqu’à 40 caractères (a à z, A à Z, 0 à 9, -et _) ajoutés au nom de votre modèle affiné.

Si vous n’êtes pas sûr de l’ID de votre modèle affiné existant, vous trouverez ces informations sur la page Modèles de Foundry. Vous pouvez également générer une liste de modèles pour une ressource Azure OpenAI à l’aide de l’API REST.

Nettoyez vos déploiements, modèles personnalisés et fichiers d’entraînement

Lorsque vous n’avez plus besoin de votre modèle personnalisé, vous pouvez supprimer le déploiement et le modèle. Vous pouvez également supprimer les fichiers d’entraînement et de validation que vous avez chargés sur le service, si nécessaire.

Supprimer votre modèle de déploiement

Vous pouvez utiliser l’une de ces méthodes pour supprimer le déploiement de votre modèle personnalisé :

Supprimer votre modèle personnalisé

Vous pouvez supprimer votre modèle personnalisé à l’aide de Foundry.

Remarque

Vous ne pouvez pas supprimer un modèle personnalisé s’il a un déploiement existant. Vous devez supprimer votre déploiement de modèle avant de pouvoir supprimer votre modèle personnalisé.

Supprimer vos fichiers de formation

Vous pouvez éventuellement supprimer des fichiers d’apprentissage et de validation que vous avez chargés pour l’apprentissage, ainsi que les fichiers de résultats générés pendant l’apprentissage, à partir de votre abonnement Azure OpenAI. Vous pouvez utiliser Foundry pour supprimer les fichiers.

Il existe deux expériences uniques de réglage précis dans le portail Microsoft Foundry :

Important

Les éléments marqués (aperçu) dans cet article sont actuellement en aperçu public. Cette version préliminaire est fournie sans contrat de niveau de service, et nous la déconseillons pour les charges de travail en production. Certaines fonctionnalités peuvent être limitées ou non prises en charge. Pour plus d’informations, consultez Conditions d’utilisation supplémentaires pour les préversions de Microsoft Azure.

Conditions préalables

Modèles pris en charge

Pour vérifier quelles régions prennent actuellement en charge le réglage précis, consultez l’article sur les modèles.

Ou vous pouvez ajuster un modèle précédemment affiné, mis en forme comme base-model.ft-{jobid}.

Passez en revue le flux de travail du portail Foundry

Prenez un moment pour passer en revue le processus d'ajustement pour l’utilisation du portail Foundry :

  1. Préparez vos données d’apprentissage et de validation.
  2. Utilisez la boîte de dialogue Créer un modèle affiné dans le portail Foundry pour entraîner votre modèle personnalisé.
    1. Sélectionnez une méthode d’entraînement.
    2. Sélectionnez un modèle de base.
    3. Choisissez votre type d’entraînement.
    4. Choisissez vos données d’entraînement.
    5. Si vous le souhaitez, choisissez vos données de validation.
    6. Si vous le souhaitez, configurez les paramètres de tâche pour votre travail de réglage précis.
    7. Si vous le souhaitez, activez le déploiement automatique pour le modèle personnalisé résultant.
    8. Passez en revue vos choix et entraînez votre nouveau modèle personnalisé.
  3. Vérifier l’état de votre modèle personnalisé et ajusté.
  4. Déployez votre modèle personnalisé pour l’utiliser.
  5. Utilisez votre modèle personnalisé.
  6. Éventuellement, analysez votre modèle personnalisé afin d’en évaluer les performances et l’adaptation.

Préparer vos données d’entraînement et de validation

Vos jeux de données d’entraînement et de validation se composent d’exemples d’entrée et de sortie montrant comment vous souhaitez que le modèle fonctionne.

Les données d’apprentissage et de validation que vous utilisez doivent être mises en forme sous forme de document JSON Lines (JSONL). Elle doit également être mise en forme selon le format conversationnel que l'API Chat Completions utilise.

Outre le format JSONL, les fichiers de données d’apprentissage et de validation doivent être encodés en UTF-8 et inclure une marque d’ordre d’octet (BOM). Chaque fichier doit avoir une taille inférieure à 512 Mo.

Nous vous recommandons généralement d’utiliser les instructions et les invites que vous avez trouvées optimales dans chaque exemple de formation. Cette approche vous aide à obtenir les meilleurs résultats, en particulier si vous avez moins d’une centaine d’exemples.

Exemple de format de fichier

{"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."}]}

Format de fichier de discussion à plusieurs tours d'Azure OpenAI

Plusieurs tours d’une conversation dans une seule ligne de votre fichier d’entraînement JSONL sont également pris en charge. Pour ignorer le réglage précis sur des messages d’assistant spécifiques, ajoutez la paire clé/valeur facultative weight. Actuellement, weight peut être défini sur 0 ou 1.

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital/major city 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}]}

Saisies semi-automatiques de conversation avec vision

{"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."}]}

Considérations relatives à la taille du jeu de données

Plus vous avez d’exemples de formation, mieux c’est. Les travaux de réglage précis ne se dérouleront pas sans au moins 10 exemples d’apprentissage, mais un si petit nombre n’est pas suffisant pour influencer de façon notable les réponses du modèle. Une bonne pratique pour la réussite de l’optimisation est de fournir des centaines, voire des milliers, d’exemples d’entraînement. Nous vous recommandons de commencer par 50 exemples bien conçus.

En général, le doublement de la taille du jeu de données peut entraîner une augmentation linéaire de la qualité du modèle. Mais gardez à l’esprit que les exemples de faible qualité peuvent affecter négativement les performances. Si vous entraînez le modèle sur une grande quantité de données internes sans d’abord élaguer le jeu de données en ne conservant que les exemples de la plus haute qualité, votre modèle pourrait avoir de moins bonnes performances que prévu.

Créer un modèle affiné

Le portail Foundry fournit la boîte de dialogue Créer un modèle affiné pour vous permettre de créer et d’entraîner un modèle affiné pour votre ressource Azure en un seul endroit.

  1. Accédez au portail Foundry et connectez-vous avec les informations d’identification qui ont accès à votre ressource Azure OpenAI. Pendant le flux de travail de connexion, sélectionnez le répertoire approprié, l’abonnement Azure et la ressource Azure OpenAI.

  2. Accédez à Tools>Fine-tuning, puis sélectionnez Ajuster le modèle.

    Capture d’écran montrant les sélections pour la création d’un modèle personnalisé dans le portail Foundry.

  3. Sélectionnez un modèle à ajuster, puis sélectionnez Suivant.

    Capture d’écran de la sélection du modèle dans le portail Foundry.

    La boîte de dialogue Créer un modèle affiné s’affiche.

    Capture d’écran de la boîte de dialogue pour la création d’un modèle affiné.

Choisir votre méthode d’entraînement

La première étape consiste à confirmer votre choix de modèle et la méthode d’entraînement. Tous les modèles ne prennent pas en charge toutes les méthodes d’entraînement.

Lorsque vous sélectionnez le modèle, vous pouvez également sélectionner un modèle précédemment affiné, comme décrit plus loin dans cet article.

Choisissez votre type d’entraînement

Foundry offre trois niveaux de formation pour répondre aux besoins des clients.

Niveau d’entraînement standard

Le niveau Standard fournit une capacité dédiée pour un réglage précis avec des performances prévisibles et des contrats SLA. Il est idéal pour les charges de travail de production qui nécessitent un débit garanti.

Niveau d’entraînement Global Standard

Le niveau de formation mondial étend la portée de la personnalisation du modèle avec la tarification plus abordable d'autres offres mondiales. Elle ne propose pas de localisation des données. Si vous avez besoin d’une résidence de données, consultez la liste des régions disponibles pour votre modèle choisi.

Vos données d’apprentissage et les pondérations de modèle résultantes peuvent être copiées dans une autre région Azure.

Lorsque vous utilisez ce niveau, vous pouvez :

  • Entraîner les derniers modèles OpenAI à partir de plus d’une douzaine de régions Azure OpenAI.
  • Bénéficiez d’un taux d’entraînement par jeton inférieur par rapport au niveau Standard.

Niveau de formation pour les développeurs

Le niveau Développeur est une option économique qui utilise la capacité inactive pour les charges de travail non urgentes ou exploratoires. Les travaux de ce niveau peuvent être préemptés et repris ultérieurement. Il est donc idéal pour l’expérimentation et les cas d’usage sensibles aux coûts.

Choisir vos données d’entraînement

L’étape suivante consiste à choisir des données d’entraînement préparées existantes ou à charger de nouvelles données d’apprentissage préparées à utiliser lorsque vous personnalisez votre modèle en sélectionnant Ajouter des données d’entraînement.

La boîte de dialogue Données d’entraînement affiche les jeux de données existants, précédemment chargés. Il fournit également des options pour charger de nouvelles données d’apprentissage.

Capture d’écran du volet pour les données d’apprentissage dans le portail Foundry

  • Si vos données d’apprentissage sont déjà chargées sur le service, sélectionnez Fichiers de la ressource IA connectée. Sélectionnez ensuite le fichier dans la liste déroulante.

  • Pour charger de nouvelles données d’apprentissage, utilisez l’une des options suivantes :

    • Sélectionnez Charger des fichiers pour charger des données d’apprentissage à partir d’un fichier local.
    • Sélectionnez l’objet Blob Azure ou d'autres emplacements web partagés pour importer des données d'apprentissage à partir du Stockage d’objets Blob Azure ou d'autres emplacements web partagés.

Pour les fichiers de données volumineux, nous vous recommandons d’importer à partir du stockage Blob. Les fichiers volumineux peuvent devenir instables lorsque vous les chargez via des formulaires multipart, car les requêtes sont atomiques et ne peuvent pas être retentées ou reprise. Pour plus d’informations sur Azure Blob Storage, consultez la section Qu’est-ce qu’Azure Blob Storage ?.

Choisir vos données de validation (facultatif)

Si vous avez un jeu de données de validation, sélectionnez Ajouter des données d’entraînement. Vous pouvez choisir des données de validation préparées existantes ou charger de nouvelles données de validation préparées à utiliser lorsque vous personnalisez votre modèle.

La boîte de dialogue Données de validation affiche les jeux de données d’apprentissage et de validation existants, précédemment chargés. Il fournit également des options pour charger de nouvelles données de validation.

Capture d’écran du volet pour les données de validation dans le portail Foundry.

  • Si vos données de validation sont déjà chargées dans le service, sélectionnez Choisir un jeu de données. Sélectionnez ensuite le fichier dans la liste déroulante.

  • Pour charger de nouvelles données de validation, utilisez l’une des options suivantes :

    • Sélectionnez Fichier local pour charger des données de validation à partir d’un fichier local.
    • Sélectionnez Azure Blob ou d'autres emplacements web partagés pour importer les données de validation depuis le stockage Azure Blob ou d'autres emplacements web partagés.

Pour les fichiers de données volumineux, nous vous recommandons d’importer à partir du stockage Blob. Les fichiers volumineux peuvent devenir instables lorsque vous les chargez via des formulaires multipart, car les requêtes sont atomiques et ne peuvent pas être retentées ou reprise.

Rendre votre modèle identifiable (facultatif)

Nous vous recommandons d'inclure un paramètre suffix afin de mieux distinguer entre les itérations de votre modèle affiné. Un suffix paramètre prend une chaîne allant jusqu’à 18 caractères et est utilisé pour nommer le modèle affiné résultant.

Configurer des paramètres d’entraînement (facultatif)

Vous pouvez fournir une valeur de départ facultative et régler des hyperparamètres supplémentaires.

Une graine contrôle la reproductibilité du travail. La transmission des mêmes paramètres de départ et de travail doit produire les mêmes résultats, mais peut différer dans de rares cas. Si vous ne spécifiez pas de valeur initiale, une valeur est générée de manière aléatoire pour vous.

Capture d’écran de la zone pour configurer une valeur initiale et des hyperparamètres dans le portail Foundry.

Les hyperparamètres suivants sont disponibles pour le réglage via le portail Foundry :

Nom Type Descriptif
Taille du lot Nombre entier Taille de lot à utiliser pour la formation. La taille du lot est le nombre d’exemples de formation utilisés pour entraîner un seul passage avant et arrière. En général, nous constatons que les tailles de lots plus grandes ont tendance à fonctionner mieux pour les jeux de données plus volumineux.

La valeur par défaut et la valeur maximale de cette propriété sont spécifiques à un modèle de base. Une taille de lot plus grande signifie que les paramètres de modèle sont mis à jour moins souvent, mais avec une variance plus faible.
Multiplicateur du taux d’apprentissage Number Multiplicateur de taux de formation à utiliser pour la formation. Le taux d’apprentissage de réglage précis est le taux d’apprentissage d’origine utilisé pour la pré-formation, multiplié par cette valeur.

Les taux d’apprentissage plus importants ont tendance à mieux fonctionner que les tailles de lot plus grandes. Nous vous recommandons d’expérimenter des valeurs comprises entre 0,02 et 0,2 pour voir ce qui produit les meilleurs résultats. Un taux d’apprentissage plus faible peut être utile pour éviter un surajustement.
Nombre d’époques Nombre entier Nombre d’époques pour lesquelles le modèle doit être entraîné. Une époque fait référence à un cycle complet dans le jeu de données de formation.

Activer le déploiement automatique (facultatif)

Pour gagner du temps, vous pouvez éventuellement activer le déploiement automatique pour votre modèle résultant. Si l’entraînement se termine correctement, le modèle est déployé en fonction du type de déploiement sélectionné. Le nom de déploiement est basé sur le nom unique généré pour votre modèle personnalisé et le suffixe facultatif que vous avez peut-être fourni précédemment.

Capture d’écran du commutateur pour le déploiement automatique dans le portail Foundry.

Remarque

Seuls les déploiements Global Standard et Développeur sont actuellement pris en charge pour le déploiement automatique. Aucune de ces options ne fournit de résidence des données. Pour plus d’informations, consultez la documentation relative aux types de déploiement.

Passez en revue vos choix et entraîner votre modèle

Passez en revue vos choix, puis sélectionnez Envoyer pour commencer à former votre nouveau modèle affiné.

Vérifier l’état de votre modèle personnalisé

Une fois que vous avez envoyé votre travail de réglage précis, une page s’affiche avec des détails sur votre modèle affiné. Vous pouvez trouver l’état et plus d’informations sur votre modèle optimisé sur la page Réglage dans le portail Foundry.

Votre tâche peut être mise en file d’attente derrière d’autres tâches sur le système. L’entraînement de votre modèle peut prendre des minutes ou des heures, en fonction de la taille du modèle et du jeu de données.

Générer des points de contrôle

Une fois chaque époque d’apprentissage terminée, un point de contrôle est généré. Un point de contrôle est une version entièrement fonctionnelle d’un modèle qui peut être déployé et utilisé comme modèle cible pour les travaux de réglage précis suivants.

Les points de contrôle peuvent être particulièrement utiles, car ils peuvent fournir des instantanés avant le surajustement. Quand un travail de réglage précis se termine, vous disposez des trois versions les plus récentes du modèle disponibles pour le déploiement. Vous pouvez copier des points de contrôle entre les ressources et les abonnements via l’API REST.

Suspension et reprise

Vous pouvez suivre la progression dans les deux vues d’ajustement du portail Foundry. Votre travail passe par les mêmes états que les travaux d’optimisation standard (en file d’attente, en cours d’exécution, réussi).

Vous pouvez également passer en revue les fichiers de résultats pendant les exécutions d’entraînement, afin d’obtenir un aperçu de la progression et de savoir si votre formation se poursuit comme prévu.

Pendant l’entraînement, vous pouvez afficher les métriques et suspendre le travail en fonction des besoins. La suspension peut être utile si les métriques ne convergent pas ou si vous pensez que le modèle n’apprend pas au bon rythme. Lorsque vous suspendez un travail de formation, un point de contrôle déployable est créé une fois les évaluations de sécurité terminées. Ce point de contrôle est disponible pour vous permettre de déployer et d’utiliser pour l’inférence, ou vous pouvez reprendre le travail pour le terminer. L’opération de pause s’applique uniquement aux travaux entraînés pour au moins une étape et qui se trouvent dans un état En cours d'exécution .

Capture d’écran du réglage précis du renforcement avec un travail en cours d’exécution.

Analyser votre modèle personnalisé

Azure OpenAI attache un fichier de résultats nommé results.csv à chaque travail de réglage précis une fois terminé. Vous pouvez utiliser le fichier de résultats pour analyser les performances d’apprentissage et de validation de votre modèle personnalisé. L’ID de fichier du fichier de résultats est répertorié pour chaque modèle personnalisé dans la colonne ID de fichier de résultat dans le volet Modèles du portail Foundry. Vous pouvez utiliser l’ID de fichier pour identifier et télécharger le fichier de résultats à partir du volet Fichiers de données du portail Foundry.

Le fichier de résultats est un fichier CSV qui contient une ligne d’en-tête et une ligne pour chaque étape d’apprentissage effectuée par le travail d’optimisation. Le fichier de résultats contient les colonnes suivantes :

Nom de colonne Descriptif
step Numéro de l’étape d’entraînement. Une étape d’entraînement représente une seule passe, avant et arrière, sur un lot de données d’entraînement.
train_loss Perte du lot d’entraînement.
train_mean_token_accuracy Pourcentage de jetons dans le lot d’entraînement qui ont été correctement prédits par le modèle.

Par exemple, si la taille du lot est définie 3 et que vos données contiennent des achèvements [[1, 2], [0, 5], [4, 2]], cette valeur est définie 0.83 sur (5 sur 6) si le modèle prédit [[1, 1], [0, 5], [4, 2]].
valid_loss Perte du lot de validation.
validation_mean_token_accuracy Pourcentage de jetons dans le lot de validation que le modèle a correctement prédit.

Par exemple, si la taille du lot est définie 3 et que vos données contiennent des achèvements [[1, 2], [0, 5], [4, 2]], cette valeur est définie 0.83 sur (5 sur 6) si le modèle prédit [[1, 1], [0, 5], [4, 2]].
full_valid_loss La perte de validation calculée à la fin de chaque époque. Lorsque la formation va bien, la perte doit diminuer.
full_valid_mean_token_accuracy La précision moyenne valide des jetons calculée à la fin de chaque époque. Lorsque l’entraînement se déroule bien, la précision des jetons doit augmenter.

Vous pouvez également afficher les données de votre results.csv fichier sous forme de tracés dans le portail Foundry. Lorsque vous sélectionnez le lien pour votre modèle entraîné, trois graphiques apparaissent : perte, précision moyenne du jeton et précision du jeton. Si vous avez fourni des données de validation, les deux jeux de données apparaissent sur le même tracé.

Les pertes devraient diminuer avec le temps et la précision augmenter. Si vos données d’entraînement et de validation diffèrent, vous risquez d’être surajusté. Essayez une formation avec moins d’époques ou un multiplicateur de taux d’apprentissage plus petit.

Déployer un modèle affiné

Lorsque vous êtes satisfait des métriques de votre travail de réglage précis ou que vous souhaitez simplement passer à l’inférence, vous devez déployer le modèle.

Si vous effectuez un déploiement pour une validation supplémentaire, envisagez de déployer des tests à l’aide d’un déploiement Développeur.

Si vous êtes prêt à déployer pour la production ou si vous avez des besoins particuliers en matière de résidence des données, suivez le guide de déploiement.

Utiliser un modèle ajusté déployé

Après avoir déployé votre modèle affiné, vous pouvez l’utiliser comme n’importe quel autre modèle déployé. Vous pouvez utiliser le terrain de jeu dans Foundry pour expérimenter votre nouveau déploiement. Vous pouvez également utiliser l’API REST pour appeler votre modèle ajusté à partir de votre application. Vous pouvez même commencer à utiliser ce nouveau modèle ajusté dans votre flux d’invite pour générer votre application d’IA générative.

Remarque

Pour les modèles de conversation, le message système que vous utilisez pour guider votre modèle affiné (qu’il soit déployé ou disponible pour les tests dans le terrain de jeu) doit être identique au message système que vous avez utilisé pour l’entraînement. Si vous utilisez un autre message système, il est possible que le modèle ne fonctionne pas comme prévu.

Effectuer un réglage précis continu

Après avoir créé un modèle affiné, vous souhaiterez peut-être continuer à affiner le modèle au fil du temps grâce à un réglage plus précis. L’ajustement continu correspond au processus itératif de sélection d’un modèle déjà affiné comme modèle de base et à l’ajuster davantage sur de nouveaux ensembles d’exemples d’apprentissage.

Pour effectuer un réglage précis sur un modèle que vous avez précédemment affiné, vous utilisez le même processus décrit dans Créer un modèle affiné. Mais au lieu de spécifier le nom d’un modèle de base générique, vous spécifiez votre modèle déjà affiné. Un modèle affiné personnalisé ressemble à gpt-4o-2024-08-06.ft-d93dda6110004b4da3472d96f4dd4777-ft.

Capture d’écran de l’interface pour la création d’un modèle personnalisé, avec un modèle affiné mis en surbrillance.

Nettoyer vos déploiements, modèles personnalisés et fichiers d’apprentissage

Lorsque vous n’avez plus besoin de votre modèle personnalisé, vous pouvez supprimer le déploiement et le modèle. Vous pouvez également supprimer les fichiers d’entraînement et de validation que vous avez chargés sur le service, si nécessaire.

Supprimer votre modèle de déploiement

Important

Après avoir déployé un modèle personnalisé, si à tout moment le déploiement reste inactif pendant plus de 15 jours, le déploiement est supprimé. Le déploiement d’un modèle personnalisé est inactif si le modèle a été déployé il y a plus de 15 jours et qu’aucun appel d’API pour des conversations ou des réponses n’a été effectué sur une période continue de 15 jours.

La suppression d’un déploiement inactif ne supprime pas ou n’affecte pas le modèle personnalisé sous-jacent. Le modèle personnalisé peut être redéployé à tout moment.

Comme décrit dans la tarification d’Azure OpenAI dans Microsoft Foundry Models, chaque modèle personnalisé (réglé) déployé entraîne un coût d’hébergement horaire, même si aucun appel d’API pour des conversations ou des réponses n'est effectué sur le modèle. Pour en savoir plus sur la planification et la gestion des coûts avec Azure OpenAI, consultez Planifier et gérer les coûts pour Azure OpenAI.

Vous pouvez supprimer le déploiement de votre modèle personnalisé dans le volet Déploiements dans le portail Foundry. Sélectionnez le déploiement à supprimer, puis sélectionnez Supprimer.

Supprimer votre modèle personnalisé

Vous pouvez supprimer un modèle personnalisé dans le volet Modèles dans le portail Foundry. Sélectionnez le modèle personnalisé à supprimer de l’onglet Modèles personnalisés , puis sélectionnez Supprimer.

Remarque

Vous ne pouvez pas supprimer un modèle personnalisé s’il a un déploiement existant. Vous devez supprimer votre déploiement de modèle avant de pouvoir supprimer votre modèle personnalisé.

Supprimer vos fichiers de formation

Vous pouvez éventuellement supprimer des fichiers d’entraînement et de validation que vous avez chargés pour l’entraînement, ainsi que les fichiers de résultats générés pendant l’entraînement, dans le volet Données de gestion>+ index dans le portail Foundry. Sélectionnez le fichier à supprimer, puis sélectionnez Supprimer.

Conditions préalables

Modèles pris en charge

Pour vérifier quelles régions prennent actuellement en charge le réglage précis, consultez l’article sur les modèles.

Ou vous pouvez ajuster un modèle précédemment affiné, mis en forme comme base-model.ft-{jobid}.

Vérifier le flux de travail du Kit de développement logiciel (SDK) Python

Prenez un moment pour vérifier le flux de travail d’ajustement de l’utilisation du SDK Python avec Azure OpenAI :

  1. Préparez vos données d’apprentissage et de validation.
  2. Sélectionnez un modèle de base.
  3. Chargez vos données d’apprentissage.
  4. Entraînez votre nouveau modèle personnalisé.
  5. Vérifiez l’état de votre modèle personnalisé.
  6. Déployez votre modèle personnalisé pour l’utilisation.
  7. Utilisez votre modèle personnalisé.
  8. Éventuellement, analysez votre modèle personnalisé pour en évaluer les performances et l’adaptation.

Préparer vos données d’entraînement et de validation

Vos jeux de données d’entraînement et de validation se composent d’exemples d’entrée et de sortie montrant comment vous souhaitez que le modèle fonctionne.

Les données d’apprentissage et de validation que vous utilisez doivent être mises en forme sous forme de document JSON Lines (JSONL). Elle doit également être mise en forme selon le format conversationnel que l'API Chat Completions utilise.

Outre le format JSONL, les fichiers de données d’apprentissage et de validation doivent être encodés en UTF-8 et inclure une marque d’ordre d’octet (BOM). Chaque fichier doit avoir une taille inférieure à 512 Mo.

Si vous souhaitez une procédure pas à pas de réglage gpt-4o-mini-2024-07-18précis, consultez le didacticiel d’optimisation d’Azure OpenAI.

Exemple de format de fichier

{"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."}]}

Format de fichier de conversation à plusieurs tours

Plusieurs tours d’une conversation dans une seule ligne de votre fichier d’entraînement JSONL sont également pris en charge. Pour ignorer le réglage précis sur des messages d’assistant spécifiques, ajoutez la paire clé/valeur facultative weight. Actuellement, weight peut être défini sur 0 ou 1.

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital/major city 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}]}

Saisies semi-automatiques de conversation avec vision

{"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."}]}

Créer vos jeux de données d’apprentissage et de validation

Plus vous avez d’exemples de formation, mieux c’est. Les travaux de réglage précis ne se dérouleront pas sans au moins 10 exemples d’apprentissage, mais un si petit nombre n’est pas suffisant pour influencer de façon notable les réponses du modèle. Une bonne pratique pour la réussite de l’optimisation est de fournir des centaines, voire des milliers, d’exemples d’entraînement.

En général, le doublement de la taille du jeu de données peut entraîner une augmentation linéaire de la qualité du modèle. Mais gardez à l’esprit que les exemples de faible qualité peuvent affecter négativement les performances. Si vous entraînez le modèle sur une grande quantité de données internes sans d’abord élaguer le jeu de données en ne conservant que les exemples de la plus haute qualité, votre modèle pourrait avoir de moins bonnes performances que prévu.

Charger vos données d’entraînement

L’étape suivante consiste à choisir des données d’apprentissage préparées existantes ou à charger de nouvelles données d’apprentissage préparées à utiliser lorsque vous personnalisez votre modèle. Après avoir préparé vos données d’apprentissage, vous pouvez charger vos fichiers dans le service. Il existe deux façons de charger des données d’apprentissage :

Pour les fichiers de données volumineux, nous vous recommandons d’importer à partir du stockage Blob. Les fichiers volumineux peuvent devenir instables lorsque vous les chargez via des formulaires multipart, car les requêtes sont atomiques et ne peuvent pas être retentées ou reprise. Pour plus d’informations sur Azure Blob Storage, consultez la section Qu’est-ce qu’Azure Blob Storage ?.

L’exemple Python suivant charge les fichiers de formation et de validation locaux à l’aide du Kit de développement logiciel (SDK) Python et récupère les ID de fichier retournés :

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)

Créer un modèle personnalisé

Après avoir chargé vos fichiers d’entraînement et de validation, vous êtes prêt à démarrer la tâche de réglage précis.

Le code Python suivant montre un exemple de création d’un travail de réglage précis à l’aide du Kit de développement logiciel (SDK) Python :

response = client.fine_tuning.jobs.create(
    training_file=training_file_id,
    validation_file=validation_file_id,
    model="gpt-4.1-2025-04-14", # Enter the base model name.
    suffix="my-model", # Custom suffix for naming the resulting model. Note that in Microsoft Foundry, the model can't contain dot/period characters.
    seed=105, # Seed parameter controls reproducibility of the fine-tuning job. If you don't specify a seed, one is generated automatically.
    extra_body={ "trainingType": "GlobalStandard" } # Change this value 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 takes some time to start and finish.

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

Remarque

Nous vous recommandons d’utiliser le niveau Global Standard pour le type d’entraînement, car il offre des économies de coûts et utilise la capacité globale pour des temps de mise en file d’attente plus rapides. Toutefois, il copie les données et les pondérations en dehors de la région de ressource actuelle. Si la résidence des données est requise, utilisez un modèle qui prend en charge la formation de niveau Standard.

Vous pouvez également passer des paramètres facultatifs supplémentaires, comme les hyperparamètres, pour prendre un meilleur contrôle du processus de réglage précis. Pour l’apprentissage initial, nous vous recommandons d’utiliser les valeurs automatiques par défaut présentes sans spécifier ces paramètres.

Les hyperparamètres actuellement pris en charge pour le réglage précis supervisé sont les suivants :

Nom Type Descriptif
batch_size Nombre entier Taille de lot à utiliser pour la formation. La taille du lot est le nombre d’exemples de formation utilisés pour entraîner un seul passage avant et arrière. En général, nous constatons que les tailles de lots plus grandes ont tendance à fonctionner mieux pour les jeux de données plus volumineux.

La valeur par défaut et la valeur maximale de cette propriété sont spécifiques à un modèle de base. Une taille de lot plus grande signifie que les paramètres de modèle sont mis à jour moins souvent, mais avec une variance plus faible.
learning_rate_multiplier Number Multiplicateur de taux de formation à utiliser pour la formation. Le taux d’apprentissage de réglage précis est le taux d’apprentissage d’origine utilisé pour la pré-formation, multiplié par cette valeur.

Les taux d’apprentissage plus importants ont tendance à mieux fonctionner que les tailles de lot plus grandes. Nous vous recommandons d’expérimenter des valeurs dans la plage de 0.02 à 0.2 pour voir ce qui produit les meilleurs résultats. Un taux d’apprentissage plus faible peut être utile pour éviter un surajustement.
n_epochs Nombre entier Nombre d’époques pour lesquelles le modèle doit être entraîné. Une époque fait référence à un cycle complet dans le jeu de données de formation.
seed Nombre entier La graine qui contrôle la reproductibilité de la tâche. La transmission des mêmes paramètres de départ et de travail doit produire les mêmes résultats, mais peut différer dans de rares cas. Si vous ne spécifiez pas de graine, une graine est générée pour vous.

Pour définir des hyperparamètres personnalisés avec la version 1.x de l’API Python OpenAI, fournissez-les dans le cadre de 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 is using supervised fine-tuning.
    "supervised": {
      "hyperparameters": {
        "n_epochs": 2
      }
    }
  },
  extra_body={ "trainingType": "GlobalStandard" }
)

Pour en savoir plus sur les hyperparamètres pris en charge pour les autres méthodes de personnalisation, consultez le guide d’optimisation des préférences directes et le guide pour le réglage précis du renforcement.

Type d’entraînement

Sélectionnez le niveau d’entraînement en fonction de votre cas d’usage et de votre budget :

  • Standard : l’entraînement a lieu dans la région actuelle de la ressource Foundry et fournit des garanties pour la résidence des données. Idéal pour les charges de travail où les données doivent rester dans une région spécifique.

  • Global : Offre des tarifs plus abordables par rapport à Standard en utilisant la capacité au-delà de votre région actuelle. Les données et les pondérations sont copiées dans la région où l’entraînement se produit. Idéal si la résidence des données n’est pas une restriction et que vous souhaitez accélérer les temps de file d’attente.

  • Développeur (version préliminaire) : offre des économies significatives en utilisant la capacité inactive pour la formation. Il n’existe aucune garantie de latence ou de contrat SLA. Les travaux de ce niveau peuvent donc être automatiquement préemptés et repris ultérieurement. Il n’existe aucune garantie pour la résidence des données. Idéal pour l’expérimentation et les charges de travail sensibles aux prix.

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)

Vérifier l’état du travail d’ajustement

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

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

Lister des événements ajustés

Pour examiner les événements de réglage précis individuels générés pendant l’entraînement, exécutez la commande suivante. Avant d’exécuter la commande, vous devrez peut-être mettre à niveau votre bibliothèque cliente OpenAI vers la dernière version à l’aide de pip install openai --upgrade.

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

Utiliser des points de contrôle

L’achèvement de chaque époque d’apprentissage génère un point de contrôle. Un point de contrôle est une version entièrement fonctionnelle d’un modèle qui peut être déployé et utilisé comme modèle cible pour les travaux de réglage précis suivants. Les points de contrôle peuvent être particulièrement utiles, car ils peuvent fournir des instantanés avant le surajustement.

Quand un travail de réglage précis se termine, vous disposez des trois versions les plus récentes du modèle disponibles pour le déploiement. Votre modèle affiné représente l’époque finale. Les deux époques précédentes sont disponibles en tant que points de contrôle.

Vous pouvez exécuter la commande suivante pour récupérer la liste des points de contrôle associés à un travail de réglage précis individuel. Avant d’exécuter la commande, vous devrez peut-être mettre à niveau votre bibliothèque cliente OpenAI vers la dernière version à l’aide de pip install openai --upgrade.

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

Analysez votre modèle personnalisé

Azure OpenAI attache un fichier de résultats nommé results.csv à chaque travail de réglage précis une fois terminé. Vous pouvez utiliser le fichier de résultats pour analyser les performances d’entraînement et de validation de votre modèle personnalisé. L’ID de fichier du fichier de résultats est répertorié pour chaque modèle personnalisé. Vous pouvez utiliser le Kit de développement logiciel (SDK) Python pour récupérer l’ID de fichier et télécharger le fichier de résultats à des fins d’analyse.

L’exemple Python suivant récupère l’ID de fichier du premier fichier de résultat attaché au travail de réglage précis de votre modèle personnalisé. Il utilise ensuite le Kit de développement logiciel (SDK) Python pour télécharger le fichier dans votre répertoire de travail actuel pour l’analyse.

# 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)

Le fichier de résultats est un fichier CSV qui contient une ligne d’en-tête et une ligne pour chaque étape d’apprentissage effectuée par le travail d’optimisation. Le fichier de résultats contient les colonnes suivantes :

Nom de colonne Descriptif
step Numéro de l’étape d’entraînement. Une étape d’entraînement représente une seule passe, avant et arrière, sur un lot de données d’entraînement.
train_loss Perte du lot d’entraînement.
train_mean_token_accuracy Pourcentage de jetons dans le lot d’entraînement qui ont été correctement prédits par le modèle.

Par exemple, si la taille du lot est définie 3 et que vos données contiennent des achèvements [[1, 2], [0, 5], [4, 2]], cette valeur est définie 0.83 sur (5 sur 6) si le modèle prédit [[1, 1], [0, 5], [4, 2]].
valid_loss Perte du lot de validation.
validation_mean_token_accuracy Pourcentage de jetons dans le lot de validation que le modèle a correctement prédit.

Par exemple, si la taille du lot est définie 3 et que vos données contiennent des achèvements [[1, 2], [0, 5], [4, 2]], cette valeur est définie 0.83 sur (5 sur 6) si le modèle prédit [[1, 1], [0, 5], [4, 2]].
full_valid_loss La perte de validation calculée à la fin de chaque époque. Lorsque la formation va bien, la perte doit diminuer.
full_valid_mean_token_accuracy La précision moyenne valide des jetons calculée à la fin de chaque époque. Lorsque l’entraînement se déroule bien, la précision des jetons doit augmenter.

Vous pouvez également afficher les données de votre results.csv fichier sous forme de tracés dans le portail Microsoft Foundry. Lorsque vous sélectionnez le lien pour votre modèle entraîné, trois graphiques apparaissent : perte, précision moyenne du jeton et précision du jeton. Si vous avez fourni des données de validation, les deux jeux de données apparaissent sur le même tracé.

Les pertes devraient diminuer avec le temps et la précision augmenter. Si vos données d’entraînement et de validation diffèrent, vous risquez d’être surajusté. Essayez une formation avec moins d’époques ou un multiplicateur de taux d’apprentissage plus petit.

Déployer un modèle affiné

Lorsque vous êtes satisfait des métriques de votre travail de réglage précis ou que vous souhaitez simplement passer à l’inférence, vous devez déployer le modèle.

Si vous effectuez un déploiement pour une validation supplémentaire, envisagez de déployer des tests à l’aide d’un déploiement Développeur.

Contrairement aux commandes précédentes du Kit de développement logiciel (SDK), vous devez utiliser l’API du plan de contrôle pour le déploiement. Cette tâche nécessite une autorisation distincte, un chemin d’ACCÈS d’API différent et une autre version de l’API.

Variable Définition
token Jeton d’autorisation. Il existe plusieurs façons de générer un jeton d’autorisation. La méthode la plus simple pour les tests initiaux consiste à ouvrir Azure Cloud Shell à partir du portail Azure. Exécutez ensuite az account get-access-token. Vous pouvez utiliser ce jeton comme jeton d’autorisation temporaire pour le test d’API. Nous vous recommandons de stocker ce jeton dans une nouvelle variable d’environnement.
subscription ID d’abonnement de la ressource Azure OpenAI associée.
resource_group Nom du groupe de ressources de votre ressource Azure OpenAI.
resource_name Le nom de ressource Azure OpenAI.
model_deployment_name Nom personnalisé de votre nouveau modèle de déploiement ajusté. Ce nom est référencé dans votre code pendant les appels de complétion de conversation.
fine_tuned_model Votre modèle optimisé. Récupérez cette valeur à partir de votre travail d’optimisation des résultats à l’étape précédente. Il ressemble à gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83. Vous devez ajouter la valeur au deploy_data JSON. Vous pouvez également déployer un point de contrôle en passant l’ID de point de contrôle, qui apparaît au format 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 use to reference the model when making inference calls.

deploy_params = {'api-version': "2024-10-01"} # Control plane API version rather than the data plane 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 looks 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())

Pour en savoir plus sur le déploiement interrégion et sur l’utilisation du modèle déployé, consultez Utiliser votre modèle affiné déployé.

Si vous êtes prêt à déployer pour la production ou si vous avez des besoins particuliers en matière de résidence des données, suivez le guide de déploiement.

Effectuer un réglage précis continu

Après avoir créé un modèle affiné, vous souhaiterez peut-être continuer à affiner le modèle au fil du temps grâce à un réglage plus précis. L’ajustement continu correspond au processus itératif de sélection d’un modèle déjà affiné comme modèle de base et à l’ajuster davantage sur de nouveaux ensembles d’exemples d’apprentissage. L'ajustement fin continu est pris en charge uniquement pour les modèles OpenAI.

Pour effectuer un réglage précis sur un modèle que vous avez précédemment affiné, vous utilisez le même processus décrit dans Créer un modèle personnalisé. Mais au lieu de spécifier le nom d’un modèle de base générique, vous spécifiez l’ID de votre modèle affiné. L’ID du modèle affiné ressemble à 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 takes some time to start and finish.

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

Nous vous recommandons également d’inclure le suffix paramètre pour distinguer plus facilement les itérations de votre modèle affiné. Le suffix paramètre prend une chaîne et est défini pour identifier le modèle affiné. Avec l’API Python OpenAI, vous pouvez ajouter une chaîne allant jusqu’à 18 caractères au nom de votre modèle affiné.

Si vous n’êtes pas sûr de l’ID de votre modèle affiné existant, vous trouverez ces informations sur la page Modèles de Microsoft Foundry. Vous pouvez également générer une liste de modèles pour une ressource Azure OpenAI à l’aide de l’API REST.

Nettoyez vos déploiements, modèles personnalisés et fichiers d’entraînement

Lorsque vous n’avez plus besoin de votre modèle personnalisé, vous pouvez supprimer le déploiement et le modèle. Vous pouvez également supprimer les fichiers d’entraînement et de validation que vous avez chargés sur le service, si nécessaire.

Supprimer votre modèle de déploiement

Important

Après avoir déployé un modèle personnalisé, si à tout moment le déploiement reste inactif pendant plus de 15 jours, le déploiement est supprimé. Le déploiement d’un modèle personnalisé est inactif si le modèle a été déployé il y a plus de 15 jours et qu’aucun appel d’API pour des conversations ou des réponses n’a été effectué sur une période continue de 15 jours.

La suppression d’un déploiement inactif ne supprime pas ou n’affecte pas le modèle personnalisé sous-jacent. Le modèle personnalisé peut être redéployé à tout moment.

Comme décrit dans la tarification d’Azure OpenAI dans Microsoft Foundry Models, chaque modèle personnalisé (réglé) déployé entraîne un coût d’hébergement horaire, même si aucun appel d’API pour des conversations ou des réponses n'est effectué sur le modèle. Pour en savoir plus sur la planification et la gestion des coûts avec Azure OpenAI, consultez Planifier et gérer les coûts pour Azure OpenAI.

Vous pouvez utiliser l’une de ces méthodes pour supprimer le déploiement de votre modèle personnalisé :

Supprimer votre modèle personnalisé

Vous pouvez supprimer votre modèle personnalisé à l’aide de Foundry.

Remarque

Vous ne pouvez pas supprimer un modèle personnalisé s’il a un déploiement existant. Vous devez supprimer votre déploiement de modèle avant de pouvoir supprimer votre modèle personnalisé.

Supprimer vos fichiers de formation

Vous pouvez éventuellement supprimer des fichiers d’apprentissage et de validation que vous avez chargés pour l’apprentissage, ainsi que les fichiers de résultats générés pendant l’apprentissage, à partir de votre abonnement Azure OpenAI. Vous pouvez utiliser les méthodes suivantes pour supprimer vos fichiers d’entraînement, de validation et de résultats :

L’exemple Python suivant utilise le SDK Python pour supprimer les fichiers d’apprentissage, de validation et de résultats pour votre modèle personnalisé :

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

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

# Enumerate all uploaded files. Extract the IDs for the
# files with file names that match your training dataset file and
# validation dataset file.
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 your files and delete each file.
print(f'Deleting already uploaded files.')
for id in results:
    openai.File.delete(sid = id)

Conditions préalables

Modèles pris en charge

Pour vérifier quelles régions prennent actuellement en charge le réglage précis, consultez l’article sur les modèles.

Ou vous pouvez ajuster un modèle précédemment affiné, mis en forme comme base-model.ft-{jobid}.

Vérifier le flux de travail pour l’API REST

Prenez un moment pour passer en revue le flux de travail d’optimisation de l’utilisation de l’API REST et de Python avec Azure OpenAI :

  1. Préparez vos données d’apprentissage et de validation.
  2. Sélectionnez un modèle de base.
  3. Chargez vos données d’apprentissage.
  4. Entraînez votre nouveau modèle personnalisé.
  5. Vérifiez l’état de votre modèle personnalisé.
  6. Déployez votre modèle personnalisé pour l’utilisation.
  7. Utilisez votre modèle personnalisé.
  8. Éventuellement, analysez votre modèle personnalisé pour en évaluer les performances et l’adaptation.

Préparer vos données d’entraînement et de validation

Vos jeux de données d’entraînement et de validation se composent d’exemples d’entrée et de sortie montrant comment vous souhaitez que le modèle fonctionne.

Les données d’apprentissage et de validation que vous utilisez doivent être mises en forme sous forme de document JSON Lines (JSONL). Elle doit également être mise en forme selon le format conversationnel que l'API Chat Completions utilise.

Outre le format JSONL, les fichiers de données d’apprentissage et de validation doivent être encodés en UTF-8 et inclure une marque d’ordre d’octet (BOM). Chaque fichier doit avoir une taille inférieure à 512 Mo.

Si vous souhaitez une procédure pas à pas de réglage gpt-4o-mini-2024-07-18précis, consultez le didacticiel d’optimisation d’Azure OpenAI.

Exemple de format de fichier

{"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."}]}

Format de fichier de conversation à plusieurs tours

Plusieurs tours d’une conversation dans une seule ligne de votre fichier d’entraînement JSONL sont également pris en charge. Pour ignorer le réglage précis sur des messages d’assistant spécifiques, ajoutez la paire clé/valeur facultative weight. Actuellement, weight peut être défini sur 0 ou 1.

{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the capital/major city 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}]}

Saisies semi-automatiques de conversation avec vision

{"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."}]}

Créer vos jeux de données d’apprentissage et de validation

Plus vous avez d’exemples de formation, mieux c’est. Les travaux de réglage précis ne se dérouleront pas sans au moins 10 exemples d’apprentissage, mais un si petit nombre n’est pas suffisant pour influencer de façon notable les réponses du modèle. Une bonne pratique pour la réussite de l’optimisation est de fournir des centaines, voire des milliers, d’exemples d’entraînement.

En général, le doublement de la taille du jeu de données peut entraîner une augmentation linéaire de la qualité du modèle. Mais gardez à l’esprit que les exemples de faible qualité peuvent affecter négativement les performances. Si vous entraînez le modèle sur une grande quantité de données internes sans d’abord élaguer le jeu de données en ne conservant que les exemples de la plus haute qualité, votre modèle pourrait avoir de moins bonnes performances que prévu.

Charger vos données d’entraînement

L’étape suivante consiste à choisir des données d’apprentissage préparées existantes ou à charger de nouvelles données d’apprentissage préparées à utiliser lorsque vous personnalisez votre modèle. Après avoir préparé vos données d’apprentissage, vous pouvez charger vos fichiers dans le service. Il existe deux façons de charger des données d’apprentissage :

Pour les fichiers de données volumineux, nous vous recommandons d’importer à partir du stockage Blob. Les fichiers volumineux peuvent devenir instables lorsque vous les chargez via des formulaires multipart, car les requêtes sont atomiques et ne peuvent pas être retentées ou reprise. Pour plus d’informations sur Azure Blob Storage, consultez la section Qu’est-ce qu’Azure Blob Storage ?.

Charger des données d’entraînement

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"

Charger des données de validation

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"

Créer un modèle personnalisé

Après avoir chargé vos fichiers d’entraînement et de validation, vous êtes prêt à démarrer la tâche de réglage précis. Le code suivant montre un exemple de comment lancer un travail de fine-tuning à l'aide de l'API REST.

Cet exemple inclut le passage du paramètre seed. La graine contrôle la reproductibilité du travail. La transmission des mêmes paramètres de départ et de travail doit produire les mêmes résultats, mais peut différer dans de rares cas. Si vous ne spécifiez pas de graine, une graine est générée pour vous.

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
}'

Si vous réglez un modèle qui prend en charge l’entraînement global, vous pouvez spécifier le type d’entraînement en utilisant l'argument nommé extra_body et api-version=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"
}'

Vous pouvez également passer d’autres paramètres facultatifs tels que des hyperparamètres pour mieux contrôler le processus d’ajustement. Pour l’apprentissage initial, nous vous recommandons d’utiliser les valeurs automatiques par défaut présentes sans spécifier ces paramètres.

Les hyperparamètres actuellement pris en charge pour le réglage précis supervisé sont les suivants :

Nom Type Descriptif
batch_size Nombre entier Taille de lot à utiliser pour la formation. La taille du lot est le nombre d’exemples de formation utilisés pour entraîner un seul passage avant et arrière. En général, nous constatons que les tailles de lots plus grandes ont tendance à fonctionner mieux pour les jeux de données plus volumineux.

La valeur par défaut et la valeur maximale de cette propriété sont spécifiques à un modèle de base. Une taille de lot plus grande signifie que les paramètres de modèle sont mis à jour moins souvent, mais avec une variance plus faible.
learning_rate_multiplier Number Multiplicateur de taux de formation à utiliser pour la formation. Le taux d’apprentissage de réglage précis est le taux d’apprentissage d’origine utilisé pour la pré-formation, multiplié par cette valeur.

Les taux d’apprentissage plus importants ont tendance à mieux fonctionner que les tailles de lot plus grandes. Nous vous recommandons d’expérimenter des valeurs dans la plage de 0.02 à 0.2 pour voir ce qui produit les meilleurs résultats. Un taux d’apprentissage plus faible peut être utile pour éviter un surajustement.
n_epochs Nombre entier Nombre d’époques pour lesquelles le modèle doit être entraîné. Une époque fait référence à un cycle complet dans le jeu de données de formation.
seed Nombre entier La graine qui contrôle la reproductibilité de la tâche.

Pour en savoir plus sur les hyperparamètres pris en charge pour les autres méthodes de personnalisation, consultez le guide d’optimisation des préférences directes et le guide pour le réglage précis du renforcement.

Sélectionner un type d’entraînement

Sélectionnez le niveau d’entraînement en fonction de votre cas d’usage et de votre budget :

  • Standard : l’entraînement a lieu dans la région actuelle de la ressource Foundry et fournit des garanties pour la résidence des données. Idéal pour les charges de travail où les données doivent rester dans une région spécifique.

  • Global : Offre des tarifs plus abordables par rapport à Standard en utilisant la capacité au-delà de votre région actuelle. Les données et les pondérations sont copiées dans la région où l’entraînement se produit. Idéal si la résidence des données n’est pas une restriction et que vous souhaitez accélérer les temps de file d’attente.

  • Développeur (version préliminaire) : offre des économies significatives en utilisant la capacité inactive pour la formation. Il n’existe aucune garantie de latence ou de contrat SLA. Les travaux de ce niveau peuvent donc être automatiquement préemptés et repris ultérieurement. Il n’existe aucune garantie de résidence des données non plus. Idéal pour l’expérimentation et les charges de travail sensibles aux prix.

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"}"

Vérifier l’état de votre modèle personnalisé

Une fois que vous avez démarré un travail de réglage précis, il peut prendre un certain temps pour terminer. Votre tâche peut être mise en file d’attente derrière d’autres tâches sur le système. L’entraînement de votre modèle peut prendre des minutes ou des heures, en fonction de la taille du modèle et du jeu de données.

L’exemple suivant utilise l’API REST pour vérifier l’état de votre travail d’ajustement. L’exemple récupère des informations sur votre travail à l’aide de l’ID de travail retourné par l’exemple précédent.

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

Lister des événements ajustés

Pour examiner les événements ajustés individuels générés lors de la formation :

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" 

Utiliser des points de contrôle

L’achèvement de chaque époque d’apprentissage génère un point de contrôle. Un point de contrôle est une version entièrement fonctionnelle d’un modèle qui peut être déployé et utilisé comme modèle cible pour les travaux de réglage précis suivants. Les points de contrôle peuvent être particulièrement utiles, car ils peuvent fournir des instantanés avant le surajustement.

Quand un travail de réglage précis se termine, vous disposez des trois versions les plus récentes du modèle disponibles pour le déploiement. Votre modèle affiné représente l’époque finale. Les deux époques précédentes sont disponibles en tant que points de contrôle.

Vous pouvez exécuter la commande suivante pour récupérer la liste des points de contrôle associés à un travail de réglage précis individuel :

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" 

Suspension et reprise

Pendant l’entraînement, vous pouvez afficher les journaux et les métriques, et suspendre le travail en fonction des besoins. La suspension peut être utile si les métriques ne convergent pas ou si vous pensez que le modèle n’apprend pas au bon rythme.

Une fois le travail de formation suspendu et les évaluations de sécurité terminées, un point de contrôle déployable est créé. Ce point de contrôle est disponible pour vous permettre de déployer et d’utiliser pour l’inférence, ou vous pouvez reprendre le travail pour le terminer.

L’opération de pause s’applique uniquement aux travaux entraînés pour au moins une étape et qui se trouvent dans un état En cours d'exécution .

Suspendre

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" 

Reprendre

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" 

Copier un modèle (aperçu)

Vous pouvez maintenant copier un modèle point de contrôle affiné d’une région à l’autre, entre différents abonnements, mais dans le même locataire. Le processus utilise des API dédiées pour garantir des transferts efficaces et sécurisés. Cette fonctionnalité est actuellement disponible uniquement avec l’API et non via le portail Foundry.

Une fois le modèle copié de la région A à la région B, vous pouvez ajuster continuellement le modèle dans la région B et déployer le modèle à partir de cet emplacement.

Remarque

La suppression du point de contrôle du modèle dans la région source n’entraîne pas la suppression du modèle dans la région de destination. Pour supprimer le modèle dans les deux régions après sa copie, vous devez déployer le modèle séparément dans chaque région.

Conditions préalables

  • La ressource ou le compte de destination doit avoir au moins un travail de réglage précis.
  • La ressource de destination ou le compte ne doit pas désactiver l’accès au réseau public (au moins pendant l’envoi de la demande de copie).
  • Vous ne pouvez copier que vers le compte de destination, si le compte qui lance la copie dispose des autorisations suffisantes pour accéder au compte de destination.

Configurer les autorisations

  1. Créez une identité managée affectée à l’utilisateur.
  2. Attribuez le rôle Utilisateur Azure AI à votre identité managée affectée par l'utilisateur sur votre ressource ou compte de destination.
  3. Affecter l’identité managée affectée par l’utilisateur à votre compte de ressource source.

Copier le modèle

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>"
}'

Étant donné qu’il s’agit d’une opération longue, vérifiez l’état de la copie de modèle affinée en fournissant l’ID de point de contrôle du compte source utilisé dans l’appel POST .

Vérifier l’état de copie

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' 

Remarque

Lorsque vous copiez un point de contrôle à partir d’un compte source, le même nom de point de contrôle est conservé dans le compte de destination. Assurez-vous d'utiliser exactement ce même nom pour l'ajustement, le déploiement ou toute autre opération dans le compte de destination. Ce point de contrôle n’apparaît pas dans l’interface utilisateur ou dans l’API list checkpoints .

Analysez votre modèle personnalisé

Azure OpenAI attache un fichier de résultats nommé results.csv à chaque travail de réglage précis une fois terminé. Vous pouvez utiliser le fichier de résultats pour analyser les performances d’entraînement et de validation de votre modèle personnalisé. L’ID de fichier du fichier de résultats est répertorié pour chaque modèle personnalisé. Vous pouvez utiliser l’API REST pour récupérer l’ID de fichier et télécharger le fichier de résultats à des fins d’analyse.

L’exemple Python suivant utilise l’API REST pour récupérer l’ID de fichier du premier fichier de résultat attaché au travail de réglage précis de votre modèle personnalisé. Il télécharge ensuite le fichier dans votre répertoire de travail à des fins d’analyse.

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>

Le fichier de résultats est un fichier CSV qui contient une ligne d’en-tête et une ligne pour chaque étape d’apprentissage effectuée par le travail d’optimisation. Le fichier de résultats contient les colonnes suivantes :

Nom de colonne Descriptif
step Numéro de l’étape d’entraînement. Une étape d’entraînement représente une seule passe, avant et arrière, sur un lot de données d’entraînement.
train_loss Perte du lot d’entraînement.
train_mean_token_accuracy Pourcentage de jetons dans le lot d’entraînement qui ont été correctement prédits par le modèle.

Par exemple, si la taille du lot est définie 3 et que vos données contiennent des achèvements [[1, 2], [0, 5], [4, 2]], cette valeur est définie 0.83 sur (5 sur 6) si le modèle prédit [[1, 1], [0, 5], [4, 2]].
valid_loss Perte du lot de validation.
validation_mean_token_accuracy Pourcentage de jetons dans le lot de validation que le modèle a correctement prédit.

Par exemple, si la taille du lot est définie 3 et que vos données contiennent des achèvements [[1, 2], [0, 5], [4, 2]], cette valeur est définie 0.83 sur (5 sur 6) si le modèle prédit [[1, 1], [0, 5], [4, 2]].
full_valid_loss La perte de validation calculée à la fin de chaque époque. Lorsque la formation va bien, la perte doit diminuer.
full_valid_mean_token_accuracy La précision moyenne valide des jetons calculée à la fin de chaque époque. Lorsque l’entraînement se déroule bien, la précision des jetons doit augmenter.

Vous pouvez également afficher les données de votre results.csv fichier sous forme de tracés dans le portail Foundry. Lorsque vous sélectionnez le lien pour votre modèle entraîné, trois graphiques apparaissent : perte, précision moyenne du jeton et précision du jeton. Si vous avez fourni des données de validation, les deux jeux de données apparaissent sur le même tracé.

Les pertes devraient diminuer avec le temps et la précision augmenter. Si vos données d’entraînement et de validation diffèrent, vous risquez d’être surajusté. Essayez une formation avec moins d’époques ou un multiplicateur de taux d’apprentissage plus petit.

Déployer un modèle affiné

Lorsque vous êtes satisfait des métriques de votre travail de réglage précis ou que vous souhaitez simplement passer à l’inférence, vous devez déployer le modèle.

Si vous effectuez un déploiement pour une validation supplémentaire, envisagez de déployer des tests à l’aide d’un déploiement Développeur.

Si vous êtes prêt à déployer pour la production ou si vous avez des besoins particuliers en matière de résidence des données, suivez le guide de déploiement.

Variable Définition
token Jeton d’autorisation. Il existe plusieurs façons de générer un jeton d’autorisation. La méthode la plus simple pour les tests initiaux consiste à ouvrir Azure Cloud Shell à partir du portail Azure. Exécutez ensuite az account get-access-token. Vous pouvez utiliser ce jeton comme jeton d’autorisation temporaire pour le test d’API. Nous vous recommandons de stocker ce jeton dans une nouvelle variable d’environnement.
subscription ID d’abonnement de la ressource Azure OpenAI associée.
resource_group Nom du groupe de ressources de votre ressource Azure OpenAI.
resource_name Le nom de ressource Azure OpenAI.
model_deployment_name Nom personnalisé de votre nouveau modèle de déploiement ajusté. Ce nom est référencé dans votre code pendant les appels de complétion de conversation.
fine_tuned_model Votre modèle optimisé. Récupérez cette valeur à partir de votre travail d’optimisation des résultats à l’étape précédente. Il ressemble à gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83. Vous devez ajouter la valeur au deploy_data JSON. Vous pouvez également déployer un point de contrôle en passant l’ID de point de contrôle, qui apparaît au format 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"
        }
    }
}'

Pour en savoir plus sur le déploiement interrégion et sur l’utilisation du modèle déployé, consultez Utiliser votre modèle affiné déployé.

Effectuer un réglage précis continu

Après avoir créé un modèle affiné, vous souhaiterez peut-être continuer à affiner le modèle au fil du temps grâce à un réglage plus précis. L’ajustement continu correspond au processus itératif de sélection d’un modèle déjà affiné comme modèle de base et à l’ajuster davantage sur de nouveaux ensembles d’exemples d’apprentissage. L'ajustement fin continu est pris en charge uniquement pour les modèles OpenAI.

Pour effectuer un réglage précis sur un modèle que vous avez précédemment affiné, vous utilisez le même processus décrit dans Créer un modèle personnalisé. Mais au lieu de spécifier le nom d’un modèle de base générique, vous spécifiez l’ID de votre modèle affiné. L’ID du modèle affiné ressemble à 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>"
}'

Nous vous recommandons également d’inclure le suffix paramètre pour distinguer plus facilement les itérations de votre modèle affiné. Le suffix paramètre prend une chaîne et est défini pour identifier le modèle affiné. Le suffixe peut contenir jusqu’à 40 caractères (a à z, A à Z, 0 à 9, -et _) ajoutés au nom de votre modèle affiné.

Si vous n’êtes pas sûr de l’ID de votre modèle affiné existant, vous trouverez ces informations sur la page Modèles de Foundry. Vous pouvez également générer une liste de modèles pour une ressource Azure OpenAI à l’aide de l’API REST.

Nettoyez vos déploiements, modèles personnalisés et fichiers d’entraînement

Lorsque vous n’avez plus besoin de votre modèle personnalisé, vous pouvez supprimer le déploiement et le modèle. Vous pouvez également supprimer les fichiers d’entraînement et de validation que vous avez chargés sur le service, si nécessaire.

Supprimer votre modèle de déploiement

Vous pouvez utiliser l’une de ces méthodes pour supprimer le déploiement de votre modèle personnalisé :

Supprimer votre modèle personnalisé

Vous pouvez supprimer votre modèle personnalisé à l’aide de Foundry.

Remarque

Vous ne pouvez pas supprimer un modèle personnalisé s’il a un déploiement existant. Vous devez supprimer votre déploiement de modèle avant de pouvoir supprimer votre modèle personnalisé.

Supprimer vos fichiers de formation

Vous pouvez éventuellement supprimer des fichiers d’apprentissage et de validation que vous avez chargés pour l’apprentissage, ainsi que les fichiers de résultats générés pendant l’apprentissage, à partir de votre abonnement Azure OpenAI. Vous pouvez utiliser Foundry pour supprimer les fichiers.