微調整でモデルをカスタマイズする
Azure OpenAI Service を使用すると、"微調整" と呼ばれるプロセスを使用して、個人用データセットに合わせてモデルを調整できます。 このカスタマイズ手順では以下が提供されて、サービスをさらに活用できるようになります。
- プロンプト エンジニアリングからだけでは得られないより高品質な結果
- モデルの最大要求コンテキスト制限を超える多くの例を使用してトレーニングする機能。
- 短いプロンプトによるトークンの節約
- 低遅延の要求 (特に小規模なモデルを使用する場合)。
少数のショット学習とは対照的に、微調整では、プロンプトに収まらない多くの例をトレーニングすることでモデルが改善され、多数のタスクでより良い結果が得られます。 微調整では、特定のタスクのパフォーマンスを向上させるために基本モデルの重みが調整されるため、プロンプトに含める例や手順を多く含める必要はありません。 つまり、送信されるテキストや API 呼び出しごとに処理されるトークンが少なくなり、コストが節約され、要求の待機時間が短縮される可能性があります。
LoRA (低ランク近似) を使用して、パフォーマンスに大きな影響を与えることなく複雑さを軽減する方法でモデルを微調整します。 このメソッドは、元の高ランクのマトリックスを下位ランク 1 で近似することによって機能するため、監視されているトレーニング フェーズ中に "重要" パラメーターの小さなサブセットのみを微調整し、モデルをより管理しやすく効率的にします。 ユーザーにとって、トレーニングが他の手法よりも速く、より手頃な価格になります。
Note
現在、Azure OpenAI では、GPT-4o mini を含むすべてのサポート対象のモデルに対して、テキストからテキストへの微調整のみがサポートされています。
前提条件
- Azure OpenAI の微調整ガイドを使用する場合を参照してください。
- Azure サブスクリプション。 無料で作成できます。
- Azure OpenAI モデルの微調整をサポートするリージョンにある Azure OpenAI リソース。 リージョン別の使用可能なモデルとサポートされている機能の一覧については、「モデルの概要テーブルとリージョンの可用性」を参照してください。 詳細については、「Azure OpenAI を使用してリソースを作成し、モデルをデプロイする」を参照してください。
- アクセスの微調整には、Cognitive Services OpenAI 共同作成者が必要です。
- クォータを表示し、Azure OpenAI Studio でモデルをデプロイするためのアクセス権がまだない場合は、追加のアクセス許可が必要です。
モデル
次のモデルでは、微調整がサポートされます。
babbage-002
davinci-002
gpt-35-turbo
(0613)gpt-35-turbo
(1106)gpt-35-turbo
(0125)gpt-4
(0613)*gpt-4o
(2024-08-06)gpt-4o-mini
(2024-07-18)
* このモデルのファインチューニングは、現在パブリック プレビューです。
または、base-model.ft-{jobid} として書式設定された、以前に微調整されたモデルを微調整することもできます。
現在微調整をサポートしているリージョンを確認するには、モデルに関するページを参照してください。
Azure OpenAI Studio のワークフローを確認する
少し時間を取って、Azure OpenAI Studio を使用するための微調整ワークフローを確認してください。
- トレーニングおよび検証用のデータを準備します。
- Azure OpenAI Studio の [Create custom model](カスタム モデルの作成) ウィザードを使用して、カスタム モデルをトレーニングします。
- 基本モデルを選択します。
- トレーニング データを選択します。
- 必要に応じて、検証データを選択します。
- 必要に応じて、微調整ジョブのタスク パラメーターを構成します。
- 選択内容を確認して、新たにカスタマイズしたモデルをトレーニングします。
- カスタム微調整モデルの状態を確認します。
- カスタム モデルをデプロイして、使用できるようにします。
- カスタム モデルを使用します。
- 必要に応じて、カスタム モデルのパフォーマンスと適合度を分析します。
トレーニング データと検証データを準備する
トレーニング データと検証データのセットは、モデルの実行方法に関する入力と出力の例で構成されます。
モデルの種類が異なると、異なる形式のトレーニング データが必要になります。
使用するトレーニングおよび検証データは、JSON Lines (JSONL) ドキュメントの形式である必要があります。 gpt-35-turbo
(すべてのバージョン)、gpt-4
、gpt-4o
、gpt-4o-mini
の場合、微調整データセットの形式は、Chat Completions API で使用される会話形式である必要があります。
gpt-4o-mini
(2024-07-18) モデルの微調整の詳細な手順については、「Azure OpenAI 微調整チュートリアル」を参照してください。
ファイル形式の例
{"messages": [{"role": "system", "content": "You are an Xbox customer support agent whose primary goal is to help users with issues they are experiencing with their Xbox devices. You are friendly and concise. You only provide factual answers to queries, and do not provide answers that are not related to Xbox."}, {"role": "user", "content": "Is Xbox better than PlayStation?"}, {"role": "assistant", "content": "I apologize, but I cannot provide personal opinions. My primary job is to assist you with any issues related to your Xbox device. Do you have any Xbox-related issues that need addressing?"}]}
{"messages": [{"role": "system", "content": "You are an Xbox customer support agent whose primary goal is to help users with issues they are experiencing with their Xbox devices. You are friendly and concise. You only provide factual answers to queries, and do not provide answers that are not related to Xbox."}, {"role": "user", "content": "Can I play PC games on my Xbox?"}, {"role": "assistant", "content": "While Xbox consoles don't natively support PC games, they can play an array of Xbox games, many of which are also available on PC. Can I assist you with finding games compatible with your Xbox device?"}]}
{"messages": [{"role": "system", "content": "You are an Xbox customer support agent whose primary goal is to help users with issues they are experiencing with their Xbox devices. You are friendly and concise. You only provide factual answers to queries, and do not provide answers that are not related to Xbox."}, {"role": "user", "content": "I'm having trouble connecting my Xbox to the Wi-Fi."}, {"role": "assistant", "content": "No worries, let's go through the network settings on your Xbox. Can you please tell me what happens when you try to connect it to the Wi-Fi?"}]}
マルチターン チャット ファイル形式
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}]}
JSONL 形式に加えて、トレーニングおよび検証のデータ ファイルは UTF-8 でエンコードしてバイトオーダー マーク (BOM) を含める必要があります。 ファイルは、512 MB 未満のサイズにする必要があります。
トレーニングおよび検証のデータセットを作成する
トレーニング例が多いほど適切になります。 微調整ジョブは、少なくとも 10 個のトレーニング例がないと実行されませんが、このような少数では、目に見えるほどの影響をモデルの応答に与えられません。 成功するには、数千ではないにしても数百のトレーニング例を提供することをお勧めします。
一般的に、データセット サイズを 2 倍にすると、モデルの品質を直線的に向上させることができます。 ただし、低品質の例はパフォーマンスに悪影響を与える可能性があることに注意してください。 大量の内部データでモデルをトレーニングする場合、最初に最高品質の例についてのみデータセットを排除しないと、予想よりもはるかにパフォーマンスの低いモデルになる可能性があります。
[Create custom model](カスタム モデルの作成) ウィザードを使用する
Azure OpenAI Studio には [Create custom model](カスタム モデルの作成) ウィザードが用意されているため、Azure リソース用に微調整されたモデルを対話形式で作成してトレーニングできます。
https://oai.azure.com/ で Azure OpenAI Studio を開き、Azure OpenAI リソースにアクセスできる資格情報を使用してサインインします。 サインイン ワークフローの途中で、適切なディレクトリ、Azure サブスクリプション、Azure OpenAI リソースを選択します。
Azure OpenAI Studio で、[ツール] > [微調整] ペインに移動し、[モデルの微調整] を選択します。
[Create custom model](カスタム モデルの作成) ウィザードが開きます。
基本モデルを選択する
カスタム モデルを作成するための最初の手順は、基本モデルを選択することです。 [Base model](基本モデル) ウィンドウで、カスタム モデルに使用する基本モデルを選択できます。 この選択は、モデルのパフォーマンスとコストの両方に影響します。
[Base model type](基本モデルの種類) ドロップダウンから基本モデルを選択し、[次へ] を選択して続行します。
次の使用可能な基本モデルのいずれかから、カスタム モデルを作成できます。
babbage-002
davinci-002
gpt-35-turbo
(0613)gpt-35-turbo
(1106)gpt-35-turbo
(0125)gpt-4
(0613)または、base-model.ft-{jobid} として書式設定された、以前に微調整されたモデルを微調整することもできます。
微調整が可能な基本モデルの詳細については、モデルに関する記事を参照してください。
トレーニング データを選択する
次の手順では、既存の準備済みトレーニング データを選択するか、モデルをカスタマイズするときに使用する新しい準備済みトレーニング データをアップロードします。 [トレーニング データ] ウィンドウには、以前にアップロードされた既存のデータセットが表示されるほか、新しいトレーニング データをアップロードできるオプションも表示されます。
トレーニング データが既にサービスにアップロードされている場合は、[Azure OpenAI Connection のファイル] を選択します。
- 表示されたドロップダウン リストからファイルを選択します。
新しいトレーニング データをアップロードするには、次のいずれかのオプションを使用します。
ローカル ファイルからトレーニング データをアップロードするには、[ローカル ファイル] を選択します。
Azure BLOB または別の Web 上の共有の場所からトレーニング データをインポートするには、[Azure BLOB またはその他の Web 上の共有場所] を選択します。
大きなデータ ファイルの場合は、Azure BLOB ストアからインポートすることをお勧めします。 大きなファイルは、マルチパート フォームを介してアップロードすると不安定になる場合があります。要求がアトミックであり、再試行または再開ができないためです。 Azure Blob Storage の詳細については、「Azure Blob Storage とは」を参照してください。
Note
トレーニング データ ファイルは、JSONL ファイル形式にし、バイトオーダー マーク (BOM) を使用して UTF-8 でエンコードする必要があります。 ファイルは、512 MB 未満のサイズにする必要があります。
ローカル ファイルからトレーニング データをアップロードする
次のいずれかの方法を使用して、ローカル ファイルから新しいトレーニング データセットをサービスにアップロードできます。
ファイルを [トレーニング データ] ウィンドウのクライアント領域にドラッグ アンド ドロップし、[ファイルのアップロード] を選択します。
[トレーニング データ] ウィンドウのクライアント領域から [ファイルを参照する] を選択し、[開く] ダイアログからアップロードするファイルを選択して、[ファイルのアップロード] を選択します。
トレーニング データセットを選択してアップロードしたら、[次へ] を選択して続行します。
Azure BLOB ストアからトレーニング データをインポートする
ファイルの名前と場所を指定することで、Azure BLOB または別の Web 上の共有の場所からトレーニング データセットをインポートできます。
ファイルの[ファイル名] を入力します。
[ファイルの場所] には、Azure BLOB の URL、Azure Storage Shared Access Signature (SAS)、またはアクセス可能な Web 上の共有の場所へのその他のリンクを指定します。
[インポート] を選択して、トレーニング データセットをサービスにインポートします。
トレーニング データセットを選択してアップロードしたら、[次へ] を選択して続行します。
検証データを選択する
次の手順では、トレーニング プロセスで検証データを使用するようにモデルを構成するためのオプションが提供されます。 検証データを使用しない場合は、[次へ] を選択してモデルの詳細オプションに進むことができます。 それ以外で、検証データセットがある場合は、既存の準備済みの検証データを選択するか、モデルをカスタマイズするときに使用する新しい準備済みの検証データをアップロードできます。
[検証データ] ウィンドウには、以前にアップロードされた既存のトレーニングおよび検証のデータセットが表示され、新しいトレーニング データをアップロードできるオプションが表示されます。
検証データが既にサービスにアップロードされている場合は、[データセットの選択] を選択します。
- [検証データ] ウィンドウに表示される一覧からファイルを選択します。
新しい検証データをアップロードするには、次のいずれかのオプションを使用します。
ローカル ファイルから検証データをアップロードするには、[ローカル ファイル] を選択します。
Azure BLOB または別の Web 上の共有の場所から検証データをインポートするには、[Azure BLOB またはその他の Web 上の共有場所] を選択します。
大きなデータ ファイルの場合は、Azure BLOB ストアからインポートすることをお勧めします。 大きなファイルは、マルチパート フォームを介してアップロードすると不安定になる場合があります。要求がアトミックであり、再試行または再開ができないためです。
Note
検証データ ファイルは、トレーニング データ ファイルと同様に JSONL ファイル形式にし、バイトオーダー マーク (BOM) を使用して UTF-8 でエンコードする必要があります。 ファイルは、512 MB 未満のサイズにする必要があります。
ローカル ファイルから検証データをアップロードする
次のいずれかの方法を使用して、ローカル ファイルから新しい検証データセットをサービスにアップロードできます。
ファイルを [検証データ] ウィンドウのクライアント領域にドラッグ アンド ドロップし、[ファイルのアップロード] を選択します。
[検証データ] ウィンドウのクライアント領域から [ファイルを参照する] を選択し、[開く] ダイアログからアップロードするファイルを選択して、[ファイルのアップロード] を選択します。
検証データセットを選択してアップロードしたら、[次へ] を選択して続行します。
Azure BLOB ストアから検証データをインポートする
ファイルの名前と場所を指定することで、Azure BLOB または別の Web 上の共有の場所から検証データセットをインポートできます。
ファイルの[ファイル名] を入力します。
[ファイルの場所] には、Azure BLOB の URL、Azure Storage Shared Access Signature (SAS)、またはアクセス可能な Web 上の共有の場所へのその他のリンクを指定します。
[インポート] を選択して、トレーニング データセットをサービスにインポートします。
検証データセットを選択してアップロードしたら、[次へ] を選択して続行します。
タスク パラメーターを構成する
[カスタム モデルの作成] ウィザードの [タスク パラメーター] ペインには、微調整されたモデルをトレーニングするためのパラメーターが表示されます。 次のパラメーターを使用できます。
名前 | タイプ | 説明 |
---|---|---|
batch_size |
integer | トレーニングに使用するバッチ サイズ。 バッチ サイズは、単一の順方向および逆方向の合格をトレーニングするために使用するトレーニング例の数です。 一般的に、大規模なデータセットでは、バッチ サイズが大きいほど適切に機能する傾向があることがわかっています。 このプロパティの既定値と最大値は、基本モデルに固有です。 バッチ サイズが大きいほど、モデル パラメーターの更新頻度は低くなりますが、分散は小さくなります。 |
learning_rate_multiplier |
数値 | トレーニングに使用する学習率乗数。 微調整の学習率は、事前トレーニングに使用された元の学習率にこの値を掛けた値です。 学習率が高いほど、大きいバッチ サイズでのパフォーマンスが向上する傾向があります。 0.02 から 0.2 の範囲の値を試して、最適な結果が得られるものを確認することをお勧めします。 学習率を小さくすると、オーバーフィットを避けるのに役立つ場合があります。 |
n_epochs |
integer | モデルをトレーニングするエポックの数。 エポックとは、トレーニング データセット全体での 1 つの完全なサイクルを指します。 |
seed |
integer | シードはジョブの再現性を制御します。 同じシードとジョブ パラメーターを渡すと同じ結果が得られますが、まれに異なる場合があります。 シードが指定されていない場合は生成されます |
[既定値] を選択して微調整ジョブの既定値を使用するか、[カスタム] を選択してハイパーパラメーター値を表示して編集します。 既定値を選択すると、トレーニング データに基づいて正しい値がアルゴリズムによって決定されます。
高度なオプションを構成したら [次へ] を選択し、選択内容を確認して微調整したモデルをトレーニングします。
選択内容をレビューしてモデルをトレーニングする
ウィザードの [レビュー] ウィンドウには、構成の選択に関する情報が表示されます。
モデルをトレーニングする準備ができたら、[Start Training job](トレーニング ジョブの開始) を選択して微調整ジョブを開始し、[モデル] ウィンドウに戻ります。
カスタム モデルの状態を確認する
[モデル] ウィンドウでは、[Customized models](カスタマイズされたモデル) タブにカスタム モデルに関する情報が表示されます。このタブには、カスタム モデルの微調整ジョブの状態とジョブ ID に関する情報が含まれます。 ジョブが完了すると、タブに結果ファイルのファイル ID が表示されます。 モデル トレーニング ジョブの更新された状態を表示するには、[最新の情報に更新] を選択する必要がある場合があります。
微調整ジョブを開始した後、完了するまでに時間がかかる場合があります。 ジョブは、システム上の他のジョブの後にキューに入れられる場合があります。 モデルのトレーニングには、モデルおよびデータセットのサイズに応じて、数分または数時間かかる場合があります。
[モデル] ウィンドウで実行できるタスクの一部を次に示します。
[Customized models](カスタマイズされたモデル) タブの [状態] 列で、カスタム モデルの微調整ジョブの状態を確認します。
[モデル名] 列でモデル名を選択して、カスタム モデルに関する詳細情報を表示します。 微調整ジョブの状態、トレーニング結果、トレーニング イベント、ジョブで使用されているハイパーパラメーターを確認できます。
[トレーニング ファイルをダウンロードする] を選択して、モデルに使用したトレーニング データをダウンロードします。
[結果のダウンロード] を選択して、モデルの微調整ジョブに添付された結果ファイルをダウンロードし、トレーニングおよび検証のパフォーマンスについてカスタム モデルを分析します。
[更新] を選んで、ページを最新の情報に更新します。
チェックポイント
各トレーニング エポックが完了すると、チェックポイントが生成されます。 チェックポイントは、完全な機能を持つモデルのバージョンであり、デプロイすることも、後続の微調整ジョブのターゲット モデルとして使用することもできます。 チェックポイントは、オーバーフィットが発生する前のモデルのスナップショットを提供できるため、特に有益です。 微調整が完了すると、3 つの最新バージョンのモデルをデプロイできるようになります。
安全性評価 GPT-4、GPT-4o、および GPT-4o-mini の微調整 - パブリック プレビュー
GPT-4o、GPT-4o-mini、GPT-4 は、お客様のニーズに合わせて微調整できる最も高度なモデルです。 Azure OpenAI の他のモデルと同様、微調整されたモデルは高度な機能を備えていますが、その分、有害なコンテンツの生成、操作、人間のような振る舞い、プライバシー問題など、責任ある AI の利用に関する課題も増大します。 リスク、機能、制限に関する詳細については、「責任ある AI プラクティスの概要」および「透明性に関する注意事項」をご参照ください。 高度に微調整されたモデルに伴うリスク軽減のため、微調整されたモデルのトレーニングと出力において有害なコンテンツを検出し、その生成を防止する追加の評価手順を導入しました。 これらの手順は、「Microsoft の責任ある AI の基本原則」と「Azure OpenAI Service のコンテンツのフィルター処理」に準拠しています。
- 評価は、顧客ごとに専用のプライベート ワークスペースを設けて実施されます。
- 評価エンドポイントは Azure OpenAI リソースと同じ地域に配置されます。
- 評価の実施に際し、トレーニング データは保存されず、最終的なモデル評価 (デプロイの可否) のみが保存されます。
GPT-4o、GPT-4o-mini、および GPT-4 の微調整済みモデルの評価フィルターには、あらかじめ決められたしきい値が設定されており、お客様側で変更することはできません。また、お客様が独自に作成したコンテンツのフィルター処理の設定には関連付けられません。
データの評価
トレーニングを開始する前に、データ内に潜む可能性のある有害コンテンツ (暴力、性的、ヘイト、公平性、自傷行為など - 各カテゴリの定義はこちら) の評価が行われます。 指定された重大度レベルを超える有害なコンテンツが検出された場合、トレーニング ジョブは失敗し、失敗の原因となったカテゴリを通知するメッセージが表示されます。
サンプル メッセージ:
The provided training data failed RAI checks for harm types: [hate_fairness, self_harm, violence]. Please fix the data and try again.
微調整機能の一環として、お客様のトレーニング データは、データ インポート ジョブにおいて自動的に評価されます。
トレーニング データで有害なコンテンツが検出されて微調整ジョブが失敗した場合、課金されません。
モデルの評価
トレーニング完了後、微調整されたモデルをデプロイできるようになる前に、Azure に組み込まれているリスクおよび安全性の指標を用いて、モデルが有害な応答を生成する可能性がないか評価されます。 大規模言語モデルのベースモデルと同じテスト手法を用いて、微調整済みモデルとの会話をシミュレートし、有害なコンテンツを出力する可能性を評価します。評価では、暴力、性的、ヘイト、公平性、自傷行為といった特定の有害なコンテンツのカテゴリを使用します。
モデルが許容範囲を超えて有害なコンテンツを含む出力を生成する場合、モデルはデプロイできなくなり、具体的にどの有害カテゴリが検出されたかについての情報が提供されます。
サンプル メッセージ:
This model is unable to be deployed. Model evaluation identified that this fine tuned model scores above acceptable thresholds for [Violence, Self Harm]. Please review your training data set and resubmit the job.
データ評価と同様、微調整機能を提供する一環として、モデルは微調整ジョブ内で自動的に評価されます。 サービスによりログに記録されるのは、結果として得られた評価 (デプロイの可否) のみです。 微調整されたモデルのデプロイ時に、モデルの出力が有害なコンテンツを含むと判断されデプロイされなかった場合、トレーニングにかかった費用は発生しません。
微調整されたモデルをデプロイする
微調整ジョブが正常に完了したら、[モデル] ウィンドウからカスタム モデルをデプロイできます。 カスタム モデルをデプロイして、補完呼び出しで使用できるようにする必要があります。
重要
カスタマイズされたモデルをデプロイした後、デプロイが 15 日を超えて非アクティブのままである場合、デプロイは削除されます。 カスタマイズされたモデルのデプロイは、モデルが 15 日以上前にデプロイされ、15 日間連続して完了またはチャット完了の呼び出しが行われなかった場合、"非アクティブ" になります。
非アクティブなデプロイを削除しても、基になるカスタマイズされたモデルは削除されることも影響を受けることもなく、カスタマイズされたモデルはいつでも再デプロイできます。 「Azure OpenAI Service の価格」で説明されているように、デプロイ済みのカスタマイズされた (微調整された) 各モデルには、補完またはチャット補完の呼び出しがモデルに対して行われているかどうかに関係なく、1 時間ごとのホスティング コストが発生します。 Azure OpenAI を使用したコストの計画と管理の詳細については、「Azure OpenAI Service のコストを管理するための計画」のガイダンスを参照してください。
Note
カスタム モデルに対して許可されるデプロイは 1 つだけです。 既にデプロイされているカスタム モデルを選択すると、エラー メッセージが表示されます。
カスタム モデルをデプロイするには、デプロイするカスタム モデルを選択し、[モデルをデプロイします] を選択します。
[モデルをデプロイします] ダイアログ ボックスが開きます。 ダイアログ ボックスで [デプロイ名] を入力し、[作成] を選択して、カスタム モデルのデプロイを開始します。
デプロイの進行状況は、Azure OpenAI Studio の [Deployments](デプロイ) ウィンドウで監視できます。
リージョン間デプロイ
微調整では、微調整されたモデルを、モデルが最初に微調整された場所とは異なるリージョンにデプロイすることがサポートされています。 別のサブスクリプション/リージョンにデプロイすることもできます。
唯一の制限は、新しいリージョンが微調整もサポートする必要があることと、サブスクリプション間でデプロイする場合、デプロイ用の認可トークンを生成するアカウントがソース サブスクリプションと宛先サブスクリプションの両方にアクセスできる必要があることです。
サブスクリプション/リージョン間のデプロイは、Python または REST を使って実行できます。
デプロイされたカスタム モデルを使用する
カスタム モデルをデプロイしたら、他のデプロイ済みモデルと同様に使用できます。 Azure OpenAI Studio の [プレイグラウンド] を使用して、新しいデプロイを試すことができます。 カスタム モデルでは、他のデプロイ済みモデルと同様に、temperature
や max_tokens
などの同じパラメーターを引き続き使用できます。 微調整された babbage-002
および davinci-002
モデルに対して、入力候補プレイグラウンドと入力候補 API を使用します。 微調整された gpt-35-turbo-0613
モデルに対して、チャット プレイグラウンドとチャット入力候補 API を使用します。
カスタム モデルを分析する
Azure OpenAI では、各微調整ジョブが完了すると、results.csv という名前の結果ファイルが添付されます。 この結果ファイルを使用して、カスタム モデルのトレーニングと検証のパフォーマンスを分析できます。 結果ファイルのファイル ID は、Azure OpenAI Studio の [モデル] ウィンドウの [結果ファイル ID] 列に、カスタム モデルごとに一覧表示されます。 ファイル ID を使用して、Azure OpenAI Studio の [Data files](データ ファイル) ウィンドウから結果ファイルを識別してダウンロードできます。
結果ファイルは、ヘッダー行と、微調整ジョブによって実行される各トレーニング ステップの行が含まれる 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 OpenAI Studio で、results.csv ファイル内のデータをプロットとして表示することもできます。 トレーニング済みのモデルのリンクを選択すると、損失、平均トークンの精度、トークンの精度の 3 つのグラフが表示されます。 検証データを指定した場合、両方のデータセットが同じプロットに表示されます。
時間の経過と同時に減少する損失を探し、精度を向上させます。 トレーニングデータと検証データの間に相違がある場合は、オーバーフィットしていることを示している可能性があります。 エポックが少ない、または学習率の乗数が小さいトレーニングを試してみてください。
デプロイ、カスタム モデル、トレーニング ファイルをクリーンアップする
カスタム モデルの利用が完了したら、デプロイとモデルを削除できます。 必要に応じて、サービスにアップロードしたトレーニングおよび検証のファイルを削除することもできます。
モデル デプロイの削除
重要
カスタマイズされたモデルをデプロイした後、デプロイが 15 日を超えて非アクティブのままである場合、デプロイは削除されます。 カスタマイズされたモデルのデプロイは、モデルが 15 日以上前にデプロイされ、15 日間連続して完了またはチャット完了の呼び出しが行われなかった場合、"非アクティブ" になります。
非アクティブなデプロイを削除しても、基になるカスタマイズされたモデルは削除されることも影響を受けることもなく、カスタマイズされたモデルはいつでも再デプロイできます。 「Azure OpenAI Service の価格」で説明されているように、デプロイ済みのカスタマイズされた (微調整された) 各モデルには、補完またはチャット補完の呼び出しがモデルに対して行われているかどうかに関係なく、1 時間ごとのホスティング コストが発生します。 Azure OpenAI を使用したコストの計画と管理の詳細については、「Azure OpenAI Service のコストを管理するための計画」のガイダンスを参照してください。
カスタム モデルのデプロイは、Azure OpenAI Studio の [Deployments](デプロイ) ウィンドウで削除できます。 削除するデプロイを選択し、[削除] を選択してデプロイを削除します。
カスタム モデルを削除する
カスタム モデルは、Azure OpenAI Studio の [モデル] ウィンドウで削除できます。 [Customized models](カスタマイズされたモデル) タブから削除するカスタム モデルを選択し、[削除] を選択してカスタム モデルを削除します。
Note
既存のデプロイがある場合は、カスタム モデルを削除できません。 カスタム モデルを削除する前に、まずモデル デプロイを削除する必要があります。
トレーニング ファイルの削除
必要に応じて、トレーニング用にアップロードしたトレーニングおよび検証のファイル、およびトレーニング中に生成された結果ファイルを、Azure OpenAI Studio の [管理]>[Data files](データ ファイル) ウィンドウで削除できます。 削除するファイルを選択し、[削除] を選択してファイルを削除します。
継続的な微調整
微調整されたモデルを作成したら、さらに微調整を行い時間をかけてモデルを改良し続けることができます。 継続的な微調整は、既に微調整されたモデルを基本モデルとして選び、新しいトレーニング サンプルのセットでさらに微調整する反復プロセスです。
以前に微調整したモデルに対して微調整を実行するには、カスタマイズされたモデルを作成するに関するセクションで説明したのと同じプロセスを使いますが、汎用基本モデルの名前を指定する代わりに、既に微調整されたモデルを指定します。 カスタムの微調整されたモデルは gpt-35-turbo-0613.ft-5fd1918ee65d4cd38a5dcf6835066ed7
のようになります
また、微調整モデルの異なるイテレーションを区別しやすくするために、suffix
パラメーターを含めることをお勧めします。 suffix
は文字列を受け取り、微調整されたモデルを特定するように設定されます。 OpenAI Python API では、微調整されたモデル名に追加される最大 18 文字の文字列がサポートされています。
重要
この記事で "(プレビュー)" と付記されている項目は、現在、パブリック プレビュー段階です。 このプレビューはサービス レベル アグリーメントなしで提供されており、運用環境ではお勧めしません。 特定の機能はサポート対象ではなく、機能が制限されることがあります。 詳しくは、Microsoft Azure プレビューの追加使用条件に関するページをご覧ください。
前提条件
Azure OpenAI の微調整ガイドを使用する場合を参照してください。
Azure サブスクリプション。無料で作成できます。
Azure AI Studio の Azure AI プロジェクト。
微調整がサポートされているリージョン内のリソースへの Azure OpenAI 接続。
Note
サポートされるリージョンは、AI Studio プロジェクトで Azure OpenAI モデルを使用する場合とプロジェクト外で使用する場合とでは異なる場合があります。
アクセスの微調整には、Azure OpenAI リソースに対する Cognitive Services OpenAI 共同作成者ロールが必要です。
Azure AI Studio でクォータを表示してモデルをデプロイするためのアクセス権がまだない場合は、さらにアクセス許可が必要です。
モデル
次のモデルでは、微調整がサポートされます。
babbage-002
davinci-002
gpt-35-turbo
(0613)gpt-35-turbo
(1106)gpt-35-turbo
(0125)gpt-4
(0613)*gpt-4o
(2024-08-06)gpt-4o-mini
(2024-07-18)
* このモデルのファインチューニングは、現在パブリック プレビューです。
または、base-model.ft-{jobid} として書式設定された、以前に微調整されたモデルを微調整することもできます。
現在微調整をサポートしているリージョンを確認するには、モデルに関するページを参照してください。
Azure AI Studio のワークフローを確認する
少し時間を取って、Azure AI Studio を使用するための微調整ワークフローを確認してください。
- トレーニングおよび検証用のデータを準備します。
- Azure AI Studio のモデルの微調整ウィザードを使用して、カスタム モデルをトレーニングします。
- モデルを選択します。
- トレーニング データを選択します。
- 必要に応じて、検証データを選択します。
- 必要に応じて、微調整ジョブのパラメーターを構成します。
- 選択内容を確認して、新たにカスタマイズしたモデルをトレーニングします。
- 微調整されたモデルの状態を確認します。
- 必要に応じて、微調整されたモデルを分析してパフォーマンスと適合を確認します。
- 使用するために微調整されたモデルをデプロイします。
- 微調整されたモデルを使用します。
トレーニング データと検証データを準備する
トレーニング データと検証データのセットは、モデルの実行方法に関する入力と出力の例で構成されます。
モデルの種類が異なると、異なる形式のトレーニング データが必要になります。
使用するトレーニングおよび検証データは、JSON Lines (JSONL) ドキュメントの形式である必要があります。 gpt-35-turbo-0613
の場合、微調整データセットの形式は、チャット入力候補 API で使用される会話形式でである必要があります。
gpt-35-turbo-0613
モデルの微調整の詳細な手順については、Azure OpenAI の微調整に関するチュートリアルを参照してください。
ファイル形式の例
{"messages": [{"role": "system", "content": "You are an Xbox customer support agent whose primary goal is to help users with issues they are experiencing with their Xbox devices. You are friendly and concise. You only provide factual answers to queries, and do not provide answers that are not related to Xbox."}, {"role": "user", "content": "Is Xbox better than PlayStation?"}, {"role": "assistant", "content": "I apologize, but I cannot provide personal opinions. My primary job is to assist you with any issues related to your Xbox device. Do you have any Xbox-related issues that need addressing?"}]}
{"messages": [{"role": "system", "content": "You are an Xbox customer support agent whose primary goal is to help users with issues they are experiencing with their Xbox devices. You are friendly and concise. You only provide factual answers to queries, and do not provide answers that are not related to Xbox."}, {"role": "user", "content": "Can I play PC games on my Xbox?"}, {"role": "assistant", "content": "While Xbox consoles don't natively support PC games, they can play an array of Xbox games, many of which are also available on PC. Can I assist you with finding games compatible with your Xbox device?"}]}
{"messages": [{"role": "system", "content": "You are an Xbox customer support agent whose primary goal is to help users with issues they are experiencing with their Xbox devices. You are friendly and concise. You only provide factual answers to queries, and do not provide answers that are not related to Xbox."}, {"role": "user", "content": "I'm having trouble connecting my Xbox to the Wi-Fi."}, {"role": "assistant", "content": "No worries, let's go through the network settings on your Xbox. Can you please tell me what happens when you try to connect it to the Wi-Fi?"}]}
マルチターン チャット ファイル形式
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}]}
JSONL 形式に加えて、トレーニングおよび検証のデータ ファイルは UTF-8 でエンコードしてバイトオーダー マーク (BOM) を含める必要があります。 ファイルは、512 MB 未満のサイズにする必要があります。
トレーニングおよび検証のデータセットを作成する
トレーニング例が多いほど適切になります。 微調整ジョブは、少なくとも 10 個のトレーニング例がないと続行されませんが、このような少数ではモデルの応答に顕著な影響を与えるには不十分です。 成功するには、数千ではないにしても数百のトレーニング例を提供することをお勧めします。
一般的に、データセット サイズを 2 倍にすると、モデルの品質を直線的に向上させることができます。 ただし、低品質の例はパフォーマンスに悪影響を与える可能性があることに注意してください。 大量の内部データでモデルをトレーニングする場合、最初に最高品質の例についてのみデータセットを排除しないと、予想よりもはるかにパフォーマンスの低いモデルになる可能性があります。
微調整モデルの作成
既存の Azure AI Studio プロジェクトで Azure OpenAI モデルを微調整するには、次の手順に従います。
Azure AI Studio にサインインし、プロジェクトを選択します。 まだプロジェクトがない場合は、最初にプロジェクトを作成します。
折りたたみ可能な左側のメニューから [微調整]>+ [モデルを微調整する] を選択します。
基本モデルを選択する
微調整するベース モデルを選択します。 この選択は、モデルのパフォーマンスとコストの両方に影響します。 この例では、
gpt-35-turbo
モデルを選択します。 次に、[確認] を選択します。gpt-35-turbo
の場合、微調整に使用できるバージョンが異なるので、微調整するバージョンを選択してください。 (0301) を選択します。また、微調整モデルの異なるイテレーションを区別しやすくするために、
suffix
パラメーターを含めることをお勧めします。suffix
は文字列を受け取り、微調整されたモデルを特定するように設定されます。 OpenAI Python API では、微調整されたモデル名に追加される最大 18 文字の文字列がサポートされています。
微調整のために複数の Azure OpenAI 接続が有効になっている場合は、使用するリソースを選択します。 Azure OpenAI リソースにアクセスできるすべてのユーザーは、この微調整されたモデルにアクセスできます。
トレーニング データを選択する
次の手順では、既存の準備済みトレーニング データを選択するか、モデルをカスタマイズするときに使用する新しい準備済みトレーニング データをアップロードします。 [トレーニング データ] ウィンドウには、以前にアップロードされた既存のデータセットが表示されるほか、新しいトレーニング データをアップロードできるオプションも表示されます。
トレーニング データがプロジェクトに既にある場合は、Azure AI Studio の [データ] を選択します。
- [トレーニング データ] ウィンドウに表示される一覧からファイルを選択します。
トレーニング データが既に Azure OpenAI サービスにアップロードされている場合は、[Azure OpenAI Connection]\(Azure OpenAI 接続\) で Azure OpenAI 接続を選択します。
トレーニング データをアップロードしてモデルを微調整するには、[データのアップロード] を選択し、[ファイルのアップロード] を選択します。
- すべてのトレーニング例が、推論に必要な形式に従っていることを確認します。 モデルを効果的に微調整するには、バランスのとれた多様なデータセットを確保してください。 つまり、データバランスを維持し、さまざまなシナリオを含み、社会の実情に合わせてトレーニング データを定期的に調整することで、最終的にはより正確でバランスの取れたモデル応答が得られます。 詳細については、「データ準備」を参照してください。
- 大きなデータ ファイルの場合は、Azure BLOB ストアからインポートすることをお勧めします。 大きなファイルは、マルチパート フォームを介してアップロードすると不安定になる場合があります。要求がアトミックであり、再試行または再開ができないためです。 Azure Blob Storage の詳細については、「Azure Blob Storage とは」を参照してください。
Note
トレーニング データ ファイルは、JSONL ファイル形式にし、バイトオーダー マーク (BOM) を使用して UTF-8 でエンコードする必要があります。 ファイルは、512 MB 未満のサイズにする必要があります。
ファイルをアップロードすると、トレーニング データのプレビューが表示されます。 [次へ] を選択して続行します。
検証データを選択する
必要に応じて、検証データを提供してモデルを微調整することもできます。 検証データを使用しない場合は、[なし] を選択し、[次へ] を選択して、モデルの詳細オプションに進むことができます。
それ以外の場合は、検証データセットがあれば、以前にアップロードしたデータから選択するか、新しく準備した検証データをアップロードしてモデルの微調整に使用できます。
Note
検証データ ファイルは、トレーニング データ ファイルと同様に JSONL ファイル形式にし、バイトオーダー マーク (BOM) を使用して UTF-8 でエンコードする必要があります。 ファイルは、512 MB 未満のサイズにする必要があります。
パラメーターを構成する
必要に応じて、微調整ジョブのパラメーターを構成します。 次の機能を使用できます:
名前 | タイプ | 説明 |
---|---|---|
batch_size |
integer | トレーニングに使用するバッチ サイズ。 バッチ サイズは、単一の順方向および逆方向の合格をトレーニングするために使用するトレーニング例の数です。 一般的に、大規模なデータセットでは、バッチ サイズが大きいほど適切に機能する傾向があることがわかっています。 このプロパティの既定値と最大値は、基本モデルに固有です。 バッチ サイズが大きいほど、モデル パラメーターの更新頻度は低くなりますが、分散は小さくなります。 -1 に設定すると、batch_size はトレーニング セットの例の 0.2% として計算されます。最大値は 256 です。 |
learning_rate_multiplier |
数値 | トレーニングに使用する学習率乗数。 微調整の学習率は、事前トレーニングに使用された元の学習率にこの値を掛けた値です。 学習率が高いほど、大きいバッチ サイズでのパフォーマンスが向上する傾向があります。 0.02 から 0.2 の範囲の値を試して、最適な結果が得られるものを確認することをお勧めします。 学習率を小さくすると、オーバーフィットを避けるのに役立つ場合があります。 |
n_epochs |
integer | モデルをトレーニングするエポックの数。 エポックとは、トレーニング データセット全体での 1 つの完全なサイクルを指します。 -1 に設定すると、入力データに基づいてエポックの数が動的に決定されます。 |
seed |
integer | シードはジョブの再現性を制御します。 同じシードとジョブ パラメーターを渡すと同じ結果が得られますが、まれに異なる場合があります。 シードが指定されていない場合は生成されます。 |
既定の構成のままにするか、設定に合わせて値をカスタマイズできます。 構成の作成が完了したら、[次へ] を選択します。
選択内容をレビューしてモデルをトレーニングする
選択内容を確認し、[送信] を選択して、新しい微調整されたモデルのトレーニングを開始します。
微調整されたモデルの状態を確認する
微調整ジョブを送信すると、微調整されたモデルに関する詳細が表示されたページが表示されます。 微調整されたモデルの状態と詳細については、Azure AI Studio の [微調整]>[モデル] ページを参照してください。
ジョブは、システム上の他のジョブの後にキューに入れられる場合があります。 モデルのトレーニングには、モデルおよびデータセットのサイズに応じて、数分または数時間かかる場合があります。
微調整されたモデルを分析する
微調整が正常に完了したら、[詳細] タブの微調整されたモデル ページから results.csv という名前の結果ファイルをダウンロードできます。この結果ファイルを使用して、カスタム モデルのトレーニングと検証のパフォーマンスを分析できます。
結果ファイルは、ヘッダー行と、微調整ジョブによって実行される各トレーニング ステップの行が含まれる 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 |
各エポックの終了時に計算された有効平均トークン精度。 トレーニングがうまくいった場合は、トークンの精度が向上します。 |
また、微調整されたモデルの [メトリック] タブで、results.csv ファイル内のデータをプロットとして Azure AI Studio で表示することもできます。 トレーニング済みのモデルのリンクを選択すると、損失とトークンの精度の 2 つのグラフが表示されます。 検証データを指定した場合、両方のデータセットが同じプロットに表示されます。
時間の経過と同時に減少する損失を探し、精度を向上させます。 トレーニング データと検証データの間に相違がある場合は、オーバーフィットしていることを示している可能性があります。 エポックが少ない、または学習率の乗数が小さいトレーニングを試してみてください。
チェックポイント
各トレーニング エポックが完了すると、チェックポイントが生成されます。 チェックポイントは、完全な機能を持つモデルのバージョンであり、デプロイすることも、後続の微調整ジョブのターゲット モデルとして使用することもできます。 チェックポイントは、オーバーフィットが発生する前のモデルのスナップショットを提供できるため、特に有益です。 微調整が完了すると、3 つの最新バージョンのモデルをデプロイできるようになります。
安全性評価 GPT-4、GPT-4o、GPT-4o-mini の微調整 - パブリック プレビュー
GPT-4o、GPT-4o-mini、GPT-4 は、お客様のニーズに合わせて微調整できる最も高度なモデルです。 Azure OpenAI の他のモデルと同様、微調整されたモデルは高度な機能を備えていますが、その分、有害なコンテンツの生成、操作、人間のような振る舞い、プライバシー問題など、責任ある AI の利用に関する課題も増大します。 リスク、機能、制限に関する詳細については、「責任ある AI プラクティスの概要」および「透明性に関する注意事項」をご参照ください。 高度に微調整されたモデルに伴うリスク軽減のため、微調整されたモデルのトレーニングと出力において有害なコンテンツを検出し、その生成を防止する追加の評価手順を導入しました。 これらの手順は、「Microsoft の責任ある AI の基本原則」と「Azure OpenAI Service のコンテンツのフィルター処理」に準拠しています。
- 評価は、顧客ごとに専用のプライベート ワークスペースを設けて実施されます。
- 評価エンドポイントは Azure OpenAI リソースと同じ地域に配置されます。
- 評価の実施に際し、トレーニング データは保存されず、最終的なモデル評価 (デプロイの可否) のみが保存されます。
GPT-4o、GPT-4o-mini、および GPT-4 の微調整済みモデルの評価フィルターには、あらかじめ決められたしきい値が設定されており、お客様側で変更することはできません。また、お客様が独自に作成したコンテンツのフィルター処理の設定には関連付けられません。
データの評価
トレーニングを開始する前に、データ内に潜む可能性のある有害コンテンツ (暴力、性的、ヘイト、公平性、自傷行為など - 各カテゴリの定義はこちら) の評価が行われます。 指定された重大度レベルを超える有害なコンテンツが検出された場合、トレーニング ジョブは失敗し、失敗の原因となったカテゴリを通知するメッセージが表示されます。
サンプル メッセージ:
The provided training data failed RAI checks for harm types: [hate_fairness, self_harm, violence]. Please fix the data and try again.
微調整機能の一環として、お客様のトレーニング データは、データ インポート ジョブにおいて自動的に評価されます。
トレーニング データで有害なコンテンツが検出されて微調整ジョブが失敗した場合、課金されません。
モデルの評価
トレーニング完了後、微調整されたモデルをデプロイできるようになる前に、Azure に組み込まれているリスクおよび安全性の指標を用いて、モデルが有害な応答を生成する可能性がないか評価されます。 大規模言語モデルのベースモデルと同じテスト手法を用いて、微調整済みモデルとの会話をシミュレートし、有害なコンテンツを出力する可能性を評価します。評価では、暴力、性的、ヘイト、公平性、自傷行為といった特定の有害なコンテンツのカテゴリを使用します。
モデルが許容範囲を超えて有害なコンテンツを含む出力を生成する場合、モデルはデプロイできなくなり、具体的にどの有害カテゴリが検出されたかについての情報が提供されます。
サンプル メッセージ:
This model is unable to be deployed. Model evaluation identified that this fine tuned model scores above acceptable thresholds for [Violence, Self Harm]. Please review your training data set and resubmit the job.
データ評価と同様、微調整機能を提供する一環として、モデルは微調整ジョブ内で自動的に評価されます。 サービスによりログに記録されるのは、結果として得られた評価 (デプロイの可否) のみです。 微調整されたモデルのデプロイ時に、モデルの出力が有害なコンテンツを含むと判断されデプロイされなかった場合、トレーニングにかかった費用は発生しません。
微調整されたモデルをデプロイする
モデルを微調整したら、モデルをデプロイし、独自のアプリケーションで使用できます。 Azure AI Studio のデプロイ ページまたはプレイグラウンド ページから、微調整されたモデルをデプロイすることはできません。 現在、微調整されたモデルのデプロイは、そのモデルのモデルの詳細ページからのみ行えます。
モデルをデプロイするときは、モデルを推論に使用できるようにし、これには 1 時間ごとのホスティング料金が発生します。 ただし、微調整されたモデルは、使用する準備ができるまで、Azure AI Studio に無償で格納できます。
重要
カスタマイズされたモデルをデプロイした後、デプロイが 15 日を超えて非アクティブのままである場合、デプロイは削除されます。 カスタマイズされたモデルのデプロイは、モデルが 15 日以上前にデプロイされ、15 日間連続して完了またはチャット完了の呼び出しが行われなかった場合、"非アクティブ" になります。
非アクティブなデプロイを削除しても、基になるカスタマイズされたモデルは削除されることも影響を受けることもなく、カスタマイズされたモデルはいつでも再デプロイできます。 「Azure OpenAI Service の価格」で説明されているように、デプロイ済みのカスタマイズされた (微調整された) 各モデルには、補完またはチャット補完の呼び出しがモデルに対して行われているかどうかに関係なく、1 時間ごとのホスティング コストが発生します。 Azure OpenAI を使用したコストの計画と管理の詳細については、「Azure OpenAI Service のコストを管理するための計画」のガイダンスを参照してください。
Note
微調整されたモデルでは、1 つのデプロイのみが許可されます。 既にデプロイされている微調整したモデルを選択すると、エラー メッセージが表示されます。
デプロイの進行状況は、Azure AI Studio の [デプロイ] ページで監視できます。
デプロイ済みの微調整されたモデルを使用する
微調整されたモデルをデプロイした後は、他のデプロイ済みモデルと同様に使用できます。 Azure AI Studio の [プレイグラウンド] を使用して、新しいデプロイを試すことができます。 REST API を使用して、独自のアプリケーションから微調整されたモデルを呼び出すこともできます。 プロンプト フローでこの新しい微調整されたモデルを使用することから始め、生成 AI アプリケーションを構築することもできます。
Note
チャット モデルの場合、微調整されたモデルをガイドするために使用するシステム メッセージは、展開されているか、プレイグラウンドでテストに使用できるかに関係なく、トレーニングに使用したシステム メッセージと同じである必要があります。 別のシステム メッセージを使用する場合、モデルが期待どおりに動作しない可能性があります。
デプロイ、微調整モデル、トレーニング ファイルをクリーンアップする
微調整モデルの利用が完了したら、デプロイとモデルを削除できます。 必要に応じて、サービスにアップロードしたトレーニングおよび検証のファイルを削除することもできます。
微調整されたモデルのデプロイを削除する
重要
カスタマイズされたモデルをデプロイした後、デプロイが 15 日を超えて非アクティブのままである場合、デプロイは削除されます。 カスタマイズされたモデルのデプロイは、モデルが 15 日以上前にデプロイされ、15 日間連続して完了またはチャット完了の呼び出しが行われなかった場合、"非アクティブ" になります。
非アクティブなデプロイを削除しても、基になるカスタマイズされたモデルは削除されることも影響を受けることもなく、カスタマイズされたモデルはいつでも再デプロイできます。 「Azure OpenAI Service の価格」で説明されているように、デプロイ済みのカスタマイズされた (微調整された) 各モデルには、補完またはチャット補完の呼び出しがモデルに対して行われているかどうかに関係なく、1 時間ごとのホスティング コストが発生します。 Azure OpenAI を使用したコストの計画と管理の詳細については、「Azure OpenAI Service のコストを管理するための計画」のガイダンスを参照してください。
微調整されたモデルのデプロイは、Azure AI Studio の [デプロイ] ページで削除できます。 削除するデプロイを選択し、[削除] を選択してデプロイを削除します。
微調整モデルの削除
微調整されたモデルは、Azure AI Studio の [微調整] ページで削除できます。 削除する微調整されたモデルを選択し、[削除] を選択して微調整されたモデルを削除します。
Note
既存のデプロイがある場合、微調整されたモデルは削除できません。 微調整したモデルを削除する前に、まずモデル デプロイを削除する必要があります。
トレーニング ファイルの削除
必要に応じて、トレーニング用にアップロードしたトレーニングと検証のファイル、およびトレーニング中に生成された結果ファイルを削除できます。 そのためには、Azure OpenAI Studio に移動し、[管理]>[データ ファイル] ウィンドウに移動する必要があります。 削除するファイルを選択し、[削除] を選択してファイルを削除します。
前提条件
- Azure OpenAI の微調整ガイドを使用する場合を参照してください。
- Azure サブスクリプション。 無料で作成できます。
- Azure OpenAI リソース。 詳細については、「Azure OpenAI を使用してリソースを作成し、モデルをデプロイする」を参照してください。
- 次の Python ライブラリ:
os
、json
、requests
、openai
。 - OpenAI Python ライブラリは、バージョン 0.28.1 以上である必要があります。
- アクセスの微調整には、Cognitive Services OpenAI 共同作成者が必要です。
- クォータを表示し、Azure AI Studio でモデルをデプロイするためのアクセス権がまだない場合は、追加のアクセス許可が必要です。
モデル
次のモデルでは、微調整がサポートされます。
babbage-002
davinci-002
gpt-35-turbo
(0613)gpt-35-turbo
(1106)gpt-35-turbo
(0125)gpt-4
(0613)*gpt-4o
(2024-08-06)gpt-4o-mini
(2024-07-18)
* このモデルのファインチューニングは、現在パブリック プレビューです。
または、base-model.ft-{jobid}
として書式設定された、以前に微調整されたモデルを微調整することもできます。
現在微調整をサポートしているリージョンを確認するには、モデルに関するページを参照してください。
Python SDK のワークフローを確認する
少し時間を取って、Python SDK と Azure OpenAI を使用するための微調整ワークフローを確認してください。
- トレーニングおよび検証用のデータを準備します。
- 基本モデルを選択します。
- トレーニング データをアップロードします。
- 新たにカスタマイズしたモデルをトレーニングします。
- カスタマイズしたモデルの状態を確認します。
- カスタマイズしたモデルをデプロイして使用できるようにします。
- カスタマイズしたモデルを使用します。
- 必要に応じて、カスタマイズしたモデルをパフォーマンスと適合度を分析します。
トレーニング データと検証データを準備する
トレーニング データと検証データのセットは、モデルの実行方法に関する入力と出力の例で構成されます。
モデルの種類が異なると、異なる形式のトレーニング データが必要になります。
使用するトレーニングおよび検証データは、JSON Lines (JSONL) ドキュメントの形式である必要があります。 gpt-35-turbo-0613
の場合、微調整データセットの形式は、チャット入力候補 API で使用される会話形式でである必要があります。
gpt-35-turbo-0613
の微調整の詳細な手順については、Azure OpenAI の微調整に関するチュートリアルを参照してください。
ファイル形式の例
{"messages": [{"role": "system", "content": "You are an Xbox customer support agent whose primary goal is to help users with issues they are experiencing with their Xbox devices. You are friendly and concise. You only provide factual answers to queries, and do not provide answers that are not related to Xbox."}, {"role": "user", "content": "Is Xbox better than PlayStation?"}, {"role": "assistant", "content": "I apologize, but I cannot provide personal opinions. My primary job is to assist you with any issues related to your Xbox device. Do you have any Xbox-related issues that need addressing?"}]}
{"messages": [{"role": "system", "content": "You are an Xbox customer support agent whose primary goal is to help users with issues they are experiencing with their Xbox devices. You are friendly and concise. You only provide factual answers to queries, and do not provide answers that are not related to Xbox."}, {"role": "user", "content": "Can I play PC games on my Xbox?"}, {"role": "assistant", "content": "While Xbox consoles don't natively support PC games, they can play an array of Xbox games, many of which are also available on PC. Can I assist you with finding games compatible with your Xbox device?"}]}
{"messages": [{"role": "system", "content": "You are an Xbox customer support agent whose primary goal is to help users with issues they are experiencing with their Xbox devices. You are friendly and concise. You only provide factual answers to queries, and do not provide answers that are not related to Xbox."}, {"role": "user", "content": "I'm having trouble connecting my Xbox to the Wi-Fi."}, {"role": "assistant", "content": "No worries, let's go through the network settings on your Xbox. Can you please tell me what happens when you try to connect it to the Wi-Fi?"}]}
マルチターン チャット ファイル形式
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}]}
JSONL 形式に加えて、トレーニングおよび検証のデータ ファイルは UTF-8 でエンコードしてバイトオーダー マーク (BOM) を含める必要があります。 ファイルは、512 MB 未満のサイズにする必要があります。
トレーニングおよび検証のデータセットを作成する
トレーニング例が多いほど適切になります。 微調整ジョブは、少なくとも 10 個のトレーニング例なしでは続行されませんが、このような少数のジョブでは、モデルの応答に大きな影響を与えるほどではありません。 成功するには、数千ではないにしても数百のトレーニング例を提供することをお勧めします。
一般的に、データセット サイズを 2 倍にすると、モデルの品質を直線的に向上させることができます。 ただし、低品質の例はパフォーマンスに悪影響を与える可能性があることに注意してください。 大量の内部データでモデルをトレーニングする場合、最初に最高品質の例についてのみデータセットを排除しないと、予想よりもはるかにパフォーマンスの低いモデルになる可能性があります。
トレーニング データをアップロードする
次の手順では、既存の準備済みトレーニング データを選択するか、モデルをカスタマイズするときに使用する新しい準備済みトレーニング データをアップロードします。 トレーニング データを準備したら、ファイルをサービスにアップロードできます。 トレーニング データをアップロードする方法は 2 つあります。
大きなデータ ファイルの場合は、Azure BLOB ストアからインポートすることをお勧めします。 大きなファイルは、マルチパート フォームを介してアップロードすると不安定になる場合があります。要求がアトミックであり、再試行または再開ができないためです。 Azure Blob Storage の詳細については、「Azure Blob Storage とは」を参照してください。
Note
トレーニング データ ファイルは、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-05-01-preview" # 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-35-turbo-0613", # 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-02-01" # This API version or later is required to access fine-tuning for turbo/babbage-002/davinci-002
)
client.fine_tuning.jobs.create(
training_file="file-abc123",
model="gpt-35-turbo-0613", # 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.list_events(fine_tuning_job_id=job_id, limit=10)
print(response.model_dump_json(indent=2))
安全性評価 GPT-4、GPT-4o、GPT-4o-mini の微調整 - パブリック プレビュー
GPT-4o、GPT-4o-mini、GPT-4 は、お客様のニーズに合わせて微調整できる最も高度なモデルです。 Azure OpenAI の他のモデルと同様、微調整されたモデルは高度な機能を備えていますが、その分、有害なコンテンツの生成、操作、人間のような振る舞い、プライバシー問題など、責任ある AI の利用に関する課題も増大します。 リスク、機能、制限に関する詳細については、「責任ある AI プラクティスの概要」および「透明性に関する注意事項」をご参照ください。 高度に微調整されたモデルに伴うリスク軽減のため、微調整されたモデルのトレーニングと出力において有害なコンテンツを検出し、その生成を防止する追加の評価手順を導入しました。 これらの手順は、「Microsoft の責任ある AI の基本原則」と「Azure OpenAI Service のコンテンツのフィルター処理」に準拠しています。
- 評価は、顧客ごとに専用のプライベート ワークスペースを設けて実施されます。
- 評価エンドポイントは Azure OpenAI リソースと同じ地域に配置されます。
- 評価の実施に際し、トレーニング データは保存されず、最終的なモデル評価 (デプロイの可否) のみが保存されます。
GPT-4o、GPT-4o-mini、および GPT-4 の微調整済みモデルの評価フィルターには、あらかじめ決められたしきい値が設定されており、お客様側で変更することはできません。また、お客様が独自に作成したコンテンツのフィルター処理の設定には関連付けられません。
データの評価
トレーニングを開始する前に、データ内に潜む可能性のある有害コンテンツ (暴力、性的、ヘイト、公平性、自傷行為など - 各カテゴリの定義はこちら) の評価が行われます。 指定された重大度レベルを超える有害なコンテンツが検出された場合、トレーニング ジョブは失敗し、失敗の原因となったカテゴリを通知するメッセージが表示されます。
サンプル メッセージ:
The provided training data failed RAI checks for harm types: [hate_fairness, self_harm, violence]. Please fix the data and try again.
微調整機能の一環として、お客様のトレーニング データは、データ インポート ジョブにおいて自動的に評価されます。
トレーニング データで有害なコンテンツが検出されて微調整ジョブが失敗した場合、課金されません。
モデルの評価
トレーニング完了後、微調整されたモデルをデプロイできるようになる前に、Azure に組み込まれているリスクおよび安全性の指標を用いて、モデルが有害な応答を生成する可能性がないか評価されます。 大規模言語モデルのベースモデルと同じテスト手法を用いて、微調整済みモデルとの会話をシミュレートし、有害なコンテンツを出力する可能性を評価します。評価では、暴力、性的、ヘイト、公平性、自傷行為といった特定の有害なコンテンツのカテゴリを使用します。
モデルが許容範囲を超えて有害なコンテンツを含む出力を生成する場合、モデルはデプロイできなくなり、具体的にどの有害カテゴリが検出されたかについての情報が提供されます。
サンプル メッセージ:
This model is unable to be deployed. Model evaluation identified that this fine tuned model scores above acceptable thresholds for [Violence, Self Harm]. Please review your training data set and resubmit the job.
データ評価と同様、微調整機能を提供する一環として、モデルは微調整ジョブ内で自動的に評価されます。 サービスによりログに記録されるのは、結果として得られた評価 (デプロイの可否) のみです。 微調整されたモデルのデプロイ時に、モデルの出力が有害なコンテンツを含むと判断されデプロイされなかった場合、トレーニングにかかった費用は発生しません。
微調整されたモデルをデプロイする
微調整ジョブが成功すると、応答本文の fine_tuned_model
変数の値がカスタマイズされたモデルの名前に設定されます。 これで、モデルは list Models API からも検出するできるようになります。 ただし、カスタマイズしたモデルがデプロイされるまで、カスタマイズしたモデルに対して候補呼び出しを発行することはできません。 カスタマイズしたモデルを候補呼び出しで使用できるようにするには、デプロイする必要があります。
重要
カスタマイズされたモデルをデプロイした後、デプロイが 15 日を超えて非アクティブのままである場合、デプロイは削除されます。 カスタマイズされたモデルのデプロイは、モデルが 15 日以上前にデプロイされ、15 日間連続して完了またはチャット完了の呼び出しが行われなかった場合、"非アクティブ" になります。
非アクティブなデプロイを削除しても、基になるカスタマイズされたモデルは削除されることも影響を受けることもなく、カスタマイズされたモデルはいつでも再デプロイできます。 「Azure OpenAI Service の価格」で説明されているように、デプロイ済みのカスタマイズされた (微調整された) 各モデルには、補完またはチャット補完の呼び出しがモデルに対して行われているかどうかに関係なく、1 時間ごとのホスティング コストが発生します。 Azure OpenAI を使用したコストの計画と管理の詳細については、「Azure OpenAI Service のコストを管理するための計画」のガイダンスを参照してください。
カスタマイズしたモデルのデプロイは Azure AI Studio または Azure CLI を使用しても行えます。
Note
カスタマイズしたモデルに対して許可されるデプロイは 1 つだけです。 既にデプロイされているカスタマイズしたモデルを選択すると、エラーが発生します。
前の SDK コマンドとは異なり、個別の認可、異なる API パス、および異なる API バージョンを必要とするコントロール プレーン API を使用してデプロイを行う必要があります。
variable | 定義 |
---|---|
token | 認証トークンを生成するには、複数の方法があります。 初期テストの最も簡単な方法は、Azure portal から Cloud Shell を起動することです。 次に、az account get-access-token を実行します。 このトークンは、API テストの一時的な認証トークンとして使用できます。 これを新しい環境変数に格納することをお勧めします。 |
subscription | 関連付けられている Azure OpenAI リソースのサブスクリプション ID。 |
resource_group | Azure OpenAI リソースのリソース グループ名。 |
resource_name | Azure OpenAI リソース名。 |
model_deployment_name | 微調整された新しいモデル デプロイのカスタム名。 これは、チャット入力候補の呼び出しを行うときにコードで参照される名前です。 |
fine_tuned_model | この値は、前の手順の微調整ジョブの結果から取得します。 これは gpt-35-turbo-0613.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-35-turbo-ft" # custom deployment name that you will use to reference the model when making inference calls.
deploy_params = {'api-version': "2023-05-01"}
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-35-turbo-0613.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())
リージョン間デプロイ
微調整では、微調整されたモデルを、モデルが最初に微調整された場所とは異なるリージョンにデプロイすることがサポートされています。 別のサブスクリプション/リージョンにデプロイすることもできます。
唯一の制限は、新しいリージョンが微調整もサポートする必要があることと、サブスクリプション間でデプロイする場合、デプロイ用の認可トークンを生成するアカウントがソース サブスクリプションと宛先サブスクリプションの両方にアクセスできる必要があることです。
以下は、あるサブスクリプション/リージョンで微調整されたモデルを別のサブスクリプション/リージョンにデプロイする例です。
import json
import os
import requests
token= os.getenv("<TOKEN>")
subscription = "<DESTINATION_SUBSCRIPTION_ID>"
resource_group = "<DESTINATION_RESOURCE_GROUP_NAME>"
resource_name = "<DESTINATION_AZURE_OPENAI_RESOURCE_NAME>"
source_subscription = "<SOURCE_SUBSCRIPTION_ID>"
source_resource_group = "<SOURCE_RESOURCE_GROUP>"
source_resource = "<SOURCE_RESOURCE>"
source = f'/subscriptions/{source_subscription}/resourceGroups/{source_resource_group}/providers/Microsoft.CognitiveServices/accounts/{source_resource}'
model_deployment_name ="gpt-35-turbo-ft" # custom deployment name that you will use to reference the model when making inference calls.
deploy_params = {'api-version': "2023-05-01"}
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_NAME">, # This value will look like gpt-35-turbo-0613.ft-0ab3f80e4f2242929258fff45b56a9ce
"version": "1",
"source": source
}
}
}
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())
同じサブスクリプションであるが異なるリージョン間でデプロイするには、サブスクリプションとリソース グループがソース変数と宛先変数の両方で同一であり、ソースと宛先のリソース名のみが一意である必要があります。
Azure CLI を使用してモデルをデプロイする
次の例は、Azure CLI を使用してカスタマイズしたモデルをデプロイする方法を示しています。 Azure CLI では、カスタマイズしたモデルのデプロイの名前を指定する必要があります。 Azure CLI を使ってカスタマイズされたモデルをデプロイする方法の詳細については、az cognitiveservices account deployment
を参照してください。
コンソール ウィンドウでこの Azure CLI コマンドを実行するには、次の "<プレースホルダー>" をカスタマイズしたモデルの対応する値に置き換える必要があります。
プレースホルダー | 値 |
---|---|
<YOUR_AZURE_SUBSCRIPTION> | Azure サブスクリプションの名前または ID。 |
<YOUR_RESOURCE_GROUP> | Azure リソース グループの名前。 |
<YOUR_RESOURCE_NAME> | Azure OpenAI リソースの名前。 |
<YOUR_DEPLOYMENT_NAME> | モデル デプロイに使用する名前。 |
<YOUR_FINE_TUNED_MODEL_ID> | カスタマイズしたモデルの名前。 |
az cognitiveservices account deployment create
--resource-group <YOUR_RESOURCE_GROUP>
--name <YOUR_RESOURCE_NAME>
--deployment-name <YOUR_DEPLOYMENT_NAME>
--model-name <YOUR_FINE_TUNED_MODEL_ID>
--model-version "1"
--model-format OpenAI
--sku-capacity "1"
--sku-name "Standard"
デプロイされたカスタマイズしたモデルを使用する
カスタム モデルをデプロイしたら、他のデプロイ済みモデルと同様に使用できます。 Azure AI Studio の [プレイグラウンド] を使用して、新しいデプロイを試すことができます。 カスタム モデルでは、他のデプロイ済みモデルと同様に、temperature
や max_tokens
などの同じパラメーターを引き続き使用できます。 微調整された babbage-002
および davinci-002
モデルに対して、入力候補プレイグラウンドと入力候補 API を使用します。 微調整された gpt-35-turbo-0613
モデルに対して、チャット プレイグラウンドとチャット入力候補 API を使用します。
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-02-01"
)
response = client.chat.completions.create(
model="gpt-35-turbo-ft", # model = "Custom deployment name you chose for your fine-tuning model"
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Does Azure OpenAI support customer managed keys?"},
{"role": "assistant", "content": "Yes, customer managed keys are supported by Azure OpenAI."},
{"role": "user", "content": "Do other Azure AI services support this too?"}
]
)
print(response.choices[0].message.content)
カスタマイズしたモデルを分析する
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 Studio で、results.csv ファイル内のデータをプロットとして表示することもできます。 トレーニング済みのモデルのリンクを選択すると、損失、平均トークンの精度、トークンの精度の 3 つのグラフが表示されます。 検証データを指定した場合、両方のデータセットが同じプロットに表示されます。
時間の経過と同時に減少する損失を探し、精度を向上させます。 トレーニング データと検証データの間に相違がある場合は、オーバーフィットしていることを示している可能性があります。 エポックが少ない、または学習率の乗数が小さいトレーニングを試してみてください。
デプロイ、カスタマイズしたモデル、トレーニング ファイルをクリーンアップする
カスタマイズしたモデルの利用が完了したら、デプロイとモデルを削除できます。 必要に応じて、サービスにアップロードしたトレーニングおよび検証のファイルを削除することもできます。
モデル デプロイの削除
重要
カスタマイズされたモデルをデプロイした後、デプロイが 15 日を超えて非アクティブのままである場合、デプロイは削除されます。 カスタマイズされたモデルのデプロイは、モデルが 15 日以上前にデプロイされ、15 日間連続して完了またはチャット完了の呼び出しが行われなかった場合、"非アクティブ" になります。
非アクティブなデプロイを削除しても、基になるカスタマイズされたモデルは削除されることも影響を受けることもなく、カスタマイズされたモデルはいつでも再デプロイできます。 「Azure OpenAI Service の価格」で説明されているように、デプロイ済みのカスタマイズされた (微調整された) 各モデルには、補完またはチャット補完の呼び出しがモデルに対して行われているかどうかに関係なく、1 時間ごとのホスティング コストが発生します。 Azure OpenAI を使用したコストの計画と管理の詳細については、「Azure OpenAI Service のコストを管理するための計画」のガイダンスを参照してください。
さまざまな方法を使用して、カスタマイズしたモデルのデプロイを削除できます。
カスタマイズしたモデルの削除
同様に、さまざまな方法を使用して、カスタマイズしたモデルを削除できます。
Note
既存のデプロイがある場合は、カスタマイズしたモデルを削除できません。 カスタマイズしたモデルを削除する前に、まずモデル デプロイを削除する必要があります。
トレーニング ファイルの削除
必要に応じて、トレーニング用にアップロードしたトレーニングおよび検証のファイル、およびトレーニング中に生成された結果ファイルを、Azure OpenAI サブスクリプションから削除できます。 次の方法を使用して、トレーニング、検証、および結果のファイルを削除できます。
- Azure AI Studio
- REST API
- Python SDK
次の 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)
継続的な微調整
微調整されたモデルを作成したら、さらに微調整を行い時間をかけてモデルを改良し続けることができます。 継続的な微調整は、既に微調整されたモデルを基本モデルとして選び、新しいトレーニング サンプルのセットでさらに微調整する反復プロセスです。
以前に微調整したモデルに対して微調整を実行するには、カスタマイズされたモデルを作成するに関するセクションで説明したのと同じプロセスを使いますが、汎用基本モデルの名前を指定する代わりに、既に微調整されたモデルの ID を指定します。 微調整されたモデル ID は gpt-35-turbo-0613.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-02-01"
)
response = client.fine_tuning.jobs.create(
training_file=training_file_id,
validation_file=validation_file_id,
model="gpt-35-turbo-0613.ft-5fd1918ee65d4cd38a5dcf6835066ed7" # Enter base model name. Note that in Azure OpenAI the model name contains dashes and cannot contain dot/period characters.
)
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 Studio の [モデル] ページでこの情報を確認するか、REST API を使って、特定の Azure OpenAI リソースのモデルのリストを生成できます。
前提条件
- Azure OpenAI の微調整ガイドを使用する場合を参照してください。
- Azure サブスクリプション。 無料で作成できます。
- Azure OpenAI リソース。 詳細については、「Azure OpenAI を使用してリソースを作成し、モデルをデプロイする」を参照してください。
- アクセスの微調整には、Cognitive Services OpenAI 共同作成者が必要です。
- クォータを表示し、Azure AI Studio でモデルをデプロイするためのアクセス権がまだない場合は、追加のアクセス許可が必要です。
モデル
次のモデルでは、微調整がサポートされます。
babbage-002
davinci-002
gpt-35-turbo
(0613)gpt-35-turbo
(1106)gpt-35-turbo
(0125)gpt-4
(0613)*gpt-4o
(2024-08-06)gpt-4o-mini
(2024-07-18)
* このモデルのファインチューニングは、現在パブリック プレビューです。
または、base-model.ft-{jobid} として書式設定された、以前に微調整されたモデルを微調整することもできます。
現在微調整をサポートしているリージョンを確認するには、モデルに関するページを参照してください。
REST API のワークフローを確認する
少し時間を取って、REST API および Python と Azure OpenAI を使用するための微調整ワークフローを確認してください。
- トレーニングおよび検証用のデータを準備します。
- 基本モデルを選択します。
- トレーニング データをアップロードします。
- 新たにカスタマイズしたモデルをトレーニングします。
- カスタマイズしたモデルの状態を確認します。
- カスタマイズしたモデルをデプロイして使用できるようにします。
- カスタマイズしたモデルを使用します。
- 必要に応じて、カスタマイズしたモデルをパフォーマンスと適合度を分析します。
トレーニング データと検証データを準備する
トレーニング データと検証データのセットは、モデルの実行方法に関する入力と出力の例で構成されます。
モデルの種類が異なると、異なる形式のトレーニング データが必要になります。
使用するトレーニングおよび検証データは、JSON Lines (JSONL) ドキュメントの形式である必要があります。 gpt-35-turbo-0613
とその他の関連モデルの場合、微調整データセットの形式は、チャット入力候補 API で使用される会話形式にする必要があります。
gpt-35-turbo-0613
の微調整の詳細な手順については、Azure OpenAI の微調整に関するチュートリアルを参照してください。
ファイル形式の例
{"messages": [{"role": "system", "content": "You are an Xbox customer support agent whose primary goal is to help users with issues they are experiencing with their Xbox devices. You are friendly and concise. You only provide factual answers to queries, and do not provide answers that are not related to Xbox."}, {"role": "user", "content": "Is Xbox better than PlayStation?"}, {"role": "assistant", "content": "I apologize, but I cannot provide personal opinions. My primary job is to assist you with any issues related to your Xbox device. Do you have any Xbox-related issues that need addressing?"}]}
{"messages": [{"role": "system", "content": "You are an Xbox customer support agent whose primary goal is to help users with issues they are experiencing with their Xbox devices. You are friendly and concise. You only provide factual answers to queries, and do not provide answers that are not related to Xbox."}, {"role": "user", "content": "Can I play PC games on my Xbox?"}, {"role": "assistant", "content": "While Xbox consoles don't natively support PC games, they can play an array of Xbox games, many of which are also available on PC. Can I assist you with finding games compatible with your Xbox device?"}]}
{"messages": [{"role": "system", "content": "You are an Xbox customer support agent whose primary goal is to help users with issues they are experiencing with their Xbox devices. You are friendly and concise. You only provide factual answers to queries, and do not provide answers that are not related to Xbox."}, {"role": "user", "content": "I'm having trouble connecting my Xbox to the Wi-Fi."}, {"role": "assistant", "content": "No worries, let's go through the network settings on your Xbox. Can you please tell me what happens when you try to connect it to the Wi-Fi?"}]}
マルチターン チャット ファイル形式
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}]}
JSONL 形式に加えて、トレーニングおよび検証のデータ ファイルは UTF-8 でエンコードしてバイトオーダー マーク (BOM) を含める必要があります。 ファイルは、512 MB 未満のサイズにする必要があります。
トレーニングおよび検証のデータセットを作成する
トレーニング例が多いほど適切になります。 微調整ジョブは、少なくとも 10 個のトレーニング例なしでは続行されませんが、このような少数のジョブでは、モデルの応答に大きな影響を与えるほどではありません。 成功するには、数千ではないにしても数百のトレーニング例を提供することをお勧めします。
一般的に、データセット サイズを 2 倍にすると、モデルの品質を直線的に向上させることができます。 ただし、低品質の例はパフォーマンスに悪影響を与える可能性があることに注意してください。 大量の内部データでモデルをトレーニングする場合、最初に最高品質の例のみになるようにデータセットを取り除かないと、予想よりもはるかにパフォーマンスの低いモデルになる可能性があります。
基本モデルを選択する
カスタム モデルを作成するための最初の手順は、基本モデルを選択することです。 [Base model](基本モデル) ウィンドウで、カスタム モデルに使用する基本モデルを選択できます。 この選択は、モデルのパフォーマンスとコストの両方に影響します。
[Base model type](基本モデルの種類) ドロップダウンから基本モデルを選択し、[次へ] を選択して続行します。
次の使用可能な基本モデルのいずれかから、カスタム モデルを作成できます。
babbage-002
davinci-002
gpt-35-turbo
(0613)gpt-35-turbo
(1106)gpt-35-turbo
(0125)gpt-4
(0613)gpt-4o
(2024-08-06)gpt-4o-mini
(2023-07-18)
または、base-model.ft-{jobid} として書式設定された、以前に微調整されたモデルを微調整することもできます。
微調整が可能な基本モデルの詳細については、モデルに関する記事を参照してください。
トレーニング データをアップロードする
次の手順では、既存の準備済みトレーニング データを選択するか、新しい準備済みトレーニング データをアップロードして、モデルを微調整するときに使用します。 トレーニング データを準備したら、ファイルをサービスにアップロードできます。 トレーニング データをアップロードする方法は 2 つあります。
大きなデータ ファイルの場合は、Azure BLOB ストアからインポートすることをお勧めします。 大きなファイルは、マルチパート フォームを介してアップロードすると不安定になる場合があります。要求がアトミックであり、再試行または再開ができないためです。 Azure Blob Storage の詳細については、「Azure Blob Storage とは」を参照してください。
Note
トレーニング データ ファイルは、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-05-01-preview \
-H "Content-Type: application/json" \
-H "api-key: $AZURE_OPENAI_API_KEY" \
-d '{
"model": "gpt-35-turbo-0613",
"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-05-01-preview \
-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-05-01-preview \
-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-05-01-preview \
-H "Content-Type: application/json" \
-H "api-key: $AZURE_OPENAI_API_KEY"
安全性評価 GPT-4、GPT-4o、GPT-4o-mini の微調整 - パブリック プレビュー
GPT-4o、GPT-4o-mini、GPT-4 は、お客様のニーズに合わせて微調整できる最も高度なモデルです。 Azure OpenAI の他のモデルと同様、微調整されたモデルは高度な機能を備えていますが、その分、有害なコンテンツの生成、操作、人間のような振る舞い、プライバシー問題など、責任ある AI の利用に関する課題も増大します。 リスク、機能、制限に関する詳細については、「責任ある AI プラクティスの概要」および「透明性に関する注意事項」をご参照ください。 高度に微調整されたモデルに伴うリスク軽減のため、微調整されたモデルのトレーニングと出力において有害なコンテンツを検出し、その生成を防止する追加の評価手順を導入しました。 これらの手順は、「Microsoft の責任ある AI の基本原則」と「Azure OpenAI Service のコンテンツのフィルター処理」に準拠しています。
- 評価は、顧客ごとに専用のプライベート ワークスペースを設けて実施されます。
- 評価エンドポイントは Azure OpenAI リソースと同じ地域に配置されます。
- 評価の実施に際し、トレーニング データは保存されず、最終的なモデル評価 (デプロイの可否) のみが保存されます。
GPT-4o、GPT-4o-mini、および GPT-4 の微調整済みモデルの評価フィルターには、あらかじめ決められたしきい値が設定されており、お客様側で変更することはできません。また、お客様が独自に作成したコンテンツのフィルター処理の設定には関連付けられません。
データの評価
トレーニングを開始する前に、データ内に潜む可能性のある有害コンテンツ (暴力、性的、ヘイト、公平性、自傷行為など - 各カテゴリの定義はこちら) の評価が行われます。 指定された重大度レベルを超える有害なコンテンツが検出された場合、トレーニング ジョブは失敗し、失敗の原因となったカテゴリを通知するメッセージが表示されます。
サンプル メッセージ:
The provided training data failed RAI checks for harm types: [hate_fairness, self_harm, violence]. Please fix the data and try again.
微調整機能の一環として、お客様のトレーニング データは、データ インポート ジョブにおいて自動的に評価されます。
トレーニング データで有害なコンテンツが検出されて微調整ジョブが失敗した場合、課金されません。
モデルの評価
トレーニング完了後、微調整されたモデルをデプロイできるようになる前に、Azure に組み込まれているリスクおよび安全性の指標を用いて、モデルが有害な応答を生成する可能性がないか評価されます。 大規模言語モデルのベースモデルと同じテスト手法を用いて、微調整済みモデルとの会話をシミュレートし、有害なコンテンツを出力する可能性を評価します。評価では、暴力、性的、ヘイト、公平性、自傷行為といった特定の有害なコンテンツのカテゴリを使用します。
モデルが許容範囲を超えて有害なコンテンツを含む出力を生成する場合、モデルはデプロイできなくなり、具体的にどの有害カテゴリが検出されたかについての情報が提供されます。
サンプル メッセージ:
This model is unable to be deployed. Model evaluation identified that this fine tuned model scores above acceptable thresholds for [Violence, Self Harm]. Please review your training data set and resubmit the job.
データ評価と同様、微調整機能を提供する一環として、モデルは微調整ジョブ内で自動的に評価されます。 サービスによりログに記録されるのは、結果として得られた評価 (デプロイの可否) のみです。 微調整されたモデルのデプロイ時に、モデルの出力が有害なコンテンツを含むと判断されデプロイされなかった場合、トレーニングにかかった費用は発生しません。
微調整されたモデルをデプロイする
重要
カスタマイズされたモデルをデプロイした後、デプロイが 15 日を超えて非アクティブのままである場合、デプロイは削除されます。 カスタマイズされたモデルのデプロイは、モデルが 15 日以上前にデプロイされ、15 日間連続して完了またはチャット完了の呼び出しが行われなかった場合、"非アクティブ" になります。
非アクティブなデプロイを削除しても、基になるカスタマイズされたモデルは削除されることも影響を受けることもなく、カスタマイズされたモデルはいつでも再デプロイできます。 「Azure OpenAI Service の価格」で説明されているように、デプロイ済みのカスタマイズされた (微調整された) 各モデルには、補完またはチャット補完の呼び出しがモデルに対して行われているかどうかに関係なく、1 時間ごとのホスティング コストが発生します。 Azure OpenAI を使用したコストの計画と管理の詳細については、「Azure OpenAI Service のコストを管理するための計画」のガイダンスを参照してください。
次の Python の例は、REST API を使用して、カスタマイズしたモデルのモデル デプロイを作成する方法を示しています。 REST API は、カスタマイズしたモデルのデプロイの名前を生成します。
variable | 定義 |
---|---|
token | 認証トークンを生成するには、複数の方法があります。 初期テストの最も簡単な方法は、Azure portal から Cloud Shell を起動することです。 次に、az account get-access-token を実行します。 このトークンは、API テストの一時的な認証トークンとして使用できます。 これを新しい環境変数に格納することをお勧めします。 |
subscription | 関連付けられている Azure OpenAI リソースのサブスクリプション ID。 |
resource_group | Azure OpenAI リソースのリソース グループ名。 |
resource_name | Azure OpenAI リソース名。 |
model_deployment_name | 微調整された新しいモデル デプロイのカスタム名。 これは、チャット入力候補の呼び出しを行うときにコードで参照される名前です。 |
fine_tuned_model | この値は、前の手順の微調整ジョブの結果から取得します。 これは gpt-35-turbo-0613.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=2023-05-01" \
-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"
}
}
}'
リージョン間デプロイ
微調整では、微調整されたモデルを、モデルが最初に微調整された場所とは異なるリージョンにデプロイすることがサポートされています。 別のサブスクリプション/リージョンにデプロイすることもできます。
唯一の制限は、新しいリージョンが微調整もサポートする必要があることと、サブスクリプション間でデプロイする場合、デプロイ用の認可トークンを生成するアカウントがソース サブスクリプションと宛先サブスクリプションの両方にアクセスできる必要があることです。
以下は、あるサブスクリプション/リージョンで微調整されたモデルを別のサブスクリプション/リージョンにデプロイする例です。
curl -X PUT "https://management.azure.com/subscriptions/<SUBSCRIPTION>/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.CognitiveServices/accounts/<RESOURCE_NAME>/deployments/<MODEL_DEPLOYMENT_NAME>api-version=2023-05-01" \
-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",
"source": "/subscriptions/{sourceSubscriptionID}/resourceGroups/{sourceResourceGroupName}/providers/Microsoft.CognitiveServices/accounts/{sourceAccount}"
}
}
}'
同じサブスクリプションであるが異なるリージョン間でデプロイするには、サブスクリプションとリソース グループがソース変数と宛先変数の両方で同一であり、ソースと宛先のリソース名のみが一意である必要があります。
Azure CLI を使用してモデルをデプロイする
次の例は、Azure CLI を使用してカスタマイズしたモデルをデプロイする方法を示しています。 Azure CLI では、カスタマイズしたモデルのデプロイの名前を指定する必要があります。 Azure CLI を使ってカスタマイズされたモデルをデプロイする方法の詳細については、az cognitiveservices account deployment
を参照してください。
コンソール ウィンドウでこの Azure CLI コマンドを実行するには、次の "<プレースホルダー>" をカスタマイズしたモデルの対応する値に置き換える必要があります。
プレースホルダー | 値 |
---|---|
<YOUR_AZURE_SUBSCRIPTION> | Azure サブスクリプションの名前または ID。 |
<YOUR_RESOURCE_GROUP> | Azure リソース グループの名前。 |
<YOUR_RESOURCE_NAME> | Azure OpenAI リソースの名前。 |
<YOUR_DEPLOYMENT_NAME> | モデル デプロイに使用する名前。 |
<YOUR_FINE_TUNED_MODEL_ID> | カスタマイズしたモデルの名前。 |
az cognitiveservices account deployment create
--resource-group <YOUR_RESOURCE_GROUP>
--name <YOUR_RESOURCE_NAME>
--deployment-name <YOUR_DEPLOYMENT_NAME>
--model-name <YOUR_FINE_TUNED_MODEL_ID>
--model-version "1"
--model-format OpenAI
--sku-capacity "1"
--sku-name "Standard"
デプロイされたカスタマイズしたモデルを使用する
カスタム モデルをデプロイしたら、他のデプロイ済みモデルと同様に使用できます。 Azure AI Studio の [プレイグラウンド] を使用して、新しいデプロイを試すことができます。 カスタム モデルでは、他のデプロイ済みモデルと同様に、temperature
や max_tokens
などの同じパラメーターを引き続き使用できます。 微調整された babbage-002
および davinci-002
モデルに対して、入力候補プレイグラウンドと入力候補 API を使用します。 微調整された gpt-35-turbo-0613
モデルに対して、チャット プレイグラウンドとチャット入力候補 API を使用します。
curl $AZURE_OPENAI_ENDPOINT/openai/deployments/<deployment_name>/chat/completions?api-version=2023-05-15 \
-H "Content-Type: application/json" \
-H "api-key: $AZURE_OPENAI_API_KEY" \
-d '{"messages":[{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": "Does Azure OpenAI support customer managed keys?"},{"role": "assistant", "content": "Yes, customer managed keys are supported by Azure OpenAI."},{"role": "user", "content": "Do other Azure AI services support this too?"}]}'
カスタマイズしたモデルを分析する
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 Studio で、results.csv ファイル内のデータをプロットとして表示することもできます。 トレーニング済みのモデルのリンクを選択すると、損失、平均トークンの精度、トークンの精度の 3 つのグラフが表示されます。 検証データを指定した場合、両方のデータセットが同じプロットに表示されます。
時間の経過と同時に減少する損失を探し、精度を向上させます。 トレーニング データと検証データの間に相違がある場合は、オーバーフィットしていることを示している可能性があります。 エポックが少ない、または学習率の乗数が小さいトレーニングを試してみてください。
デプロイ、カスタマイズしたモデル、トレーニング ファイルをクリーンアップする
カスタマイズしたモデルの利用が完了したら、デプロイとモデルを削除できます。 必要に応じて、サービスにアップロードしたトレーニングおよび検証のファイルを削除することもできます。
モデル デプロイの削除
さまざまな方法を使用して、カスタマイズしたモデルのデプロイを削除できます。
カスタマイズしたモデルの削除
同様に、さまざまな方法を使用して、カスタマイズしたモデルを削除できます。
Note
既存のデプロイがある場合は、カスタマイズしたモデルを削除できません。 カスタマイズしたモデルを削除する前に、まずモデル デプロイを削除する必要があります。
トレーニング ファイルの削除
必要に応じて、トレーニング用にアップロードしたトレーニングおよび検証のファイル、およびトレーニング中に生成された結果ファイルを、Azure OpenAI サブスクリプションから削除できます。 次の方法を使用して、トレーニング、検証、および結果のファイルを削除できます。
継続的な微調整
微調整されたモデルを作成したら、さらに微調整を行い時間をかけてモデルを改良し続けることができます。 継続的な微調整は、既に微調整されたモデルを基本モデルとして選び、新しいトレーニング サンプルのセットでさらに微調整する反復プロセスです。
以前に微調整したモデルに対して微調整を実行するには、カスタマイズされたモデルを作成するに関するセクションで説明したのと同じプロセスを使いますが、汎用基本モデルの名前を指定する代わりに、既に微調整されたモデルの ID を指定します。 微調整されたモデル ID は gpt-35-turbo-0613.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-35-turbo-0613.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 Studio の [モデル] ページでこの情報を確認するか、REST API を使って、特定の Azure OpenAI リソースのモデルのリストを生成できます。
トラブルシューティング
微調整はどのように有効にしますか? Azure OpenAI Studio で [Create a custom model](カスタム モデルの作成) はグレー表示されていますか?
微調整に正常にアクセスするには、Cognitive Services OpenAI 共同作成者が割り当てられている必要があります。 高度なサービス管理者のアクセス許可を持つユーザーでも、微調整にアクセスするためにはこのアカウントを明示的に設定する必要があります。 詳細については、ロールベースのアクセス制御のガイダンスに関するページを参照してください。
アップロードが失敗した理由
Azure OpenAI Studio でファイルのアップロードが失敗した場合は、Azure OpenAI Studio の [データ ファイル] の下でエラー メッセージを確認できます。 「エラー」と表示されている場所 (状態列の下) にマウス ポインターを置くと、エラーの説明が表示されます。
微調整されたモデルが改善されていないようです
システムメッセージがありません: 微調整するときにシステムメッセージを提供する必要があります。微調整されたモデルを使用する場合は、同じシステム メッセージを提供する必要があります。 別のシステム メッセージを指定すると、微調整した結果とは異なる結果が表示されることがあります。
十分なデータがありません: パイプラインを実行するには 10 が最小ですが、モデルに新しいスキルを教えるには数百から数千のデータ ポイントが必要です。 データ ポイントが少なすぎると、オーバーフィットや一般化の不十分なリスクがあります。 微調整されたモデルはトレーニング データに対して適切に動作する可能性がありますが、学習パターンの代わりにトレーニング例を記憶しているため、他のデータではパフォーマンスが低下する可能性があります。 最適な結果を得るには、数百または数千のデータ ポイントを含むデータ セットを準備することを計画してください。
不適切なデータ: 不適切にキュレーションされたデータセットまたは表現されていないデータセットは、低品質のモデルを生成します。 モデルは、データセットから不正確または偏ったパターンを学習する場合があります。 たとえば、顧客サービスのチャットボットをトレーニングしているが、1 つのシナリオ (アイテムの返品など) のトレーニング データのみを提供する場合、他のシナリオに対応する方法はわかりません。 または、トレーニング データが正しくない (不適切な応答が含まれている) 場合、モデルは間違った結果を提供することを学習します。
次のステップ
- 微調整機能の詳細については、Azure OpenAI の微調整に関するチュートリアルを参照してください。
- 微調整モデルのリージョン別の利用可能性を確認する
- Azure OpenAI クォータについて詳しく知る