Share via


MLflow 中的成品到模型

下列文章說明 MLflow 成品與 MLflow 模型之間的差異,以及如何在兩者之間轉換。 此外也說明 Azure Machine Learning 如何使用 MLflow 模型的概念來啟用精簡的部署工作流程。

成品與模型之間有何差異?

如果您不熟悉 MLflow,您可能不了解記錄成品或檔案與記錄 MLflow 模型之間有何差異。 兩者之間有一些根本上的差異:

成品

成品是從實驗的執行或作業中產生 (並擷取) 的任何檔案。 成品可以代表序列化為 Pickle 檔案的模型、PyTorch 或 TensorFlow 模型的權數,甚或包含線性迴歸係數的文字檔。 有些成品也可能與模型本身無關;相反地,它們可以包含執行模型、前置處理資訊或範例資料等的設定。 成品可以有各種格式。

您可能已經記錄成品:

filename = 'model.pkl'
with open(filename, 'wb') as f:
  pickle.dump(model, f)

mlflow.log_artifact(filename)

模型

MLflow 中的模型也是成品。 不過,我們對這類型的成品做出更強有力的假設。 這類假設會在儲存的檔案與檔案的意義之間提供清楚的合約。 當您將模型記錄為成品 (簡單的檔案) 時,您需要知道模型建立器對每個檔案的含義,以便了解如何載入模型以進行推斷。 相反地,MLflow 模型可以藉由 MLmodel 格式中指定的合約來載入。

在 Azure Machine Learning 中,記錄模型具有下列優點:

  • 您可以將它們部署到即時或批次端點,而不需提供評分指令碼或環境。
  • 當您部署模型時,部署會自動產生 Swagger,而且測試功能可用於 Azure Machine Learning 工作室。
  • 您可以直接使用模型作為管線輸入。
  • 您可以將負責任 AI 儀表板與您的模型搭配使用。

您可以使用 MLflow SDK 來記錄模型:

import mlflow
mlflow.sklearn.log_model(sklearn_estimator, "classifier")

MLmodel 格式

MLflow 採用 MLmodel 格式,作為在成品及其代表的項目之間建立合約的方式。 MLmodel 格式會將資產儲存在資料夾中。 在這些資產中,有一個名為 MLmodel 的檔案。 此檔案是有關於如何載入及使用模型的單一事實來源。

下列螢幕擷取畫面顯示 Azure Machine Learning 工作室中的範例 MLflow 模型資料夾。 此模型放置在名為 credit_defaults_model 的資料夾中。 此資料夾的命名沒有特定的需求。 此資料夾包含 MLmodel 檔案以及其他模型成品。

A screenshot showing assets of a sample MLflow model, including the MLmodel file.

下列程式碼是使用 fastai 定型之電腦視覺模型的 MLmodel 檔案的範例:

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 引入了風格 (flavor) 的概念,作為一種在所有機器學習架構上提供唯一處理合約的方式。 風格會指出使用特定架構所建立的指定模型應有的行為。 例如,TensorFlow 有其本身的風格,指定了 TensorFlow 模型應如何保存和載入。 因為每個模型風格都會指出如何保存和載入指定架構的模型,因此 MLmodel 格式不會強制執行所有模型都必須支援的單一序列化機制。 這項決定可讓每種風格根據其最佳做法來使用提供最佳效能或最佳支援的方法,而不會影響與 MLmodel 標準的相容性。

下列程式碼是 fastai 模型的 flavors 區段範例。

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 簽章強制執行

簽章會在記錄模型時顯示,而且它們會保存在 MLmodel 檔案的 signature 區段中。 MLflow 中的 Autolog 功能會盡可能自動推斷簽章。 不過,如果推斷的簽章不是您需要的簽章,您可能必須手動記錄模型。 如需詳細資訊,請參閱如何使用簽章來記錄模型

簽章有兩種類型:

  • 以資料行為基礎的簽章:此簽章會在表格式資料上運作。 對於具有此簽章類型的模型,MLflow 會提供 pandas.DataFrame 物件做為輸入。
  • Tensor 型簽章:此簽章會以 n 維陣列或張量運作。 對於具有此簽章的模型,MLflow 會提供 numpy.ndarray 做為輸入 (若使用具名張量簽章,則為 numpy.ndarray 的字典)。

下列範例對應於使用 fastai 定型的電腦視覺模型。 此模型會收到一批以圖形 (300, 300, 3) 的張量表示的影像,及其 RGB 表示法 (不帶正負號的整數)。 此模型會輸出兩個類別的預測 (機率) 批次。

MLmodel

signature:
  inputs: '[{"type": "tensor",
             "tensor-spec": 
                 {"dtype": "uint8", "shape": [-1, 300, 300, 3]}
           }]'
  outputs: '[{"type": "tensor", 
              "tensor-spec": 
                 {"dtype": "float32", "shape": [-1,2]}
            }]'

提示

Azure Machine Learning 會產生一個 Swagger 檔案,以用於部署具有可用簽章的 MLflow 模型。 這可讓您更輕鬆地使用 Azure Machine Learning 工作室來測試部署。

模型環境

執行模型的需求指定於 conda.yaml 檔案中。 MLflow 可以自動偵測相依性,或者您也可以藉由呼叫 mlflow.<flavor>.log_model() 方法來手動指示它們。 如果您的環境中包含的程式庫不是您打算使用的程式庫,則後者可能很有用。

下列程式碼是用於使用 fastai 架構所建立之模型的環境範例:

conda.yaml

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 Machine Learning 環境之間的差異為何?

MLflow 環境是在模型層級運作,而 Azure Machine Learning 環境則是在工作區 (對於已註冊的環境) 或作業/部署 (對於匿名環境) 層級運作。 當您在 Azure Machine Learning 中部署 MLflow 模型時,即會建置模型的環境並將其用於部署。 或者,您也可以使用 Azure Machine Learning CLI v2 覆寫此行為,並使用特定的 Azure Machine Learning 環境來部署 MLflow 模型。

Predict 函式

所有 MLflow 模型都包含 predict 函式。 使用無程式碼部署體驗部署模型時會呼叫此函式predict 函式所傳回的內容 (例如,類別、機率或預測) 取決於用於定型的架構 (即風格)。 請閱讀每種風格的文件,以了解其傳回的內容。

在某些情況下,您可能需要自訂此 predict 函式,以變更推斷的執行方式。 在此類情況下,您必須記錄在預測方法中有不同行為的模型,或記錄自訂模型的風格

載入 MLflow 模型的工作流程

您可以從幾個位置中來載入作為 MLflow 模型所建立的模型,包括:

  • 直接從記錄模型的執行中
  • 從儲存模型的檔案系統中
  • 從註冊模型的模型登錄中。

無論模型位於何處,MLflow 都可讓您以一致的方式來載入這些模型。

有兩個工作流程可用來載入模型:

  • 重新載入已記錄的相同物件和類型:您可以使用 MLflow SDK 來載入模型,並取得類型屬於定型程式庫的模型執行個體。 例如,ONNX 模型會傳回 ModelProto,而使用 scikit-learn 定型的決策樹模型會傳回 DecisionTreeClassifier 物件。 使用 mlflow.<flavor>.load_model() 來重新載入已記錄的相同模型物件和類型。

  • 重新載入執行推斷的模型: 您可以使用 MLflow SDK 來載入模型,並取得包裝函式 (其中 MLflow 保證會有 predict 函式)。 無論您使用哪種風格,每個 MLflow 模型都有 predict 函式。 此外,MLflow 還保證可以使用類型 pandas.DataFramenumpy.ndarraydict[string, numpyndarray] 的引數來呼叫此函式 (視模型的簽章而定)。 MLflow 會針對模型所預期的輸入類型處理其類型轉換。 使用 mlflow.pyfunc.load_model() 來重新載入模型以執行推斷。