共用方式為


將自訂 ML 模型轉換為 MLflow 格式化模型

在本文中,了解如何將自訂 ML 模型轉換成 MLflow 格式。 MLflow 是一個開放原始碼程式庫,可用於管理機器學習實驗的生命週期。 在某些情況下,您可能會使用機器學習架構,而不需要其內建的 MLflow 模型變體支援。 由於缺乏內建的 MLflow 模型變體,因此您無法使用 MLflow 模型 Fluent API 來記錄或註冊模型。 若要解決此問題,您可以將模型轉換成 MLflow 格式,您可以在其中利用下列 Azure Machine Learning 和 MLflow 模型的優點。

透過 Azure Machine Learning,MLflow 模型會獲得下列新增的優點:

  • 無程式碼部署
  • 開放原始碼標準格式所帶來的可攜性
  • 能夠在本機和雲端上進行部署

MLflow 支援各種機器學習架構 (scikit-learn、Keras、Pytorch 等等);不過,其可能不會涵蓋每個使用案例。 例如,您可能需要使用 MLflow 原生未支援的架構來建立 MLflow 模型,或者您可能要在執行作業時,變更模型執行預先處理或後置處理的方式。 若要深入了解 MLflow 模型,請參閱從成品到 MLflow 中的模型

如果您未使用 MLFlow 將模型定型,而且想要使用 Azure Machine Learning 的 MLflow 無程式碼部署供應項目,您必須將自訂模型轉換為 MLFLow。 深入了解自訂 Python 模型和 MLflow

必要條件

只需要已安裝的 mlflow 套件即可將您的自訂模型轉換為 MLflow 格式。

為您的模型建立 Python 包裝函式

您必須先為您的模型建立 Python 包裝函式,才能將模型轉換為 MLflow 支援的格式。 下列程式碼示範如何建立 sklearn 模型的 Python 包裝函式。


# Load training and test datasets
from sys import version_info
import sklearn
import mlflow.pyfunc


PYTHON_VERSION = "{major}.{minor}.{micro}".format(major=version_info.major,
                                                  minor=version_info.minor,
                                                  micro=version_info.micro)

# Train and save an SKLearn model
sklearn_model_path = "model.pkl"

artifacts = {
    "sklearn_model": sklearn_model_path
}

# create wrapper
class SKLearnWrapper(mlflow.pyfunc.PythonModel):

    def load_context(self, context):
        import pickle
        self.sklearn_model = pickle.load(open(context.artifacts["sklearn_model"], 'rb'))
    
    def predict(self, model, data):
        return self.sklearn_model.predict(data)

建立 Conda 環境

接下來,您必須為包含所有必要相依性的新 MLflow 模型建立 Conda 環境。 若未指出,則會從目前的安裝推斷環境。 如果沒有,則可加以指定。


import cloudpickle
conda_env = {
    'channels': ['defaults'],
    'dependencies': [
      'python={}'.format(PYTHON_VERSION),
      'pip',
      {
        'pip': [
          'mlflow',
          'scikit-learn=={}'.format(sklearn.__version__),
          'cloudpickle=={}'.format(cloudpickle.__version__),
        ],
      },
    ],
    'name': 'sklearn_env'
}

載入 MLFlow 格式化模型並測試預測

一旦環境準備就緒後,您就可以將 SKlearnWrapper、Conda 環境,以及新建立的構件字典傳遞至 mlflow.pyfunc.save_model() 方法。 這麼做會將模型儲存到您的磁碟。

mlflow_pyfunc_model_path = "sklearn_mlflow_pyfunc_custom"
mlflow.pyfunc.save_model(path=mlflow_pyfunc_model_path, python_model=SKLearnWrapper(), conda_env=conda_env, artifacts=artifacts)

為了確保新儲存的 MLflow 格式化模型在儲存期間未變更,您可以載入模型並列印出測試預測,來比較原始模型。

下列程式碼會從 mlflow 格式化模型列印測試預測,以及 sklearn 模型 (已儲存至磁碟以供比較) 的測試預測。

loaded_model = mlflow.pyfunc.load_model(mlflow_pyfunc_model_path)

input_data = "<insert test data>"
# Evaluate the model
import pandas as pd
test_predictions = loaded_model.predict(input_data)
print(test_predictions)

# load the model from disk
import pickle
loaded_model = pickle.load(open(sklearn_model_path, 'rb'))
result = loaded_model.predict(input_data)
print(result)

註冊 MLflow 格式化模型

確認模型已正確儲存之後,您可以建立測試回合,以便註冊 MLflow 格式化模型,並將其儲存至模型登錄。


mlflow.start_run()

mlflow.pyfunc.log_model(artifact_path=mlflow_pyfunc_model_path, 
                        loader_module=None, 
                        data_path=None, 
                        code_path=None,
                        python_model=SKLearnWrapper(),
                        registered_model_name="Custom_mlflow_model", 
                        conda_env=conda_env,
                        artifacts=artifacts)
mlflow.end_run()

重要

在某些情況下,您可能會使用機器學習架構,而不需要其內建的 MLflow 模型變體支援。 例如,vaderSentiment 程式庫是用於情感分析的標準自然語言處理 (NLP) 程式庫。 由於缺乏內建的 MLflow 模型變體,因此您無法使用 MLflow 模型 Fluent API 來記錄或註冊模型。 請參閱如何儲存、記錄和註冊沒有受支援內建 MLflow 模型變體的模型相關範例。

下一步