學習如何在 Microsoft Foundry 中針對你的資料集和使用案例微調模型。 微調功能使得以下內容成為可能:
- 相較於直接從提示工程獲得的結果,可將品質提升至更高層次
- 能夠針對超出模型最大要求內容限制的範例進行定型。
- 由於提示較短而節省權杖
- 低延遲要求,尤其是使用較小模型時。
相較於少樣本學習,微調透過使用超出提示所能容納的更多範例進行訓練,從而提升模型效能。 由於權重會適應您的工作,您只需提供較少的範例或指令,從而減少每次呼叫的權杖數量,並可能降低成本與延遲。
我們會使用 LoRA 或低等級調整,以降低其複雜度的方式微調模型,而不會大幅影響其效能。 該方法的工作原理是將原始高階矩陣與較低階矩陣近似,從而在監督訓練階段僅微調較小的重要參數子集,使模型更易於管理和高效。 對於使用者來說,這可讓定型比其他技術更快且價格更合理。
在本文中,您將了解如何:
- 選擇合適的資料集和格式進行微調
- 觸發微調作業、監控狀態並獲取結果。
- 部署和評估微調的模型。
- 根據評估意見反應反覆運算。
先決條件
- 請閱讀使用 Foundry 微調的時機指南 (部分內容可能是機器或 AI 翻譯)。
- Azure 訂用帳戶。 免費建立一個。
- Foundry 的專案資源。 登入 Foundry 入口 網站即可創建一個。
- 微調存取需要 Azure AI 使用者 角色。
- 如果你還沒有權限在 Microsoft Foundry 入口網站中查看配額或部署模型,則需要 更多權限。
支援的模型
請參閱模型頁面 (機器翻譯),查看目前支援微調的區域。
或者,您可以對先前微調的模型再次微調,其格式為 base-model.ft-{jobid}。
準備資料
您的定型資料和驗證資料集包含您想要執行模型之方式的輸入和輸出範例。
您使用的訓練和驗證資料 必須 格式化為 JSON Lines (JSONL) 檔,並且必須格式化為 聊天完成 API 所使用的對話格式。
建議使用您在每個訓練範例中發現最有效的指示和提示。 這可以幫助您獲得最佳結果,尤其是當您的範例少於一百個時。
如果您沒有準備現有的資料集,您可以使用 資料產生 功能來建立新的資料集。
範例檔案格式
{"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 定型檔案的單行中進行多回合交談亦受支援。 若要跳過對特定助理訊息的微調,請新增選擇性 weight 索引鍵值組。 目前 weight 可設定為 0 或 1。
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "What's the biggest city in France?"}, {"role": "assistant", "content": "Paris", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Paris, as if everyone doesn't know that already.", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "Who wrote 'Romeo and Juliet'?"}, {"role": "assistant", "content": "William Shakespeare", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Oh, just some guy named William Shakespeare. Ever heard of him?", "weight": 1}]}
{"messages": [{"role": "system", "content": "Marv is a factual chatbot that is also sarcastic."}, {"role": "user", "content": "How far is the Moon from Earth?"}, {"role": "assistant", "content": "384,400 kilometers", "weight": 0}, {"role": "user", "content": "Can you be more sarcastic?"}, {"role": "assistant", "content": "Around 384,400 kilometers. Give or take a few, like that really matters.", "weight": 1}]}
具有視覺的聊天完成
{"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 個精心製作的訓練資料開始。
一般而言,資料集大小加倍會導致模型品質呈線性增加。 但請記住,低品質範例則可能會對效能造成負面影響。 如果您在大量內部資料上訓練模型,而不先修剪資料集以僅針對最高品質的範例,您最終可能會得到效能低於預期的模型。
建立微調模型
要在現有的 Foundry 專案中微調模型,請遵循以下步驟:
流覽至 [建置 > 微調 ] 頁面,然後選取右上角的 [微調 ] 按鈕。
您現在應該會看到 [微調模型] 體驗,可用於建立新的微調作業。 使用下列各節來協助設定作業,並選取 [提交] 以開始訓練新的微調模型。
基本模型選取
可用的模型可能會受到專案區域的限制。 您選擇的模型會影響模型的效能和成本。
選取模型時,您也可以選取先前微調的模型。
客製化方式
根據所選型號,可能支援不同的自訂方法:
受監督 (SFT):根據標記的輸入-輸出配對來訓練模型。 最適合大多數情境,包括工作專門化。
直接偏好優化 (DPO):使模型與人類偏好的回應保持一致。 非常適合改善響應品質。
強化 (RFT):使用來自模型評分工具的獎勵訊號將複雜行為最佳化。
訓練類型
根據您的使用案例和預算選取訓練層級。
標準:訓練發生在目前 Foundry 資源的區域中,提供資料駐留保證。 非常適合需要將資料保留在特定區域中的工作負載。
全球:透過使用超出你目前區域的容量,提供比標準更實惠的價格。 資料和權重會被複製到進行訓練的區域中。 如果資料駐留不是限制,而且您想要更快的佇列時間,則這是理想的選擇。
開發者(預覽):透過利用閒置容量進行訓練,顯著降低成本。 沒有延遲或 SLA 保證,因此此層中的工作可能會被自動中斷,並在稍後重新繼續。 資料的駐留位置也沒有任何保證。 非常適合進行實驗及用於對價格敏感的工作負載。
定型和驗證資料
如果您在 Foundry 專案中有現有的資料集,請選擇資料來源的現有資料集,然後選取您的資料集。
若要上傳新準備的資料集,請選擇資料來源的上傳新資料集,然後上傳您的 JSONL 檔案。
選取或上傳資料檔案後,會自動進行驗證檢查,以確認其格式正確。
備註
定型資料檔案必須格式化為 JSONL 檔案、以 UTF-8 編碼,並以位元組順序標記 (BOM)。 檔案大小必須小於 512 MB。 雖然 10 是資料集中所需的最小樣本數,但建議至少使用 100 個訓練樣本來教導模型新技能。
選擇性參數
後置詞
建議填寫 字尾 欄位,以便更容易區分微調模型的不同疊代。 尾碼最多採用 18 個字元的字串,並在命名產生的微調模型時使用。
Seed
控制工作的可重現性。 傳入相同的種子和作業參數應該會產生相同的結果,但在極少數情況下可能會有所不同。 如果未指定種子,則會為您隨機產生種子。
超參數
微調工作的超參數可以手動配置或保留為預設值。
下列超參數可供使用:
| 名稱 | 型別 | 說明 |
|---|---|---|
batch_size |
整數 | 用於訓練的批次大小。 批次大小是用來訓練單一向前和向後傳遞的訓練範例數目。 一般來說,我們發現較大的批量大小往往更適合較大的資料集。 這個屬性的預設值和最大值是特定於基本模型。 批次大小越大,表示模型參數的更新頻率越低,而變異數越少。 當設定為 -1 時,batch_size 會計算為訓練集中範例的 0.2%,最大值為 256。 |
learning_rate_multiplier |
number | 用於訓練的學習速率乘數。 微調學習速率是預先定型所用原始學習速率乘以此值。 學習速率越大,通常在越大的批次大小下擁有更佳效能。 建議您試驗 0.02 到 0.2 這個範圍內的值,看看哪些值會產生最佳結果。 較小的學習率可能有助於避免過度擬合。 |
n_epochs |
整數 | 訓練模型的週期數目。 Epoch 是指透過訓練資料集的一個完整週期。 如果設定為 -1,則會根據輸入資料動態決定 Epoch 數目。 |
啟用自動部署
若要節省時間,您可以為產生的模型啟用自動部署。 如果定型成功完成,則會使用選取的部署類型來部署模型。 部署名稱是以自訂模型產生的唯一名稱,以及您先前可能提供的選擇性尾碼為基礎。
備註
自動部署僅支援 OpenAI 模型。
監控和分析結果
當您提交微調任務後,您會看到一個表格列表,列出您所有的微調任務提交。 按一下 工作詳細資料 頁面,以查看個別結果的詳細資訊。
您的作業可能會排入系統中其他作業後方的佇列。 訓練模型可能需要幾分鐘到幾小時的時間,視模型和資料集大小而定。
Metrics
您可以導覽至 [監控] 頁籤來檢視下列指標:
- train_loss:訓練批次的損失。 X 軸上的每個訓練步驟代表對一批訓練資料的單一行程 (向前和向後)。
- full_valid_loss:在每個紀元結束時計算的驗證損失。 訓練順利時,損失應該會減少。
-
train_mean_token_accuracy:模型正確預測之訓練批次中的語彙基元百分比。
例如,如果批次大小設定為 3,且您的資料包含完成[[1, 2], [0, 5], [4, 2]],則如果模型預測[[1, 1], [0, 5], [4, 2]],此值會設定為 0.83 (5 除以 6)。 - full_valid_mean_token_accuracy:在每個紀元結束時計算的有效平均令牌準確度。 當訓練順利進行時,權杖正確性應該會增加。
隨著時間推移,您的損失會減少,而正確性會增加。 如果您發現定型資料和驗證資料之間存在差異,則可能表示您過度學習。 嘗試使用較少的 Epoch 或較小的學習速率乘數進行定型。
檢查站
當每個訓練時期完成時,就會產生檢查點。 您可以透過瀏覽到 [檢查點] 樞紐來檢視檢查點。
檢查點是模型的完整版本,既可部署,也能作為後續微調工作的目標模型使用。 檢查點很有用,因為它們可能在過度擬合前提供快照。 當微調工作完成後,你將擁有三個最新的版本可供部署。 您可以透過 REST API 複製資源與訂用帳戶之間的檢查點。
備註
在訓練期間,您可以檢視指標,並視需要暫停工作。 如果指標沒有收斂,或者您覺得模型沒有以正確的速度學習,則暫停可能會很有用。 訓練作業暫停後,一旦安全評估完成,就會建立可部署的檢查點。 此檢查點可供您部署並用於推論,或繼續作業直至完成。 暫停作業僅適用於已定型至少一個步驟且處於 執行 中狀態的作業。 暫停功能僅支援 OpenAI 模型。
部署微調的模型
一旦您對微調工作的指標感到滿意,您可以按一下詳細資料頁面右上方的 [部署 ] 按鈕並設定部署設定來部署模型。
如需詳細資訊,請參閱 微調部署指南 。
使用已部署的微調模型
部署微調模型後,您就能如同使用其他部署模型般使用該模型。 您可以使用 Foundry 中的 [遊樂場] 對新部署進行實驗。 您也可以使用 REST API,從自己的應用程式呼叫微調模型。 您甚至可以開始在提示流程中使用此新微調模型,以建置生成式 AI 應用程式。
備註
針對聊天模型,您用於引導微調模型的系統訊息 (無論是否已部署或可在遊樂場中進行測試) 必須與用於訓練的系統訊息相同。 如果您使用不同的系統訊息,模型可能無法如預期般執行。
持續微調
當你建立出微調模型後,你可能會想透過進一步微調來持續精煉模型。 持續微調是選取已微調模型作為基底模型,並在新的定型範例集中進一步微調的反覆程序。
若要對先前微調的模型執行微調,您會使用與 建立微調模型 中所述的相同程式,而不是指定已微調的模型泛型基底模型名稱。 自訂微調模型看起來像 gpt-4o-2024-08-06.ft-d93dda6110004b4da3472d96f4dd4777-ft。
備註
持續微調僅支援 OpenAI 模型。
清除資源
當您完成微調模型時,可刪除部署和模型。 您也可以刪除上傳至服務的定型和驗證檔案 (如需要)。
刪除微調模型部署
這很重要
部署自訂模型之後,如果在任何時候該部署處於非使用中的狀態超過十五 (15) 天,則系統會刪除該部署。 如果模型部署的時間超過十五 (15) 天,而且在連續 15 天內沒有針對模型進行完成或聊天完成呼叫,則自訂模型的部署為「非使用中」。
刪除非使用中的部署不會刪除或影響基礎自訂模型,且自訂模型可以隨時進行重新部署。 如 Microsoft Foundry 模型中的 Azure OpenAI 定價中所述,每個部署的自訂 (微調) 模型都會產生每小時裝載成本,無論是否要對模型進行完成或聊天完成呼叫。 若要深入瞭解使用 Azure OpenAI 規劃和管理成本,請參閱 規劃管理 Azure OpenAI 成本中的指引。
您可以在 Foundry 入口網站的 [建置] > [模型] 頁面上刪除已微調模型的部署。
刪除微調模型
你可以在 Foundry 入口網站的 微調 頁面刪除微調模型。 選取要刪除的微調模型,然後選取 [刪除] 以刪除微調模型。
備註
如果微調模型具有現有部署,則無法刪除微調模型。 您必須先刪除模型部署,才能刪除微調模型。
先決條件
- 請閱讀 使用 Azure OpenAI 微調的時機指南 (機器翻譯)。
- Azure 訂用帳戶。 免費建立一個。
- Azure OpenAI 資源。 如需詳細資訊,請參閱使用 Azure OpenAI 建立資源及部署模型。
- 下列 Python 程式庫:
os、json、requests、openai。 - OpenAI Python 程式庫。
- 微調存取權限需要 Azure AI 使用者 角色。
- 如果您尚未擁有在 Microsoft Foundry 入口網站中查看配額及部署模型的權限,則需要 額外權限。
支援的模型
請參閱模型頁面 (機器翻譯),查看目前支援微調的區域。
或者,您可以對先前微調的模型再次進行微調,格式為 base-model.ft-{jobid}。
檢閱 Python SDK 的工作流程
請花一點時間檢閱搭配 Azure OpenAI 使用 Python SDK 的微調工作流程:
- 準備您的定型和驗證資料。
- 選取基底模型。
- 上傳定型資料。
- 定型新的自訂模型。
- 檢查自訂模型的狀態。
- 部署自訂模型以供使用。
- 使用自訂模型。
- (選擇性) 分析自訂模型以取得效能並加以調整。
準備您的定型和驗證資料
您的定型資料和驗證資料集包含您想要執行模型之方式的輸入和輸出範例。
您使用的訓練和驗證資料 必須 格式化為 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 定型檔案的單行中進行多回合交談亦受支援。 若要跳過對特定助理訊息的微調,請新增選擇性 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}]}
具有視覺的聊天完成
{"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 個訓練範例才能進行,但如此如此少量的範例不足以顯著影響模型回應。 如果無法提供數千個定型範例,起碼須提供數百個定型範例,才是順利完成作業的最佳做法。
一般而言,資料集大小加倍會導致模型品質呈線性增加。 但請記住,低品質範例則可能會對效能造成負面影響。 如果您透過大量內部資料定型模型,而未事先剪除資料集以留下最高品質的範例,則最終可能會得到一個效能比預期更差的模型。
上傳定型資料集
下一個步驟是選擇現有的備妥定型資料,或上傳自訂模型時要使用的新備妥定型資料。 備妥定型資料後,您可以將檔案上傳至服務。 上傳定型資料有兩種方式:
若為大型資料檔案,建議您從 Azure Blob 存放區匯入。 透過多部分表單上傳大型檔案時會變得不穩定,因為這些要求不可部分完成,而且無法重試或繼續。 如需 Azure Blob 儲存體的詳細資訊,請參閱什麼是 Azure Blob 儲存體?
備註
定型資料檔案必須格式化為 JSONL 檔案、以 UTF-8 編碼,並以位元組順序標記 (BOM)。 檔案大小必須小於 512 MB。
下列 Python 範例會使用 Python SDK 上傳本機定型和驗證檔案,並擷取傳回的檔案識別碼。
import os
from openai import OpenAI
# Load the OpenAI client
client = OpenAI(
api_key = os.getenv("AZURE_OPENAI_API_KEY"),
base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/"
)
# Upload the training and validation dataset files to Microsoft Foundry with the SDK.
training_file_name = 'training_set.jsonl'
validation_file_name = 'validation_set.jsonl'
training_response = client.files.create(file=open(training_file_name, "rb"), purpose="fine-tune")
validation_response = client.files.create(file=open(validation_file_name, "rb"), purpose="fine-tune")
training_file_id = training_response.id
validation_file_id = validation_response.id
print("Training file ID:", training_file_id)
print("Validation file ID:", validation_file_id)
建立自訂模型
上傳定型和驗證檔案之後,您就可以開始微調作業。
下列 Python 程式碼示範如何使用 Python SDK 建立新的微調作業範例:
response = client.fine_tuning.jobs.create(
training_file=training_file_id,
validation_file=validation_file_id,
model="gpt-4.1-2025-04-14", # Enter base model name.
suffix="my-model", # Custom suffix for naming the resulting model. Note that in Microsoft Foundry the model cannot contain dot/period characters.
seed=105, # Seed parameter controls reproducibility of the fine-tuning job. If no seed is specified one will be generated automatically.
extra_body={ "trainingType": "GlobalStandard" } # Change this to your preferred training type. Other options are `Standard` and `Developer`.
)
job_id = response.id
# You can use the job ID to monitor the status of the fine-tuning job.
# The fine-tuning job will take some time to start and complete.
print("Job ID:", response.id)
print(response.model_dump_json(indent=2))
備註
我們建議使用全球標準層級(Global Standard tier)來進行培訓,因為它能 節省成本 並利用全球容量,加快排隊時間。 不過,它確實會複製當前資源區域外的資料和權重。 如果資料 駐留 是必要條件,請使用支援標準層級訓練的 模型 。
您也可以傳遞其他選擇性參數 (例如超參數),以進一步控制微調流程。 針對初始定型,建議您使用已存在的自動預設值,而非指定這些參數。
目前支援的監督式微調超參數如下:
| 名稱 | 型別 | 說明 |
|---|---|---|
batch_size |
整數 | 用於訓練的批次大小。 批次大小是用來訓練單一向前和向後傳遞的訓練範例數目。 一般而言,我們發現較大的批次大小通常較適合較大的資料集。 此屬性的預設值和最大值是基底模型所特有的。 批次大小越大,表示模型參數的更新頻率越低,而變異數越少。 |
learning_rate_multiplier |
number | 用於訓練的學習速率乘數。 微調學習速率是預先定型所用原始學習速率乘以此值。 學習速率越大,通常在越大的批次大小下擁有更佳效能。 建議您試驗 0.02 到 0.2 這個範圍內的值,看看哪些值會產生最佳結果。 較小的學習速率可能有助於避免過度學習。 |
n_epochs |
整數 | 訓練模型的週期數目。 Epoch 是指透過訓練資料集的一個完整週期。 |
seed |
整數 | 種子會控制作業的重現性。 傳入相同的種子和作業參數應該會產生相同的結果,但在罕見的情況下可能會有所不同。 如果未指定種子,將會為您產生一個種子。 |
若要使用 OpenAI Python API 的 1.x 版本設定自訂超參數,請將它們作為 method 的一部分提供。
client.fine_tuning.jobs.create(
training_file="file-abc123",
model="gpt-4.1-2025-04-14",
suffix="my-model",
seed=105,
method={
"type": "supervised", # In this case, the job will be using Supervised Fine Tuning.
"supervised": {
"hyperparameters": {
"n_epochs": 2
}
}
},
extra_body={ "trainingType": "GlobalStandard" }
)
訓練類型
根據您的使用案例和預算選取訓練層級。
標準:訓練發生在目前 Foundry 資源的區域中,提供資料駐留保證。 非常適合需要將資料保留在特定區域中的工作負載。
全球:透過利用目前區域以外的容量,提供比標準更實惠的價格。 資料和權重會被複製到進行訓練的區域中。 如果資料駐留不是限制,而且您想要更快的佇列時間,則這是理想的選擇。
開發人員 (預覽版):利用閒置容量進行訓練,以節省大量成本。 沒有延遲或 SLA 保證,因此此層中的工作可能會被自動中斷,並在稍後重新繼續。 資料的駐留位置也沒有任何保證。 非常適合進行實驗及用於對價格敏感的工作負載。
import openai
from openai import AzureOpenAI
base_uri = "https://<ACCOUNT-NAME>.services.ai.azure.com"
api_key = "<API-KEY>"
api_version = "2025-04-01-preview"
client = AzureOpenAI(
azure_endpoint=base_uri,
api_key=api_key,
api_version=api_version
)
try:
client.fine_tuning.jobs.create(
model="gpt-4.1-mini",
training_file="<FILE-ID>",
extra_body={"trainingType": "developerTier"}
)
except openai.APIConnectionError as e:
print("The server could not be reached")
print(e.__cause__) # an underlying Exception, likely raised within httpx.
except openai.RateLimitError as e:
print("A 429 status code was received; we should back off a bit.")
except openai.APIStatusError as e:
print("Another non-200-range status code was received")
print(e.status_code)
print(e.response)
print(e.body)
檢查微調作業狀態
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))
檢查站
當每個訓練時期完成時,就會產生檢查點。 檢查點是模型的完整功能版本,可以被部署且用作後續微調作業的目標模型。 檢查點特別有用,因為它們可能會在過度學習之前提供快照集。 微調作業完成時,您將有三個最新版本的模型可供部署。 最終 Epoch 將會以微調模型來表示,而前兩個 Epoch 將做為檢查點使用。
您可以執行清單檢查點命令,以擷取與個別微調作業相關聯的檢查點清單。 您可能需要使用 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 的結果檔案附加至其中。 您可以使用結果檔案來分析自訂模型的定型和驗證效能。 結果檔案的檔案識別碼會針對每個自訂模型列出,並且您可以使用 Python SDK 來擷取檔案識別碼和下載結果檔案進行分析。
下列 Python 範例會擷取附加至自定義模型微調作業之第一個結果檔的檔案識別符,然後使用 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 |
定型步驟的數目。 定型步驟代表對一批定型資料的單次向前和向後傳遞。 |
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 |
在每個 Epoch 結尾計算的驗證遺失。 訓練順利時,損失應該會減少。 |
full_valid_mean_token_accuracy |
在每個 Epoch 結尾計算的有效平均權杖正確性。 當訓練順利進行時,權杖正確性應該會增加。 |
你也可以在 Microsoft Foundry 入口網站中以圖表顯示 results.csv 檔案中的資料。 選取已定型模型的連結,您會看到三個圖表:遺失、平均權杖正確性和權杖正確性。 如果您已提供驗證資料,則兩個資料集都會出現在同一繪圖上。
隨著時間推移,您的損失會減少,而正確性會增加。 如果您發現定型資料和驗證資料之間存在差異,則可能表示您過度學習。 嘗試使用較少的 Epoch 或較小的學習速率乘數進行定型。
部署已優化的模型
一旦您滿意微調作業中的計量,或只想移至推斷,您必須部署模型。
如果您要部署以進行進一步驗證,請考慮使用開發人員部署進行 測試 。
有別於先前的 SDK 命令,您必須使用控制平面 API 來完成部署,而這需要個別的授權、不同的 API 路徑和不同的 API 版本。
| 變數 | 定義 |
|---|---|
| Token | 有多種方式可以產生授權令牌。 初始測試最簡單的方法是從 Azure 入口網站啟動Cloud Shell。 接著,執行 az account get-access-token。 您可以使用此權杖作為 API 測試的暫時授權權杖。 建議您將此儲存在新的環境變數中。 |
| 月租方案 | 相關聯 Azure OpenAI 資源的訂閱識別碼。 |
| 資源群組 | Azure OpenAI 資源的資源群組名稱。 |
| 資源名稱 | Azure OpenAI 資源名稱。 |
| 模型部署名稱 | 新微調模型部署的自訂名稱。 這是在程式碼中執行聊天完成功能調用時參考的名稱。 |
| fine_tuned_model | 從上一個步驟的微調作業結果中擷取此值。 其將會如 gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83 所示。 您必須將此值新增至 deploy_data json。 或者,您也可以透過傳遞檢查點識別碼 (格式為 ftchkpt-e559c011ecc04fc68eaa339d8227d02d) 來部署檢查點 |
import json
import os
import requests
token= os.getenv("<TOKEN>")
subscription = "<YOUR_SUBSCRIPTION_ID>"
resource_group = "<YOUR_RESOURCE_GROUP_NAME>"
resource_name = "<YOUR_AZURE_OPENAI_RESOURCE_NAME>"
model_deployment_name ="gpt-41-ft" # custom deployment name that you will use to reference the model when making inference calls.
deploy_params = {'api-version': "2024-10-01"} # control plane API version rather than dataplane API for this call
deploy_headers = {'Authorization': 'Bearer {}'.format(token), 'Content-Type': 'application/json'}
deploy_data = {
"sku": {"name": "standard", "capacity": 1},
"properties": {
"model": {
"format": "OpenAI",
"name": <"fine_tuned_model">, #retrieve this value from the previous call, it will look like gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83
"version": "1"
}
}
}
deploy_data = json.dumps(deploy_data)
request_url = f'https://management.azure.com/subscriptions/{subscription}/resourceGroups/{resource_group}/providers/Microsoft.CognitiveServices/accounts/{resource_name}/deployments/{model_deployment_name}'
print('Creating a new deployment...')
r = requests.put(request_url, params=deploy_params, headers=deploy_headers, data=deploy_data)
print(r)
print(r.reason)
print(r.json())
在這裡深入瞭解跨區域部署和使用已 部署的模型。
如果您已準備好要部署生產環境或具有特定數據落地需求,請遵循我們的 部署指南。
持續微調
建立微調模型之後,建議您透過進一步微調繼續精簡模型。 持續微調是選取已微調模型作為基底模型,並在新的定型範例集中進一步微調的反覆程序。
備註
持續微調僅支援 OpenAI 模型。
若要對先前微調的模型執行微調,您可以使用建立自訂模型中所述的相同流程,但請指定已微調模型的識別碼,而不是指定一般基底模型的名稱。 微調模型的識別碼看起來像 gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7
response = client.fine_tuning.jobs.create(
training_file=training_file_id,
validation_file=validation_file_id,
model="gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7"
)
job_id = response.id
# You can use the job ID to monitor the status of the fine-tuning job.
# The fine-tuning job will take some time to start and complete.
print("Job ID:", response.id)
print("Status:", response.id)
print(response.model_dump_json(indent=2))
我們也建議您加入 suffix 參數,以便更輕鬆區分微調模型的不同反覆項目。
suffix 會接受字串,並設定用於識別微調模型。 OpenAI Python API 支援最多 18 個字元的字串,該字串會新增至微調的模型名稱中。
如果您不確定現有微調模型的 ID,這些資訊可在 Microsoft Foundry 的 模型 頁面找到,或是使用 REST API 為特定 Azure OpenAI 資源產生 模型清單 。
清除部署、自訂模型和定型檔案
當您完成自訂模型時,可刪除部署和模型。 您也可以刪除上傳至服務的定型和驗證檔案 (如需要)。
刪除模型部署
這很重要
部署自訂模型之後,如果在任何時候該部署處於非使用中的狀態超過十五 (15) 天,則系統會刪除該部署。 如果模型部署的時間超過十五 (15) 天,而且在連續 15 天內沒有針對模型進行完成或聊天完成呼叫,則自訂模型的部署為「非使用中」。
刪除非使用中的部署不會刪除或影響基礎自訂模型,且自訂模型可以隨時進行重新部署。 如 Microsoft Foundry 模型中的 Azure OpenAI 定價中所述,每個部署的自訂 (微調) 模型都會產生每小時裝載成本,無論是否要對模型進行完成或聊天完成呼叫。 若要深入瞭解使用 Azure OpenAI 規劃和管理成本,請參閱 規劃管理 Azure OpenAI 成本中的指引。
您可以使用各種方法來刪除自訂模型的部署:
刪除自訂模型
同樣地,您可以使用各種方法來刪除自訂模型:
備註
如果自訂模型具有現有部署,則無法刪除自訂模型。 您必須先刪除模型部署,才能刪除自訂的模型。
刪除定型檔案
您可以選擇從 Azure OpenAI 訂閱中刪除為定型而上傳的定型和驗證檔案,以及在定型期間產生的結果檔案。 您可以使用下列方法來刪除定型、驗證和結果檔案:
- Microsoft Foundry
- 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)
先決條件
- 請閱讀 使用 Azure OpenAI 微調的時機指南 (機器翻譯)。
- Azure 訂用帳戶。 免費建立一個。
- Azure OpenAI 資源。 如需詳細資訊,請參閱使用 Azure OpenAI 建立資源及部署模型。
- 微調存取權限需要 Azure AI 使用者 角色。
- 如果你還沒有權限在 Microsoft Foundry 入口網站中查看配額或部署模型,則需要 額外權限。
支援的模型
請參閱模型頁面 (機器翻譯),查看目前支援微調的區域。
或者,您可以對先前微調的模型再次微調,其格式為 base-model.ft-{jobid}。
檢閱 REST API 的工作流程
請花一點時間檢閱搭配 Azure OpenAI 使用 REST API 和 Python 的微調工作流程:
- 準備您的定型和驗證資料。
- 選取基底模型。
- 上傳定型資料。
- 定型新的自訂模型。
- 檢查自訂模型的狀態。
- 部署自訂模型以供使用。
- 使用自訂模型。
- (選擇性) 分析自訂模型以取得效能並加以調整。
準備您的定型和驗證資料
您的定型資料和驗證資料集包含您想要執行模型之方式的輸入和輸出範例。
您使用的訓練和驗證資料 必須 格式化為 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 定型檔案的單行中進行多回合交談亦受支援。 若要跳過對特定助理訊息的微調,請新增選擇性 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}]}
具有視覺的聊天完成
{"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 個訓練範例才能進行,但如此如此少量的範例不足以顯著影響模型回應。 如果無法提供數千個定型範例,起碼須提供數百個定型範例,才是順利完成作業的最佳做法。
一般而言,資料集大小加倍會導致模型品質呈線性增加。 但請記住,低品質範例則可能會對效能造成負面影響。 如果您透過大量內部資料定型模型,而未事先剪除資料集以留下最高品質的範例,則最終可能會得到一個效能比預期更差的模型。
上傳定型資料集
下一個步驟是選擇現有的備妥定型資料,或上傳微調模型時要使用的新備妥定型資料。 備妥定型資料後,您可以將檔案上傳至服務。 上傳定型資料有兩種方式:
若為大型資料檔案,建議您從 Azure Blob 存放區匯入。 透過多部分表單上傳大型檔案時會變得不穩定,因為這些要求不可部分完成,而且無法重試或繼續。 如需 Azure Blob 儲存體的詳細資訊,請參閱什麼是 Azure Blob 儲存體?
備註
定型資料檔案必須格式化為 JSONL 檔案、以 UTF-8 編碼,並以位元組順序標記 (BOM)。 檔案大小必須小於 512 MB。
上傳定型資料
curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/files \
-H "Content-Type: multipart/form-data" \
-H "api-key: $AZURE_OPENAI_API_KEY" \
-F "purpose=fine-tune" \
-F "file=@C:\\fine-tuning\\training_set.jsonl;type=application/json"
上傳驗證資料
curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/files \
-H "Content-Type: multipart/form-data" \
-H "api-key: $AZURE_OPENAI_API_KEY" \
-F "purpose=fine-tune" \
-F "file=@C:\\fine-tuning\\validation_set.jsonl;type=application/json"
建立自訂模型
上傳定型和驗證檔案之後,您就可以開始微調作業。 下列程式碼示範如何使用 REST API 建立新微調作業 (部分機器翻譯) 的範例。
在此範例中,我們也會傳遞種子參數。 種子會控制作業的重現性。 傳入相同的種子和作業參數應該會產生相同的結果,但在罕見的情況下,可能會有所不同。 如果未指定種子,將會為您產生一個種子。
curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs \
-H "Content-Type: application/json" \
-H "api-key: $AZURE_OPENAI_API_KEY" \
-d '{
"model": "gpt-4.1-2025-04-14",
"training_file": "<TRAINING_FILE_ID>",
"validation_file": "<VALIDATION_FILE_ID>",
"seed": 105
}'
如果您要微調支援全域訓練的模型,您可以使用extra_body具名引數來指定訓練類型,並使用 api-version 2025-04-01-preview。
curl -X POST $AZURE_OPENAI_ENDPOINT/openai/fine_tuning/jobs?api-version=2025-04-01-preview \
-H "Content-Type: application/json" \
-H "api-key: $AZURE_OPENAI_API_KEY" \
-d '{
"model": "gpt-4.1-2025-04-14",
"training_file": "<TRAINING_FILE_ID>",
"validation_file": "<VALIDATION_FILE_ID>",
"seed": 105,
"trainingType": "globalstandard"
}'
您也可以傳遞其他選擇性參數 (例如超參數),以進一步控制微調流程。 針對初始定型,建議您使用已存在的自動預設值,而非指定這些參數。
目前支援的監督式微調超參數如下:
| 名稱 | 型別 | 說明 |
|---|---|---|
batch_size |
整數 | 用於訓練的批次大小。 批次大小是用來訓練單一向前和向後傳遞的訓練範例數目。 一般而言,我們發現較大的批次大小通常較適合較大的資料集。 此屬性的預設值和最大值是基底模型所特有的。 批次大小越大,表示模型參數的更新頻率越低,而變異數越少。 |
learning_rate_multiplier |
number | 用於訓練的學習速率乘數。 微調學習速率是預先定型所用原始學習速率乘以此值。 學習速率越大,通常在越大的批次大小下擁有更佳效能。 建議您試驗 0.02 到 0.2 這個範圍內的值,看看哪些值會產生最佳結果。 較小的學習速率可能有助於避免過度學習。 |
n_epochs |
整數 | 訓練模型的週期數目。 Epoch 是指透過訓練資料集的一個完整週期。 |
seed |
整數 | 種子會控制作業的重現性。 傳入相同的種子和作業參數應該會產生相同的結果,但在罕見的情況下可能會有所不同。 如果未指定種子,將會為您產生一個種子。 |
訓練類型
根據您的使用案例和預算選取訓練層級。
標準:訓練發生在目前 Foundry 資源的區域中,提供資料駐留保證。 非常適合需要將資料保留在特定區域中的工作負載。
全球:透過利用目前區域以外的容量,提供比標準更實惠的價格。 資料和權重會被複製到進行訓練的區域中。 如果資料駐留不是限制,而且您想要更快的佇列時間,則這是理想的選擇。
開發者 (預覽版):透過運用閒置產能進行訓練,可大幅節省成本。 沒有延遲或 SLA 保證,因此此層中的工作可能會被自動中斷,並在稍後重新繼續。 資料的駐留位置也沒有任何保證。 非常適合進行實驗及用於對價格敏感的工作負載。
curl -X POST "https://<ACCOUNT-NAME>.openai.azure.com/openai/fine_tuning/jobs?api-version=2025-04-01-preview" -H "Content-Type: application/json" -H "api-key: <API-KEY>" -d "{"model": "gpt-4.1", "training_file": "<FILE_ID>", "hyperparameters": {"prompt_loss_weight": 0.1}, "trainingType": "developerTier"}"
檢查自訂模型的狀態
啟動微調作業之後,可能需要一些時間才能完成。 您的作業可能會排入系統中其他作業後方的佇列。 視模型和資料集大小而定,定型模型可能需要幾分鐘或幾小時的時間。 下列範例會使用 REST API 來檢查微調作業的狀態。 此範例會使用上一個範例傳回的作業識別碼,擷取作業的相關資訊:
curl -X GET $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/<YOUR-JOB-ID> \
-H "api-key: $AZURE_OPENAI_API_KEY"
暫停與繼續
在訓練期間,您可以檢視記錄和計量,並視需要暫停作業。 如果計量未聚合,或您覺得模型不是以正確的步調學習,暫停可能會很有用。 一旦訓練作業暫停,完成安全評估後,就會建立可部署的檢查點。 此檢查點可供您部署並用於推論,或繼續作業直至完成。 暫停作業僅適用於已定型至少一個步驟且處於 執行 中狀態的作業。
暫停
curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/pause \
-H "Content-Type: application/json" \
-H "api-key: $AZURE_OPENAI_API_KEY"
履歷
curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/resume \
-H "Content-Type: application/json" \
-H "api-key: $AZURE_OPENAI_API_KEY"
列出微調事件
若要檢查訓練期間產生的個別微調事件:
curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/events \
-H "Content-Type: application/json" \
-H "api-key: $AZURE_OPENAI_API_KEY"
複製模型 (預覽)
現在,您可以跨不同訂用帳戶 (但在同一租用戶內) 將已微調的檢查點模型從一個區域複製到另一個區域。 該流程會使用專用的 API 來確保有效率且安全的傳輸。 此功能目前僅透過 API 提供,無法透過 Foundry 入口網站使用。 將模型從區域 A 複製到區域 B 後,您可以繼續在區域 B 中微調模型,並從此位置部署模型。
備註
刪除來源區域中的模型檢查點不會導致模型在目的地區域中被刪除。 複製模型後,若要刪除兩個區域中的該模型,則必須分別在每個區域中刪除該模型。
必要條件
- 目的地資源/帳戶至少應該要有一個微調工作。
- 目的地資源/帳戶不應停用公用網路存取。 (至少在傳送複製要求時)。
- 只有當起始複製的帳戶具有足夠的權限來存取目的地帳戶時,您才能複製到目的地帳戶。
權限設定
- 建立使用者指派的受控識別。
- 提供 Azure AI 使用者角色給您目標資源/帳戶上由使用者指派的受控身分識別。
- 將使用者指派的受控識別指派給您的來源資源帳戶。
複製模型
curl --request POST \
--url 'https://<aoai-resource>.openai.azure.com/openai/v1/fine_tuning/jobs/<ftjob>/checkpoints/<checkpoint-name>/copy' \
--header 'Content-Type: application/json' \
--header 'api-key: <api-key>' \
--header 'aoai-copy-ft-checkpoints: preview' \
--data '{
"destinationResourceId": "<resourceId>",
"region": "<region>"
}'
由於這是長時間執行的作業,因此請透過提供 POST 呼叫中使用的來源帳戶的檢查點 ID 來檢查微調模型複本的狀態。
檢查複製狀態
curl --request GET \
--url 'https://<aoai-resource>.openai.azure.com//openai/v1/fine_tuning/jobs/<ftjob>/checkpoints/<checkpoint-name>/copy' \
--header 'Content-Type: application/json' \
--header 'api-key: <api-key>' \
--header 'aoai-copy-ft-checkpoints: preview'
備註
當您從來源帳戶複製檢查點時,目的地帳戶中會保留相同的檢查點名稱。 請確保您在微調、部署或目的地帳戶中的其他操作時使用完全相同的名稱。 此檢查點不會出現在 UI 或 API 中 list checkpoints 。
檢查站
當每個訓練時期完成時,就會產生檢查點。 檢查點是模型的完整功能版本,可以被部署且用作後續微調作業的目標模型。 檢查點特別有用,因為它們可能會在過度學習之前提供快照集。 微調作業完成時,您將有三個最新版本的模型可供部署。 最終 Epoch 將會以微調模型來表示,而前兩個 Epoch 將做為檢查點使用。
您可以執行清單檢查點命令來擷取與個別微調作業相關聯的檢查點清單:
curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/checkpoints \
-H "Content-Type: application/json" \
-H "api-key: $AZURE_OPENAI_API_KEY"
分析自訂模型
每個微調作業完成後,Azure OpenAI 都會將名為 results.csv 的結果檔案附加至其中。 您可以使用結果檔案來分析自訂模型的定型和驗證效能。 結果檔案的檔案識別碼會針對每個自訂模型列出,並且您可以使用 REST API 來擷取檔案識別碼和下載結果檔案進行分析。
下列 Python 範例會使用 REST API 擷取附加至自訂模型微調作業中第一個結果檔案的檔案識別碼,然後將檔案下載至工作目錄進行分析。
curl -X GET "$AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/<JOB_ID>" \
-H "api-key: $AZURE_OPENAI_API_KEY")
curl -X GET "$AZURE_OPENAI_ENDPOINT/openai/v1/files/<RESULT_FILE_ID>/content" \
-H "api-key: $AZURE_OPENAI_API_KEY" > <RESULT_FILENAME>
結果檔案為 CSV 檔案,其中包含標頭資料列,以及微調作業所執行每個定型步驟的資料列。 該結果檔案包含下列資料行:
| 欄位名稱 | 說明 |
|---|---|
step |
定型步驟的數目。 定型步驟代表對一批定型資料的單次向前和向後傳遞。 |
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 |
在每個 Epoch 結尾計算的驗證遺失。 訓練順利時,損失應該會減少。 |
full_valid_mean_token_accuracy |
在每個 Epoch 結尾計算的有效平均權杖正確性。 當訓練順利進行時,權杖正確性應該會增加。 |
你也可以在 Foundry 入口網站中以圖塊形式查看 results.csv 檔案中的資料。 選取已定型模型的連結,您會看到三個圖表:遺失、平均權杖正確性和權杖正確性。 如果您已提供驗證資料,則兩個資料集都會出現在同一繪圖上。
隨著時間推移,您的損失會減少,而正確性會增加。 如果您發現定型資料和驗證資料之間存在差異,則可能表示您過度學習。 嘗試使用較少的 Epoch 或較小的學習速率乘數進行定型。
部署已優化的模型
一旦您滿意微調作業中的計量,或只想移至推斷,您必須部署模型。
如果您要部署以進行進一步驗證,請考慮使用開發人員部署進行 測試 。
如果您已準備好要部署生產環境或具有特定數據落地需求,請遵循我們的 部署指南。
| 變數 | 定義 |
|---|---|
| Token | 有多種方式可以產生授權令牌。 初始測試最簡單的方法是從 Azure 入口網站啟動Cloud Shell。 接著,執行 az account get-access-token。 您可以使用此權杖作為 API 測試的暫時授權權杖。 建議您將此儲存在新的環境變數中。 |
| 月租方案 | 相關聯 Azure OpenAI 資源的訂閱識別碼。 |
| 資源群組 | Azure OpenAI 資源的資源群組名稱。 |
| 資源名稱 | Azure OpenAI 資源名稱。 |
| 模型部署名稱 | 新微調模型部署的自訂名稱。 這是在程式碼中執行聊天完成功能調用時參考的名稱。 |
| fine_tuned_model | 從上一個步驟的微調作業結果中擷取此值。 其將會如 gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83 所示。 您必須將此值新增至 deploy_data json。 或者,您也可以透過傳遞檢查點識別碼 (格式為 ftchkpt-e559c011ecc04fc68eaa339d8227d02d) 來部署檢查點 |
curl -X POST "https://management.azure.com/subscriptions/<SUBSCRIPTION>/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.CognitiveServices/accounts/<RESOURCE_NAME>/deployments/<MODEL_DEPLOYMENT_NAME>?api-version=2024-10-21" \
-H "Authorization: Bearer <TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"sku": {"name": "standard", "capacity": 1},
"properties": {
"model": {
"format": "OpenAI",
"name": "<FINE_TUNED_MODEL>",
"version": "1"
}
}
}'
在這裡深入瞭解跨區域部署和使用已 部署的模型。
持續微調
建立微調模型之後,建議您透過進一步微調繼續精簡模型。 持續微調是選取已微調模型作為基底模型,並在新的定型範例集中進一步微調的反覆程序。
備註
持續微調僅支援 OpenAI 模型。
若要對先前微調的模型執行微調,您可以使用建立自訂模型中所述的相同流程,但請指定已微調模型的識別碼,而不是指定一般基底模型的名稱。 微調模型的識別碼看起來像 gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7
curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs \
-H "Content-Type: application/json" \
-H "api-key: $AZURE_OPENAI_API_KEY" \
-d '{
"model": "gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7",
"training_file": "<TRAINING_FILE_ID>",
"validation_file": "<VALIDATION_FILE_ID>",
"suffix": "<additional text used to help identify fine-tuned models>"
}'
我們也建議您加入 suffix 參數,以便更輕鬆區分微調模型的不同反覆項目。
suffix 會接受字串,並設定用於識別微調模型。 尾碼最多可包含 40 個字元 (a-z、A-Z、0-9 和 _),這些字元會新增至微調模型名稱中。
如果你不確定微調模型的 ID,這些資訊可以在 Foundry 的 模型 頁面找到,或者你也可以使用 REST API 為特定 Azure OpenAI 資源產生 模型清單 。
清除部署、自訂模型和定型檔案
當您完成自訂模型時,可刪除部署和模型。 您也可以刪除上傳至服務的定型和驗證檔案 (如需要)。
刪除模型部署
您可以使用各種方法來刪除自訂模型的部署:
刪除自訂模型
同樣地,您可以使用各種方法來刪除自訂模型:
備註
如果自訂模型具有現有部署,則無法刪除自訂模型。 您必須先刪除模型部署,才能刪除自訂的模型。
刪除定型檔案
您可以選擇從 Azure OpenAI 訂閱中刪除為定型而上傳的定型和驗證檔案,以及在定型期間產生的結果檔案。 您可以使用下列方法來刪除定型、驗證和結果檔案:
Microsoft Foundry 入口網站有兩種獨特的微調體驗:
- 中樞/專案檢視 - 支援從多個提供者微調模型,包括 Azure OpenAI、Meta Llama、Microsoft Phi 等。
- Azure OpenAI 中心檢視 - 僅支援微調 Azure OpenAI 模型,但支援其他功能,如權數和偏差 (W&B) 預覽整合 (英文)。
如果您只是要微調 Azure OpenAI 模型,建議您瀏覽至 https://ai.azure.com/resource/overview,以使用以 Azure OpenAI 為中心的微調體驗。
這很重要
本文中標示為 (預覽) 的項目目前處於公開預覽狀態。 此預覽版本沒有服務等級協定,不建議將其用於生產工作負載。 可能不支援特定功能,或可能已經限制功能。 如需詳細資訊,請參閱 Microsoft Azure 預覽版增補使用條款。
先決條件
- 請閱讀 使用 Azure OpenAI 微調的時機指南 (機器翻譯)。
- Azure 訂用帳戶。 免費建立一個。
- 位於支援 Azure OpenAI 模型微調的區域中的 Azure OpenAI 資源。 如需按區域和支援功能劃分的可用型號清單,請查看模型摘要資料表和區域可用性 (機器翻譯)。 如需詳細資訊,請參閱使用 Azure OpenAI 建立資源及部署模型。
- 微調存取權限需要 Azure AI 使用者 角色。
- 如果您尚未擁有在 Microsoft Foundry 入口網站中查看配額及部署模型的權限,則需要 額外權限。
支援的模型
請參閱模型頁面 (機器翻譯),查看目前支援微調的區域。
或者,您可以對先前微調的模型再次微調,其格式為 base-model.ft-{jobid}。
檢視 Foundry 入口網站的工作流程
花點時間回顧使用 Foundry 入口網站的微調工作流程:
- 準備您的定型和驗證資料。
- 在 Foundry 入口網站使用「 建立微調模型 」對話框來訓練你的自訂模型。
- 選擇訓練方法。
- 選取基底模型。
- 選擇您的訓練類型
- 選擇定型資料。
- (選擇性) 選擇您的驗證資料。
- (選擇性) 針對微調作業設定工作參數。
- 選擇性地為產生的自定義模型 啟用自動部署 。
- 檢閱您的選擇,並定型新的自訂模型。
- 檢查自訂微調模型的狀態。
- 部署自訂模型以供使用。
- 使用您的自訂模型。
- (選擇性) 分析自訂模型以取得效能並加以調整。
準備您的定型和驗證資料
您的定型資料和驗證資料集包含您想要執行模型之方式的輸入和輸出範例。
您使用的訓練和驗證資料 必須 格式化為 JSON Lines (JSONL) 檔,並且必須格式化為 聊天完成 API 所使用的對話格式。
通常建議使用您在每一個訓練範例中找到的最佳指示和提示。 這可協助您取得最佳結果,特別是如果您有少於一百個範例時。
範例檔案格式
{"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 定型檔案的單行中進行多回合交談亦受支援。 若要跳過對特定助理訊息的微調,請新增選擇性 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}]}
具有視覺的聊天完成
{"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 個精心製作的訓練資料開始。
一般而言,資料集大小加倍會導致模型品質呈線性增加。 但請記住,低品質範例則可能會對效能造成負面影響。 如果您透過大量內部資料定型模型,而未事先剪除資料集以留下最高品質的範例,則最終可能會得到一個效能比預期更差的模型。
建立微調的模型
Foundry 入口網站提供「 建立微調模型 」對話框,讓你能在同一個地方輕鬆建立並訓練 Azure 資源的微調模型。
請到 Foundry 入口 https://ai.azure.com/ 網站登入,使用能存取你 Azure OpenAI 資源的憑證登入。 在登入工作流程期間,選取適當的目錄、Azure 訂用帳戶和 Azure OpenAI 資源。
在 Foundry 入口網站中,瀏覽>工具微調窗格,選擇微調模型。
選取要微調的模型,然後選取 [ 下一步 ] 繼續。
您現在應該會看到 [建立微調的模型] 對話框。
選擇您的訓練方式
第一個步驟是確認模型選擇和定型方法。 並非所有模型都支援所有訓練方法。
選取模型時,您也可以選取 先前微調的模型。
選擇訓練類型
Foundry 提供三個培訓層級,旨在滿足不同客戶需求:
標準訓練層級
提供專用資源用於微調,具備可預測的效能與服務等級協議(SLA)。 非常適合需要保證輸送量的生產工作負載。
全球標準訓練層級
Global Training 透過我們其他全球產品 更實惠 的價格,擴大了模型客製化的範圍。 不提供資料儲存位置。 如果您需要資料駐留,請參閱您所選模型的模型可用性中所列的區域。
你的訓練資料及所得模型權重可能會被複製到另一個 Azure 區域。
- 訓練來自十多個 Azure OpenAI 區域的最新 OpenAI 模型。
- 與標準層相比,可享受較低的每單位權杖訓練費率。
開發者培訓層級
這是一種具成本效益的選項,利用閒置容量處理非緊急或探索性工作負載。
此層級的工作可能會被搶先執行,之後再恢復,非常適合實驗性及成本敏感的使用情境。
選擇定型資料
下一個步驟是選擇現有的備妥訓練數據,或在自定義模型時,選擇 [新增訓練數據] 上傳要使用的新備妥訓練數據。
[訓練資料] 對話框會顯示現有的已上傳資料集,並提供上傳新訓練資料的選項。
如果您的訓練數據已上傳至服務,請選取已連接的 AI 資源中的檔案。
- 從顯示的下拉式清單中選取檔案。
若要上傳新的定型資料,請使用下列其中一個選項:
- 選取 [上傳檔案 ] 以從本機檔案上傳訓練數據。
- 選取 [Azure Blob] 或其他共用 Web 位置 ,以從 Azure Blob 或其他共用 Web 位置匯入訓練數據。
若為大型資料檔案,建議您從 Azure Blob 存放區匯入。 透過多部分表單上傳大型檔案時會變得不穩定,因為這些要求不可部分完成,而且無法重試或繼續。 如需 Azure Blob 儲存體的詳細資訊,請參閱什麼是 Azure Blob 儲存體?
備註
定型資料檔案必須格式化為 JSONL 檔案、以 UTF-8 編碼,並以位元組順序標記 (BOM)。 檔案大小必須小於 512 MB。
選擇您的驗證資料(選擇性)
如果您有驗證數據集,請選取 [新增訓練數據]。 您可以選擇現有的備妥驗證數據,或上傳自定義模型時要使用的新備妥驗證數據。
[ 驗證數據] 對話框會顯示任何先前上傳的定型和驗證數據集,並提供您可以上傳新驗證數據的選項。
如果您的驗證資料已上傳至服務,請選取 [選擇資料集]。
- 從 [驗證資料] 窗格所顯示的清單中選取檔案。
若要上傳新的驗證資料,請使用下列其中一個選項:
- 選取 [本機檔案 ] 以從本機檔案上傳驗證數據。
- 選取 [Azure Blob] 或其他共用 Web 位置 ,以從 Azure Blob 或其他共用 Web 位置匯入驗證數據。
若為大型資料檔案,建議您從 Azure Blob 存放區匯入。 透過多部分表單上傳大型檔案時會變得不穩定,因為這些要求不可部分完成,而且無法重試或繼續。
備註
類似於定型資料檔案,驗證資料檔案必須格式化為 JSONL 檔案、以 UTF-8 編碼,並以位元組順序標記 (BOM)。 檔案大小必須小於 512 MB。
讓您的模型成為可識別的 (選擇性)
我們也建議您加入 suffix 參數,讓您更輕鬆地區分微調模型的不同版本。
suffix會採用最多 18 個字元的字串,並在命名產生的微調模型時使用。
設定定型參數 (選擇性)
您可以提供可選的種子,並調整其他超參數。
種子會控制作業的重現性。 傳入相同的種子和作業參數應該會產生相同的結果,但在罕見的情況下可能會有所不同。 如果未指定種子,系統會為您隨機產生一個種子。
以下超參數可透過 Foundry 入口網站調校:
| 名稱 | 型別 | 說明 |
|---|---|---|
| 批次大小 | 整數 | 用於訓練的批次大小。 批次大小是用來訓練單一向前和向後傳遞的訓練範例數目。 一般而言,我們發現較大的批次大小通常較適合較大的資料集。 此屬性的預設值和最大值是基底模型所特有的。 批次大小越大,表示模型參數的更新頻率越低,而變異數越少。 |
| 學習速率乘數 | number | 用於訓練的學習速率乘數。 微調學習速率是預先定型所用原始學習速率乘以此值。 學習速率越大,通常在越大的批次大小下擁有更佳效能。 建議您試驗 0.02 到 0.2 這個範圍內的值,看看哪些值會產生最佳結果。 較小的學習速率可能有助於避免過度學習。 |
| Epoch 數目 | 整數 | 訓練模型的週期數目。 Epoch 是指透過訓練資料集的一個完整週期。 |
開啟自動部署(選擇性)
若要節省時間,您可以選擇性地為產生的模型啟用自動部署。 如果定型成功完成,將會使用選取的 部署類型來部署模型。 部署將根據為您的自定義模型生成的唯一名稱以及您稍早提供的選擇性後綴來進行命名。
檢閱選擇並定型模型
檢閱您的選擇,然後選取 [提交] 以開始定型新的微調模型。
檢查自訂模型的狀態
提交微調工作之後,您會看到一個頁面,其中包含微調模型的詳細數據。 您可以在 Foundry 入口網站的 微調 頁面找到您微調模型的狀態及更多資訊。
您的作業可能會排入系統中其他作業後方的佇列。 視模型和資料集大小而定,定型模型可能需要幾分鐘或幾小時的時間。
檢查站
當每個訓練時期完成時,就會產生檢查點。 檢查點是模型的完整功能版本,可以被部署且用作後續微調作業的目標模型。 檢查點特別有用,因為它們可能會在過度學習之前提供快照集。 微調作業完成時,您將有三個最新版本的模型可供部署。 您可以透過 REST API 複製資源與訂用帳戶之間的檢查點。
暫停與繼續
您可以在 Foundry 入口網站的兩個微調檢視中追蹤進度。 您會看到您的作業經歷與正常微調作業相同的狀態 (已排入佇列、執行中、已成功)。
您也可以在訓練執行時檢閱結果檔案,以便瞭解進度並確認訓練是否如預期進行。
備註
在訓練期間,您可以檢視記錄和計量,並視需要暫停作業。 如果計量未聚合,或您覺得模型不是以正確的步調學習,暫停可能會很有用。 一旦訓練作業暫停,完成安全評估後,就會建立可部署的檢查點。 此檢查點可供您部署並用於推論,或繼續作業直至完成。 暫停作業僅適用於已定型至少一個步驟且處於 執行 中狀態的作業。
分析您的自訂模型
每個微調作業完成後,Azure OpenAI 都會將名為 results.csv 的結果檔案附加至其中。 您可以使用結果檔案來分析自訂模型的定型和驗證效能。 每個自訂模型的檔案 ID 會列出在 Models for Foundry 入口網站的 Result file ID 欄位中。 你可以用檔案 ID 從 Foundry 入口網站的資料 檔案 面板中識別並下載結果檔案。
結果檔案為 CSV 檔案,其中包含標頭資料列,以及微調作業所執行每個定型步驟的資料列。 該結果檔案包含下列資料行:
| 欄位名稱 | 說明 |
|---|---|
step |
定型步驟的數目。 定型步驟代表對一批定型資料的單次向前和向後傳遞。 |
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 |
在每個 Epoch 結尾計算的驗證遺失。 訓練順利時,損失應該會減少。 |
full_valid_mean_token_accuracy |
在每個 Epoch 結尾計算的有效平均權杖正確性。 當訓練順利進行時,權杖正確性應該會增加。 |
你也可以在 Foundry 入口網站中以圖塊形式查看 results.csv 檔案中的資料。 選取已定型模型的連結,您會看到三個圖表:遺失、平均權杖正確性和權杖正確性。 如果您已提供驗證資料,則兩個資料集都會出現在同一繪圖上。
隨著時間推移,您的損失會減少,而正確性會增加。 如果您發現定型資料和驗證資料之間存在差異,則可能表示您過度學習。 嘗試使用較少的 Epoch 或較小的學習速率乘數進行定型。
部署已優化的模型
一旦您對微調作業所得的計量結果感到滿意,或者只是想進行推斷,您必須部署模型。
如果您要部署以進行進一步驗證,請考慮使用開發人員部署進行 測試 。
如果您已準備好要部署生產環境或具有特定數據落地需求,請遵循我們的 部署指南。
使用已部署的微調模型
部署微調模型後,您就能如同使用其他部署模型般使用該模型。 您可以使用 Foundry 中的 [遊樂場] 對新部署進行實驗。 您也可以使用 REST API,從自己的應用程式呼叫微調模型。 您甚至可以開始在提示流程中使用此新微調模型,以建置生成式 AI 應用程式。
備註
對於聊天模型,您用於引導微調模型的系統訊息 (無論是否已部署或可在遊樂場中進行測試),必須與用於定型的系統訊息相同。 如果您使用不同的系統訊息,模型可能無法如預期般執行。
持續微調
建立微調模型之後,建議您透過進一步微調繼續精簡模型。 持續微調是選取已微調模型作為基底模型,並在新的定型範例集中進一步微調的反覆程序。
若要對先前微調的模型執行微調,您會使用與 建立微調模型 中所述的相同程式,而不是指定已微調的模型泛型基底模型名稱。 自訂微調模型看起來會像 gpt-4o-2024-08-06.ft-d93dda6110004b4da3472d96f4dd4777-ft
清除部署、自訂模型和定型檔案
當您完成自訂模型時,可刪除部署和模型。 您也可以刪除上傳至服務的定型和驗證檔案 (如需要)。
刪除模型部署
這很重要
部署自訂模型之後,如果在任何時候該部署處於非使用中的狀態超過十五 (15) 天,則系統會刪除該部署。 如果模型部署的時間超過十五 (15) 天,而且在連續 15 天內沒有針對模型進行完成或聊天完成呼叫,則自訂模型的部署為「非使用中」。
刪除非使用中的部署不會刪除或影響基礎自訂模型,且自訂模型可以隨時進行重新部署。 如 Microsoft Foundry 模型中的 Azure OpenAI 定價中所述,每個部署的自訂 (微調) 模型都會產生每小時裝載成本,無論是否要對模型進行完成或聊天完成呼叫。 若要深入瞭解使用 Azure OpenAI 規劃和管理成本,請參閱 規劃管理 Azure OpenAI 成本中的指引。
你可以在 Foundry 入口的 部署 面板刪除自訂模型的部署。 選取要刪除的部署,然後選取 [刪除] 以刪除部署。
刪除您的自訂模型
你可以在 Foundry 入口網站的 模型 面板刪除自訂模型。 從 [自訂模型] 索引標籤中選取要刪除的自訂模型,然後選取 [刪除] 以刪除自訂模型。
備註
如果自訂模型具有現有部署,則無法刪除自訂模型。 您必須先刪除模型部署,才能刪除自訂模型。
刪除定型檔案
你可以選擇性地刪除你上傳的訓練與驗證檔案,以及訓練期間產生的結果檔案,這些檔案都在 Foundry 入口網站的 管理>資料 + 索引面板 中。 選取要刪除的檔案,然後選取 [刪除] 以刪除檔案。
先決條件
- 請閱讀 使用 Azure OpenAI 微調的時機指南 (機器翻譯)。
- Azure 訂用帳戶。 免費建立一個。
- Azure OpenAI 資源。 如需詳細資訊,請參閱使用 Azure OpenAI 建立資源及部署模型。
- 下列 Python 程式庫:
os、json、requests、openai。 - OpenAI Python 程式庫。
- 微調存取權限需要 Azure AI 使用者 角色。
- 如果您尚未擁有在 Microsoft Foundry 入口網站中查看配額及部署模型的權限,則需要 額外權限。
支援的模型
請參閱模型頁面 (機器翻譯),查看目前支援微調的區域。
或者,您可以對先前微調的模型再次進行微調,格式為 base-model.ft-{jobid}。
檢閱 Python SDK 的工作流程
請花一點時間檢閱搭配 Azure OpenAI 使用 Python SDK 的微調工作流程:
- 準備您的定型和驗證資料。
- 選取基底模型。
- 上傳定型資料。
- 定型新的自訂模型。
- 檢查自訂模型的狀態。
- 部署自訂模型以供使用。
- 使用自訂模型。
- (選擇性) 分析自訂模型以取得效能並加以調整。
準備您的定型和驗證資料
您的定型資料和驗證資料集包含您想要執行模型之方式的輸入和輸出範例。
您使用的訓練和驗證資料 必須 格式化為 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 定型檔案的單行中進行多回合交談亦受支援。 若要跳過對特定助理訊息的微調,請新增選擇性 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}]}
具有視覺的聊天完成
{"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 個訓練範例才能進行,但如此如此少量的範例不足以顯著影響模型回應。 如果無法提供數千個定型範例,起碼須提供數百個定型範例,才是順利完成作業的最佳做法。
一般而言,資料集大小加倍會導致模型品質呈線性增加。 但請記住,低品質範例則可能會對效能造成負面影響。 如果您透過大量內部資料定型模型,而未事先剪除資料集以留下最高品質的範例,則最終可能會得到一個效能比預期更差的模型。
上傳定型資料集
下一個步驟是選擇現有的備妥定型資料,或上傳自訂模型時要使用的新備妥定型資料。 備妥定型資料後,您可以將檔案上傳至服務。 上傳定型資料有兩種方式:
若為大型資料檔案,建議您從 Azure Blob 存放區匯入。 透過多部分表單上傳大型檔案時會變得不穩定,因為這些要求不可部分完成,而且無法重試或繼續。 如需 Azure Blob 儲存體的詳細資訊,請參閱什麼是 Azure Blob 儲存體?
備註
定型資料檔案必須格式化為 JSONL 檔案、以 UTF-8 編碼,並以位元組順序標記 (BOM)。 檔案大小必須小於 512 MB。
下列 Python 範例會使用 Python SDK 上傳本機定型和驗證檔案,並擷取傳回的檔案識別碼。
import os
from openai import OpenAI
# Load the OpenAI client
client = OpenAI(
api_key = os.getenv("AZURE_OPENAI_API_KEY"),
base_url="https://YOUR-RESOURCE-NAME.openai.azure.com/openai/v1/"
)
# Upload the training and validation dataset files to Microsoft Foundry with the SDK.
training_file_name = 'training_set.jsonl'
validation_file_name = 'validation_set.jsonl'
training_response = client.files.create(file=open(training_file_name, "rb"), purpose="fine-tune")
validation_response = client.files.create(file=open(validation_file_name, "rb"), purpose="fine-tune")
training_file_id = training_response.id
validation_file_id = validation_response.id
print("Training file ID:", training_file_id)
print("Validation file ID:", validation_file_id)
建立自訂模型
上傳定型和驗證檔案之後,您就可以開始微調作業。
下列 Python 程式碼示範如何使用 Python SDK 建立新的微調作業範例:
response = client.fine_tuning.jobs.create(
training_file=training_file_id,
validation_file=validation_file_id,
model="gpt-4.1-2025-04-14", # Enter base model name.
suffix="my-model", # Custom suffix for naming the resulting model. Note that in Microsoft Foundry the model cannot contain dot/period characters.
seed=105, # Seed parameter controls reproducibility of the fine-tuning job. If no seed is specified one will be generated automatically.
extra_body={ "trainingType": "GlobalStandard" } # Change this to your preferred training type. Other options are `Standard` and `Developer`.
)
job_id = response.id
# You can use the job ID to monitor the status of the fine-tuning job.
# The fine-tuning job will take some time to start and complete.
print("Job ID:", response.id)
print(response.model_dump_json(indent=2))
備註
我們建議使用全球標準層級(Global Standard tier)來進行培訓,因為它能 節省成本 並利用全球容量,加快排隊時間。 不過,它確實會複製當前資源區域外的資料和權重。 如果資料 駐留 是必要條件,請使用支援標準層級訓練的 模型 。
您也可以傳遞其他選擇性參數 (例如超參數),以進一步控制微調流程。 針對初始定型,建議您使用已存在的自動預設值,而非指定這些參數。
目前支援的監督式微調超參數如下:
| 名稱 | 型別 | 說明 |
|---|---|---|
batch_size |
整數 | 用於訓練的批次大小。 批次大小是用來訓練單一向前和向後傳遞的訓練範例數目。 一般而言,我們發現較大的批次大小通常較適合較大的資料集。 此屬性的預設值和最大值是基底模型所特有的。 批次大小越大,表示模型參數的更新頻率越低,而變異數越少。 |
learning_rate_multiplier |
number | 用於訓練的學習速率乘數。 微調學習速率是預先定型所用原始學習速率乘以此值。 學習速率越大,通常在越大的批次大小下擁有更佳效能。 建議您試驗 0.02 到 0.2 這個範圍內的值,看看哪些值會產生最佳結果。 較小的學習速率可能有助於避免過度學習。 |
n_epochs |
整數 | 訓練模型的週期數目。 Epoch 是指透過訓練資料集的一個完整週期。 |
seed |
整數 | 種子會控制作業的重現性。 傳入相同的種子和作業參數應該會產生相同的結果,但在罕見的情況下可能會有所不同。 如果未指定種子,將會為您產生一個種子。 |
若要使用 OpenAI Python API 的 1.x 版本設定自訂超參數,請將它們作為 method 的一部分提供。
client.fine_tuning.jobs.create(
training_file="file-abc123",
model="gpt-4.1-2025-04-14",
suffix="my-model",
seed=105,
method={
"type": "supervised", # In this case, the job will be using Supervised Fine Tuning.
"supervised": {
"hyperparameters": {
"n_epochs": 2
}
}
},
extra_body={ "trainingType": "GlobalStandard" }
)
訓練類型
根據您的使用案例和預算選取訓練層級。
標準:訓練發生在目前 Foundry 資源的區域中,提供資料駐留保證。 非常適合需要將資料保留在特定區域中的工作負載。
全球:透過利用目前區域以外的容量,提供比標準更實惠的價格。 資料和權重會被複製到進行訓練的區域中。 如果資料駐留不是限制,而且您想要更快的佇列時間,則這是理想的選擇。
開發人員 (預覽版):利用閒置容量進行訓練,以節省大量成本。 沒有延遲或 SLA 保證,因此此層中的工作可能會被自動中斷,並在稍後重新繼續。 資料的駐留位置也沒有任何保證。 非常適合進行實驗及用於對價格敏感的工作負載。
import openai
from openai import AzureOpenAI
base_uri = "https://<ACCOUNT-NAME>.services.ai.azure.com"
api_key = "<API-KEY>"
api_version = "2025-04-01-preview"
client = AzureOpenAI(
azure_endpoint=base_uri,
api_key=api_key,
api_version=api_version
)
try:
client.fine_tuning.jobs.create(
model="gpt-4.1-mini",
training_file="<FILE-ID>",
extra_body={"trainingType": "developerTier"}
)
except openai.APIConnectionError as e:
print("The server could not be reached")
print(e.__cause__) # an underlying Exception, likely raised within httpx.
except openai.RateLimitError as e:
print("A 429 status code was received; we should back off a bit.")
except openai.APIStatusError as e:
print("Another non-200-range status code was received")
print(e.status_code)
print(e.response)
print(e.body)
檢查微調作業狀態
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))
檢查站
當每個訓練時期完成時,就會產生檢查點。 檢查點是模型的完整功能版本,可以被部署且用作後續微調作業的目標模型。 檢查點特別有用,因為它們可能會在過度學習之前提供快照集。 微調作業完成時,您將有三個最新版本的模型可供部署。 最終 Epoch 將會以微調模型來表示,而前兩個 Epoch 將做為檢查點使用。
您可以執行清單檢查點命令,以擷取與個別微調作業相關聯的檢查點清單。 您可能需要使用 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 的結果檔案附加至其中。 您可以使用結果檔案來分析自訂模型的定型和驗證效能。 結果檔案的檔案識別碼會針對每個自訂模型列出,並且您可以使用 Python SDK 來擷取檔案識別碼和下載結果檔案進行分析。
下列 Python 範例會擷取附加至自定義模型微調作業之第一個結果檔的檔案識別符,然後使用 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 |
定型步驟的數目。 定型步驟代表對一批定型資料的單次向前和向後傳遞。 |
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 |
在每個 Epoch 結尾計算的驗證遺失。 訓練順利時,損失應該會減少。 |
full_valid_mean_token_accuracy |
在每個 Epoch 結尾計算的有效平均權杖正確性。 當訓練順利進行時,權杖正確性應該會增加。 |
你也可以在 Microsoft Foundry 入口網站中以圖表顯示 results.csv 檔案中的資料。 選取已定型模型的連結,您會看到三個圖表:遺失、平均權杖正確性和權杖正確性。 如果您已提供驗證資料,則兩個資料集都會出現在同一繪圖上。
隨著時間推移,您的損失會減少,而正確性會增加。 如果您發現定型資料和驗證資料之間存在差異,則可能表示您過度學習。 嘗試使用較少的 Epoch 或較小的學習速率乘數進行定型。
部署已優化的模型
一旦您滿意微調作業中的計量,或只想移至推斷,您必須部署模型。
如果您要部署以進行進一步驗證,請考慮使用開發人員部署進行 測試 。
有別於先前的 SDK 命令,您必須使用控制平面 API 來完成部署,而這需要個別的授權、不同的 API 路徑和不同的 API 版本。
| 變數 | 定義 |
|---|---|
| Token | 有多種方式可以產生授權令牌。 初始測試最簡單的方法是從 Azure 入口網站啟動Cloud Shell。 接著,執行 az account get-access-token。 您可以使用此權杖作為 API 測試的暫時授權權杖。 建議您將此儲存在新的環境變數中。 |
| 月租方案 | 相關聯 Azure OpenAI 資源的訂閱識別碼。 |
| 資源群組 | Azure OpenAI 資源的資源群組名稱。 |
| 資源名稱 | Azure OpenAI 資源名稱。 |
| 模型部署名稱 | 新微調模型部署的自訂名稱。 這是在程式碼中執行聊天完成功能調用時參考的名稱。 |
| fine_tuned_model | 從上一個步驟的微調作業結果中擷取此值。 其將會如 gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83 所示。 您必須將此值新增至 deploy_data json。 或者,您也可以透過傳遞檢查點識別碼 (格式為 ftchkpt-e559c011ecc04fc68eaa339d8227d02d) 來部署檢查點 |
import json
import os
import requests
token= os.getenv("<TOKEN>")
subscription = "<YOUR_SUBSCRIPTION_ID>"
resource_group = "<YOUR_RESOURCE_GROUP_NAME>"
resource_name = "<YOUR_AZURE_OPENAI_RESOURCE_NAME>"
model_deployment_name ="gpt-41-ft" # custom deployment name that you will use to reference the model when making inference calls.
deploy_params = {'api-version': "2024-10-01"} # control plane API version rather than dataplane API for this call
deploy_headers = {'Authorization': 'Bearer {}'.format(token), 'Content-Type': 'application/json'}
deploy_data = {
"sku": {"name": "standard", "capacity": 1},
"properties": {
"model": {
"format": "OpenAI",
"name": <"fine_tuned_model">, #retrieve this value from the previous call, it will look like gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83
"version": "1"
}
}
}
deploy_data = json.dumps(deploy_data)
request_url = f'https://management.azure.com/subscriptions/{subscription}/resourceGroups/{resource_group}/providers/Microsoft.CognitiveServices/accounts/{resource_name}/deployments/{model_deployment_name}'
print('Creating a new deployment...')
r = requests.put(request_url, params=deploy_params, headers=deploy_headers, data=deploy_data)
print(r)
print(r.reason)
print(r.json())
在這裡深入瞭解跨區域部署和使用已 部署的模型。
如果您已準備好要部署生產環境或具有特定數據落地需求,請遵循我們的 部署指南。
持續微調
建立微調模型之後,建議您透過進一步微調繼續精簡模型。 持續微調是選取已微調模型作為基底模型,並在新的定型範例集中進一步微調的反覆程序。
備註
持續微調僅支援 OpenAI 模型。
若要對先前微調的模型執行微調,您可以使用建立自訂模型中所述的相同流程,但請指定已微調模型的識別碼,而不是指定一般基底模型的名稱。 微調模型的識別碼看起來像 gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7
response = client.fine_tuning.jobs.create(
training_file=training_file_id,
validation_file=validation_file_id,
model="gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7"
)
job_id = response.id
# You can use the job ID to monitor the status of the fine-tuning job.
# The fine-tuning job will take some time to start and complete.
print("Job ID:", response.id)
print("Status:", response.id)
print(response.model_dump_json(indent=2))
我們也建議您加入 suffix 參數,以便更輕鬆區分微調模型的不同反覆項目。
suffix 會接受字串,並設定用於識別微調模型。 OpenAI Python API 支援最多 18 個字元的字串,該字串會新增至微調的模型名稱中。
如果您不確定現有微調模型的 ID,這些資訊可在 Microsoft Foundry 的 模型 頁面找到,或是使用 REST API 為特定 Azure OpenAI 資源產生 模型清單 。
清除部署、自訂模型和定型檔案
當您完成自訂模型時,可刪除部署和模型。 您也可以刪除上傳至服務的定型和驗證檔案 (如需要)。
刪除模型部署
這很重要
部署自訂模型之後,如果在任何時候該部署處於非使用中的狀態超過十五 (15) 天,則系統會刪除該部署。 如果模型部署的時間超過十五 (15) 天,而且在連續 15 天內沒有針對模型進行完成或聊天完成呼叫,則自訂模型的部署為「非使用中」。
刪除非使用中的部署不會刪除或影響基礎自訂模型,且自訂模型可以隨時進行重新部署。 如 Microsoft Foundry 模型中的 Azure OpenAI 定價中所述,每個部署的自訂 (微調) 模型都會產生每小時裝載成本,無論是否要對模型進行完成或聊天完成呼叫。 若要深入瞭解使用 Azure OpenAI 規劃和管理成本,請參閱 規劃管理 Azure OpenAI 成本中的指引。
您可以使用各種方法來刪除自訂模型的部署:
刪除自訂模型
同樣地,您可以使用各種方法來刪除自訂模型:
備註
如果自訂模型具有現有部署,則無法刪除自訂模型。 您必須先刪除模型部署,才能刪除自訂的模型。
刪除定型檔案
您可以選擇從 Azure OpenAI 訂閱中刪除為定型而上傳的定型和驗證檔案,以及在定型期間產生的結果檔案。 您可以使用下列方法來刪除定型、驗證和結果檔案:
- Microsoft Foundry
- 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)
先決條件
- 請閱讀 使用 Azure OpenAI 微調的時機指南 (機器翻譯)。
- Azure 訂用帳戶。 免費建立一個。
- Azure OpenAI 資源。 如需詳細資訊,請參閱使用 Azure OpenAI 建立資源及部署模型。
- 微調存取權限需要 Azure AI 使用者 角色。
- 如果你還沒有權限在 Microsoft Foundry 入口網站中查看配額或部署模型,則需要 額外權限。
支援的模型
請參閱模型頁面 (機器翻譯),查看目前支援微調的區域。
或者,您可以對先前微調的模型再次微調,其格式為 base-model.ft-{jobid}。
檢閱 REST API 的工作流程
請花一點時間檢閱搭配 Azure OpenAI 使用 REST API 和 Python 的微調工作流程:
- 準備您的定型和驗證資料。
- 選取基底模型。
- 上傳定型資料。
- 定型新的自訂模型。
- 檢查自訂模型的狀態。
- 部署自訂模型以供使用。
- 使用自訂模型。
- (選擇性) 分析自訂模型以取得效能並加以調整。
準備您的定型和驗證資料
您的定型資料和驗證資料集包含您想要執行模型之方式的輸入和輸出範例。
您使用的訓練和驗證資料 必須 格式化為 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 定型檔案的單行中進行多回合交談亦受支援。 若要跳過對特定助理訊息的微調,請新增選擇性 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}]}
具有視覺的聊天完成
{"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 個訓練範例才能進行,但如此如此少量的範例不足以顯著影響模型回應。 如果無法提供數千個定型範例,起碼須提供數百個定型範例,才是順利完成作業的最佳做法。
一般而言,資料集大小加倍會導致模型品質呈線性增加。 但請記住,低品質範例則可能會對效能造成負面影響。 如果您透過大量內部資料定型模型,而未事先剪除資料集以留下最高品質的範例,則最終可能會得到一個效能比預期更差的模型。
上傳定型資料集
下一個步驟是選擇現有的備妥定型資料,或上傳微調模型時要使用的新備妥定型資料。 備妥定型資料後,您可以將檔案上傳至服務。 上傳定型資料有兩種方式:
若為大型資料檔案,建議您從 Azure Blob 存放區匯入。 透過多部分表單上傳大型檔案時會變得不穩定,因為這些要求不可部分完成,而且無法重試或繼續。 如需 Azure Blob 儲存體的詳細資訊,請參閱什麼是 Azure Blob 儲存體?
備註
定型資料檔案必須格式化為 JSONL 檔案、以 UTF-8 編碼,並以位元組順序標記 (BOM)。 檔案大小必須小於 512 MB。
上傳定型資料
curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/files \
-H "Content-Type: multipart/form-data" \
-H "api-key: $AZURE_OPENAI_API_KEY" \
-F "purpose=fine-tune" \
-F "file=@C:\\fine-tuning\\training_set.jsonl;type=application/json"
上傳驗證資料
curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/files \
-H "Content-Type: multipart/form-data" \
-H "api-key: $AZURE_OPENAI_API_KEY" \
-F "purpose=fine-tune" \
-F "file=@C:\\fine-tuning\\validation_set.jsonl;type=application/json"
建立自訂模型
上傳定型和驗證檔案之後,您就可以開始微調作業。 下列程式碼示範如何使用 REST API 建立新微調作業 (部分機器翻譯) 的範例。
在此範例中,我們也會傳遞種子參數。 種子會控制作業的重現性。 傳入相同的種子和作業參數應該會產生相同的結果,但在罕見的情況下,可能會有所不同。 如果未指定種子,將會為您產生一個種子。
curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs \
-H "Content-Type: application/json" \
-H "api-key: $AZURE_OPENAI_API_KEY" \
-d '{
"model": "gpt-4.1-2025-04-14",
"training_file": "<TRAINING_FILE_ID>",
"validation_file": "<VALIDATION_FILE_ID>",
"seed": 105
}'
如果您要微調支援全域訓練的模型,您可以使用extra_body具名引數來指定訓練類型,並使用 api-version 2025-04-01-preview。
curl -X POST $AZURE_OPENAI_ENDPOINT/openai/fine_tuning/jobs?api-version=2025-04-01-preview \
-H "Content-Type: application/json" \
-H "api-key: $AZURE_OPENAI_API_KEY" \
-d '{
"model": "gpt-4.1-2025-04-14",
"training_file": "<TRAINING_FILE_ID>",
"validation_file": "<VALIDATION_FILE_ID>",
"seed": 105,
"trainingType": "globalstandard"
}'
您也可以傳遞其他選擇性參數 (例如超參數),以進一步控制微調流程。 針對初始定型,建議您使用已存在的自動預設值,而非指定這些參數。
目前支援的監督式微調超參數如下:
| 名稱 | 型別 | 說明 |
|---|---|---|
batch_size |
整數 | 用於訓練的批次大小。 批次大小是用來訓練單一向前和向後傳遞的訓練範例數目。 一般而言,我們發現較大的批次大小通常較適合較大的資料集。 此屬性的預設值和最大值是基底模型所特有的。 批次大小越大,表示模型參數的更新頻率越低,而變異數越少。 |
learning_rate_multiplier |
number | 用於訓練的學習速率乘數。 微調學習速率是預先定型所用原始學習速率乘以此值。 學習速率越大,通常在越大的批次大小下擁有更佳效能。 建議您試驗 0.02 到 0.2 這個範圍內的值,看看哪些值會產生最佳結果。 較小的學習速率可能有助於避免過度學習。 |
n_epochs |
整數 | 訓練模型的週期數目。 Epoch 是指透過訓練資料集的一個完整週期。 |
seed |
整數 | 種子會控制作業的重現性。 傳入相同的種子和作業參數應該會產生相同的結果,但在罕見的情況下可能會有所不同。 如果未指定種子,將會為您產生一個種子。 |
訓練類型
根據您的使用案例和預算選取訓練層級。
標準:訓練發生在目前 Foundry 資源的區域中,提供資料駐留保證。 非常適合需要將資料保留在特定區域中的工作負載。
全球:透過利用目前區域以外的容量,提供比標準更實惠的價格。 資料和權重會被複製到進行訓練的區域中。 如果資料駐留不是限制,而且您想要更快的佇列時間,則這是理想的選擇。
開發者 (預覽版):透過運用閒置產能進行訓練,可大幅節省成本。 沒有延遲或 SLA 保證,因此此層中的工作可能會被自動中斷,並在稍後重新繼續。 資料的駐留位置也沒有任何保證。 非常適合進行實驗及用於對價格敏感的工作負載。
curl -X POST "https://<ACCOUNT-NAME>.openai.azure.com/openai/fine_tuning/jobs?api-version=2025-04-01-preview" -H "Content-Type: application/json" -H "api-key: <API-KEY>" -d "{"model": "gpt-4.1", "training_file": "<FILE_ID>", "hyperparameters": {"prompt_loss_weight": 0.1}, "trainingType": "developerTier"}"
檢查自訂模型的狀態
啟動微調作業之後,可能需要一些時間才能完成。 您的作業可能會排入系統中其他作業後方的佇列。 視模型和資料集大小而定,定型模型可能需要幾分鐘或幾小時的時間。 下列範例會使用 REST API 來檢查微調作業的狀態。 此範例會使用上一個範例傳回的作業識別碼,擷取作業的相關資訊:
curl -X GET $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/<YOUR-JOB-ID> \
-H "api-key: $AZURE_OPENAI_API_KEY"
暫停與繼續
在訓練期間,您可以檢視記錄和計量,並視需要暫停作業。 如果計量未聚合,或您覺得模型不是以正確的步調學習,暫停可能會很有用。 一旦訓練作業暫停,完成安全評估後,就會建立可部署的檢查點。 此檢查點可供您部署並用於推論,或繼續作業直至完成。 暫停作業僅適用於已定型至少一個步驟且處於 執行 中狀態的作業。
暫停
curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/pause \
-H "Content-Type: application/json" \
-H "api-key: $AZURE_OPENAI_API_KEY"
履歷
curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/resume \
-H "Content-Type: application/json" \
-H "api-key: $AZURE_OPENAI_API_KEY"
列出微調事件
若要檢查訓練期間產生的個別微調事件:
curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/events \
-H "Content-Type: application/json" \
-H "api-key: $AZURE_OPENAI_API_KEY"
複製模型 (預覽)
現在,您可以跨不同訂用帳戶 (但在同一租用戶內) 將已微調的檢查點模型從一個區域複製到另一個區域。 該流程會使用專用的 API 來確保有效率且安全的傳輸。 此功能目前僅透過 API 提供,無法透過 Foundry 入口網站使用。 將模型從區域 A 複製到區域 B 後,您可以繼續在區域 B 中微調模型,並從此位置部署模型。
備註
刪除來源區域中的模型檢查點不會導致模型在目的地區域中被刪除。 複製模型後,若要刪除兩個區域中的該模型,則必須分別在每個區域中刪除該模型。
必要條件
- 目的地資源/帳戶至少應該要有一個微調工作。
- 目的地資源/帳戶不應停用公用網路存取。 (至少在傳送複製要求時)。
- 只有當起始複製的帳戶具有足夠的權限來存取目的地帳戶時,您才能複製到目的地帳戶。
權限設定
- 建立使用者指派的受控識別。
- 提供 Azure AI 使用者角色給您目標資源/帳戶上由使用者指派的受控身分識別。
- 將使用者指派的受控識別指派給您的來源資源帳戶。
複製模型
curl --request POST \
--url 'https://<aoai-resource>.openai.azure.com/openai/v1/fine_tuning/jobs/<ftjob>/checkpoints/<checkpoint-name>/copy' \
--header 'Content-Type: application/json' \
--header 'api-key: <api-key>' \
--header 'aoai-copy-ft-checkpoints: preview' \
--data '{
"destinationResourceId": "<resourceId>",
"region": "<region>"
}'
由於這是長時間執行的作業,因此請透過提供 POST 呼叫中使用的來源帳戶的檢查點 ID 來檢查微調模型複本的狀態。
檢查複製狀態
curl --request GET \
--url 'https://<aoai-resource>.openai.azure.com//openai/v1/fine_tuning/jobs/<ftjob>/checkpoints/<checkpoint-name>/copy' \
--header 'Content-Type: application/json' \
--header 'api-key: <api-key>' \
--header 'aoai-copy-ft-checkpoints: preview'
備註
當您從來源帳戶複製檢查點時,目的地帳戶中會保留相同的檢查點名稱。 請確保您在微調、部署或目的地帳戶中的其他操作時使用完全相同的名稱。 此檢查點不會出現在 UI 或 API 中 list checkpoints 。
檢查站
當每個訓練時期完成時,就會產生檢查點。 檢查點是模型的完整功能版本,可以被部署且用作後續微調作業的目標模型。 檢查點特別有用,因為它們可能會在過度學習之前提供快照集。 微調作業完成時,您將有三個最新版本的模型可供部署。 最終 Epoch 將會以微調模型來表示,而前兩個 Epoch 將做為檢查點使用。
您可以執行清單檢查點命令來擷取與個別微調作業相關聯的檢查點清單:
curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/{fine_tuning_job_id}/checkpoints \
-H "Content-Type: application/json" \
-H "api-key: $AZURE_OPENAI_API_KEY"
分析自訂模型
每個微調作業完成後,Azure OpenAI 都會將名為 results.csv 的結果檔案附加至其中。 您可以使用結果檔案來分析自訂模型的定型和驗證效能。 結果檔案的檔案識別碼會針對每個自訂模型列出,並且您可以使用 REST API 來擷取檔案識別碼和下載結果檔案進行分析。
下列 Python 範例會使用 REST API 擷取附加至自訂模型微調作業中第一個結果檔案的檔案識別碼,然後將檔案下載至工作目錄進行分析。
curl -X GET "$AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs/<JOB_ID>" \
-H "api-key: $AZURE_OPENAI_API_KEY")
curl -X GET "$AZURE_OPENAI_ENDPOINT/openai/v1/files/<RESULT_FILE_ID>/content" \
-H "api-key: $AZURE_OPENAI_API_KEY" > <RESULT_FILENAME>
結果檔案為 CSV 檔案,其中包含標頭資料列,以及微調作業所執行每個定型步驟的資料列。 該結果檔案包含下列資料行:
| 欄位名稱 | 說明 |
|---|---|
step |
定型步驟的數目。 定型步驟代表對一批定型資料的單次向前和向後傳遞。 |
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 |
在每個 Epoch 結尾計算的驗證遺失。 訓練順利時,損失應該會減少。 |
full_valid_mean_token_accuracy |
在每個 Epoch 結尾計算的有效平均權杖正確性。 當訓練順利進行時,權杖正確性應該會增加。 |
你也可以在 Foundry 入口網站中以圖塊形式查看 results.csv 檔案中的資料。 選取已定型模型的連結,您會看到三個圖表:遺失、平均權杖正確性和權杖正確性。 如果您已提供驗證資料,則兩個資料集都會出現在同一繪圖上。
隨著時間推移,您的損失會減少,而正確性會增加。 如果您發現定型資料和驗證資料之間存在差異,則可能表示您過度學習。 嘗試使用較少的 Epoch 或較小的學習速率乘數進行定型。
部署已優化的模型
一旦您滿意微調作業中的計量,或只想移至推斷,您必須部署模型。
如果您要部署以進行進一步驗證,請考慮使用開發人員部署進行 測試 。
如果您已準備好要部署生產環境或具有特定數據落地需求,請遵循我們的 部署指南。
| 變數 | 定義 |
|---|---|
| Token | 有多種方式可以產生授權令牌。 初始測試最簡單的方法是從 Azure 入口網站啟動Cloud Shell。 接著,執行 az account get-access-token。 您可以使用此權杖作為 API 測試的暫時授權權杖。 建議您將此儲存在新的環境變數中。 |
| 月租方案 | 相關聯 Azure OpenAI 資源的訂閱識別碼。 |
| 資源群組 | Azure OpenAI 資源的資源群組名稱。 |
| 資源名稱 | Azure OpenAI 資源名稱。 |
| 模型部署名稱 | 新微調模型部署的自訂名稱。 這是在程式碼中執行聊天完成功能調用時參考的名稱。 |
| fine_tuned_model | 從上一個步驟的微調作業結果中擷取此值。 其將會如 gpt-4.1-2025-04-14.ft-b044a9d3cf9c4228b5d393567f693b83 所示。 您必須將此值新增至 deploy_data json。 或者,您也可以透過傳遞檢查點識別碼 (格式為 ftchkpt-e559c011ecc04fc68eaa339d8227d02d) 來部署檢查點 |
curl -X POST "https://management.azure.com/subscriptions/<SUBSCRIPTION>/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.CognitiveServices/accounts/<RESOURCE_NAME>/deployments/<MODEL_DEPLOYMENT_NAME>?api-version=2024-10-21" \
-H "Authorization: Bearer <TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"sku": {"name": "standard", "capacity": 1},
"properties": {
"model": {
"format": "OpenAI",
"name": "<FINE_TUNED_MODEL>",
"version": "1"
}
}
}'
在這裡深入瞭解跨區域部署和使用已 部署的模型。
持續微調
建立微調模型之後,建議您透過進一步微調繼續精簡模型。 持續微調是選取已微調模型作為基底模型,並在新的定型範例集中進一步微調的反覆程序。
備註
持續微調僅支援 OpenAI 模型。
若要對先前微調的模型執行微調,您可以使用建立自訂模型中所述的相同流程,但請指定已微調模型的識別碼,而不是指定一般基底模型的名稱。 微調模型的識別碼看起來像 gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7
curl -X POST $AZURE_OPENAI_ENDPOINT/openai/v1/fine_tuning/jobs \
-H "Content-Type: application/json" \
-H "api-key: $AZURE_OPENAI_API_KEY" \
-d '{
"model": "gpt-4.1-2025-04-14.ft-5fd1918ee65d4cd38a5dcf6835066ed7",
"training_file": "<TRAINING_FILE_ID>",
"validation_file": "<VALIDATION_FILE_ID>",
"suffix": "<additional text used to help identify fine-tuned models>"
}'
我們也建議您加入 suffix 參數,以便更輕鬆區分微調模型的不同反覆項目。
suffix 會接受字串,並設定用於識別微調模型。 尾碼最多可包含 40 個字元 (a-z、A-Z、0-9 和 _),這些字元會新增至微調模型名稱中。
如果你不確定微調模型的 ID,這些資訊可以在 Foundry 的 模型 頁面找到,或者你也可以使用 REST API 為特定 Azure OpenAI 資源產生 模型清單 。
清除部署、自訂模型和定型檔案
當您完成自訂模型時,可刪除部署和模型。 您也可以刪除上傳至服務的定型和驗證檔案 (如需要)。
刪除模型部署
您可以使用各種方法來刪除自訂模型的部署:
刪除自訂模型
同樣地,您可以使用各種方法來刪除自訂模型:
備註
如果自訂模型具有現有部署,則無法刪除自訂模型。 您必須先刪除模型部署,才能刪除自訂的模型。
刪除定型檔案
您可以選擇從 Azure OpenAI 訂閱中刪除為定型而上傳的定型和驗證檔案,以及在定型期間產生的結果檔案。 您可以使用下列方法來刪除定型、驗證和結果檔案: