次の方法で共有


微調整でモデルをカスタマイズする

Azure AI Foundry Models の Azure OpenAI を使用すると、 微調整と呼ばれるプロセスを使用して、個人用データセットに合わせてモデルを調整できます。 このカスタマイズ手順では以下が提供されて、サービスをさらに活用できるようになります。

  • プロンプト エンジニアリングからだけでは得られないより高品質な結果
  • モデルの最大要求コンテキスト制限を超える多くの例を使用してトレーニングする機能。
  • 短いプロンプトによるトークンの節約
  • 低遅延の要求 (特に小規模なモデルを使用する場合)。

少数のショット学習とは対照的に、微調整では、プロンプトに収まらない多くの例をトレーニングすることでモデルが改善され、多数のタスクでより良い結果が得られます。 微調整では、特定のタスクのパフォーマンスを向上させるために基本モデルの重みが調整されるため、プロンプトに含める例や手順を多く含める必要はありません。 つまり、送信されるテキストや API 呼び出しごとに処理されるトークンが少なくなり、コストが節約され、要求の待機時間が短縮される可能性があります。

LoRA (低ランク適応) を使用して、パフォーマンスに大きな影響を与えることなく、複雑さを軽減する方法でモデルを微調整します。 このメソッドは、下位ランク行列を使用して元の高ランク行列の近似を求めることで機能します。つまり、教師あり学習フェーズ中に 重要 パラメーターの小さなサブセットのみを微調整し、モデルをより管理しやすい効率的なものにします。 ユーザーにとって、トレーニングが他の手法よりも速く、より手頃な価格になります。

Azure AI Foundry ポータルには、次の 2 つの固有のファインチューニング エクスペリエンスがあります。

Azure OpenAI モデルのみをファインチューニングする場合は、Azure OpenAI 中心のファインチューニング エクスペリエンスをお勧めします。これは、https://ai.azure.com/resource/overview に移動することによってご利用いただけます。

重要

この記事で "(プレビュー)" と付記されている項目は、現在、パブリック プレビュー段階です。 このプレビューはサービス レベル アグリーメントなしで提供されており、運用環境ではお勧めしません。 特定の機能はサポート対象ではなく、機能が制限されることがあります。 詳しくは、Microsoft Azure プレビューの追加使用条件に関するページをご覧ください。

前提条件

サポートされているモデル

現在微調整をサポートしているリージョンを確認するには、モデルに関するページを参照してください。

または、base-model.ft-{jobid} として書式設定された、以前に微調整されたモデルを微調整することもできます。

Azure AI Foundry ポータルのワークフローを確認する

少し時間を取って、Azure AI Foundry ポータルを使用するためのファインチューニング ワークフローを確認してください。

  1. トレーニングおよび検証用のデータを準備します。
  2. Azure AI Foundry ポータルの [微調整されたモデルの作成 ] ダイアログを使用して、カスタム モデルをトレーニングします。
    1. トレーニング方法を選択します。
    2. 基本モデルを選択します。
    3. トレーニングの種類を選択する
    4. トレーニング データを選択します
    5. 必要に応じて、検証データを選択します
    6. 必要に応じて、微調整ジョブのタスク パラメーターを構成します。
    7. 必要に応じて、結果のカスタム モデルの 自動デプロイを有効にします
    8. 選択内容を確認して、新たにカスタマイズしたモデルをトレーニングします
  3. カスタム微調整モデルの状態を確認します。
  4. カスタム モデルをデプロイして、使用できるようにします。
  5. カスタム モデルを使用します。
  6. 必要に応じて、カスタム モデルのパフォーマンスと適合度を分析します。

トレーニング データと検証データを準備する

トレーニング データと検証データのセットは、モデルの実行方法に関する入力と出力の例で構成されます。

使用するトレーニングデータと検証データは、JSON Lines (JSONL) ドキュメントとして書式設定する必要があり、チャット入力候補 API で使用される会話形式で書式設定する必要があります。

一般に、すべてのトレーニング例で最適に動作した手順とプロンプトを使用することをお勧めします。 これは、特に 100 個未満の例がある場合に最適な結果を得るのに役立ちます。

ファイル形式の例

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

マルチターン チャット ファイル形式 Azure OpenAI

jsonl トレーニング ファイルの 1 行での会話の複数のターンもサポートされています。 特定のアシスタント メッセージの微調整をスキップするには、オプションの weight キー値ペアを追加します。 現在、weight は 0 または 1 に設定できます。

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

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

JSONL 形式に加えて、トレーニングおよび検証のデータ ファイルは UTF-8 でエンコードしてバイトオーダー マーク (BOM) を含める必要があります。 ファイルは、512 MB 未満のサイズにする必要があります。

データセットのサイズに関する考慮事項

トレーニング例が多いほど適切になります。 微調整ジョブは、少なくとも 10 個のトレーニング例なしでは続行されませんが、このような少数のジョブでは、モデルの応答に大きな影響を与えるほどではありません。 成功するには、数千ではないにしても数百のトレーニング例を提供することをお勧めします。 適切に作成された 50 個のトレーニング データから開始することをお勧めします。

一般的に、データセット サイズを 2 倍にすると、モデルの品質を直線的に向上させることができます。 ただし、低品質の例はパフォーマンスに悪影響を与える可能性があることに注意してください。 大量の内部データでモデルをトレーニングする場合、最初に最高品質の例についてのみデータセットを排除しないと、予想よりもはるかにパフォーマンスの低いモデルになる可能性があります。

微調整されたモデルの作成

Azure AI Foundry ポータルには 微調整されたモデルの作成 ダイアログが用意されているため、1 か所で Azure リソース用に微調整されたモデルを簡単に作成およびトレーニングできます。

  1. https://ai.azure.com/で Azure AI Foundry ポータルに移動し、Azure OpenAI リソースにアクセスできる資格情報でサインインします。 サインイン ワークフローの途中で、適切なディレクトリ、Azure サブスクリプション、Azure OpenAI リソースを選択します。

  2. Azure AI Foundry ポータル内で [ツール] > [ファインチューニング] ペインに移動し、[モデルのファインチューニング] を選択します。

    Azure AI Foundry ポータル内の [カスタム モデルの作成] ウィザードにアクセスする方法を示すスクリーンショット。

  3. 微調整するモデルを選択し、[ 次へ ] を選択して続行します。

    Azure AI Foundry ポータルの [モデルの選択] ダイアログのスクリーンショット。

[ 微調整されたモデルの作成 ] ダイアログが表示されます。

[微調整されたモデルの作成] ダイアログのスクリーンショット。

トレーニング方法を選択する

最初の手順では、モデルの選択とトレーニング方法を確認します。 すべてのモデルがすべてのトレーニング方法をサポートしているわけではありません。

  • 教師あり微調整 (SFT): すべての非推論モデルでサポートされます。
  • ダイレクト 基本設定の最適化 (プレビュー) (DPO): GPT-4o でサポートされています。
  • 強化微調整 (プレビュー) (RFT): o4-mini などの推論モデルでサポートされます。

モデルを選択するときに、 以前に微調整したモデルを選択することもできます。

トレーニングの種類を選択します

微調整ジョブに使うトレーニング レベルを選びます。

  • Standard: トレーニングは、現在の Azure OpenAI リソースのリージョンで行われ、データ所在地が提供されます。
  • グローバル (プレビュー): トークンごとの より手頃な価格 のトレーニングでは、 データの保存場所は提供されません。

データ所在地の要件がない場合は、グローバルを選択すると、現在のリージョンを超えてトレーニング容量を活用できる良い選択になります。 パブリック プレビュー段階では、 現在 のリージョン内でグローバルを使用できない場合があります。 コンサルティング

場合によっては、現在のリージョン内で Standard を使用できない場合があります。 データ所在地が必要な場合は、選択したモデルの モデルの可用性 に関する一覧のリージョンを参照してください。

トレーニング データを選択する

次の手順では、既存の準備済みトレーニング データを選択するか、[トレーニング データの追加] を選択して、モデルをカスタマイズするときに使用する新しい準備済み トレーニング データをアップロードします。

[ トレーニング データ ] ダイアログには、以前にアップロードした既存のデータセットが表示され、新しいトレーニング データをアップロードするためのオプションも表示されます。

Azure AI Foundry ポータルのカスタム モデルの作成ウィザードの [トレーニング データ] ウィンドウのスクリーンショット。

  • トレーニング データが既にサービスにアップロードされている場合は、[ 接続済み AI リソース] から [ファイル] を選択します。

    • 表示されたドロップダウン リストからファイルを選択します。
  • 新しいトレーニング データをアップロードするには、次のいずれかのオプションを使用します。

    • [ ファイルのアップロード] を選択して、トレーニング データをローカル ファイルからアップロードします。
    • Azure BLOB またはその他の共有 Web の場所を選択して、Azure BLOB または別の共有 Web の場所からトレーニング データをインポートします。

大きなデータ ファイルの場合は、Azure BLOB ストアからインポートすることをお勧めします。 大きなファイルは、マルチパート フォームを介してアップロードすると不安定になる場合があります。要求がアトミックであり、再試行または再開ができないためです。 Azure Blob Storage の詳細については、「Azure Blob Storage とは」を参照してください。

トレーニング データ ファイルは、JSONL ファイル形式にし、バイトオーダー マーク (BOM) を使用して UTF-8 でエンコードする必要があります。 ファイルは、512 MB 未満のサイズにする必要があります。

検証データを選択する (省略可能)

検証データセットがある場合は、[ トレーニング データの追加] を選択します。 既存の準備済み検証データを選択するか、モデルをカスタマイズするときに使用する新しい準備済み検証データをアップロードできます。

[ 検証データ ] ダイアログには、以前にアップロードされた既存のトレーニングデータセットと検証データセットが表示され、新しい検証データをアップロードできるオプションが表示されます。

Azure AI Foundry ポータルのカスタム モデルの作成ウィザードの [検証データ] ウィンドウのスクリーンショット。

  • 検証データが既にサービスにアップロードされている場合は、[データセットの選択] を選択します。

    • [検証データ] ウィンドウに表示される一覧からファイルを選択します。
  • 新しい検証データをアップロードするには、次のいずれかのオプションを使用します。

    • ローカル ファイルから検証データをアップロードするには、[ローカル ファイル] を選択します。
    • Azure BLOB またはその他の共有 Web の場所を選択して、Azure BLOB または別の共有 Web の場所から検証データをインポートします。

大きなデータ ファイルの場合は、Azure BLOB ストアからインポートすることをお勧めします。 大きなファイルは、マルチパート フォームを介してアップロードすると不安定になる場合があります。要求がアトミックであり、再試行または再開ができないためです。

検証データ ファイルは、トレーニング データ ファイルと同様に JSONL ファイル形式にし、バイトオーダー マーク (BOM) を使用して UTF-8 でエンコードする必要があります。 ファイルは、512 MB 未満のサイズにする必要があります。

モデルを識別可能にする (省略可能)

また、微調整されたモデルのさまざまなイテレーションを区別しやすくするために、 suffix パラメーターを含めておくことをお勧めします。 suffixは最大 18 文字の文字列を受け取り、結果の微調整されたモデルに名前を付けるときに使用されます。

トレーニング パラメーターを構成する (省略可能)

オプションの シード を指定し、追加のハイパーパラメーターを調整できます。

シードはジョブの再現性を制御します。 同じシードとジョブ パラメーターを渡すと同じ結果が得られますが、まれに異なる場合があります。 シードが指定されていない場合は、ランダムに生成されます。

Azure AI Foundry ポータルのカスタム モデルの作成ウィザードのパラメーター セクションのスクリーンショットを閉じます。

次のハイパーパラメーターは、Azure AI Foundry ポータルを介したチューニングに使用できます。

名前 タイプ 説明
バッチ サイズ 整数 (integer) トレーニングに使用するバッチ サイズ。 バッチ サイズは、単一の順方向および逆方向の合格をトレーニングするために使用するトレーニング例の数です。 一般的に、大規模なデータセットでは、バッチ サイズが大きいほど適切に機能する傾向があることがわかっています。 このプロパティの既定値と最大値は、基本モデルに固有です。 バッチ サイズが大きいほど、モデル パラメーターの更新頻度は低くなりますが、分散は小さくなります。
学習率乗数 数値 トレーニングに使用する学習率乗数。 微調整の学習率は、事前トレーニングに使用された元の学習率にこの値を掛けた値です。 学習率が高いほど、大きいバッチ サイズでのパフォーマンスが向上する傾向があります。 0.02 から 0.2 の範囲の値を試して、最適な結果が得られるものを確認することをお勧めします。 学習率を小さくすると、オーバーフィットを避けるのに役立つ場合があります。
エポックの数 整数 (integer) モデルをトレーニングするエポックの数。 エポックとは、トレーニング データセット全体での 1 つの完全なサイクルを指します。

自動デプロイを有効にする (省略可能)

時間を節約するために、必要に応じて、結果のモデルの自動デプロイを有効にすることができます。 トレーニングが正常に完了すると、選択したデプロイの種類を使用してモデルが デプロイされます。 デプロイには、カスタム モデル用に生成された一意の名前と、前に指定したオプションの サフィックス に基づいて名前が付 けられます

Azure AI Foundry ポータルのカスタム モデルの作成ウィザードの自動デプロイ トグルのスクリーンショット。

自動デプロイでは、現在、グローバル標準および開発者向けのデプロイのみがサポートされています。 どちらのオプションもデータの保存場所を提供しません。 詳細については、 デプロイの種類 に関するドキュメントを参照してください。

選択内容をレビューしてモデルをトレーニングする

選択内容を確認し、[送信] を選択して、新しい微調整されたモデルのトレーニングを開始します。

カスタム モデルの状態を確認する

微調整ジョブを送信すると、微調整されたモデルに関する詳細が表示されるページが表示されます。 微調整されたモデルの状態と詳細については、Azure AI Foundry ポータルの 微調整 ページを参照してください。

ジョブは、システム上の他のジョブの後にキューに入れられる場合があります。 モデルのトレーニングには、モデルおよびデータセットのサイズに応じて、数分または数時間かかる場合があります。

チェックポイント

各トレーニング エポックが完了すると、チェックポイントが生成されます。 チェックポイントは、完全な機能を持つモデルのバージョンであり、デプロイすることも、後続の微調整ジョブのターゲット モデルとして使用することもできます。 チェックポイントは、オーバーフィットの前にスナップショットを提供する可能性があるため、特に便利です。 微調整が完了すると、3 つの最新バージョンのモデルをデプロイできるようになります。

カスタム モデルを分析する

Azure OpenAI では、各微調整ジョブが完了すると、results.csv という名前の結果ファイルが添付されます。 この結果ファイルを使用して、カスタム モデルのトレーニングと検証のパフォーマンスを分析できます。 結果ファイルのファイル ID は、Azure AI Foundry ポータルの [モデル] ペイン上の [結果ファイル ID] 列に、カスタム モデルごとに一覧表示されます。 ファイル ID を使用して、Azure AI Foundry ポータルの [データ ファイル] ペインから結果ファイルを特定してダウンロードできます。

結果ファイルは、ヘッダー行と、微調整ジョブによって実行される各トレーニング ステップの行が含まれる CSV ファイルです。 この結果ファイルには、次の列が含まれています。

列名 説明
step トレーニング ステップの数。 トレーニング ステップは、トレーニング データのバッチに対する前方と後方の 1 回のパスを表します。
train_loss トレーニング バッチの損失。
train_mean_token_accuracy モデルによって正しく予測されたトレーニング バッチ内のトークンの割合。
たとえば、バッチ サイズが 3 に設定されていて、データに候補 [[1, 2], [0, 5], [4, 2]] が含まれており、モデルが [[1, 1], [0, 5], [4, 2]] を予測した場合、この値は 0.83 (5/6) に設定されます。
valid_loss 検証バッチの損失。
validation_mean_token_accuracy モデルによって正しく予測された検証バッチ内のトークンの割合。
たとえば、バッチ サイズが 3 に設定されていて、データに候補 [[1, 2], [0, 5], [4, 2]] が含まれており、モデルが [[1, 1], [0, 5], [4, 2]] を予測した場合、この値は 0.83 (5/6) に設定されます。
full_valid_loss 各エポックの終了時に計算される検証損失。 トレーニングがうまくいった場合は、損失は減少します。
full_valid_mean_token_accuracy 各エポックの終了時に計算された有効平均トークン精度。 トレーニングがうまくいった場合は、トークンの精度が向上します。

Azure AI Foundry ポータル内で、results.csv ファイル内のデータをプロットとして表示することもできます。 トレーニング済みのモデルのリンクを選択すると、損失、平均トークンの精度、トークンの精度の 3 つのグラフが表示されます。 検証データを指定した場合、両方のデータセットが同じプロットに表示されます。

時間の経過と同時に減少する損失を探し、精度を向上させます。 トレーニングデータと検証データの間に相違がある場合は、オーバーフィットしていることを示している可能性があります。 エポックが少ない、または学習率の乗数が小さいトレーニングを試してみてください。

微調整されたモデルをデプロイする

微調整ジョブのメトリックに満足した後、または推論に移行するだけの場合は、モデルをデプロイする必要があります。

さらなる検証のためにデプロイする場合は、Developer デプロイを使用した テスト 用のデプロイを検討してください。

運用環境にデプロイする準備ができている場合、または特定のデータ所在地のニーズがある場合は、 デプロイ ガイドに従ってください。

デプロイ済みの微調整されたモデルを使用する

微調整されたモデルをデプロイした後は、他のデプロイ済みモデルと同様に使用できます。 Azure AI Foundry 内の [プレイグラウンド] を使用して、新しいデプロイを試すことができます。 REST API を使用して、独自のアプリケーションから微調整されたモデルを呼び出すこともできます。 プロンプト フローでこの新しい微調整されたモデルを使用することから始め、生成 AI アプリケーションを構築することもできます。

チャット モデルの場合、微調整されたモデルをガイドするために使用するシステム メッセージは、展開されているか、プレイグラウンドでテストに使用できるかに関係なく、トレーニングに使用したシステム メッセージと同じである必要があります。 別のシステム メッセージを使用する場合、モデルが期待どおりに動作しない可能性があります。

継続的な微調整

微調整されたモデルを作成したら、さらに微調整を行い時間をかけてモデルを改良し続けることができます。 継続的な微調整は、既に微調整されたモデルを基本モデルとして選び、新しいトレーニング サンプルのセットでさらに微調整する反復プロセスです。

以前に微調整したモデルに対して微調整を実行するには、微調整されたモデルの作成で説明したのと同じプロセス 使用しますが、汎用基本モデルの名前を指定する代わりに、既に微調整されたモデルを指定します。 カスタムの微調整されたモデルは gpt-4o-2024-08-06.ft-d93dda6110004b4da3472d96f4dd4777-ft のようになります

微調整されたモデルが強調表示されている [カスタム モデルを作成する] UI のスクリーンショット。

デプロイ、カスタム モデル、トレーニング ファイルをクリーンアップする

カスタム モデルの利用が完了したら、デプロイとモデルを削除できます。 必要に応じて、サービスにアップロードしたトレーニングおよび検証のファイルを削除することもできます。

モデル デプロイの削除

重要

カスタマイズされたモデルをデプロイした後、デプロイが 15 日を超えて非アクティブのままである場合、デプロイは削除されます。 カスタマイズされたモデルのデプロイは、モデルが 15 日以上前にデプロイされ、15 日間連続して完了またはチャット完了の呼び出しが行われなかった場合、"非アクティブ" になります。

非アクティブなデプロイを削除しても、基になるカスタマイズされたモデルは削除されることも影響を受けることもなく、カスタマイズされたモデルはいつでも再デプロイできます。 Azure AI Foundry Models の価格に関する Azure OpenAI で説明されているように、デプロイされるカスタマイズされた (微調整された) 各モデルでは、完了またはチャット完了の呼び出しがモデルに対して行われているかどうかに関係なく、1 時間ごとのホスティング コストが発生します。 Azure OpenAI を使用したコストの計画と管理の詳細については、「Azure OpenAI のコストを管理する計画」のガイダンスを参照してください。

Azure AI Foundry ポータル内の [デプロイ] ペイン上でカスタム モデルのデプロイを削除できます。 削除するデプロイを選択し、[削除] を選択してデプロイを削除します。

カスタム モデルを削除する

Azure AI Foundry ポータル内の [モデル] ペイン上でカスタム モデルを削除できます。 [Customized models](カスタマイズされたモデル) タブから削除するカスタム モデルを選択し、[削除] を選択してカスタム モデルを削除します。

既存のデプロイがある場合は、カスタム モデルを削除できません。 カスタム モデルを削除する前に、まずモデル デプロイを削除する必要があります。

トレーニング ファイルの削除

必要に応じて、トレーニング用にアップロードしたトレーニングおよび検証のファイルと、トレーニング中に生成された結果ファイルを、Azure AI Foundry ポータル内の [管理]>[データとインデックス] ペインで削除できます。 削除するファイルを選択し、[削除] を選択してファイルを削除します。

前提条件

REST API は現在、グローバル トレーニング ジョブ サポートしていません。 API を使用してグローバル トレーニング ジョブを検査すると、正しくない情報が返される場合があります。

サポートされているモデル

現在微調整をサポートしているリージョンを確認するには、モデルに関するページを参照してください。

または、base-model.ft-{jobid} として書式設定された、以前に微調整されたモデルを微調整することもできます。

Python SDK のワークフローを確認する

少し時間を取って、Python SDK と Azure OpenAI を使用するための微調整ワークフローを確認してください。

  1. トレーニングおよび検証用のデータを準備します。
  2. 基本モデルを選択します。
  3. トレーニング データをアップロードします。
  4. 新たにカスタマイズしたモデルをトレーニングします。
  5. カスタマイズしたモデルの状態を確認します。
  6. カスタマイズしたモデルをデプロイして使用できるようにします。
  7. カスタマイズしたモデルを使用します。
  8. 必要に応じて、カスタマイズしたモデルをパフォーマンスと適合度を分析します。

トレーニング データと検証データを準備する

トレーニング データと検証データのセットは、モデルの実行方法に関する入力と出力の例で構成されます。

使用するトレーニングデータと検証データは、JSON Lines (JSONL) ドキュメントとして書式設定する必要があり、チャット入力候補 API で使用される会話形式で書式設定する必要があります。

gpt-4o-mini-2024-07-18 の微調整の詳細な手順については、Azure OpenAI の微調整に関するチュートリアルを参照してください。

ファイル形式の例

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

マルチターン チャット ファイル形式

jsonl トレーニング ファイルの 1 行での会話の複数のターンもサポートされています。 特定のアシスタント メッセージの微調整をスキップするには、オプションの weight キー値ペアを追加します。 現在、weight は 0 または 1 に設定できます。

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

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

JSONL 形式に加えて、トレーニングおよび検証のデータ ファイルは UTF-8 でエンコードしてバイトオーダー マーク (BOM) を含める必要があります。 ファイルは、512 MB 未満のサイズにする必要があります。

トレーニングおよび検証のデータセットを作成する

トレーニング例が多いほど適切になります。 微調整ジョブは、少なくとも 10 個のトレーニング例がないと続行されませんが、このような少数ではモデルの応答に顕著な影響を与えるには不十分です。 成功するには、数千ではないにしても数百のトレーニング例を提供することをお勧めします。

一般的に、データセット サイズを 2 倍にすると、モデルの品質を直線的に向上させることができます。 ただし、低品質の例はパフォーマンスに悪影響を与える可能性があることに注意してください。 大量の内部データでモデルをトレーニングする場合、最初に最高品質の例についてのみデータセットを排除しないと、予想よりもはるかにパフォーマンスの低いモデルになる可能性があります。

トレーニング データをアップロードする

次の手順では、既存の準備済みトレーニング データを選択するか、モデルをカスタマイズするときに使用する新しい準備済みトレーニング データをアップロードします。 トレーニング データを準備したら、ファイルをサービスにアップロードできます。 トレーニング データをアップロードする方法は 2 つあります。

大きなデータ ファイルの場合は、Azure BLOB ストアからインポートすることをお勧めします。 大きなファイルは、マルチパート フォームを介してアップロードすると不安定になる場合があります。要求がアトミックであり、再試行または再開ができないためです。 Azure Blob Storage の詳細については、「Azure Blob Storage とは」を参照してください。

トレーニング データ ファイルは、JSONL ファイル形式にし、バイトオーダー マーク (BOM) を使用して UTF-8 でエンコードする必要があります。 ファイルは、512 MB 未満のサイズにする必要があります。

次の Python の例では、Python SDK を使用してローカルのトレーニングおよび検証ファイルをアップロードし、返されたファイル ID を取得します。

# Upload fine-tuning files

import os
from openai import AzureOpenAI

client = AzureOpenAI(
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"), 
  api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
  api_version="2024-10-21"  # This API version or later is required to access seed/events/checkpoint capabilities
)

training_file_name = 'training_set.jsonl'
validation_file_name = 'validation_set.jsonl'

# Upload the training and validation dataset files to Azure OpenAI with the SDK.

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

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

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

カスタマイズしたモデルを作成する

トレーニングおよび検証ファイルをアップロードしたら、微調整ジョブを開始する準備が整います。

次の Python コードは、Python SDK を使用して新しい微調整ジョブを作成する方法の例を示しています。

この例では、seed パラメーターも渡しています。 シードはジョブの再現性を制御します。 同じシードとジョブ パラメーターを渡すと同じ結果が得られますが、まれに異なる場合があります。 シードが指定されていない場合は生成されます。

response = client.fine_tuning.jobs.create(
    training_file=training_file_id,
    validation_file=validation_file_id,
    model="gpt-4.1-2025-04-14", # Enter base model name. Note that in Azure OpenAI the model name contains dashes and cannot contain dot/period characters.
    seed = 105  # seed parameter controls reproducibility of the fine-tuning job. If no seed is specified one will be generated automatically.
)

job_id = response.id

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

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

ハイパーパラメーターなどの追加の省略可能なパラメーターを渡して、微調整プロセスをより細かく制御することもできます。 初期トレーニングでは、これらのパラメーターを指定せずに、存在する自動既定値を使うことをお勧めします。

現在サポートされている微調整用のハイパーパラメーターは次のとおりです。

名前 タイプ 説明
batch_size 整数 (integer) トレーニングに使用するバッチ サイズ。 バッチ サイズは、単一の順方向および逆方向の合格をトレーニングするために使用するトレーニング例の数です。 一般的に、大規模なデータセットでは、バッチ サイズが大きいほど適切に機能する傾向があることがわかっています。 このプロパティの既定値と最大値は、基本モデルに固有です。 バッチ サイズが大きいほど、モデル パラメーターの更新頻度は低くなりますが、分散は小さくなります。
learning_rate_multiplier 数値 トレーニングに使用する学習率乗数。 微調整の学習率は、事前トレーニングに使用された元の学習率にこの値を掛けた値です。 学習率が高いほど、大きいバッチ サイズでのパフォーマンスが向上する傾向があります。 0.02 から 0.2 の範囲の値を試して、最適な結果が得られるものを確認することをお勧めします。 学習率を低くすると、オーバーフィットを避けるのに役立つ場合があります。
n_epochs 整数 (integer) モデルをトレーニングするエポックの数。 エポックとは、トレーニング データセット全体での 1 つの完全なサイクルを指します。
seed 整数 (integer) シードはジョブの再現性を制御します。 同じシードとジョブ パラメーターを渡すと同じ結果が得られますが、まれに異なる場合があります。 シードが指定されていない場合は生成されます。

OpenAI Python API の 1.x バージョンでカスタム ハイパーパラメーターを設定するには:

from openai import AzureOpenAI

client = AzureOpenAI(
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"), 
  api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
  api_version="2024-10-21"  # This API version or later is required
)

client.fine_tuning.jobs.create(
  training_file="file-abc123", 
  model="gpt-4.1-2025-04-14", # Enter base model name. Note that in Azure OpenAI the model name contains dashes and cannot contain dot/period characters.
  hyperparameters={
    "n_epochs":2
  }
)

微調整ジョブの状態を確認する

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

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

微調整イベントの一覧

トレーニング中に生成された個々の微調整イベントを調べるには、このコマンドを実行するために、 pip install openai --upgrade を使用して OpenAI クライアント ライブラリを最新バージョンにアップグレードすることが必要になる場合があります。

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

チェックポイント

各トレーニング エポックが完了すると、チェックポイントが生成されます。 チェックポイントは、完全な機能を持つモデルのバージョンであり、デプロイすることも、後続の微調整ジョブのターゲット モデルとして使用することもできます。 チェックポイントは、オーバーフィットの前にスナップショットを提供する可能性があるため、特に便利です。 微調整が完了すると、3 つの最新バージョンのモデルをデプロイできるようになります。 最後のエポックは微調整されたモデルで表され、前の 2 つのエポックはチェックポイントとして利用できます。

list checkpoints コマンドを実行して、個々の微調整ジョブに関連付けられているチェックポイントのリストを取得できます。 このコマンドを実行するには、pip install openai --upgrade を使用して OpenAI クライアント ライブラリを最新バージョンにアップグレードする必要がある場合があります。

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

カスタマイズしたモデルを分析する

Azure OpenAI では、各微調整ジョブが完了すると、results.csv という名前の結果ファイルが添付されます。 この結果ファイルを使用して、カスタマイズしたモデルのトレーニングと検証のパフォーマンスを分析できます。 カスタマイズしたモデルごとに結果ファイルのファイル ID が一覧表示され、Python SDK を使用してファイル ID を取得し、分析するために結果ファイルをダウンロードできます。

次の Python の例では、カスタマイズしたモデルの微調整ジョブにアタッチされた最初の結果ファイルのファイル ID を取得し、Python SDK を使用して、分析のために現在の作業ディレクトリにファイルをダウンロードします。

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

結果ファイルは、ヘッダー行と、微調整ジョブによって実行される各トレーニング ステップの行が含まれる CSV ファイルです。 この結果ファイルには、次の列が含まれています。

列名 説明
step トレーニング ステップの数。 トレーニング ステップは、トレーニング データのバッチに対する前方と後方の 1 回のパスを表します。
train_loss トレーニング バッチの損失。
train_mean_token_accuracy モデルによって正しく予測されたトレーニング バッチ内のトークンの割合。
たとえば、バッチ サイズが 3 に設定されていて、データに候補 [[1, 2], [0, 5], [4, 2]] が含まれており、モデルが [[1, 1], [0, 5], [4, 2]] を予測した場合、この値は 0.83 (5/6) に設定されます。
valid_loss 検証バッチの損失。
validation_mean_token_accuracy モデルによって正しく予測された検証バッチ内のトークンの割合。
たとえば、バッチ サイズが 3 に設定されていて、データに候補 [[1, 2], [0, 5], [4, 2]] が含まれており、モデルが [[1, 1], [0, 5], [4, 2]] を予測した場合、この値は 0.83 (5/6) に設定されます。
full_valid_loss 各エポックの終了時に計算される検証損失。 トレーニングがうまくいった場合は、損失は減少します。
full_valid_mean_token_accuracy 各エポックの終了時に計算された有効平均トークン精度。 トレーニングがうまくいった場合は、トークンの精度が向上します。

Azure AI Foundry ポータル内で、results.csv ファイル内のデータをプロットとして表示することもできます。 トレーニング済みのモデルのリンクを選択すると、損失、平均トークンの精度、トークンの精度の 3 つのグラフが表示されます。 検証データを指定した場合、両方のデータセットが同じプロットに表示されます。

時間の経過と同時に減少する損失を探し、精度を向上させます。 トレーニング データと検証データの間に相違がある場合は、オーバーフィットしていることを示している可能性があります。 エポックが少ない、または学習率の乗数が小さいトレーニングを試してみてください。

微調整されたモデルをデプロイする

微調整ジョブのメトリックに満足できたら、または推論に移行するだけの場合は、モデルをデプロイする必要があります。

さらなる検証のためにデプロイする場合は、Developer デプロイを使用した テスト 用のデプロイを検討してください。

前の SDK コマンドとは異なり、個別の認可、異なる API パス、および異なる API バージョンを必要とするコントロール プレーン API を使用してデプロイを行う必要があります。

変数 定義
トークン 認証トークンを生成するには、複数の方法があります。 初期テストの最も簡単な方法は、Azure portal から Cloud Shell を起動することです。 次に、az account get-access-token を実行します。 このトークンは、API テストの一時的な認証トークンとして使用できます。 これを新しい環境変数に格納することをお勧めします。
サブスクリプション 関連付けられている Azure OpenAI リソースのサブスクリプション ID。
リソースグループ Azure OpenAI リソースのリソース グループ名。
リソース名 Azure OpenAI リソース名。
モデルデプロイメント名 微調整された新しいモデル デプロイのカスタム名。 これは、チャット入力候補の呼び出しを行うときにコードで参照される名前です。
ファインチューニングされたモデル(fine_tuned_model) この値は、前の手順の微調整ジョブの結果から取得します。 これは gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83 のようになります。 その値を deploy_data json に追加する必要があります。 また、ftchkpt-e559c011ecc04fc68eaa339d8227d02d 形式で表示されるチェックポイント ID を渡すことで、チェックポイントをデプロイすることもできます。
import json
import os
import requests

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

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

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

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

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

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

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

リージョン間デプロイの詳細を確認し、デプロイされたモデルを 使用します

運用環境にデプロイする準備ができている場合、または特定のデータ所在地のニーズがある場合は、 デプロイ ガイドに従ってください。

継続的な微調整

微調整されたモデルを作成したら、さらに微調整を行い時間をかけてモデルを改良し続けることができます。 継続的な微調整は、既に微調整されたモデルを基本モデルとして選び、新しいトレーニング サンプルのセットでさらに微調整する反復プロセスです。

以前に微調整したモデルに対して微調整を実行するには、カスタマイズされたモデルを作成するに関するセクションで説明したのと同じプロセスを使いますが、汎用基本モデルの名前を指定する代わりに、既に微調整されたモデルの ID を指定します。 微調整されたモデル ID は gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7 のようになります

from openai import AzureOpenAI

client = AzureOpenAI(
  azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"), 
  api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
  api_version="2024-10-21"  
)

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

job_id = response.id

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

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

また、微調整モデルの異なるイテレーションを区別しやすくするために、suffix パラメーターを含めることをお勧めします。 suffix は文字列を受け取り、微調整されたモデルを特定するように設定されます。 OpenAI Python API では、微調整されたモデル名に追加される最大 18 文字の文字列がサポートされています。

既存のファインチューニングされたモデルの ID が不明な場合は、Azure AI Foundry の [モデル] ページの中でこの情報を確認できます。または REST API を使用して、特定の Azure OpenAI リソースのモデルの一覧を生成できます。

デプロイ、カスタマイズしたモデル、トレーニング ファイルをクリーンアップする

カスタマイズしたモデルの利用が完了したら、デプロイとモデルを削除できます。 必要に応じて、サービスにアップロードしたトレーニングおよび検証のファイルを削除することもできます。

モデル デプロイの削除

重要

カスタマイズされたモデルをデプロイした後、デプロイが 15 日を超えて非アクティブのままである場合、デプロイは削除されます。 カスタマイズされたモデルのデプロイは、モデルが 15 日以上前にデプロイされ、15 日間連続して完了またはチャット完了の呼び出しが行われなかった場合、"非アクティブ" になります。

非アクティブなデプロイを削除しても、基になるカスタマイズされたモデルは削除されることも影響を受けることもなく、カスタマイズされたモデルはいつでも再デプロイできます。 Azure AI Foundry Models の価格に関する Azure OpenAI で説明されているように、デプロイされるカスタマイズされた (微調整された) 各モデルでは、完了またはチャット完了の呼び出しがモデルに対して行われているかどうかに関係なく、1 時間ごとのホスティング コストが発生します。 Azure OpenAI を使用したコストの計画と管理の詳細については、「Azure OpenAI のコストを管理する計画」のガイダンスを参照してください。

さまざまな方法を使用して、カスタマイズしたモデルのデプロイを削除できます。

カスタマイズしたモデルの削除

同様に、さまざまな方法を使用して、カスタマイズしたモデルを削除できます。

既存のデプロイがある場合は、カスタマイズしたモデルを削除できません。 カスタマイズしたモデルを削除する前に、まずモデル デプロイを削除する必要があります。

トレーニング ファイルの削除

必要に応じて、トレーニング用にアップロードしたトレーニングおよび検証のファイル、およびトレーニング中に生成された結果ファイルを、Azure OpenAI サブスクリプションから削除できます。 次の方法を使用して、トレーニング、検証、および結果のファイルを削除できます。

次の Python の例では、Python SDK を使用して、カスタマイズしたモデルのトレーニング、検証、および結果のファイルを削除します。

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

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

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

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

前提条件

REST API は現在、グローバル トレーニング ジョブ サポートしていません。 API を使用してグローバル トレーニング ジョブを検査すると、正しくない情報が返される場合があります。

サポートされているモデル

現在微調整をサポートしているリージョンを確認するには、モデルに関するページを参照してください。

または、base-model.ft-{jobid} として書式設定された、以前に微調整されたモデルを微調整することもできます。

REST API のワークフローを確認する

少し時間を取って、REST API および Python と Azure OpenAI を使用するための微調整ワークフローを確認してください。

  1. トレーニングおよび検証用のデータを準備します。
  2. 基本モデルを選択します。
  3. トレーニング データをアップロードします。
  4. 新たにカスタマイズしたモデルをトレーニングします。
  5. カスタマイズしたモデルの状態を確認します。
  6. カスタマイズしたモデルをデプロイして使用できるようにします。
  7. カスタマイズしたモデルを使用します。
  8. 必要に応じて、カスタマイズしたモデルをパフォーマンスと適合度を分析します。

トレーニング データと検証データを準備する

トレーニング データと検証データのセットは、モデルの実行方法に関する入力と出力の例で構成されます。

使用するトレーニングデータと検証データは、JSON Lines (JSONL) ドキュメントとして書式設定する必要があり、チャット入力候補 API で使用される会話形式で書式設定する必要があります。

gpt-4o-mini-2024-07-18 の微調整の詳細な手順については、Azure OpenAI の微調整に関するチュートリアルを参照してください。

ファイル形式の例

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

マルチターン チャット ファイル形式

jsonl トレーニング ファイルの 1 行での会話の複数のターンもサポートされています。 特定のアシスタント メッセージの微調整をスキップするには、オプションの weight キー値ペアを追加します。 現在、weight は 0 または 1 に設定できます。

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

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

JSONL 形式に加えて、トレーニングおよび検証のデータ ファイルは UTF-8 でエンコードしてバイトオーダー マーク (BOM) を含める必要があります。 ファイルは、512 MB 未満のサイズにする必要があります。

トレーニングおよび検証のデータセットを作成する

トレーニング例が多いほど適切になります。 微調整ジョブは、少なくとも 10 個のトレーニング例がないと続行されませんが、このような少数ではモデルの応答に顕著な影響を与えるには不十分です。 成功するには、数千ではないにしても数百のトレーニング例を提供することをお勧めします。

一般的に、データセット サイズを 2 倍にすると、モデルの品質を直線的に向上させることができます。 ただし、低品質の例はパフォーマンスに悪影響を与える可能性があることに注意してください。 大量の内部データでモデルをトレーニングする場合、最初に最高品質の例のみになるようにデータセットを取り除かないと、予想よりもはるかにパフォーマンスの低いモデルになる可能性があります。

トレーニング データをアップロードする

次の手順では、既存の準備済みトレーニング データを選択するか、新しい準備済みトレーニング データをアップロードして、モデルを微調整するときに使用します。 トレーニング データを準備したら、ファイルをサービスにアップロードできます。 トレーニング データをアップロードする方法は 2 つあります。

大きなデータ ファイルの場合は、Azure BLOB ストアからインポートすることをお勧めします。 大きなファイルは、マルチパート フォームを介してアップロードすると不安定になる場合があります。要求がアトミックであり、再試行または再開ができないためです。 Azure Blob Storage の詳細については、「Azure Blob Storage とは」を参照してください。

トレーニング データ ファイルは、JSONL ファイル形式にし、バイトオーダー マーク (BOM) を使用して UTF-8 でエンコードする必要があります。 ファイルは、512 MB 未満のサイズにする必要があります。

トレーニング データのアップロード

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/files?api-version=2023-12-01-preview \
  -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"

検証データのアップロード

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/files?api-version=2023-12-01-preview \
  -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"

カスタマイズしたモデルを作成する

トレーニングおよび検証ファイルをアップロードしたら、微調整ジョブを開始する準備が整います。 次のコードは、REST API を使って新しい微調整ジョブを作成する方法の例を示しています。

この例では、seed パラメーターも渡しています。 シードはジョブの再現性を制御します。 同じシードとジョブ パラメーターを渡すと同じ結果が得られますが、まれに異なる場合があります。 シードが指定されていない場合は生成されます。

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/fine_tuning/jobs?api-version=2024-10-21 \
  -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
}'

ハイパーパラメーターなどの追加の省略可能なパラメーターを渡して、微調整プロセスをより細かく制御することもできます。 初期トレーニングでは、これらのパラメーターを指定せずに、存在する自動既定値を使うことをお勧めします。

現在サポートされている微調整用のハイパーパラメーターは次のとおりです。

名前 タイプ 説明
batch_size 整数 (integer) トレーニングに使用するバッチ サイズ。 バッチ サイズは、単一の順方向および逆方向の合格をトレーニングするために使用するトレーニング例の数です。 一般的に、大規模なデータセットでは、バッチ サイズが大きいほど適切に機能する傾向があることがわかっています。 このプロパティの既定値と最大値は、基本モデルに固有です。 バッチ サイズが大きいほど、モデル パラメーターの更新頻度は低くなりますが、分散は小さくなります。
learning_rate_multiplier 数値 トレーニングに使用する学習率乗数。 微調整の学習率は、事前トレーニングに使用された元の学習率にこの値を掛けた値です。 学習率が高いほど、大きいバッチ サイズでのパフォーマンスが向上する傾向があります。 0.02 から 0.2 の範囲の値を試して、最適な結果が得られるものを確認することをお勧めします。 学習率を低くすると、オーバーフィットを避けるのに役立つ場合があります。
n_epochs 整数 (integer) モデルをトレーニングするエポックの数。 エポックとは、トレーニング データセット全体での 1 つの完全なサイクルを指します。
seed 整数 (integer) シードはジョブの再現性を制御します。 同じシードとジョブ パラメーターを渡すと同じ結果が得られますが、まれに異なる場合があります。 シードが指定されていない場合は生成されます。

カスタマイズしたモデルの状態を確認する

微調整ジョブを開始した後、完了するまでに時間がかかる場合があります。 ジョブは、システム内の他のジョブの後にキューに入れられる場合があります。 モデルのトレーニングには、モデルおよびデータセットのサイズに応じて、数分または数時間かかる場合があります。 次の例では、REST API を使用して、微調整ジョブの状態を確認します。 この例では、前の例で返されたジョブ ID を使用して、ジョブに関する情報を取得します。

curl -X GET $AZURE_OPENAI_ENDPOINT/openai/fine_tuning/jobs/<YOUR-JOB-ID>?api-version=2024-10-21 \
  -H "api-key: $AZURE_OPENAI_API_KEY"

微調整イベントの一覧

トレーニング中に生成された個々の微調整イベントを調べるには、次の操作を行います。

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/fine_tuning/jobs/{fine_tuning_job_id}/events?api-version=2024-10-21 \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

チェックポイント

各トレーニング エポックが完了すると、チェックポイントが生成されます。 チェックポイントは、完全な機能を持つモデルのバージョンであり、デプロイすることも、後続の微調整ジョブのターゲット モデルとして使用することもできます。 チェックポイントは、オーバーフィットの前にスナップショットを提供する可能性があるため、特に便利です。 微調整が完了すると、3 つの最新バージョンのモデルをデプロイできるようになります。 最後のエポックは微調整されたモデルで表され、前の 2 つのエポックはチェックポイントとして利用できます。

個々の微調整ジョブに関連付けられたチェックポイントの一覧を取得するために、list checkpoints コマンドを実行できます。

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/fine_tuning/jobs/{fine_tuning_job_id}/checkpoints?api-version=2024-10-21 \
  -H "Content-Type: application/json" \
  -H "api-key: $AZURE_OPENAI_API_KEY" 

カスタマイズしたモデルを分析する

Azure OpenAI では、各微調整ジョブが完了すると、results.csv という名前の結果ファイルが添付されます。 この結果ファイルを使用して、カスタマイズしたモデルのトレーニングと検証のパフォーマンスを分析できます。 カスタマイズしたモデルごとに結果ファイルのファイル ID が一覧表示され、REST API を使用してファイル ID を取得し、分析するために結果ファイルをダウンロードできます。

次の Python の例では、REST API を使ってカスタマイズしたモデルの微調整ジョブに添付された最初の結果ファイルのファイル ID を取得し、分析するために作業ディレクトリにファイルをダウンロードします。

curl -X GET "$AZURE_OPENAI_ENDPOINT/openai/fine_tuning/jobs/<JOB_ID>?api-version=2023-12-01-preview" \
  -H "api-key: $AZURE_OPENAI_API_KEY")
curl -X GET "$AZURE_OPENAI_ENDPOINT/openai/files/<RESULT_FILE_ID>/content?api-version=2023-12-01-preview" \
    -H "api-key: $AZURE_OPENAI_API_KEY" > <RESULT_FILENAME>

結果ファイルは、ヘッダー行と、微調整ジョブによって実行される各トレーニング ステップの行が含まれる CSV ファイルです。 この結果ファイルには、次の列が含まれています。

列名 説明
step トレーニング ステップの数。 トレーニング ステップは、トレーニング データのバッチに対する前方と後方の 1 回のパスを表します。
train_loss トレーニング バッチの損失。
train_mean_token_accuracy モデルによって正しく予測されたトレーニング バッチ内のトークンの割合。
たとえば、バッチ サイズが 3 に設定されていて、データに候補 [[1, 2], [0, 5], [4, 2]] が含まれており、モデルが [[1, 1], [0, 5], [4, 2]] を予測した場合、この値は 0.83 (5/6) に設定されます。
valid_loss 検証バッチの損失。
validation_mean_token_accuracy モデルによって正しく予測された検証バッチ内のトークンの割合。
たとえば、バッチ サイズが 3 に設定されていて、データに候補 [[1, 2], [0, 5], [4, 2]] が含まれており、モデルが [[1, 1], [0, 5], [4, 2]] を予測した場合、この値は 0.83 (5/6) に設定されます。
full_valid_loss 各エポックの終了時に計算される検証損失。 トレーニングがうまくいった場合は、損失は減少します。
full_valid_mean_token_accuracy 各エポックの終了時に計算された有効平均トークン精度。 トレーニングがうまくいった場合は、トークンの精度が向上します。

Azure AI Foundry ポータル内で、results.csv ファイル内のデータをプロットとして表示することもできます。 トレーニング済みのモデルのリンクを選択すると、損失、平均トークンの精度、トークンの精度の 3 つのグラフが表示されます。 検証データを指定した場合、両方のデータセットが同じプロットに表示されます。

時間の経過と同時に減少する損失を探し、精度を向上させます。 トレーニング データと検証データの間に相違がある場合は、オーバーフィットしていることを示している可能性があります。 エポックが少ない、または学習率の乗数が小さいトレーニングを試してみてください。

微調整されたモデルをデプロイする

微調整ジョブのメトリックに満足できたら、または推論に移行するだけの場合は、モデルをデプロイする必要があります。

さらなる検証のためにデプロイする場合は、Developer デプロイを使用した テスト 用のデプロイを検討してください。

運用環境にデプロイする準備ができている場合、または特定のデータ所在地のニーズがある場合は、 デプロイ ガイドに従ってください。

変数 定義
トークン 認証トークンを生成するには、複数の方法があります。 初期テストの最も簡単な方法は、Azure portal から Cloud Shell を起動することです。 次に、az account get-access-token を実行します。 このトークンは、API テストの一時的な認証トークンとして使用できます。 これを新しい環境変数に格納することをお勧めします。
サブスクリプション 関連付けられている Azure OpenAI リソースのサブスクリプション ID。
リソースグループ Azure OpenAI リソースのリソース グループ名。
リソース名 Azure OpenAI リソース名。
モデルデプロイメント名 微調整された新しいモデル デプロイのカスタム名。 これは、チャット入力候補の呼び出しを行うときにコードで参照される名前です。
ファインチューニングされたモデル(fine_tuned_model) この値は、前の手順の微調整ジョブの結果から取得します。 これは gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83 のようになります。 その値を deploy_data json に追加する必要があります。 また、ftchkpt-e559c011ecc04fc68eaa339d8227d02d 形式で表示されるチェックポイント ID を渡すことで、チェックポイントをデプロイすることもできます。
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"
        }
    }
}'

リージョン間デプロイの詳細を確認し、デプロイされたモデルを 使用します

継続的な微調整

微調整されたモデルを作成したら、さらに微調整を行い時間をかけてモデルを改良し続けることができます。 継続的な微調整は、既に微調整されたモデルを基本モデルとして選び、新しいトレーニング サンプルのセットでさらに微調整する反復プロセスです。

以前に微調整したモデルに対して微調整を実行するには、カスタマイズされたモデルを作成するに関するセクションで説明したのと同じプロセスを使いますが、汎用基本モデルの名前を指定する代わりに、既に微調整されたモデルの ID を指定します。 微調整されたモデル ID は gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7 のようになります

curl -X POST $AZURE_OPENAI_ENDPOINT/openai/fine_tuning/jobs?api-version=2023-12-01-preview \
  -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>"
}'

また、微調整モデルの異なるイテレーションを区別しやすくするために、suffix パラメーターを含めることをお勧めします。 suffix は文字列を受け取り、微調整されたモデルを特定するように設定されます。 サフィックスには最大 40 文字 (a-z、A-Z、0-9、-、_) を指定することができ、微調整したモデル名に追加されます。

ファインチューニングされたモデルの ID が不明な場合は、Azure AI Foundry の [モデル] ページの中でこの情報を確認できます。または REST API を使用して、特定の Azure OpenAI リソースのモデルの一覧を生成できます。

デプロイ、カスタマイズしたモデル、トレーニング ファイルをクリーンアップする

カスタマイズしたモデルの利用が完了したら、デプロイとモデルを削除できます。 必要に応じて、サービスにアップロードしたトレーニングおよび検証のファイルを削除することもできます。

モデル デプロイの削除

さまざまな方法を使用して、カスタマイズしたモデルのデプロイを削除できます。

カスタマイズしたモデルの削除

同様に、さまざまな方法を使用して、カスタマイズしたモデルを削除できます。

既存のデプロイがある場合は、カスタマイズしたモデルを削除できません。 カスタマイズしたモデルを削除する前に、まずモデル デプロイを削除する必要があります。

トレーニング ファイルの削除

必要に応じて、トレーニング用にアップロードしたトレーニングおよび検証のファイル、およびトレーニング中に生成された結果ファイルを、Azure OpenAI サブスクリプションから削除できます。 次の方法を使用して、トレーニング、検証、および結果のファイルを削除できます。

次のステップ