使用 MLflow 和 Azure Machine Learning 追蹤 Azure Databricks 機器學習實驗
MLflow 是一個開放原始碼程式庫,可用於管理機器學習實驗的生命週期。 您可以使用 MLflow 將 Azure Databricks 與 Azure Machine Learning 整合,確保從這兩項產品中獲得最佳效能。
在本文章中,您將了解:
- 使用 MLflow 搭配 Azure Databricks 與 Azure Machine Learning 所需的程式庫。
- 如何使用 Azure Machine Learning 中的 MLflow 追蹤 Azure Databricks 執行。
- 如何使用 MLflow 記錄模型,以在 Azure Machine Learning 中註冊它們。
- 如何部署和取用 Azure Machine Learning 中已註冊的模型。
必要條件
azureml-mlflow
套件,可處理與 Azure Machine Learning 的連線,包括驗證。- Azure Databricks 工作區和叢集。
- Azure Machine Learning 工作區。
Notebook 範例
在 Azure Databricks 中定型模型,並在 Azure Machine Learning 存放庫上部署模型示範如何在 Azure Databricks 中定型模型,並將其部署在 Azure Machine Learning 中。 其中也描述如何使用 Azure Databricks 中的 MLflow 執行個體來追蹤實驗和模型, 並描述如何使用 Azure Machine Learning 進行部署。
安裝程式庫
若要在叢集上安裝程式庫:
瀏覽至 [程式庫] 索引標籤,然後選取 [安裝新的]。
在 [套件] 欄位中輸入 azureml-mlflow,然後選取 [安裝]。 視需要重複此步驟,以將套件安裝到您的叢集來進行實驗。
使用 MLflow 追蹤 Azure Databricks 執行
您可將 Azure Databricks 設定為使用 MLflow 以兩種方式追蹤實驗:
根據預設,當您連結 Azure Databricks 工作區時,系統會為您設定雙重追蹤。
Azure Databricks 和 Azure Machine Learning 上的雙重追蹤
將 Azure Databricks 工作區連結至 Azure Machine Learning 工作區,可讓您同時在 Azure Machine Learning 工作區和 Azure Databricks 工作區中追蹤您的實驗資料。 此組態稱為「雙重追蹤」。
目前不支援在已啟用私人連結的 Azure Machine Learning 工作區中進行雙重追蹤。 請改用 Azure Machine Learning 工作區設定單獨追蹤。
由 21Vianet 營運的 Microsoft Azure 目前不支援雙重追蹤。 請改用 Azure Machine Learning 工作區設定單獨追蹤。
若要將您的 Azure Databricks 工作區連結至新的或現有的 Azure Machine Learning 工作區:
登入 Azure 入口網站。
瀏覽至 Azure Databricks 工作區 [概觀] 頁面。
選取您的 [連結 Azure Machine Learning 工作區]。
當您將 Azure Databricks 工作區與 Azure Machine Learning 工作區連結之後,MLflow 追蹤會自動在下列位置中追蹤:
- 連結的 Azure Machine Learning 工作區。
- 您的原始 Azure Databricks 工作區。
然後,您可以透過慣用的相同方式,在 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 部署選項啟用較簡單部署路徑的優點。
警告
針對已啟用私人連結的 Azure Machine Learning 工作區,您必須在自己的網路中部署 Azure Databricks (VNet 插入),以確保連線正常。
設定 MLflow 追蹤 URI,以單獨指向 Azure Machine Learning,如下列範例所示:
設定追蹤 URI
取得工作區的追蹤 URI。
登入和設定您的工作區。
az account set --subscription <subscription> az configure --defaults workspace=<workspace> group=<resource-group> location=<location>
您可以使用
az ml workspace
命令來取得追蹤 URI。az ml workspace show --query mlflow_tracking_uri
設定追蹤 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,而不是以每個工作階段為基礎執行。
設定環境變數之後,將在 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 的格式和值與追蹤 URI 的 MLflow 相同。
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 或受控推斷端點中進行即時和批次推斷。
- 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 將模型部署至 Azure Databricks,以進行批次計分
您可以選擇用於批次計分的 Azure Databricks 叢集。 藉由利用 Mlflow,您可以解析所連線登錄中的任何模型。 您通常會使用下列其中一個方法:
- 如果您的模型是使用 Spark 程式庫 (例如
MLLib
) 定型和建置,請使用mlflow.pyfunc.spark_udf
載入模型,並將其作為 Spark Pandas UDF 來為新資料評分。 - 如果您的模型並非使用 Spark 程式庫定型或建置,請使用
mlflow.pyfunc.load_model
或mlflow.<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 工作區取消連結。
如果您不打算在工作區中使用記錄的計量和成品,請刪除包含儲存體帳戶和工作區的資源群組。
- 在 Azure 入口網站中,搜尋資源群組。 選取 [資源群組] 下的 [服務]。
- 在 [資源群組] 清單中,尋找並選取您建立的資源群組以開啟。
- 在 [概觀] 頁面上,選取 [刪除資源群組]。
- 若要確認刪除,請輸入資源組名稱。