使用微調自定義模型

Azure OpenAI 服務可讓您使用稱為 微調的程式,為您的個人數據集量身打造我們的模型。 藉由提供下列內容,此自訂步驟可讓您來獲得更多服務:

  • 質量高於您從 提示工程中取得的結果
  • 對更多範例進行定型的能力,比可以納入模型的最大要求內容限制。
  • 由於提示較短而節省令牌
  • 較低的延遲要求,特別是在使用較小的模型時。

相較於很少拍攝的學習,微調會藉由對比在提示中容納的更多範例進行定型來改善模型,讓您在大量的工作中取得更好的結果。 因為微調會調整基底模型的權數,以改善特定工作的效能,因此您不必在提示中包含盡可能多的範例或指示。 這表示在每次 API 呼叫上傳送的文字和處理的令牌較少、可能節省成本,以及改善要求延遲。

我們會使用 LoRA 或低等級近似值,以降低其複雜度的方式微調模型,而不會大幅影響其效能。 這個方法的運作方式是將原始的高排名矩陣近似為較低的排名一,因此只會微調受監督定型階段中較小子集的「重要」參數,讓模型更容易管理且更有效率。 對於用戶來說,這可讓訓練比其他技術更快且更實惠。

必要條件

注意

目前,您必須提交應用程式以存取 Azure OpenAI 服務。 若要申請存取權限,請填寫此表單

模型

下列模型支援微調:

  • babbage-002
  • davinci-002
  • gpt-35-turbo (0613)
  • gpt-35-turbo (1106)
  • gpt-35-turbo (0125)

請參閱模型頁面,以檢查目前支援微調的區域。

檢閱 Azure OpenAI Studio 的工作流程

花點時間檢閱使用 Azure OpenAI Studio 的微調工作流程:

  1. 準備訓練和驗證數據。
  2. 使用 Azure OpenAI Studio 中的 [ 建立自定義模型精 靈] 來定型您的自定義模型。
    1. 選取基底模型
    2. 選擇您的定型數據
    3. 您可以選擇 性地選擇您的驗證資料
    4. 或者, 為微調作業設定進階選項
    5. 檢閱您的選擇,並定型新的自定義模型
  3. 檢查自定義微調模型的狀態。
  4. 部署您的自定義模型以供使用。
  5. 使用您的自定義模型。
  6. 選擇性地分析您的自定義模型以取得效能並符合。

準備訓練和驗證數據

您的定型資料和驗證資料集包含您希望模型如何執行的輸入和輸出範例。

不同的模型類型需要不同類型的定型數據。

您使用 的定型和驗證資料必須 格式化為 JSON Line (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 格式之外,定型和驗證數據檔還必須以 UTF-8 編碼,並包含位元組順序標記 (BOM)。 檔案的大小必須小於 100 MB。

建立定型和驗證數據集

您擁有的訓練範例越多,越好。 微調工作不會繼續至少 10 個定型範例,但如此少量不足以明顯影響模型回應。 最佳做法是提供數百個,如果不是數千個,訓練範例才能成功。

一般而言,將數據集大小加倍可能會導致模型品質的線性增加。 但請記住,低品質範例可能會對效能造成負面影響。 如果您在大量的內部數據上定型模型,而不需要先針對品質最高的範例剪除數據集,您最終可能會產生比預期更差的模型。

使用建立自定義模型精靈

Azure OpenAI Studio 提供建立 自定義模型精 靈,讓您可以互動方式建立和定型 Azure 資源的微調模型。

  1. 在 開啟 Azure OpenAI Studio https://oai.azure.com/ ,並使用可存取 Azure OpenAI 資源的認證登入。 在登入工作流程期間,選取適當的目錄、Azure 訂用帳戶和 Azure OpenAI 資源。

  2. 在 Azure OpenAI Studio 中,流覽至 [ 管理 > 模型 ] 窗格,然後選取 [ 建立自定義模型]。

    顯示如何在 Azure OpenAI Studio 中存取 [建立自定義模型精靈] 的螢幕快照。

[建立自定義模型精靈] 隨即開啟。

選取基底模型

建立自定義模型的第一個步驟是選擇基底模型。 [ 基底模型 ] 窗格可讓您選擇要用於自定義模型的基底模型。 您的選擇會影響模型的效能和成本。

[基底模型類型 ] 下拉式清單中選取基底模型,然後選取 [下一步 ] 繼續。

您可以從下列其中一個可用的基底模型建立自訂模型:

  • babbage-002

  • davinci-002

  • gpt-35-turbo (0613)

  • gpt-35-turbo (1106)

  • 或者,您可以微調先前微調的模型,其格式為base-model.ft-{jobid}。

具有自訂微調模型之模型選項的螢幕快照。

如需可以微調的基底模型之詳細資訊,請參閱模型

選擇您的定型數據

下一個步驟是選擇現有的備妥定型數據,或上傳自定義模型時要使用的新備妥定型數據。 [ 定型數據 ] 窗格會顯示任何現有的先前上傳數據集,也提供上傳新定型數據的選項。

Azure OpenAI Studio 中 [建立自定義模型精靈] 的訓練數據窗格螢幕快照。

  • 如果您的定型數據已上傳至服務,請選取 [ 選擇數據集]。

    • 從 [定型數據] 窗格中顯示的清單中選取檔案。
  • 若要上傳新的定型數據,請使用下列其中一個選項:

對於大型數據文件,建議您從 Azure Blob 存放區匯入。 透過多部分窗體上傳時,大型檔案可能會變得不穩定,因為要求是不可部分完成的,而且無法重試或繼續。 如需 Azure Blob 儲存體 的詳細資訊,請參閱什麼是 Azure Blob 儲存體

注意

定型數據文件必須格式化為 JSONL 檔案,以 UTF-8 編碼的位元組順序標記 (BOM)。 檔案的大小必須小於 512 MB。

從本機檔案上傳訓練數據

您可以使用下列其中一種方法,將新的定型資料集從本機檔案上傳至服務:

  • 將檔案拖放到 [定型數據] 窗格的工作區,然後選取 [上傳檔案]。

  • 從 [訓練數據] 窗格的工作區選取 [瀏覽檔案],從 [開啟] 對話框選擇要上傳的檔案,然後選取 [上傳檔案]。

選取並上傳定型數據集之後,請選取 [下一步 ] 繼續。

[建立自定義模型精靈] 的 [定型數據] 窗格螢幕快照,其中包含本機檔案選項。

從 Azure Blob 存放區匯入定型數據

您可以藉由提供檔案的名稱和位置,從 Azure Blob 或其他共用 Web 位置匯入定型數據集。

  1. 輸入 檔案的檔名

  2. 針對 [檔案位置],提供 Azure Blob URL、Azure 儲存體 共用存取簽章(SAS)或其他可存取共享網站位置的連結。

  3. 選取 [上傳檔案 ] 將定型數據集匯入服務。

選取並上傳定型數據集之後,請選取 [下一步 ] 繼續。

[建立自定義模型精靈] 的 [定型數據] 窗格螢幕快照,其中包含 Azure Blob 和共用 Web 位置選項。

選擇您的驗證數據

下一個步驟提供選項來設定模型,以在定型程式中使用驗證數據。 如果您不想使用驗證數據,您可以選擇 [下一步 ] 繼續前往模型的進階選項。 否則,如果您有驗證數據集,您可以選擇現有的備妥驗證數據,或上傳自定義模型時要使用的新備妥驗證數據。

[ 驗證數據 ] 窗格會顯示任何先前上傳的定型和驗證數據集,並提供您可以上傳新驗證數據的選項。

Azure OpenAI Studio 中 [建立自定義模型精靈] 的 [驗證數據] 窗格螢幕快照。

  • 如果您的驗證數據已上傳至服務,請選取 [ 選擇數據集]。

    • 從 [驗證資料] 窗格中顯示的清單中選取檔案。
  • 若要上傳新的驗證數據,請使用下列其中一個選項:

對於大型數據文件,建議您從 Azure Blob 存放區匯入。 透過多部分窗體上傳時,大型檔案可能會變得不穩定,因為要求是不可部分完成的,而且無法重試或繼續。

注意

與定型數據檔類似,驗證數據文件必須格式化為 JSONL 檔案,以 UTF-8 編碼的位元組順序標記 (BOM)。 檔案的大小必須小於 100 MB。

從本機檔案上傳驗證數據

您可以使用下列其中一種方法,將新的驗證資料集從本機檔案上傳至服務:

  • 將檔案拖放到 [驗證數據] 窗格的工作區,然後選取 [上傳檔案]。

  • 從 [驗證數據] 窗格的工作區選取 [瀏覽檔案],從 [開啟] 對話框選擇要上傳的檔案,然後選取 [上傳檔案]。

選取並上傳驗證數據集之後,請選取 [下一步 ] 繼續。

[建立自定義模型精靈] 的 [驗證數據] 窗格螢幕快照,其中包含本機檔案選項。

從 Azure Blob 存放區匯入驗證數據

您可以藉由提供檔案的名稱和位置,從 Azure Blob 或其他共用 Web 位置匯入驗證數據集。

  1. 輸入 檔案的檔名

  2. 針對 [檔案位置],提供 Azure Blob URL、Azure 儲存體 共用存取簽章(SAS)或其他可存取共用 Web 位置的連結。

  3. 選取 [上傳檔案 ] 將定型數據集匯入服務。

選取並上傳驗證數據集之後,請選取 [下一步 ] 繼續。

[建立自定義模型精靈] 的 [驗證數據] 窗格螢幕快照,其中包含 Azure Blob 和共用 Web 位置選項。

設定進階選項

[建立自定義模型精靈] 會在 [進階選項] 窗格上顯示用於定型微調模型的超參數。 下列超參數可供使用:

名稱 類型 說明
batch_size 整數 要用於定型的批次大小。 批次大小是用來將單一向前和向後階段定型的訓練範例數目。 一般而言,我們發現較大的批次大小較適合較大的數據集。 這個屬性的預設值和最大值是基底模型特有的。 較大的批次大小表示模型參數的更新頻率較低,但差異較低。
learning_rate_multiplier 數值 要用於定型的學習速率乘數。 微調學習速率是用於預先定型的原始學習速率乘以此值。 較大的學習速率通常會以較大的批次大小執行得更好。 建議您試驗 0.02 到 0.2 範圍內的值,以查看產生最佳結果的結果。 較小的學習率可能有助於避免過度學習。
n_epochs 整數 要為其定型模型的 Epoch 數目。 Epoch 是指透過定型數據集的一個完整迴圈。

[建立自定義模型精靈] [進階選項] 窗格的螢幕快照,其中已選取默認選項。

選取 [預設值 ] 以使用微調作業的預設值,或選取 [進階 ] 以顯示和編輯超參數值。

[ 進階 ] 選項可讓您設定下列超參數:

參數名稱 描述
Epoch 數目 要用於定型模型的 Epoch 數目。 Epoch 是指透過定型數據集的一個完整迴圈。

設定進階選項之後,請選取 [下一步 ] 以 檢閱您的選擇,並訓練微調的模型

檢閱您的選擇並定型模型

精靈的 [ 檢閱 ] 窗格會顯示設定選項的相關信息。

Azure OpenAI Studio 中 [建立自定義模型精靈] 的 [檢閱] 窗格螢幕快照。

如果您已準備好將模型定型,請選取 [開始定型作業 ] 以啟動微調作業,然後返回 [ 模型 ] 窗格。

檢查自定義模型的狀態

[模型] 窗格會在 [自定義模型] 索引標籤中顯示自定義模型的相關信息。索引標籤包含自定義模型微調作業的狀態和作業標識符相關信息。 當作業完成時,索引標籤會顯示結果檔的檔案識別碼。 您可能需要選取 [ 重新 整理],才能查看模型定型作業的更新狀態。

Azure OpenAI Studio 中 [模型] 窗格的螢幕快照,其中顯示自定義模型。

啟動微調作業之後,可能需要一些時間才能完成。 您的作業可能會排入系統中其他作業的佇列。 視模型和數據集大小而定,定型模型可能需要幾分鐘或數小時的時間。

以下是您可以在 [ 模型 ] 窗格上執行的一些工作:

  • 在 [自定義模型] 索引標籤的 [狀態] 資料行中,檢查自定義模型的微調作業狀態。

  • 在 [ 模型名稱] 資料行中,選取模型名稱以檢視自定義模型的詳細資訊。 您可以看到微調作業、定型結果、定型事件和作業中使用的超參數狀態。

  • 選取 [ 下載定型檔案 ] 以下載您用於模型的定型數據。

  • 選取 [下載結果 ] 以下載附加至模型微調作業的結果檔案,並 分析自定義模型 以取得定型和驗證效能。

  • 選取 [重新整理] 以更新頁面上的資訊。

Azure OpenAI Studio 中 [模型] 窗格的螢幕快照,其中顯示自定義模型。

部署自定義模型

微調作業成功時,您可以從 [模型] 窗格部署自定義模型。 您必須部署自定義模型,使其可用於完成呼叫。

重要

部署自定義模型之後,如果部署隨時保持非使用中狀態超過15天,則會刪除部署。 如果模型在 15 天前部署超過 15 天,且在連續 15 天期間內未進行聊天完成或聊天完成呼叫,則自定義模型的 部署會處於非 作用中狀態。

刪除非使用中部署並不會刪除或影響基礎自定義模型,而且可以隨時重新部署自定義模型。 如 Azure OpenAI 服務定價中所述,部署的每個自定義(微調)模型都會產生每小時裝載成本,而不論模型的完成或聊天完成呼叫為何。 若要深入瞭解使用 Azure OpenAI 規劃和管理成本,請參閱規劃管理 Azure OpenAI 服務成本中的指引。

注意

自定義模型只允許一個部署。 如果您選取已部署的自定義模型,就會顯示錯誤訊息。

若要部署自定義模型,請選取要部署的自定義模型,然後選取 [ 部署模型]。

顯示如何在 Azure OpenAI Studio 中部署自定義模型的螢幕快照。

[ 部署模型] 對話框隨即開啟。 在對話框中,輸入您的 [部署名稱 ],然後選取 [ 建立] 以開始部署自定義模型。

Azure OpenAI Studio 中 [部署模型] 對話框的螢幕快照。

您可以在 Azure OpenAI Studio 的 [部署] 窗格上監視部署進度。

跨區域部署

微調支援將微調的模型部署到與最初微調模型不同的區域。 您也可以部署到不同的訂用帳戶/區域。

唯一的限制是,新區域也必須支援微調,而且在部署跨訂用帳戶時,產生部署授權令牌的帳戶必須同時具有來源和目的地訂用帳戶的存取權。

跨訂用帳戶/區域部署可以透過 PythonREST 來完成。

使用已部署的自定義模型

在自定義模型部署之後,您可以使用它,就像任何其他已部署的模型一樣。 您可以使用 Azure OpenAI Studio 中的遊樂場來實驗您的新部署。 您可以繼續使用與自定義模型相同的參數,例如 temperaturemax_tokens,就像您可以搭配其他已部署的模型一樣。 針對微調 babbage-002davinci-002 模型,您將使用 Completions 遊樂場和完成 API。 針對微調 gpt-35-turbo-0613 的模型,您將使用聊天遊樂場和聊天完成 API。

Azure OpenAI Studio 中 [遊樂場] 窗格的螢幕快照,其中已醒目提示區段。

分析您的自定義模型

Azure OpenAI 會將名為 results.csv 的結果檔案附加至完成之後的每個微調作業。 您可以使用結果檔來分析自定義模型的定型和驗證效能。 結果檔的檔案識別碼會針對 Azure OpenAI Studio 的 [模型] 窗格上的 [結果檔標識符] 資料行中的每個自定義模型列出。 您可以使用檔案識別碼,從 Azure OpenAI Studio 的 [資料檔 ] 窗格識別並下載結果檔案。

結果檔案是 CSV 檔案,其中包含微調作業所執行之每個定型步驟的標頭數據列和數據列。 結果檔包含下列資料列:

資料行名稱 描述
step 定型步驟的數目。 定型步驟代表一批定型數據的單一傳遞、向前和向後。
train_loss 定型批次的遺失。
training_accuracy 定型批次中模型的預測令牌完全符合真實完成標記的完成百分比。
例如,如果批次大小設定為 3,且您的數據包含完成 [[1, 2], [0, 5], [4, 2]],則如果模型預測 [[1, 1], [0, 5], [4, 2]],這個值會設定為 0.67 (2/3)。
train_mean_token_accuracy 模型正確預測定型批次中的標記百分比。
例如,如果批次大小設定為 3,且您的數據包含完成 [[1, 2], [0, 5], [4, 2]],則如果模型預測 [[1, 1], [0, 5], [4, 2]],這個值會設定為 0.83 (5/6)。
valid_loss 驗證批次的遺失。
valid_accuracy 驗證批次中的完成百分比,模型預測的令牌完全符合真正的完成令牌。
例如,如果批次大小設定為 3,且您的數據包含完成 [[1, 2], [0, 5], [4, 2]],則如果模型預測 [[1, 1], [0, 5], [4, 2]],這個值會設定為 0.67 (2/3)。
validation_mean_token_accuracy 模型正確預測驗證批次中的令牌百分比。
例如,如果批次大小設定為 3,且您的數據包含完成 [[1, 2], [0, 5], [4, 2]],則如果模型預測 [[1, 1], [0, 5], [4, 2]],這個值會設定為 0.83 (5/6)。

您也可以將results.csv檔案中的數據檢視為 Azure OpenAI Studio 中的繪圖。 選取已定型模型的連結,您會看到三個圖表:遺失、平均令牌精確度和令牌精確度。 如果您提供驗證數據,這兩個數據集都會出現在相同的繪圖上。

尋找您的損失,以隨著時間減少,以及您增加的精確度。 如果您在定型和驗證數據之間看到分歧,這可能表示您過度學習。 嘗試使用較少的 Epoch 或較小的學習速率乘數進行定型。

清除您的部署、自定義模型和定型檔案

當您完成自定義模型時,您可以刪除部署和模型。 您也可以視需要刪除上傳至服務的定型和驗證檔案。

刪除模型部署

重要

部署自定義模型之後,如果部署隨時保持非使用中狀態超過15天,則會刪除部署。 如果模型在 15 天前部署超過 15 天,且在連續 15 天期間內未進行聊天完成或聊天完成呼叫,則自定義模型的 部署會處於非 作用中狀態。

刪除非使用中部署並不會刪除或影響基礎自定義模型,而且可以隨時重新部署自定義模型。 如 Azure OpenAI 服務定價中所述,部署的每個自定義(微調)模型都會產生每小時裝載成本,而不論模型的完成或聊天完成呼叫為何。 若要深入瞭解使用 Azure OpenAI 規劃和管理成本,請參閱規劃管理 Azure OpenAI 服務成本中的指引。

您可以在 Azure OpenAI Studio 的 [部署] 窗格上 ,刪除自定義模型的部署 。 選取要刪除的部署,然後選取 [ 刪除 ] 以刪除部署。

刪除您的自定義模型

您可以在 Azure OpenAI Studio 的 [模型 ] 窗格中刪除自定義模型。 從 [自定義模型] 索引標籤中選取要刪除的自定義模型,然後選取 [刪除] 以刪除自定義模型。

注意

如果自定義模型具有現有的部署,則無法刪除該模型。 您必須先 刪除模型部署 ,才能刪除自定義模型。

刪除訓練檔案

您可以選擇性地刪除您在 Azure OpenAI Studio 的 [管理>數據檔] 窗格上上傳的定型和驗證檔案,以及定型期間產生的結果檔案。 選取要刪除的檔案,然後選取 [ 刪除 ] 以刪除檔案。

連續微調

建立微調模型之後,您可能想要透過進一步微調繼續精簡模型。 連續微調是選取已微調模型做為基底模型的反覆程式,並在新的定型範例集中進一步微調。

若要對先前微調的模型執行微調,您會使用與建立自定義模型中所述的相同程式,而不是指定泛型基底模型的名稱,而是指定您已微調的模型。 自定義微調模型看起來會像這樣 gpt-35-turbo-0613.ft-5fd1918ee65d4cd38a5dcf6835066ed7

[建立自定義模型 UI] 的螢幕快照,其中已醒目提示微調的模型。

我們也建議您加入 suffix 參數,讓您更輕鬆地區分微調模型的不同反覆專案。 suffix 會採用字串,並設定為識別微調的模型。 透過OpenAI Python API,支援最多18個字元的字串,以新增至微調的模型名稱。

必要條件

注意

目前,您必須提交應用程式以存取 Azure OpenAI 服務。 若要申請存取權限,請填寫此表單

模型

下列模型支援微調:

  • babbage-002
  • davinci-002
  • gpt-35-turbo (0613)
  • gpt-35-turbo (1106)
  • gpt-35-turbo (0125)

或者,您可以微調先前微調的模型,其格式為base-model.ft-{jobid}。

具有自訂微調模型之模型選項的螢幕快照。

請參閱模型頁面,以檢查目前支援微調的區域。

檢閱 Python SDK 的工作流程

花點時間檢閱微調工作流程,以搭配 Azure OpenAI 使用 Python SDK:

  1. 準備訓練和驗證數據。
  2. 選取基底模型。
  3. 上傳訓練數據。
  4. 將新的自定義模型定型。
  5. 檢查自定義模型的狀態。
  6. 部署您的自定義模型以供使用。
  7. 使用您的自定義模型。
  8. 選擇性地分析您的自定義模型以取得效能並符合。

準備訓練和驗證數據

您的定型資料和驗證資料集包含您希望模型如何執行的輸入和輸出範例。

不同的模型類型需要不同類型的定型數據。

您使用 的定型和驗證資料必須 格式化為 JSON Line (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 格式之外,定型和驗證數據檔還必須以 UTF-8 編碼,並包含位元組順序標記 (BOM)。 檔案的大小必須小於 100 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="2023-12-01-preview"  # This API version or later is required to access fine-tuning for turbo/babbage-002/davinci-002
)

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

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 是指透過定型數據集的一個完整迴圈。

若要使用 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="2023-12-01-preview"  # 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))

部署自定義模型

微調作業成功時,響應主體中的變數值 fine_tuned_model 會設定為自定義模型的名稱。 您的模型現在也可供從 模型 API 清單進行探索。 不過,在部署自定義模型之前,您無法對自定義模型發出完成呼叫。 您必須部署自定義模型,使其可用於完成呼叫。

重要

部署自定義模型之後,如果部署隨時保持非使用中狀態超過15天,則會刪除部署。 如果模型在 15 天前部署超過 15 天,且在連續 15 天期間內未進行聊天完成或聊天完成呼叫,則自定義模型的 部署會處於非 作用中狀態。

刪除非使用中部署並不會刪除或影響基礎自定義模型,而且可以隨時重新部署自定義模型。 如 Azure OpenAI 服務定價中所述,部署的每個自定義(微調)模型都會產生每小時裝載成本,而不論模型的完成或聊天完成呼叫為何。 若要深入瞭解使用 Azure OpenAI 規劃和管理成本,請參閱規劃管理 Azure OpenAI 服務成本中的指引。

您可以使用 Azure OpenAIAzure 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。
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 OpenAI Studio 中的遊樂場來實驗您的新部署。 您可以繼續使用與自定義模型相同的參數,例如 temperaturemax_tokens,就像您可以搭配其他已部署的模型一樣。 針對微調 babbage-002davinci-002 模型,您將使用 Completions 遊樂場和完成 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="2023-05-15"
)

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 定型批次的遺失。
training_accuracy 定型批次中模型的預測令牌完全符合真實完成標記的完成百分比。
例如,如果批次大小設定為 3,且您的數據包含完成 [[1, 2], [0, 5], [4, 2]],則如果模型預測 [[1, 1], [0, 5], [4, 2]],這個值會設定為 0.67 (2/3)。
train_mean_token_accuracy 模型正確預測定型批次中的標記百分比。
例如,如果批次大小設定為 3,且您的數據包含完成 [[1, 2], [0, 5], [4, 2]],則如果模型預測 [[1, 1], [0, 5], [4, 2]],這個值會設定為 0.83 (5/6)。
valid_loss 驗證批次的遺失。
valid_accuracy 驗證批次中的完成百分比,模型預測的令牌完全符合真正的完成令牌。
例如,如果批次大小設定為 3,且您的數據包含完成 [[1, 2], [0, 5], [4, 2]],則如果模型預測 [[1, 1], [0, 5], [4, 2]],這個值會設定為 0.67 (2/3)。
validation_mean_token_accuracy 模型正確預測驗證批次中的令牌百分比。
例如,如果批次大小設定為 3,且您的數據包含完成 [[1, 2], [0, 5], [4, 2]],則如果模型預測 [[1, 1], [0, 5], [4, 2]],這個值會設定為 0.83 (5/6)。

您也可以將results.csv檔案中的數據檢視為 Azure OpenAI Studio 中的繪圖。 選取已定型模型的連結,您會看到三個圖表:遺失、平均令牌精確度和令牌精確度。 如果您提供驗證數據,這兩個數據集都會出現在相同的繪圖上。

尋找您的損失,以隨著時間減少,以及您增加的精確度。 如果您在定型和驗證數據之間看到分歧,這可能表示您過度學習。 嘗試使用較少的 Epoch 或較小的學習速率乘數進行定型。

清除您的部署、自定義模型和定型檔案

當您完成自定義模型時,您可以刪除部署和模型。 您也可以視需要刪除上傳至服務的定型和驗證檔案。

刪除模型部署

重要

部署自定義模型之後,如果部署隨時保持非使用中狀態超過15天,則會刪除部署。 如果模型在 15 天前部署超過 15 天,且在連續 15 天期間內未進行聊天完成或聊天完成呼叫,則自定義模型的 部署會處於非 作用中狀態。

刪除非使用中部署並不會刪除或影響基礎自定義模型,而且可以隨時重新部署自定義模型。 如 Azure OpenAI 服務定價中所述,部署的每個自定義(微調)模型都會產生每小時裝載成本,而不論模型的完成或聊天完成呼叫為何。 若要深入瞭解使用 Azure OpenAI 規劃和管理成本,請參閱規劃管理 Azure OpenAI 服務成本中的指引。

您可以使用各種方法來移除自訂模型的部署:

刪除您的自定義模型

同樣地,您可以使用各種方法來刪除自定義模型:

注意

如果自定義模型具有現有的部署,則無法刪除該模型。 您必須先 刪除模型部署 ,才能刪除自定義的模型。

刪除訓練檔案

您可以選擇性地從 Azure OpenAI 訂用帳戶刪除您上傳的定型和驗證檔案,以及定型期間產生的結果檔案。 您可以使用下列方法來刪除訓練、驗證和結果檔案:

下列 Python 範例會使用 Python SDK 來刪除自定義模型的定型、驗證和結果檔案:

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

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

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

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

連續微調

建立微調的模型之後,您可能會想要透過進一步微調繼續精簡模型。 連續微調是選取已微調模型做為基底模型的反覆程式,並在新的定型範例集中進一步微調。

若要對先前微調的模型執行微調,您會使用與建立自定義模型中所述的相同程式,而不是指定泛型基底模型的名稱,而是指定您已微調的模型標識符。 微調的模型標識碼看起來像 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="2023-12-01-preview"  
)

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 OpenAI Studio 的 [模型] 頁面中找到這項資訊,或者您可以使用 REST API 為指定的 Azure OpenAI 資源產生模型清單。

必要條件

注意

目前,您必須提交應用程式以存取 Azure OpenAI 服務。 若要申請存取權限,請填寫此表單

模型

下列模型支援微調:

  • babbage-002
  • davinci-002
  • gpt-35-turbo (0613)
  • gpt-35-turbo (1106)
  • gpt-35-turbo (0125)

請參閱模型頁面,以檢查目前支援微調的區域。

檢閱 REST API 的工作流程

請花點時間檢閱微調工作流程,以搭配 Azure OpenAI 使用 REST API 和 Python:

  1. 準備訓練和驗證數據。
  2. 選取基底模型。
  3. 上傳訓練數據。
  4. 將新的自定義模型定型。
  5. 檢查自定義模型的狀態。
  6. 部署您的自定義模型以供使用。
  7. 使用您的自定義模型。
  8. 選擇性地分析您的自定義模型以取得效能並符合。

準備訓練和驗證數據

您的定型資料和驗證資料集包含您希望模型如何執行的輸入和輸出範例。

不同的模型類型需要不同類型的定型數據。

您使用 的定型和驗證資料必須 格式化為 JSON Line (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 格式之外,定型和驗證數據檔還必須以 UTF-8 編碼,並包含位元組順序標記 (BOM)。 檔案的大小必須小於 100 MB。

建立定型和驗證數據集

您擁有的訓練範例越多,越好。 微調工作不會繼續至少 10 個定型範例,但如此少量不足以明顯影響模型回應。 最佳做法是提供數百個,如果不是數千個,訓練範例才能成功。

一般而言,將數據集大小加倍可能會導致模型品質的線性增加。 但請記住,低品質範例可能會對效能造成負面影響。 如果您在大量內部數據上定型模型,而不需要先剪除數據集以取得最高品質的範例,您最終可能會產生比預期更差的模型。

選取基底模型

建立自定義模型的第一個步驟是選擇基底模型。 [ 基底模型 ] 窗格可讓您選擇要用於自定義模型的基底模型。 您的選擇會影響模型的效能和成本。

[基底模型類型 ] 下拉式清單中選取基底模型,然後選取 [下一步 ] 繼續。

您可以從下列其中一個可用的基底模型建立自訂模型:

  • babbage-002
  • davinci-002
  • gpt-35-turbo (0613)
  • gpt-35-turbo (1106)

或者,您可以微調先前微調的模型,其格式為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=2023-12-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>"
}'

您也可以傳遞額外的選擇性參數,例如 超參數 ,以進一步控制微調程式。 針對初始定型,我們建議使用存在的自動預設值,而不指定這些參數。

微調目前支援的超參數如下:

名稱 類型 說明
batch_size 整數 要用於定型的批次大小。 批次大小是用來將單一向前和向後階段定型的訓練範例數目。 一般而言,我們發現較大的批次大小較適合較大的數據集。 這個屬性的預設值和最大值是基底模型特有的。 較大的批次大小表示模型參數的更新頻率較低,但差異較低。
learning_rate_multiplier 數值 要用於定型的學習速率乘數。 微調學習速率是用於預先定型的原始學習速率乘以此值。 較大的學習速率通常會以較大的批次大小執行得更好。 建議您試驗 0.02 到 0.2 範圍內的值,以查看產生最佳結果的結果。 較小的學習率有助於避免過度學習。
n_epochs 整數 要為其定型模型的 Epoch 數目。 Epoch 是指透過定型數據集的一個完整迴圈。

檢查自定義模型的狀態

開始微調作業之後,可能需要一些時間才能完成。 您的作業可能會排入系統中其他作業的佇列。 視模型和數據集大小而定,定型模型可能需要幾分鐘或數小時的時間。 下列範例會使用 REST API 來檢查微調作業的狀態。 此範例會使用上一個範例傳回的作業標識符,擷取作業的相關信息:

curl -X GET $AZURE_OPENAI_ENDPOINT/openai/fine_tuning/jobs/<YOUR-JOB-ID>?api-version=2023-12-01-preview \
  -H "api-key: $AZURE_OPENAI_API_KEY"

部署自定義模型

重要

部署自定義模型之後,如果部署隨時保持非使用中狀態超過15天,則會刪除部署。 如果模型在 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。
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 OpenAI Studio 中的遊樂場來實驗您的新部署。 您可以繼續使用與自定義模型相同的參數,例如 temperaturemax_tokens,就像您可以搭配其他已部署的模型一樣。 針對微調 babbage-002davinci-002 模型,您將使用 Completions 遊樂場和完成 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 定型批次的遺失。
training_accuracy 定型批次中模型的預測令牌完全符合真實完成標記的完成百分比。
例如,如果批次大小設定為 3,且您的數據包含完成 [[1, 2], [0, 5], [4, 2]],則如果模型預測 [[1, 1], [0, 5], [4, 2]],這個值會設定為 0.67 (2/3)。
train_mean_token_accuracy 模型正確預測定型批次中的標記百分比。
例如,如果批次大小設定為 3,且您的數據包含完成 [[1, 2], [0, 5], [4, 2]],則如果模型預測 [[1, 1], [0, 5], [4, 2]],這個值會設定為 0.83 (5/6)。
valid_loss 驗證批次的遺失。
valid_accuracy 驗證批次中的完成百分比,模型預測的令牌完全符合真正的完成令牌。
例如,如果批次大小設定為 3,且您的數據包含完成 [[1, 2], [0, 5], [4, 2]],則如果模型預測 [[1, 1], [0, 5], [4, 2]],這個值會設定為 0.67 (2/3)。
validation_mean_token_accuracy 模型正確預測驗證批次中的令牌百分比。
例如,如果批次大小設定為 3,且您的數據包含完成 [[1, 2], [0, 5], [4, 2]],則如果模型預測 [[1, 1], [0, 5], [4, 2]],這個值會設定為 0.83 (5/6)。

您也可以將results.csv檔案中的數據檢視為 Azure OpenAI Studio 中的繪圖。 選取已定型模型的連結,您會看到三個圖表:遺失、平均令牌精確度和令牌精確度。 如果您提供驗證數據,這兩個數據集都會出現在相同的繪圖上。

尋找您的損失,以隨著時間減少,以及您增加的精確度。 如果您在定型和驗證數據之間看到分歧,這可能表示您過度學習。 嘗試使用較少的 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 OpenAI Studio 的 [模型] 頁面中找到這項資訊,或者您可以使用 REST API 為指定的 Azure OpenAI 資源產生模型清單。

疑難排解

如何? 啟用微調? 在 Azure OpenAI Studio 中建立自定義模型呈現灰色嗎?

若要成功存取微調,您需要 指派認知服務 OpenAI 參與者。 即使是具有高階服務 管理員 istrator 許可權的人員仍然需要明確設定此帳戶,才能存取微調。 如需詳細資訊,請檢閱 角色型訪問控制指引

為什麼我的上傳失敗?

如果您的檔案上傳失敗,您可以在 Azure OpenAI Studio 中的「數據檔」底下檢視錯誤訊息。 將滑鼠停留在顯示「錯誤」(狀態數據行下)的位置,並顯示失敗的說明。

微調錯誤訊息的螢幕快照。

我的微調模型似乎沒有改善

  • 遺漏系統訊息: 當您微調時,您需要提供系統訊息;當您使用微調的模型時,您會想要提供相同的系統訊息。 如果您提供不同的系統訊息,您可能會看到與微調結果不同的結果。

  • 數據不足: 雖然 10 是管線要執行的最小值,但您需要數十到數千個數據點來教導模型一項新的技能。 數據點太少,可能會過度學習和較差的一般化。 微調的模型可能會對定型數據執行良好,但在其他數據上表現不佳,因為它已記住定型範例,而不是學習模式。 為了獲得最佳結果,請規劃準備具有數百個或數千個數據點的數據集。

  • 不正確的數據: 精心策劃或不具代表性的數據集會產生低品質的模型。 您的模型可能會從數據集學習不正確或有偏差的模式。 例如,如果您要為客戶服務定型聊天機器人,但只提供一個案例的訓練數據(例如專案傳回),則不知道如何回應其他案例。 或者,如果您的定型數據不正確(包含不正確的回應),您的模型將會瞭解如何提供不正確的結果。

下一步