將自訂 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 中的從成品到模型。
如果您未使用 MLFlow 將模型定型,而且想要使用 Azure Machine Learning 的 MLflow 無程式碼部署供應項目,您必須將自訂模型轉換為 MLFLow。 如需詳細資訊,請參閱自訂 Python 模型。
必要條件
- 安裝
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 模型變體的模型,請參閱登錄未受支援的機器學習模型相關範例。