MLflow 中的成品和模型
本文說明 MLflow 成品和 MLflow 模型,以及 MLflow 模型與其他成品有何不同。 本文也會說明 Azure 機器學習 如何使用 MLflow 模型的特性來啟用簡化的部署工作流程。
成品和模型
在 MLflow 中,記錄簡單檔案成品和記錄 MLflow 模型之間有一些基本差異。
成品
成品是從實驗的執行或作業中產生並擷取的任何檔案。 成品可以是串行化為pickle檔案的模型、PyTorch或 TensorFlow 模型的權數,或包含線性回歸係數的文字檔。 有些成品與模型本身無關,但包含執行組態、前置處理資訊或範例數據。 成品可以有各種格式。
下列範例會記錄檔案成品。
filename = 'model.pkl'
with open(filename, 'wb') as f:
pickle.dump(model, f)
mlflow.log_artifact(filename)
Model
MLflow 模型是一個成品,您可以做出更有力的假設,以提供儲存盤案與它們的意義之間的明確合約。 不過,如果您將模型的檔案記錄為成品,您必須知道每個檔案的意義,以及如何載入它們以進行推斷。
您可以使用 MLflow SDK 來記錄 MLflow 模型,例如:
import mlflow
mlflow.sklearn.log_model(sklearn_estimator, "classifier")
在 Azure 中記錄 MLflow 模型 機器學習 具有下列優點:
- 您可以將 MLflow 模型部署到即時或批次端點,而不需要提供評分腳本或環境。
- 當您部署 MLflow 模型時,部署會自動產生 swagger 檔案,因此您可以在 Azure Machine Learning 工作室 中使用測試功能。
- 您可以直接使用 MLflow 模型作為管線輸入。
- 您可以使用 負責任 AI 儀錶板 搭配 MLflow 模型。
MLmodel 格式
對於記錄為簡單成品檔案的模型,您必須先知道模型產生器針對每個檔案的用途,才能載入模型以進行推斷。 但是對於 MLflow 模型,您可以使用 MLmodel 格式來載入模型,以指定成品之間的合約及其代表的內容。
MLmodel 格式會將資產儲存在沒有特定命名需求的資料夾中。 資產中有一 個名為 MLmodel 的檔案,這是如何載入和使用模型的單一事實來源。
下圖顯示 Azure Machine Learning 工作室 中名為 credit_defaults_model 的 MLflow 模型資料夾。 資料夾包含 MLmodel 檔案和其他模型成品。
下列範例顯示使用 定型之電腦視覺模型的 fastai
MLmodel 檔案:
artifact_path: classifier
flavors:
fastai:
data: model.fastai
fastai_version: 2.4.1
python_function:
data: model.fastai
env: conda.yaml
loader_module: mlflow.fastai
python_version: 3.8.12
model_uuid: e694c68eba484299976b06ab9058f636
run_id: e13da8ac-b1e6-45d4-a9b2-6a0a5cfac537
signature:
inputs: '[{"type": "tensor",
"tensor-spec":
{"dtype": "uint8", "shape": [-1, 300, 300, 3]}
}]'
outputs: '[{"type": "tensor",
"tensor-spec":
{"dtype": "float32", "shape": [-1,2]}
}]'
模型風格
考慮到可用的大量機器學習架構,MLflow 引進了類別的概念,作為為所有機器學習架構提供唯一合約的方法。 類別表示特定架構所建立之指定模型的預期。 例如,TensorFlow 有自己的類別,指定如何保存和載入 TensorFlow 模型。
因為每個模型風格都會指出如何保存和載入指定架構的模型,因此 MLmodel 格式不會強制執行所有模型都必須支援的單一序列化機制。 因此,每個口味都可以使用根據最佳作法提供最佳效能或最佳支援的方法,而不會影響與 MLmodel 標準的相容性。
下列範例顯示 flavors
模型的 區段 fastai
。
flavors:
fastai:
data: model.fastai
fastai_version: 2.4.1
python_function:
data: model.fastai
env: conda.yaml
loader_module: mlflow.fastai
python_version: 3.8.12
模型簽章
MLflow 模型簽章 是模型規格的重要組成部分,因為它可作為模型與執行模型之伺服器之間的數據合約。 模型簽章對於在部署階段剖析和強制執行模型的輸入類型也很重要。 如果簽章可用,MLflow 會在數據提交至模型時強制執行輸入類型。 如需詳細資訊,請參閱 MLflow 簽章強制執行。
簽章會在記錄模型時指出,並且會signature
保存在 MLmodel 檔案的 區段中。 MLflow 中的自動記錄功能會自動盡最大努力推斷簽章。 不過,如果推斷的簽章不是您需要的簽章,您可以手動記錄模型。 如需詳細資訊,請參閱如何使用簽章來記錄模型。
簽章有兩種類型:
- 以數據行為基礎的簽章會在 表格式數據上運作。 對於具有此簽章類型的模型,MLflow 會提供
pandas.DataFrame
物件做為輸入。 - 以 Tensor 為基礎的簽章會 使用 n 維陣列或張量運作。 對於具有此簽章的模型,MLflow 會
numpy.ndarray
提供做為輸入,或指定張量的字典numpy.ndarray
。
下列範例顯示 signature
使用 定型的計算機視覺模型 fastai
區段。 此模型會接收一批以圖形張量表示的 (300, 300, 3)
影像,其 RGB 表示法為不帶正負號的整數。 模型會將預測批次輸出為兩個類別的機率。
signature:
inputs: '[{"type": "tensor",
"tensor-spec":
{"dtype": "uint8", "shape": [-1, 300, 300, 3]}
}]'
outputs: '[{"type": "tensor",
"tensor-spec":
{"dtype": "float32", "shape": [-1,2]}
}]'
提示
Azure 機器學習 會產生 Swagger 檔案,以部署具有可用簽章的 MLflow 模型。 此檔案可讓您更輕鬆地使用 Azure Machine Learning 工作室 測試部署。
模型環境
要執行的模型需求是在 conda.yaml 檔案中指定。 MLflow 可以自動偵測相依性,或者您可以呼叫 mlflow.<flavor>.log_model()
方法來手動指示它們。 如果環境中包含的 MLflow 連結庫不是您想要使用的連結庫,則呼叫 方法會很有用。
下列 conda.yaml 範例顯示使用 fastai
架構建立之模型的環境:
channels:
- conda-forge
dependencies:
- python=3.8.5
- pip
- pip:
- mlflow
- astunparse==1.6.3
- cffi==1.15.0
- configparser==3.7.4
- defusedxml==0.7.1
- fastai==2.4.1
- google-api-core==2.7.1
- ipython==8.2.0
- psutil==5.9.0
name: mlflow-env
注意
MLflow 環境會以模型層級運作,但 Azure 機器學習 環境會在已註冊環境的工作區層級或匿名環境的作業/部署層級運作。 當您部署 MLflow 模型時,Azure 機器學習 會建置模型環境,並將其用於部署。 您可以使用 Azure 機器學習 CLI 來覆寫此行為,並將 MLflow 模型部署到特定的 Azure 機器學習 環境。
Predict 函式
所有 MLflow 模型都包含一個 predict
函式,此函式會在使用無程式代碼部署來部署模型時呼叫。 predict
函式傳回的內容,例如類別、機率或預測,取決於用於定型的架構或類別。 每個類別的檔會描述其傳回的內容。
您可以自定義 函 predict
式,以變更推斷的執行方式。 您可以使用 不同的行為來記錄模型,或 記錄自定義模型類別。
載入 MLflow 模型的工作流程
您可以從下列位置載入 MLflow 模型:
- 直接從記錄模型的執行
- 從儲存模型的文件系統
- 從註冊模型的模型登錄
不論位置為何,MLflow 都會提供一致的方式來載入這些模型。
載入模型有兩個工作流程:
載入已記錄的相同物件和類型。 您可以使用 MLflow SDK 載入模型,並使用屬於定型連結庫的類型來取得模型的實例。 例如,開放式類神經網路交換 (ONNX) 模型會
ModelProto
傳回 ,而使用 定型的scikit-learn
判定樹模型會DecisionTreeClassifier
傳回 物件。 使用mlflow.<flavor>.load_model()
來重新載入已記錄的相同模型物件和類型。載入模型以執行推斷。 您可以使用 MLflow SDK 載入模型,並取得具有保證函式的
predict
包裝函式。 您所使用的類別並不重要,因為每個 MLflow 模型都有函predict
式。MLflow 保證您可以使用 、、 或
dict[string, numpyndarray]
類型的pandas.DataFrame
numpy.ndarray
自變數,根據模型簽章來呼叫此函式。 MLflow 會針對模型所預期的輸入類型處理其類型轉換。 使用mlflow.pyfunc.load_model()
來重新載入模型以執行推斷。