使用微調自訂模型
Azure OpenAI 服務可讓您使用名為「微調」的程序,為個人資料集量身打造模型。 藉由提供下列內容,此自訂步驟可讓您來獲得更多服務:
- 相較於直接從提示工程獲得的結果,可將品質提升至更高層次
- 能夠針對超出模型最大要求內容限制的範例進行定型。
- 由於提示較短而節省權杖
- 低延遲要求,尤其是使用較小模型時。
相較於小樣本學習,微調會針對遠超出提示容納量的範例進行定型來改善模型,讓您在大量工作中取得更好的結果。 由於微調會調整基底模型的權數,以提升特定工作的效能,因此您不必在提示中盡可能包含更多範例或說明。 這表示每次 API 呼叫時傳送的文字和處理的權杖更少,從而可能節省成本並改善要求延遲。
我們會使用 LoRA (即低秩近似) 微調模型,以降低其複雜性而不會大幅影響效能。 這個方法的運作方式是將原始高排名矩陣與較低的排名一近似,因此只會微調受監督定型階段中較小的重要參數子集,讓模型更容易管理且更有效率。 對於使用者來說,這可讓定型比其他技術更快且價格更合理。
Azure AI Foundry 入口網站中有兩種獨特的微調體驗:
- 中樞/項目檢視 - 支援從多個提供者微調模型,包括 Azure OpenAI、Meta Llama、Microsoft Phi 等。
- Azure OpenAI 中心檢視 - 僅支援微調 Azure OpenAI 模型,但支援其他功能,例如 權數和偏差 (W&B) 預覽整合。
如果您只是微調 Azure OpenAI 模型,建議您流覽至 https://oai.azure.com,以 Azure OpenAI 為中心的微調體驗。
必要條件
- 請閱讀 使用 Azure OpenAI 微調的時機指南 (機器翻譯)。
- Azure 訂用帳戶。 免費建立一個。
- 位於支援 Azure OpenAI 模型微調的區域中的 Azure OpenAI 資源。 如需按區域和支援功能劃分的可用型號清單,請查看模型摘要資料表和區域可用性 (機器翻譯)。 如需詳細資訊,請參閱使用 Azure OpenAI 建立資源及部署模型。
- 微調存取需要認知服務 OpenAI 參與者。
- 如果您還沒有存取權可檢視配額,並在 Azure AI Foundry 入口網站中部署模型,則需要 額外的許可權。
模型
下列模型支援微調:
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 Foundry 的工作流程
花點時間檢閱使用 Azure AI Foundry 的微調工作流程:
- 準備您的定型和驗證資料。
- 使用 Azure AI Foundry 入口網站中的 [ 建立自定義模型精 靈] 來定型您的自定義模型。
- 選取基底模型。
- 選擇定型資料。
- (選擇性) 選擇您的驗證資料。
- 或者, 為微調作業設定工作參數 。
- 檢閱您的選擇,並定型新的自訂模型。
- 檢查自訂微調模型的狀態。
- 部署自訂模型以供使用。
- 使用您的自訂模型。
- (選擇性) 分析自訂模型以取得效能並加以調整。
準備您的定型和驗證資料
您的定型資料和驗證資料集包含您想要執行模型之方式的輸入和輸出範例。
不同的模型類型需要不同格式的定型資料。
您使用的定型和驗證資料必須格式化為 JSON Lines (JSONL) 文件。 針對 gpt-35-turbo
(所有版本)、gpt-4
、gpt-4o
和 gpt-4o-mini
,微調資料集必須採用聊天完成 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?"}]}
多回合聊天檔格式 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個定型範例,但如此少量不足以明顯影響模型回應。 如果無法提供數千個定型範例,起碼須提供數百個定型範例,才是順利完成作業的最佳做法。
一般而言,資料集大小加倍會導致模型品質呈線性增加。 但請記住,低品質範例則可能會對效能造成負面影響。 如果您透過大量內部資料定型模型,而未事先剪除資料集以留下最高品質的範例,則最終可能會得到一個效能比預期更差的模型。
使用 [建立自訂模型] 精靈
Azure AI Foundry 提供建立 自定義模型 精靈,讓您可以互動方式建立和定型 Azure 資源的微調模型。
開啟 Azure AI Foundry, https://oai.azure.com/ 並使用可存取 Azure OpenAI 資源的認證登入。 在登入工作流程期間,選取適當的目錄、Azure 訂用帳戶和 Azure OpenAI 資源。
在 Azure AI Foundry 入口網站中,流覽至 [工具微調] 窗格,然後選取 [微調模型>]。
[建立自訂模型] 精靈隨即開啟。
選取基底模型
建立自訂模型的第一個步驟為選擇基底模型。 [基底模型] 窗格可讓您選擇要用於自訂模型的基底模型。 您的選擇會影響模型的效能和成本。
從 [基底模型類型] 下拉式清單中選取基底模型,然後選取 [下一步] 以繼續。
您可以從下列其中一個可用的基底模型建立自訂模型:
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 連線選取 [檔案]。
- 從顯示的下拉式清單中選取檔案。
若要上傳新的定型資料,請使用下列其中一個選項:
選取 [本機檔案],從本機檔案上傳定型資料。
選取 [Azure Blob 或其他共用 Web 位置],從 Azure Blob 或其他共用 Web 位置匯入定型資料。
若為大型資料檔案,建議您從 Azure Blob 存放區匯入。 透過多部分表單上傳大型檔案時會變得不穩定,因為這些要求不可部分完成,而且無法重試或繼續。 如需 Azure Blob 儲存體的詳細資訊,請參閱什麼是 Azure Blob 儲存體?
注意
定型資料檔案必須格式化為 JSONL 檔案、以 UTF-8 編碼,並以位元組順序標記 (BOM)。 檔案大小必須小於 512 MB。
從本機檔案上傳定型資料
您可以使用下列其中一種方法,將新的定型資料集從本機檔案上傳至服務:
將檔案拖放至 [定型資料] 窗格的工作區,然後選取 [上傳檔案]。
從 [定型資料] 窗格的工作區選取 [瀏覽檔案],從 [開啟] 對話方塊選擇要上傳的檔案,然後選取 [上傳檔案]。
選取並上傳定型資料集之後,請選取 [下一步] 以繼續。
從 Azure Blob 存放區匯入定型資料
您可以藉由提供檔案的名稱和位置,從 Azure Blob 或其他共用 Web 位置匯入定型資料集。
針對檔案輸入 [檔案名稱]。
針對 [檔案位置],請提供 Azure Blob URL、Azure 儲存體共用存取簽章 (SAS) 或其他可存取共用 Web 位置的連結。
選取 [ 匯 入] 將定型數據集匯入服務。
選取並上傳定型資料集之後,請選取 [下一步] 以繼續。
選擇您的驗證資料
下一步提供設定模型以在定型流程中使用驗證資料的選項。 如果您不想要使用驗證資料,可以選擇 [下一步] 前往模型的進階選項。 否則,如果您具有驗證資料集,您可以選擇現有的備妥驗證資料,或上傳自訂模型時要使用的新備妥驗證資料。
[驗證資料] 窗格會顯示任何現有、先前上傳的定型和驗證資料集,並提供您可以上傳新驗證資料的選項。
如果您的驗證資料已上傳至服務,請選取 [選擇資料集]。
- 從 [驗證資料] 窗格所顯示的清單中選取檔案。
若要上傳新的驗證資料,請使用下列其中一個選項:
選取 [本機檔案],從本機檔案上傳驗證資料。
選取 [Azure Blob 或其他共用 Web 位置],從 Azure Blob 或其他共用 Web 位置匯入驗證資料。
若為大型資料檔案,建議您從 Azure Blob 存放區匯入。 透過多部分表單上傳大型檔案時會變得不穩定,因為這些要求不可部分完成,而且無法重試或繼續。
注意
類似於定型資料檔案,驗證資料檔案必須格式化為 JSONL 檔案、以 UTF-8 編碼,並以位元組順序標記 (BOM)。 檔案大小必須小於 512 MB。
從本機檔案上傳驗證資料
您可以使用下列其中一種方法,將新的驗證資料集從本機檔案上傳至服務:
將檔案拖放至 [驗證資料] 窗格的工作區,然後選取 [上傳檔案]。
從 [驗證資料] 窗格的工作區選取 [瀏覽檔案],從 [開啟] 對話方塊選擇要上傳的檔案,然後選取 [上傳檔案]。
選取並上傳驗證資料集之後,請選取 [下一步] 以繼續。
從 Azure Blob 存放區匯入驗證資料
您可以藉由提供檔案的名稱和位置,從 Azure Blob 或其他共用 Web 位置匯入驗證資料集。
針對檔案輸入 [檔案名稱]。
針對 [檔案位置],請提供 Azure Blob URL、Azure 儲存體共用存取簽章 (SAS) 或其他可存取共用 Web 位置的連結。
選取 [ 匯 入] 將定型數據集匯入服務。
選取並上傳驗證資料集之後,請選取 [下一步] 以繼續。
設定工作參數
[ 建立自定義模型精靈 ] 會顯示在 [工作參數] 窗格上 定型微調模型的參數 。 可用的參數如下:
名稱 | 類型 | 說明 |
---|---|---|
batch_size |
整數 | 用於定型的批次大小。 批次大小是用來訓練單一向前和向後傳遞的訓練範例數目。 一般而言,我們發現較大的批次大小通常較適合較大的資料集。 此屬性的預設值和最大值是基底模型所特有的。 批次大小越大,表示模型參數的更新頻率越低,而變異數越少。 |
learning_rate_multiplier |
數值 | 用於定型的學習速率乘數。 微調學習速率是預先定型所用原始學習速率乘以此值。 學習速率越大,通常在越大的批次大小下擁有更佳效能。 建議您試驗 0.02 到 0.2 這個範圍內的值,看看哪些值會產生最佳結果。 較小的學習速率可能有助於避免過度學習。 |
n_epochs |
整數 | 定型模型的 Epoch 數目。 Epoch 是指透過定型資料集的完整循環。 |
seed |
整數 | 種子會控制作業的重現性。 傳入相同的種子和作業參數應該會產生相同的結果,但在罕見的情況下可能會有所不同。 如果未指定種子,則系統會為您產生一個種子 |
Beta |
整數 | dpo 遺失的溫度參數,通常介於 0.1 到 0.5 的範圍內。 這會控制我們對參考模型的關注程度。 Beta 越小,我們就越允許模型偏離參考模型。 當 beta 愈小時,我們會忽略參考模型。 |
選取 [預設值 ] 以使用微調作業的預設值,或選取 [ 自定義 ] 以顯示和編輯超參數值。 選取預設值時,我們會根據您的定型資料透過演算法判斷正確的值。
設定進階選項之後,請選取 [下一步] 以檢閱您的選擇,並定型微調模型。
檢閱選擇並定型模型
精靈的 [檢閱] 窗格會顯示設定選項的相關資訊。
如果您準備好定型模型,請選取 [開始定型作業] 以啟動微調作業並返回 [模型] 窗格。
檢查自訂模型的狀態
[模型] 窗格會在 [自訂模型] 索引標籤中顯示自訂模型的相關資訊。索引標籤包含自訂模型微調作業的狀態和作業識別碼的相關資訊。 作業完成時,索引標籤會顯示結果檔案的檔案識別碼。 請選取 [重新整理],以查看模型定型作業的更新狀態。
啟動微調作業之後,可能需要一些時間才能完成。 您的作業可能會排入系統中其他作業後方的佇列。 視模型和資料集大小而定,定型模型可能需要幾分鐘或幾小時的時間。
以下是您可以在 [模型] 窗格中執行的工作:
在 [自訂模型] 索引標籤的 [狀態] 資料行中,檢查自訂模型的微調作業狀態。
在 [模型名稱] 資料行中,選取模型名稱以檢視自訂模型的詳細資訊。 您可以查看微調作業的狀態、定型結果、定型事件和作業中使用的超參數。
選取 [下載定型檔案],以下載模型所使用的定型資料。
選取 [下載結果],以下載附加至模型微調作業的結果檔案,並分析自訂模型的定型和驗證效能。
選取 [重新整理] 以更新頁面上的資訊。
檢查點
當每個定型 Epoch 完成時,就會產生檢查點。 檢查點是模型的完整功能版本,可以部署為並用作後續微調作業的目標模型。 檢查點特別有用,因為其可以在過度學習發生之前提供模型的快照集。 微調作業完成時,您將有三個最新版本的模型可供部署。
GPT-4、GPT-4o 和 GPT-4o-mini 微調的安全評估 - 公開預覽
GPT-4o、GPT-4o-mini 和 GPT-4 是我們最進階的模型,可根據您的需求進行微調。 與 Azure OpenAI 模型的一般情況相同,微調模型的進階功能也帶來了與有害內容、操縱、類似人為行為、隱私權問題等相關的負責任 AI 挑戰。 深入了解負責任 AI 做法概觀 (英文) 和透明度資訊 (英文) 中有關的風險、功能和限制。 為有效降低進階微調模型的相關風險,我們實作了額外的評估步驟,以利偵測和防止微調模型定型和輸出中的有害內容。 這些步驟基於 Microsoft 負責任 AI 標準和 Azure OpenAI 服務內容篩選。
- 評估是在專用、客戶專屬、私人工作區中進行;
- 評估端點位於與 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 服務定價中所述,每個部署的自訂 (微調) 模型都會產生每小時裝載成本,無論是否要對模型進行完成或聊天完成呼叫。 若要深入了解使用 Azure OpenAI 規劃和管理成本,請參閱規劃管理 Azure OpenAI 服務的成本 (機器翻譯) 中的指引。
注意
自訂模型僅允許一個部署。 如果您選取已部署的自訂模型,則會顯示錯誤訊息。
若要部署自訂模型,請選取要部署的自訂模型,然後選取 [部署模型]。
[部署模型] 對話方塊隨即開啟。 在對話方塊中,輸入 [部署名稱],然後選取 [建立] 以開始部署自訂模型。
您可以在 Azure AI Foundry 入口網站的 [部署] 窗格上監視部署進度。
跨區域部署
微調支援將微調的模型部署至與最初微調模型時的不同區域。 您也可以部署至不同的訂閱/區域。
唯一的限制在於新區域也必須支援微調,且在跨訂閱部署時,產生部署授權權杖的帳戶必須同時具有來源和目的地訂閱的存取權。
跨訂閱/區域部署可以透過 Python 或 REST 完成。
使用已部署的自訂模型
部署自訂模型後,您就能如同使用其他部署模型般使用該模型。 您可以使用 Azure AI Foundry 中的遊樂場來實驗您的新部署。 您可以繼續對自訂模型使用相同的參數,例如 temperature
和 max_tokens
,如同對其他部署模型一樣。 針對微調的 babbage-002
和 davinci-002
模型,您會使用 [完成遊樂場] 和 [完成 API]。 針對微調的 gpt-35-turbo-0613
模型,您會使用 [聊天遊樂場] 和 [聊天完成 API]。
分析您的自訂模型
每個微調作業完成後,Azure OpenAI 都會將名為 results.csv 的結果檔案附加至其中。 您可以使用結果檔案來分析自訂模型的定型和驗證效能。 結果檔的檔案識別碼會針對 Azure AI Foundry 的 [模型] 窗格上的 [結果檔識別符] 資料行中的每個自定義模型列出。 您可以使用檔案識別碼,從 Azure AI 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 結尾計算的有效平均權杖正確性。 當訓練順利進行時,權杖正確性應該會增加。 |
您也可以在 Azure AI Foundry 入口網站中,將results.csv檔案中的數據檢視為繪圖。 選取已定型模型的連結,您會看到三個圖表:遺失、平均權杖正確性和權杖正確性。 如果您已提供驗證資料,則兩個資料集都會出現在同一繪圖上。
隨著時間推移,您的損失會減少,而正確性會增加。 如果您發現定型資料和驗證資料之間存在差異,則可能表示您過度學習。 嘗試使用較少的 Epoch 或較小的學習速率乘數進行定型。
清除部署、自訂模型和定型檔案
當您完成自訂模型時,可刪除部署和模型。 您也可以刪除上傳至服務的定型和驗證檔案 (如需要)。
刪除模型部署
重要
部署自訂模型之後,如果在任何時候該部署處於非使用中的狀態超過十五 (15) 天,則系統會刪除該部署。 如果模型部署的時間超過十五 (15) 天,而且在連續 15 天內沒有針對模型進行完成或聊天完成呼叫,則自訂模型的部署為「非使用中」。
刪除非使用中的部署不會刪除或影響基礎自訂模型,且自訂模型可以隨時進行重新部署。 如 Azure OpenAI 服務定價中所述,每個部署的自訂 (微調) 模型都會產生每小時裝載成本,無論是否要對模型進行完成或聊天完成呼叫。 若要深入了解使用 Azure OpenAI 規劃和管理成本,請參閱規劃管理 Azure OpenAI 服務的成本 (機器翻譯) 中的指引。
您可以在 Azure AI Foundry 入口網站的 [部署] 窗格上,刪除自定義模型的部署。 選取要刪除的部署,然後選取 [刪除] 以刪除部署。
刪除您的自訂模型
您可以在 Azure AI Foundry 入口網站的 [模型] 窗格中刪除自定義模型。 從 [自訂模型] 索引標籤中選取要刪除的自訂模型,然後選取 [刪除] 以刪除自訂模型。
注意
如果自訂模型具有現有部署,則無法刪除自訂模型。 您必須先刪除模型部署,才能刪除自訂模型。
刪除定型檔案
您可以選擇性地刪除您在 Azure AI Foundry 入口網站的 [管理>數據檔] 窗格上上傳的定型和驗證檔案,以及定型期間產生的結果檔案。 選取要刪除的檔案,然後選取 [刪除] 以刪除檔案。
持續微調
建立微調模型之後,建議您透過進一步微調繼續精簡模型。 持續微調是選取已微調模型作為基底模型,並在新的定型範例集中進一步微調的反覆程序。
若要對先前微調的模型執行微調,您可以使用建立自訂模型中所述的相同流程,但請指定已微調的模型,而不是指定一般基底模型的名稱。 自訂微調模型看起來會像 gpt-35-turbo-0613.ft-5fd1918ee65d4cd38a5dcf6835066ed7
我們也建議您加入 suffix
參數,以便更輕鬆區分微調模型的不同反覆項目。 suffix
會接受字串,並設定用於識別微調模型。 OpenAI Python API 支援最多 18 個字元的字串,該字串會新增至微調的模型名稱中。
必要條件
- 請閱讀 使用 Azure OpenAI 微調的時機指南 (機器翻譯)。
- Azure 訂用帳戶。 免費建立一個。
- Azure OpenAI 資源。 如需詳細資訊,請參閱使用 Azure OpenAI 建立資源及部署模型。
- 下列 Python 程式庫:
os
、json
、requests
、openai
。 - OpenAI Python 程式庫至少應為 0.28.1 版。
- 微調存取需要認知服務 OpenAI 參與者。
- 如果您還沒有存取權可檢視配額,並在 Azure AI Foundry 入口網站中部署模型,則需要 額外的許可權。
模型
下列模型支援微調:
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 的工作流程
請花一點時間檢閱搭配 Azure OpenAI 使用 Python SDK 的微調工作流程:
- 準備您的定型和驗證資料。
- 選取基底模型。
- 上傳定型資料。
- 定型新的自訂模型。
- 檢查自訂模型的狀態。
- 部署自訂模型以供使用。
- 使用自訂模型。
- (選擇性) 分析自訂模型以取得效能並加以調整。
準備您的定型和驗證資料
您的定型資料和驗證資料集包含您想要執行模型之方式的輸入和輸出範例。
不同的模型類型需要不同格式的定型資料。
您使用的定型和驗證資料必須格式化為 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 定型檔案的單行中進行多回合交談亦受支援。 若要跳過對特定助理訊息的微調,請新增選擇性 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 上傳本機定型和驗證檔案,並擷取傳回的檔案識別碼。
# 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 建立新的微調作業範例:
在此範例中,我們也會傳遞種子參數。 種子會控制作業的重現性。 傳入相同的種子和作業參數應該會產生相同的結果,但在罕見的情況下可能會有所不同。 如果未指定種子,將會為您產生一個種子。
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 |
整數 | 用於定型的批次大小。 批次大小是用來訓練單一向前和向後傳遞的訓練範例數目。 一般而言,我們發現較大的批次大小通常較適合較大的資料集。 此屬性的預設值和最大值是基底模型所特有的。 批次大小越大,表示模型參數的更新頻率越低,而變異數越少。 |
learning_rate_multiplier |
數值 | 用於定型的學習速率乘數。 微調學習速率是預先定型所用原始學習速率乘以此值。 學習速率越大,通常在越大的批次大小下擁有更佳效能。 建議您試驗 0.02 到 0.2 這個範圍內的值,看看哪些值會產生最佳結果。 較小的學習速率可能有助於避免過度學習。 |
n_epochs |
整數 | 定型模型的 Epoch 數目。 Epoch 是指透過定型資料集的完整循環。 |
seed |
整數 | 種子會控制作業的重現性。 傳入相同的種子和作業參數應該會產生相同的結果,但在罕見的情況下可能會有所不同。 如果未指定種子,將會為您產生一個種子。 |
若要使用 1.x 版的 OpenAI Python API 來設定自訂超參數:
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))
檢查點
當每個定型 Epoch 完成時,就會產生檢查點。 檢查點是模型的完整功能版本,可以部署為並用作後續微調作業的目標模型。 檢查點特別有用,因為其可以在過度學習發生之前提供模型的快照集。 微調作業完成時,您將有三個最新版本的模型可供部署。 最終 Epoch 將會以微調模型來表示,而前兩個 Epoch 將做為檢查點使用。
您可以執行清單檢查點命令來擷取與個別微調作業相關聯的檢查點清單:
您可能需要使用 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 服務內容篩選。
- 評估是在專用、客戶專屬、私人工作區中進行;
- 評估端點位於與 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
變數的值將設定為自訂模型的名稱。 您的模型現在也可供從清單模型 API 進行探索。 然而,在部署自訂模型之前,您無法對自訂模型發出完成呼叫。 您必須部署自訂模型,以使其可用於完成呼叫。
重要
部署自訂模型之後,如果在任何時候該部署處於非使用中的狀態超過十五 (15) 天,則系統會刪除該部署。 如果模型部署的時間超過十五 (15) 天,而且在連續 15 天內沒有針對模型進行完成或聊天完成呼叫,則自訂模型的部署為「非使用中」。
刪除非使用中的部署不會刪除或影響基礎自訂模型,且自訂模型可以隨時進行重新部署。 如 Azure OpenAI 服務定價中所述,每個部署的自訂 (微調) 模型都會產生每小時裝載成本,無論是否要對模型進行完成或聊天完成呼叫。 若要深入了解使用 Azure OpenAI 規劃和管理成本,請參閱規劃管理 Azure OpenAI 服務的成本 (機器翻譯) 中的指引。
您也可以使用 Azure AI Foundry 或 Azure CLI 來部署您的自定義模型。
注意
自訂模型僅允許一個部署。 如果您選取已部署的自訂模型,則會發生錯誤。
有別於先前的 SDK 命令,您必須使用控制平面 API 來完成部署,而這需要個別的授權、不同的 API 路徑和不同的 API 版本。
variable | 定義 |
---|---|
token | 有多種方式可以產生授權權杖。 初始測試最簡單的方法是從 Azure 入口網站啟動Cloud Shell。 接著,執行 az account get-access-token 。 您可以使用此權杖作為 API 測試的暫時授權權杖。 建議您將此儲存在新的環境變數中。 |
訂用帳戶 | 相關聯 Azure OpenAI 資源的訂閱識別碼。 |
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 ) 來部署檢查點 |
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 訂用帳戶的名稱或識別碼。 |
<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 Foundry 中的遊樂場來實驗您的新部署。 您可以繼續對自訂模型使用相同的參數,例如 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 的結果檔案附加至其中。 您可以使用結果檔案來分析自訂模型的定型和驗證效能。 結果檔案的檔案識別碼會針對每個自訂模型列出,並且您可以使用 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 結尾計算的有效平均權杖正確性。 當訓練順利進行時,權杖正確性應該會增加。 |
您也可以在 Azure AI Foundry 入口網站中,將results.csv檔案中的數據檢視為繪圖。 選取已定型模型的連結,您會看到三個圖表:遺失、平均權杖正確性和權杖正確性。 如果您已提供驗證資料,則兩個資料集都會出現在同一繪圖上。
隨著時間推移,您的損失會減少,而正確性會增加。 如果您發現定型資料和驗證資料之間存在差異,則可能表示您過度學習。 嘗試使用較少的 Epoch 或較小的學習速率乘數進行定型。
清除部署、自訂模型和定型檔案
當您完成自訂模型時,可刪除部署和模型。 您也可以刪除上傳至服務的定型和驗證檔案 (如需要)。
刪除模型部署
重要
部署自訂模型之後,如果在任何時候該部署處於非使用中的狀態超過十五 (15) 天,則系統會刪除該部署。 如果模型部署的時間超過十五 (15) 天,而且在連續 15 天內沒有針對模型進行完成或聊天完成呼叫,則自訂模型的部署為「非使用中」。
刪除非使用中的部署不會刪除或影響基礎自訂模型,且自訂模型可以隨時進行重新部署。 如 Azure OpenAI 服務定價中所述,每個部署的自訂 (微調) 模型都會產生每小時裝載成本,無論是否要對模型進行完成或聊天完成呼叫。 若要深入了解使用 Azure OpenAI 規劃和管理成本,請參閱規劃管理 Azure OpenAI 服務的成本 (機器翻譯) 中的指引。
您可以使用各種方法來刪除自訂模型的部署:
刪除自訂模型
同樣地,您可以使用各種方法來刪除自訂模型:
注意
如果自訂模型具有現有部署,則無法刪除自訂模型。 您必須先刪除模型部署,才能刪除自訂的模型。
刪除定型檔案
您可以選擇從 Azure OpenAI 訂閱中刪除為定型而上傳的定型和驗證檔案,以及在定型期間產生的結果檔案。 您可以使用下列方法來刪除定型、驗證和結果檔案:
- Azure AI 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)
持續微調
建立微調模型之後,建議您透過進一步微調繼續精簡模型。 持續微調是選取已微調模型作為基底模型,並在新的定型範例集中進一步微調的反覆程序。
若要對先前微調的模型執行微調,您可以使用建立自訂模型中所述的相同流程,但請指定已微調模型的識別碼,而不是指定一般基底模型的名稱。 微調模型的識別碼看起來像 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 個字元的字串,該字串會新增至微調的模型名稱中。
如果您不確定現有微調模型的標識符,您可以在 Azure AI Foundry 的 [模型] 頁面中找到這項資訊,或者您可以使用 REST API 為指定的 Azure OpenAI 資源產生模型清單。
必要條件
- 請閱讀 使用 Azure OpenAI 微調的時機指南 (機器翻譯)。
- Azure 訂用帳戶。 免費建立一個。
- Azure OpenAI 資源。 如需詳細資訊,請參閱使用 Azure OpenAI 建立資源及部署模型。
- 微調存取需要認知服務 OpenAI 參與者。
- 如果您還沒有存取權可檢視配額,並在 Azure AI Foundry 入口網站中部署模型,則需要 額外的許可權。
模型
下列模型支援微調:
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 的工作流程
請花一點時間檢閱搭配 Azure OpenAI 使用 REST API 和 Python 的微調工作流程:
- 準備您的定型和驗證資料。
- 選取基底模型。
- 上傳定型資料。
- 定型新的自訂模型。
- 檢查自訂模型的狀態。
- 部署自訂模型以供使用。
- 使用自訂模型。
- (選擇性) 分析自訂模型以取得效能並加以調整。
準備您的定型和驗證資料
您的定型資料和驗證資料集包含您想要執行模型之方式的輸入和輸出範例。
不同的模型類型需要不同格式的定型資料。
您使用的定型和驗證資料必須格式化為 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 定型檔案的單行中進行多回合交談亦受支援。 若要跳過對特定助理訊息的微調,請新增選擇性 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 個定型範例,但如此少量不足以明顯影響模型回應。 如果無法提供數千個定型範例,起碼須提供數百個定型範例,才是順利完成作業的最佳做法。
一般而言,資料集大小加倍會導致模型品質呈線性增加。 但請記住,低品質範例則可能會對效能造成負面影響。 如果您透過大量內部資料定型模型,而未事先剪除資料集以留下最高品質的範例,則最終可能會得到一個效能比預期更差的模型。
選取基底模型
建立自訂模型的第一個步驟為選擇基底模型。 [基底模型] 窗格可讓您選擇要用於自訂模型的基底模型。 您的選擇會影響模型的效能和成本。
從 [基底模型類型] 下拉式清單中選取基底模型,然後選取 [下一步] 以繼續。
您可以從下列其中一個可用的基底模型建立自訂模型:
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}。
如需可以微調的基底模型之詳細資訊,請參閱模型。
上傳定型資料集
下一個步驟是選擇現有的備妥定型資料,或上傳微調模型時要使用的新備妥定型資料。 備妥定型資料後,您可以將檔案上傳至服務。 上傳定型資料有兩種方式:
若為大型資料檔案,建議您從 Azure Blob 存放區匯入。 透過多部分表單上傳大型檔案時會變得不穩定,因為這些要求不可部分完成,而且無法重試或繼續。 如需 Azure Blob 儲存體的詳細資訊,請參閱什麼是 Azure Blob 儲存體?
注意
定型資料檔案必須格式化為 JSONL 檔案、以 UTF-8 編碼,並以位元組順序標記 (BOM)。 檔案大小必須小於 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 建立新微調作業 (部分機器翻譯) 的範例。
在此範例中,我們也會傳遞種子參數。 種子會控制作業的重現性。 傳入相同的種子和作業參數應該會產生相同的結果,但在罕見的情況下,可能會有所不同。 如果未指定種子,將會為您產生一個種子。
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 |
整數 | 用於定型的批次大小。 批次大小是用來訓練單一向前和向後傳遞的訓練範例數目。 一般而言,我們發現較大的批次大小通常較適合較大的資料集。 此屬性的預設值和最大值是基底模型所特有的。 批次大小越大,表示模型參數的更新頻率越低,而變異數越少。 |
learning_rate_multiplier |
數值 | 用於定型的學習速率乘數。 微調學習速率是預先定型所用原始學習速率乘以此值。 學習速率越大,通常在越大的批次大小下擁有更佳效能。 建議您試驗 0.02 到 0.2 這個範圍內的值,看看哪些值會產生最佳結果。 較小的學習速率可能有助於避免過度學習。 |
n_epochs |
整數 | 定型模型的 Epoch 數目。 Epoch 是指透過定型資料集的完整循環。 |
seed |
整數 | 種子會控制作業的重現性。 傳入相同的種子和作業參數應該會產生相同的結果,但在罕見的情況下可能會有所不同。 如果未指定種子,將會為您產生一個種子。 |
檢查自訂模型的狀態
啟動微調作業之後,可能需要一些時間才能完成。 您的作業可能會排入系統中其他作業後方的佇列。 視模型和資料集大小而定,定型模型可能需要幾分鐘或幾小時的時間。 下列範例會使用 REST API 來檢查微調作業的狀態。 此範例會使用上一個範例傳回的作業識別碼,擷取作業的相關資訊:
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"
檢查點
當每個定型 Epoch 完成時,就會產生檢查點。 檢查點是模型的完整功能版本,可以部署為並用作後續微調作業的目標模型。 檢查點特別有用,因為其可以在過度學習發生之前提供模型的快照集。 微調作業完成時,您將有三個最新版本的模型可供部署。 最終 Epoch 將會以微調模型來表示,而前兩個 Epoch 將做為檢查點使用。
您可以執行清單檢查點命令來擷取與個別微調作業相關聯的檢查點清單:
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 服務內容篩選。
- 評估是在專用、客戶專屬、私人工作區中進行;
- 評估端點位於與 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 服務定價中所述,每個部署的自訂 (微調) 模型都會產生每小時裝載成本,無論是否要對模型進行完成或聊天完成呼叫。 若要深入了解使用 Azure OpenAI 規劃和管理成本,請參閱規劃管理 Azure OpenAI 服務的成本 (機器翻譯) 中的指引。
下列 Python 範例示範如何使用 REST API 為自訂模型建立模型部署。 REST API 會產生自訂模型部署的名稱。
variable | 定義 |
---|---|
token | 有多種方式可以產生授權權杖。 初始測試最簡單的方法是從 Azure 入口網站啟動Cloud Shell。 接著,執行 az account get-access-token 。 您可以使用此權杖作為 API 測試的暫時授權權杖。 建議您將此儲存在新的環境變數中。 |
訂用帳戶 | 相關聯 Azure OpenAI 資源的訂閱識別碼。 |
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 ) 來部署檢查點 |
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 訂用帳戶的名稱或識別碼。 |
<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 Foundry 中的遊樂場來實驗您的新部署。 您可以繼續對自訂模型使用相同的參數,例如 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 的結果檔案附加至其中。 您可以使用結果檔案來分析自訂模型的定型和驗證效能。 結果檔案的檔案識別碼會針對每個自訂模型列出,並且您可以使用 REST API 來擷取檔案識別碼和下載結果檔案進行分析。
下列 Python 範例會使用 REST API 擷取附加至自訂模型微調作業中第一個結果檔案的檔案識別碼,然後將檔案下載至工作目錄進行分析。
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 |
定型步驟的數目。 定型步驟代表對一批定型資料的單次向前和向後傳遞。 |
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 結尾計算的有效平均權杖正確性。 當訓練順利進行時,權杖正確性應該會增加。 |
您也可以在 Azure AI Foundry 入口網站中,將results.csv檔案中的數據檢視為繪圖。 選取已定型模型的連結,您會看到三個圖表:遺失、平均權杖正確性和權杖正確性。 如果您已提供驗證資料,則兩個資料集都會出現在同一繪圖上。
隨著時間推移,您的損失會減少,而正確性會增加。 如果您發現定型資料和驗證資料之間存在差異,則可能表示您過度學習。 嘗試使用較少的 Epoch 或較小的學習速率乘數進行定型。
清除部署、自訂模型和定型檔案
當您完成自訂模型時,可刪除部署和模型。 您也可以刪除上傳至服務的定型和驗證檔案 (如需要)。
刪除模型部署
您可以使用各種方法來刪除自訂模型的部署:
刪除自訂模型
同樣地,您可以使用各種方法來刪除自訂模型:
注意
如果自訂模型具有現有部署,則無法刪除自訂模型。 您必須先刪除模型部署,才能刪除自訂的模型。
刪除定型檔案
您可以選擇從 Azure OpenAI 訂閱中刪除為定型而上傳的定型和驗證檔案,以及在定型期間產生的結果檔案。 您可以使用下列方法來刪除定型、驗證和結果檔案:
持續微調
建立微調模型之後,建議您透過進一步微調繼續精簡模型。 持續微調是選取已微調模型作為基底模型,並在新的定型範例集中進一步微調的反覆程序。
若要對先前微調的模型執行微調,您可以使用建立自訂模型中所述的相同流程,但請指定已微調模型的識別碼,而不是指定一般基底模型的名稱。 微調模型的識別碼看起來像 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 和 _),這些字元會新增至微調模型名稱中。
如果您不確定微調模型的標識符,您可以在 Azure AI Foundry 的 [模型] 頁面中找到這項資訊,或者您可以使用 REST API 為指定的 Azure OpenAI 資源產生模型清單。
全球標準版 (預覽)
Azure OpenAI 微調支持 美國東部 2、美國中北部和瑞典中部的全域標準部署 ,適用於:
gpt-4o-mini-2024-07-18
gpt-4o-2024-08-06
(新的部署在 2025 年 1 月之前無法使用)
全域標準微調的部署可 節省成本,但自定義模型權數可能會暫時儲存在 Azure OpenAI 資源的地理位置之外。
全域標準微調部署目前不支援視覺和結構化輸出。
視覺微調
您也可以使用 JSONL 檔案中的影像進行微調。 就像您可以將一或多個影像輸入傳送至聊天完成一樣,您可以在定型數據中包含這些相同的訊息類型。 您可以將影像提供為可公開存取的 URL 或包含 base64編碼影像的數據URI。
影像數據集需求
- 您的定型檔案最多可以包含包含影像的 50,000 個範例(不包括文字範例)。
- 每個範例最多可以有 64 個影像。
- 每個映像最多可以 10 MB。
格式
映射必須是:
- JPEG
- PNG
- WEBP
影像必須處於 RGB 或 RGBA 影像模式。
您無法將影像包含在具有助理角色的訊息輸出中。
Con 帳篷模式 ration 原則
我們會先掃描您的影像,再進行訓練,以確保它們符合我們的使用原則 透明度附註。 這可能會在開始微調之前,在檔案驗證中引入延遲。
包含下列專案的影像將會從數據集中排除,且不會用於定型:
- 人員
- 臉部
- CAPTCHA
重要
如需視覺微調臉部檢測程序:我們會篩選臉部/人員,以略過這些影像來定型模型。 檢測功能利用臉部偵測 無 臉部識別,這表示我們不會建立臉部範本或測量特定臉部幾何,而用來檢測臉部的技術無法唯一識別個人。 若要深入瞭解臉部的數據和隱私權,請參閱 - 臉部的數據和隱私權 - Azure AI 服務 |Microsoft Learn。
提示快取
Azure OpenAI 微調支援使用選取模型進行提示快取。 提示快取可讓您減少在提示開始時具有相同內容的較長提示的整體要求延遲和成本。 若要深入瞭解提示快取,請參閱 開始使用提示快取。
直接喜好設定優化 (DPO) (預覽)
直接喜好設定優化 (DPO) 是大型語言模型的對齊技術,用來根據人類喜好來調整模型權數。 它不同於人類意見反應的增強式學習(RLHF),因為它不需要調整獎勵模型,並使用更簡單的二進位數據喜好設定進行定型。 其計算重量比 RLHF 更快,同時在對齊時同樣有效。
為什麼 DPO 很有用?
DPO 在沒有清楚切入的正確答案的情況下特別有用,而且語氣、樣式或特定內容喜好設定等主觀元素很重要。 此方法也可讓模型從正面範例(被視為正確或理想)和負面範例(不太想要或不正確)中學習。
DPO 被認為是一種技術,可讓客戶更輕鬆地產生高品質的訓練數據集。 雖然許多客戶難以產生足夠的大型數據集來進行受監督的微調,但他們通常會根據用戶記錄、A/B 測試或較小的手動註釋工作收集喜好設定數據。
直接喜好設定優化數據集格式
直接喜好設定優化檔案的格式與受監督的微調不同。 客戶會提供包含系統訊息和初始使用者訊息的「交談」,然後使用配對的喜好設定數據「完成」。 使用者只能提供兩個完成。
三個最上層欄位: input
、 preferred_output
和 non_preferred_output
- preferred_output/non_preferred_output中的每個元素都必須包含至少一個助理訊息
- preferred_output/non_preferred_output中的每個元素只能有角色(助理、工具)
{
"input": {
"messages": {"role": "system", "content": ...},
"tools": [...],
"parallel_tool_calls": true
},
"preferred_output": [{"role": "assistant", "content": ...}],
"non_preferred_output": [{"role": "assistant", "content": ...}]
}
定型資料集的格式必須 jsonl
如下:
{{"input": {"messages": [{"role": "system", "content": "You are a chatbot assistant. Given a user question with multiple choice answers, provide the correct answer."}, {"role": "user", "content": "Question: Janette conducts an investigation to see which foods make her feel more fatigued. She eats one of four different foods each day at the same time for four days and then records how she feels. She asks her friend Carmen to do the same investigation to see if she gets similar results. Which would make the investigation most difficult to replicate? Answer choices: A: measuring the amount of fatigue, B: making sure the same foods are eaten, C: recording observations in the same chart, D: making sure the foods are at the same temperature"}]}, "preferred_output": [{"role": "assistant", "content": "A: Measuring The Amount Of Fatigue"}], "non_preferred_output": [{"role": "assistant", "content": "D: making sure the foods are at the same temperature"}]}
}
直接喜好設定優化模型支援
使用者可以使用喜好設定微調搭配基底模型,以及已使用受監督微調微調的模型,只要它們屬於支援的模型/版本即可進行微調。
如何使用直接喜好設定優化微調?
- 以喜好設定格式準備
jsonl
數據集。 - 選取模型,然後選取自定義 直接喜好設定優化的方法。
- 上傳數據集 – 定型和驗證。 視需要預覽。
- 選取超參數,建議使用預設值進行初始測試。
- 檢閱選取專案,並建立微調作業。
疑難排解
如何啟用微調?
為了成功存取微調,您需要指派認知服務 OpenAI 參與者。 即使是具有高階服務管理員權限的人員,仍然需要明確設定此帳戶才能存取微調。 如需詳細資訊,請參閱角色型存取控制指引 (機器翻譯)。
為什麼會上傳失敗?
如果檔案在 Azure OpenAI Studio 中上傳失敗,您可以在 Azure OpenAI Studio 中的 [資料檔案] 下檢視錯誤訊息。 請將滑鼠停留在顯示「錯誤」的位置 (狀態資料行下方),有關失敗的說明隨即顯示。
我的微調模型似乎並未改善
遺漏系統訊息:您必須在微調時提供系統訊息;當您使用微調模型時,建議提供相同的系統訊息。 如果您提供不同的系統訊息,則可能看到與微調結果不同的結果。
資料不足:雖然管線運行的最小值為 10,但您需要數百到數千個資料點來教導模型新技能。 資料點太少,可能導致過度學習和一般化不佳。 您的微調模型可能在定型資料上表現良好,但在其他資料上表現不佳,因為該模型記住的是定型範例而非學習模式。 為了獲得最佳結果,請規劃準備具有數百個或數千個資料點的資料集。
不正確的資料:策展不當或不具代表性的資料集會產生低品質的模型。 您的模型可能會從資料集學習不正確或有偏差的模式。 例如,如果您正在定型用於客戶服務的聊天機器人,但只提供一種案例 (例如商品退貨) 的定型資料,則該聊天機器人不會知道如何回應其他案例。 或者,如果您的定型資料不正確 (包含不正確的回應),則您的模型學會提供不正確的結果。
使用視覺微調
如果您的影像略過,該怎麼辦
您的影像可能會因為下列原因而略過:
- 包含 CAPTCHA
- 包含人員
- 包含臉部
拿掉映像。 目前,我們無法微調包含這些實體之影像的模型。
常見問題
問題 | 原因/解決方案 |
---|---|
略過影像 | 影像可能會因為下列原因而略過:包含 CAPTCHA、人員或臉部。 拿掉映像。 目前,我們無法微調包含這些實體之影像的模型。 |
無法存取的 URL | 檢查影像 URL 是否可公開存取。 |
影像太大 | 檢查您的影像是否落在我們的數據集大小限制內。 |
無效的影像格式 | 檢查您的影像是否屬於我們的數據集格式。 |
如何上傳大型檔案
您的定型檔案可能會相當大。 您可以使用上傳 API,在多個元件中上傳最多 8 GB 的檔案,而不是檔案 API,這隻允許最多 512 MB 的檔案上傳。
降低訓練成本
如果您將影像的詳細數據參數設定為低,則影像的大小會調整為 512 x 512 圖元,而且只以 85 個標記表示,而不論其大小為何。 這將降低訓練成本。
{
"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",
"detail": "low"
}
}
視覺微調的其他考慮
若要控制影像理解的精確度,請將的詳細數據參數 image_url
設定為 low
、 high
或 auto
每個影像。 這也會影響模型在定型期間看到的每個影像令牌數目,並會影響定型的成本。
下一步
- 探索 Azure OpenAI 微調教學課程 (機器翻譯) 中的微調功能。
- 檢閱微調模型區域可用性 (機器翻譯)
- 深入了解 Azure OpenAI 配額 (機器翻譯)