使用 MLflow 和 Azure Machine Learning 追蹤 Azure Databricks ML 實驗

MLflow 是一個開放原始碼程式庫,可用於管理機器學習實驗的生命週期。 您可以使用 MLflow 將 Azure Databricks 與 Azure Machine Learning 整合,確保從這兩項產品中獲得最佳效能。

在本文中,您將了解:

必要條件

Notebook 範例

在 Azure Databricks 中定型模型,並在 Azure Machine Learning 上部署模型示範如何在 Azure Databricks 中定型模型,並將其部署在 Azure Machine Learning 中。 其也包括如何處理您也想要在 Azure Databricks 中使用 MLflow 執行個體來追蹤實驗和模型,並利用 Azure Machine Learning 進行部署的情況。

安裝程式庫

若要在叢集上安裝程式庫,請瀏覽至 [程式庫] 索引標籤,然後選取 [安裝新程式庫]

mlflow with azure databricks

在 [套件] 欄位中輸入 azureml-mlflow,然後選取 [安裝]。 視需要重複此步驟,以將其他套件安裝到您的叢集來進行實驗。

Azure DB install mlflow library

使用 MLflow 追蹤 Azure Databricks 執行

Azure Databricks 可以設定為使用 MLflow 以兩種方式追蹤實驗:

根據預設,當您連結 Azure Databricks 工作區時,系統會為您設定雙重追蹤。

Azure Databricks 和 Azure Machine Learning 上的雙重追蹤

將 ADB 工作區連結至 Azure Machine Learning 工作區,可讓您同時在 Azure Machine Learning 工作區和 Azure Databricks 工作區中追蹤您的實驗資料。 這稱為雙重追蹤。

警告

由 21Vianet 營運的 Microsoft Azure 目前不支援雙重追蹤。 請改用 Azure Machine Learning 工作區設定單獨追蹤

若要將您的 ADB 工作區連結至新的或現有的 Azure Machine Learning 工作區,

  1. 登入 Azure 入口網站
  2. 瀏覽至您 ADB 工作區的 [概觀] 頁面。
  3. 選取右下方的 [連結 Azure Machine Learning 工作區] 按鈕。

Link Azure DB and Azure Machine Learning workspaces

當您將 Azure Databricks 工作區與 Azure Machine Learning 工作區連結之後,MLflow 追蹤會自動設定為在所有下列位置中追蹤:

  • 連結的 Azure Machine Learning 工作區。
  • 您的原始 ADB 工作區。

然後,您可以透過慣用的相同方式,在 Azure Databricks 中使用 MLflow。 下列範例會設定實驗名稱,因為它通常是在 Azure Databricks 中完成,並開始記錄一些參數:

import mlflow 

experimentName = "/Users/{user_name}/{experiment_folder}/{experiment_name}" 
mlflow.set_experiment(experimentName) 

with mlflow.start_run():
   mlflow.log_param('epochs', 20)
   pass

注意

與追蹤相反,模型登錄不支援同時在 Azure Machine Learning 和 Azure Databricks 上註冊模型。 必須使用其中一個或另一個。 如需詳細資訊,請參閱使用 MLflow 在登錄中註冊模型一節。

單獨在 Azure Machine Learning 工作區上追蹤

如果您想要在集中位置管理追蹤的實驗,可以將 MLflow 追蹤設定為在 Azure Machine Learning 工作區中追蹤。 此設定具有使用 Azure Machine Learning 部署選項啟用較簡單部署路徑的優點。

您必須設定 MLflow 追蹤 URI,以單獨指向 Azure Machine Learning,如下列範例所示:

設定追蹤 URI

  1. 取得工作區的追蹤 URI:

    適用於:Azure CLI ml 延伸模組 v2 (目前)

    1. 登入和設定您的工作區:

      az account set --subscription <subscription>
      az configure --defaults workspace=<workspace> group=<resource-group> location=<location> 
      
    2. 您可以使用 az ml workspace 命令來取得追蹤 URI:

      az ml workspace show --query mlflow_tracking_uri
      
  2. 設定追蹤 URI:

    然後,此方法 set_tracking_uri() 會將 MLflow 追蹤 URI 指向該 URI。

    import mlflow
    
    mlflow.set_tracking_uri(mlflow_tracking_uri)
    

    提示

    使用共用環境時,例如 Azure Databricks 叢集、Azure Synapse Analytics 叢集或類似環境,最好在叢集層級設定環境變數 MLFLOW_TRACKING_URI,以自動設定 MLflow 追蹤 URI,針對叢集中執行的所有工作階段指向 Azure Machine Learning,而不是針對每個工作階段執行。

    Configure the environment variables in an Azure Databricks cluster

    設定環境變數之後,將在 Azure Machine Learning 中追蹤在這類叢集中執行的任何實驗。

設定驗證

設定追蹤之後,您也必須設定如何對相關聯工作區執行驗證。 根據預設,MLflow 的 Azure Machine Learning 外掛程式會開啟預設瀏覽器來提示輸入認證,以執行互動式驗證。 請參閱設定 Azure Machine Learning 的 MLflow:設定驗證為 Azure Machine Learning 工作區中的 MLflow 設定驗證的其他方式。

對於有使用者連線到工作階段的互動式作業,您可以依賴互動式驗證,因此不需要採取進一步的動作。

警告

互動式瀏覽器驗證會在提示輸入認證時封鎖程式碼執行。 不適合在自動環境中進行驗證,例如定型作業。 建議您設定其他驗證模式。

針對需要自動執行的案例,您必須設定服務主體以與 Azure Machine Learning 通訊。

import os

os.environ["AZURE_TENANT_ID"] = "<AZURE_TENANT_ID>"
os.environ["AZURE_CLIENT_ID"] = "<AZURE_CLIENT_ID>"
os.environ["AZURE_CLIENT_SECRET"] = "<AZURE_CLIENT_SECRET>"

提示

在共用環境上工作時,建議您在計算中設定這些環境變數。 最佳做法是盡可能將其作為 Azure Key Vault 執行個體中的祕密加以管理。 例如在 Azure Databricks 中,您可以在環境變數中使用祕密,如下的叢集設定所示:AZURE_CLIENT_SECRET={{secrets/<scope-name>/<secret-name>}}。 如需如何在 Azure Databricks 中執行這項操作,請參閱參考環境變數中的祕密,或參考平台中的類似文件。

Azure Machine Learning 中的實驗名稱

當 MLflow 設定為以單獨方式追蹤 Azure Machine Learning 工作區中的實驗時,實驗的命名慣例必須遵循 Azure Machine Learning 所使用的命名慣例。 在 Azure Databricks 中,實驗會以儲存實驗的路徑命名為類似以下:/Users/alice@contoso.com/iris-classifier。 不過,在 Azure Machine Learning 中,您必須直接提供實驗名稱。 如同上一個範例,相同的實驗會直接命名為 iris-classifier

mlflow.set_experiment(experiment_name="experiment-name")

追蹤參數、計量和成品

然後,您可以透過慣用的相同方式,在 Azure Databricks 中使用 MLflow。 如需詳細資料,請參閱記錄和檢視計量與記錄檔

使用 MLflow 記錄模型

在訓練您的模型之後,您可以使用 mlflow.<model_flavor>.log_model() 方法,將模型記錄至追蹤伺服器。 <model_flavor>,是指與模型相關聯的架構。 了解支援的模型變體。 在下列範例中,正在註冊以 Spark 程式庫 MLLib 建立的模型:

mlflow.spark.log_model(model, artifact_path = "model")

值得一提的是,此類別 spark 並未對應我們在 Spark 叢集中訓練模型的事實,而是因為所使用的訓練架構而導致 (您可以使用 TensorFlow 搭配 Spark 來完美訓練模型,因此要使用的類別會是 tensorflow)。

模型會記錄在正在追蹤的執行內。 這代表,該模型可用於 Azure Databricks 和 Azure Machine Learning 中 (預設),或者如果您將追蹤 URI 設定為指向 Azure Machine Learning,則可在 Azure Machine Learning 中獨佔模型。

重要

請注意,這裡尚未指定參數 registered_model_name。 如需這類參數含意和登錄運作方式的詳細資訊,請參閱 使用 MLflow 在登錄中註冊模型 一節。

使用 MLflow 在登錄中註冊模型

與追蹤相反,模型登錄無法在 Azure Databricks 和 Azure Machine Learning 中同時運作。 必須使用其中一個或另一個。 Azure Databricks 工作區預設為用於模型登錄;除非您選擇將 MLflow 追蹤設定為只在 Azure Machine Learning 工作區中追蹤,則模型登錄就是 Azure Machine Learning 工作區。

然後,考慮到您正在使用預設設定,下列這一行會在 Azure Databricks 和 Azure Machine Learning 的對應執行中記錄模型,但只會在 Azure Databricks 上註冊模型:

mlflow.spark.log_model(model, artifact_path = "model", 
                       registered_model_name = 'model_name')  
  • 如果具有該名稱的已註冊模型不存在,則此方法會註冊新的模型、建立第 1 版,並傳回 ModelVersion MLflow 物件。

  • 如果具有該名稱的已註冊模型已存在,則此方法會建立新的模型版本,並傳回版本物件。

搭配 MLflow 使用 Azure Machine Learning 登錄

如果您想要使用 Azure Machine Learning 模型登錄,而不是 Azure Databricks,我們建議您將 MLflow 追蹤設定為只在 Azure Machine Learning 工作區中追蹤。 這會避免註冊模型的位置模棱兩可,並簡化複雜度。

不過,如果您想要繼續使用雙重追蹤功能,但在 Azure Machine Learning 中註冊模型,您可以設定 MLflow 模型登錄 URI,指示 MLflow 使用 Azure Machine Learning 進行模型登錄。 此 URI 的格式和值與 MLflow 追蹤 URI 完全相同。

mlflow.set_registry_uri(azureml_mlflow_uri)

注意

azureml_mlflow_uri 值的取得方式,是與將 MLflow 追蹤設定為只在 Azure Machine Learning 工作區中追蹤內所示範的方式相同

如需此案例的完整範例,請查看範例在 Azure Databricks 中定型模型,並在 Azure Machine Learning 上部署模型

部署和取用 Azure Machine Learning 中已註冊的模型

Azure Machine Learning 服務中使用 MLflow 的已註冊模型,可用作:

  • Azure Machine Learning 端點 (即時和批次):此部署可讓您利用 Azure Machine Learning 部署功能,在 Azure 容器執行個體 (ACI)、Azure Kubernetes (AKS) 或受控推斷端點中進行即時和批次推斷。

  • MLFlow 模型物件或 Pandas UDF,可用於串流或批次管線中的 Azure Databricks 筆記本。

將模型部署到 Azure Machine Learning 端點

您可以利用 azureml-mlflow 外掛程式,將模型部署到您的 Azure Machine Learning 工作區。 如需如何將模型部署到不同目標的完整詳細資料,請參閱如何部署 MLflow 模型頁面。

重要

模型必須在 Azure Machine Learning 登錄中註冊,才能加以部署。 如果您的模型註冊在 Azure Databricks 內的 MLflow 實例中,您必須在 Azure Machine Learning 中再次註冊它們。 如果是這種情況,請查看範例在 Azure Databricks 中定型模型,並在 Azure Machine Learning 上部署模型

使用 UDF 將模型部署至 ADB,以進行批次計分

您可以選擇用於批次計分的 Azure Databricks 叢集。 藉由利用 Mlflow,您可以解析所連線登錄中的任何模型。 您通常有下列兩種方法可用:

  • 如果您的模型是使用 Spark 程式庫 (例如 MLLib) 定型和建置,請使用 mlflow.pyfunc.spark_udf 載入模型,並將其作為 Spark Pandas UDF 來為新資料評分。
  • 如果您的模型並非使用 Spark 程式庫定型或建置,請使用 mlflow.pyfunc.load_modelmlflow.<flavor>.load_model 在叢集驅動程式中載入模型。 請注意,如此一來,您想要在叢集中發生的任何平行處理或工作散發,都必須由您協調。 另請注意,MLflow 不會安裝模型執行所需的任何程式庫。 這些程式庫在執行之前必須先安裝至叢集中。

下列範例示範如何從名為 uci-heart-classifier 的登錄載入模型,並將其作為 Spark Pandas UDF 來為新資料評分。

from pyspark.sql.types import ArrayType, FloatType 

model_name = "uci-heart-classifier"
model_uri = "models:/"+model_name+"/latest"

#Create a Spark UDF for the MLFlow model 
pyfunc_udf = mlflow.pyfunc.spark_udf(spark, model_uri) 

提示

如需從登錄參考模型的更多方法,請查看從登錄載入模型

載入模型之後,您就能用來為新資料評分:

#Load Scoring Data into Spark Dataframe 
scoreDf = spark.table({table_name}).where({required_conditions}) 

#Make Prediction 
preds = (scoreDf 
           .withColumn('target_column_name', pyfunc_udf('Input_column1', 'Input_column2', ' Input_column3', …)) 
        ) 

display(preds) 

清除資源

如果您想要保留 Azure Databricks 工作區,但不再需要 Azure Machine Learning 工作區,您可以刪除 Azure Machine Learning 工作區。 此動作會導致您的 Azure Databricks 工作區和 Azure Machine Learning 工作區取消連結。

如果您不打算在工作區使用已記錄的計量和成品,則目前無法個別刪除這些項目。 請改以刪除包含儲存體帳戶和工作區的資源群組,以免產生任何費用:

  1. 在 Azure 入口網站中,選取最左邊的 [資源群組]

    Delete in the Azure portal

  2. 在清單中,選取您所建立的資源群組。

  3. 選取 [刪除資源群組]

  4. 輸入資源群組名稱。 接著選取刪除

下一步