撰寫批次部署的評分指令碼
適用於:Azure CLI ml 延伸模組 v2 (目前)Python SDK azure-ai-ml v2 (目前)
Batch 端點可讓您部署大規模執行長時間執行推斷的模型。 部署模型時,您必須建立並指定評分腳本(也稱為 批次驅動程式腳本),以指出如何透過輸入數據來建立預測。 在本文中,您將瞭解如何在不同案例的模型部署中使用評分腳本。 您也將瞭解批次端點的最佳做法。
提示
MLflow 模型不需要評分腳本。 它會自動為您產生。 如需批次端點如何使用 MLflow 模型的詳細資訊,請流覽 在批次部署 專用教學課程中使用 MLflow 模型。
警告
若要在批次端點下部署自動化 ML 模型,請注意,自動化 ML 提供僅適用於在線端點的評分腳本。 該評分腳本並非針對批次執行所設計。 如需如何建立評分腳本的詳細資訊,請遵循這些指導方針,針對您的模型所執行的作業進行自定義。
了解評分指令碼
評分腳本是 Python 檔案 (.py
) ,指定如何執行模型,並讀取批次部署執行程式提交的輸入數據。 每個模型部署都會在建立時提供評分腳本(以及所有其他必要相依性)。 評分腳本通常看起來像這樣:
deployment.yml
code_configuration:
code: code
scoring_script: batch_driver.py
評分指令碼必須包含兩個方法:
init
方法
將此 init()
方法用於任何昂貴或一般的準備。 例如,用其將模型載入記憶體中。 整個批次作業的開頭會呼叫此函式一次。 模型檔案可在環境變數 AZUREML_MODEL_DIR
所決定的路徑中使用。 視模型註冊方式而定,其檔案可能會包含在資料夾中。 在下一個範例中,模型在名為 model
的資料夾中有數個檔案。 如需詳細資訊,請流覽 如何判斷模型所使用的資料夾。
def init():
global model
# AZUREML_MODEL_DIR is an environment variable created during deployment
# The path "model" is the name of the registered model's folder
model_path = os.path.join(os.environ["AZUREML_MODEL_DIR"], "model")
# load the model
model = load_model(model_path)
在此範例中,我們會將模型放在全域變數 model
中。 若要提供對評分函式執行推斷所需的資產,請使用全域變數。
run
方法
run(mini_batch: List[str]) -> Union[List[Any], pandas.DataFrame]
使用方法來處理批次部署產生之每個迷你批次的評分。 針對您輸入數據所產生的每個 mini_batch
方法呼叫一次。 批次部署會根據部署設定的方式,以批次方式讀取數據。
import pandas as pd
from typing import List, Any, Union
def run(mini_batch: List[str]) -> Union[List[Any], pd.DataFrame]:
results = []
for file in mini_batch:
(...)
return pd.DataFrame(results)
此方法會以參數 (mini_batch
) 的形式接收檔案路徑清單。 您可以使用這份清單逐一查看並個別處理每個檔案,或讀取整個批次並一次處理一次。 最佳選項取決於計算記憶體和所需達到的輸送量。 如需描述如何一次讀取整個批次數據的範例,請流覽 高輸送量部署。
注意
如何散發工作?
批次部署會在檔案層級散發工作,這表示包含100個檔案的資料夾,包含10個檔案的迷你批次,每個檔案會產生10批10個檔案。 請注意,相關檔案的大小沒有相關性。 對於檔案太大而無法處理大型迷你批次,我們建議您將檔案分割成較小的檔案,以達到較高層級的平行處理原則,或減少每個迷你批次的檔案數目。 此時,批次部署無法考慮檔案大小散發中的扭曲。
run()
方法應該傳回 Pandas DataFrame
或陣列/清單。 每個傳回的輸出元素表示輸入 mini_batch
中輸入元素的一個成功執行。 對於檔案或資料夾數據資產,每個傳回的數據列/元素都代表已處理的單一檔案。 對於表格式數據資產,每個傳回的數據列/元素都代表已處理檔案中的數據列。
重要
如何寫入預測?
函 run()
式傳回的所有項目都會附加在批次作業產生的輸出預測檔案中。 請務必從此函式傳回正確的資料類型。 需要輸出單一預測時,請傳回陣列。 需要傳回多個資訊片段時,請傳回 Pandas DataFrame。 例如,針對表格式數據,您可能想要將預測附加至原始記錄。 使用 pandas DataFrame 來執行此動作。 雖然 pandas DataFrame 可能包含數據行名稱,但輸出檔案不包含這些名稱。
若要以不同的方式撰寫預測,您可以在 批次部署中自定義輸出。
警告
在函式中 run
,不要輸出複雜資料類型(或複雜資料類型的清單),而不是 pandas.DataFrame
。 這些輸出會轉換成字串,而且會變得難以讀取。
產生的 DataFrame 或數位會附加至指定的輸出檔案。 不需要結果的基數。 一個檔案可以在輸出中產生1或多個資料列/元素。 結果 DataFrame 或陣列中的所有元素皆會依現況寫入輸出檔案 (須注意 output_action
不是 summary_only
)。
用於評分的 Python 套件
您必須指出評分腳本必須在批次部署執行的環境中執行的任何連結庫。 針對評分腳本,每個部署都會指出環境。 通常,您會使用 conda.yml
相依性檔案來指出您的需求,如下所示:
mnist/environment/conda.yaml
name: mnist-env
channels:
- conda-forge
dependencies:
- python=3.8.5
- pip<22.0
- pip:
- torch==1.13.0
- torchvision==0.14.0
- pytorch-lightning
- pandas
- azureml-core
- azureml-dataset-runtime[fuse]
如需如何指出模型環境的詳細資訊,請 流覽建立批次部署 。
以不同方式撰寫預測
如部署中所述,批次部署預設會在單一檔案中寫入模型的預測。 不過,在某些情況下,您必須在多個檔案中撰寫預測。 例如,針對數據分割的輸入數據,您可能也想要產生數據分割的輸出。 在這些情況下,您可以 自定義批次部署 中的輸出,以指出:
- 用來撰寫預測的檔案格式 (CSV、parquet、json 等)
- 數據在輸出中分割的方式
如需如何達成目標的詳細資訊,請流覽 自定義批次部署 中的輸出。
評分指令碼的原始檔控制
強烈建議您將評分腳本放在原始檔控制之下。
撰寫評分指令碼的最佳做法
撰寫處理大量數據的評分腳本時,您必須考慮數個因素,包括
- 每個檔案的大小
- 每個檔案上的數據量
- 讀取每個檔案所需的記憶體數量
- 讀取整個檔案批次所需的記憶體數量
- 模型的記憶體使用量
- 在輸入數據上執行時,模型記憶體使用量
- 計算中的可用記憶體
批次部署會在檔案層級散發工作。 這表示包含 100 個檔案的資料夾,在 10 個檔案的迷你批次中,每個檔案會產生 10 批 10 個檔案(不論涉及的檔案大小為何)。 對於檔案太大而無法處理大型迷你批次,建議您將檔案分割成較小的檔案、達到較高層級的平行處理原則,或減少每個迷你批次的檔案數目。 此時,批次部署無法考慮檔案大小散發中的扭曲。
平行處理原則的程度與評分指令碼之間的關聯性
您的部署組態可控制每個迷你批次的大小,以及每個節點上的背景工作角色數目。 當您決定是否要讀取整個迷你批次來執行推斷、依檔案執行推斷檔案,或逐列執行推斷數據列時,這會變得很重要。 如需詳細資訊,請流覽 在迷你批次、檔案或數據列層級 執行推斷。
在同一個實例上執行多個背景工作角色時,您應該考慮所有背景工作角色之間共用記憶體的事實。 每個節點的背景工作角色數目增加通常伴隨著迷你批次大小的減少,或如果數據大小和計算 SKU 保持不變,則評分策略有所變更。
在迷你批次、檔案或資料列層級執行推斷
批次端點會 run()
針對每個迷你批次呼叫評分腳本中的函式一次。 不過,您可以決定是否要針對表格式數據逐一執行整個批次的推斷、一次一個檔案或一個以上的數據列。
迷你批次層級
您通常會想要一次透過批次執行推斷,以在批次評分程式中達到高輸送量。 如果您透過 GPU 執行推斷,而您想要達到推斷裝置的飽和度,就會發生這種情況。 如果數據不適合記憶體,例如 或PyTorch
數據載入器,TensorFlow
您也可能依賴可以處理批處理本身的數據載入器。 在這些情況下,您可能會想要在整個批次上執行推斷。
警告
在批次層級執行推斷可能需要密切控制輸入數據大小,以正確考慮記憶體需求,並避免記憶體不足例外狀況。 您是否可以在記憶體中載入整個迷你批次,取決於迷你批次的大小、叢集中的實例大小、每個節點上的背景工作角色數目,以及迷你批次的大小。
請流覽 高輸送量部署 ,以瞭解如何達成此目的。 此範例會一次處理整個批次的檔案。
檔案層級
執行推斷的最簡單方式之一是反覆執行迷你批次中的所有檔案,然後透過該模型執行模型。 在某些情況下,例如影像處理,這可能是個好主意。 針對表格式數據,您可能需要對每個檔案中的數據列數目進行很好的估計。 此估計值可顯示模型是否可以處理記憶體需求,以將整個數據載入記憶體,以及執行推斷。 某些模型(特別是以遞歸神經網路為基礎的模型)展開並呈現具有潛在非線性數據列計數的記憶體使用量。 對於記憶體費用較高的模型,請考慮在數據列層級執行推斷。
提示
請考慮將檔案分成太大而無法一次讀取成多個較小的檔案,以考慮更好的平行處理。
請流覽 使用批次部署進行 映像處理,以瞭解如何執行此動作。 該範例會一次處理檔案。
資料列層級 (表格式)
對於呈現其輸入大小挑戰的模型,您可能想要在數據列層級執行推斷。 您的批次部署仍會提供評分腳本與小型檔案批次。 不過,您將一次讀取一個檔案、一個數據列。 這似乎沒有效率,但對於某些深度學習模型而言,執行推斷的唯一方式,而不需要擴大硬體資源。
請流覽 使用批次部署 的文字處理,以瞭解如何執行這項操作。 該範例會一次處理一個數據列。
使用其為資料夾的模型
AZUREML_MODEL_DIR
環境變數包含所選模型位置的路徑,而且函init()
式通常會使用它將模型載入記憶體中。 不過,有些模型可能會在其資料夾中包含其檔案,而且載入這些模型時可能需要加以考慮。 您可以識別模型的資料夾結構,如下所示:
使用此路徑來載入模型:
def init():
global model
# AZUREML_MODEL_DIR is an environment variable created during deployment
# The path "model" is the name of the registered model's folder
model_path = os.path.join(os.environ["AZUREML_MODEL_DIR"], "model")
model = load_model(model_path)
下一步
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應