共用方式為


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 檔案和其他模型成品。

顯示範例 MLflow 模型資產的螢幕擷取畫面,其中包含 MLmodel 檔案。

下列範例顯示使用 定型之電腦視覺模型的 fastaiMLmodel 檔案:

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.DataFramenumpy.ndarray自變數,根據模型簽章來呼叫此函式。 MLflow 會針對模型所預期的輸入類型處理其類型轉換。 使用 mlflow.pyfunc.load_model() 來重新載入模型以執行推斷。