Azure Databricks 提供的舊版 MLflow 模型服務

重要

這項功能處於公開預覽狀態。

重要

  • 此文件已淘汰,且可能未更新。 不再支援此內容中提及的產品、服務或技術。
  • 本文中的指引適用於舊版 MLflow 模型服務。 Databricks 建議您將模型服務工作流程移轉至模型服務,以取得增強的模型端點部署和延展性。 欲了解更多資訊,請參閱 「使用模型服務部署模型」。

舊版 MLflow 模型服務可讓您將模型登錄中的機器學習模型裝載為 REST 端點,這些端點會根據模型版本及其階段的可用性自動更新。 它會使用在您自己的帳戶下執行的單一節點叢集,該叢集位於現稱為傳統運算平面的環境中。 此計算平面包含虛擬網路及其相關聯的計算資源,例如筆記本和作業的叢集、專業和傳統 SQL 倉儲,以及舊版模型服務端點。

當您為指定的已註冊模型啟用模型服務時,Azure Databricks 會自動為模型建立唯一的叢集,並在該叢集上部署所有未封存版本的模型。 如果發生錯誤,Azure Databricks 會重新啟動叢集;當您停用該模型的模型服務時,則會終止叢集。 模型服務會自動與模型登錄同步,並部署任何新的已註冊模型版本。 您可以使用標準 REST API 要求來查詢已部署的模型版本。 Azure Databricks 會使用其標準驗證來驗證模型的要求。

雖然此服務處於預覽狀態,但 Databricks 建議其用於低輸送量和非關鍵應用程式。 目標輸送量為 200 qps,目標可用性為 99.5%,但無法保證任一項。 此外,每個要求都有 16 MB 的承載大小限制。

每個模型版本都是使用 MLflow 模型部署來部署 ,並在其相依性所指定的 Conda 環境中執行。

注意

  • 只要已啟用服務,叢集就會持續維持,即使沒有任何有效的模型版本也一樣。 若要終止服務叢集,請停用已註冊模型的模型服務。
  • 叢集被視為一個全用途叢集,受限於所有用途的工作負載定價。
  • 全域 init 腳本 不會在提供叢集的模型上執行。

重要

Anaconda Inc. 已更新其 anaconda.org 頻道的服務條款。 根據新的服務條款,如果您依賴 Anaconda 的封裝和散發,您可能需要商業使用授權。 如需詳細資訊,請參閱 Anaconda 商業版本常見問題集。 你使用任何 Anaconda 通道都會受到其服務條款的規範。

在 v1.18 之前記錄的 MLflow 模型(Databricks 執行階段 8.3 ML 或更早版本)預設會以 conda defaults 頻道(https://repo.anaconda.com/pkgs/)記錄為相依性。 由於此授權變更,Databricks 已停止對使用 MLflow v1.18 及以上版本記錄的模型使用 defaults 通道。 目前記錄的預設頻道為 conda-forge,其指向由社群管理的 https://conda-forge.org/。

如果你在 MLflow v1.18 之前記錄模型,但未從模型的 conda 環境排除 defaults 頻道,則該模型可能在 defaults 頻道具有你或未預期的相依性。 如果要手動確認模型是否具有此相依性,你可以針對以記錄模型封裝的 channel 檔案檢查其 conda.yaml 值。 例如,具有conda.yaml通道相依性之defaults模型的 可能如下所示:

channels:
- defaults
dependencies:
- python=3.8.8
- pip
- pip:
    - mlflow
    - scikit-learn==0.23.2
    - cloudpickle==1.6.0
      name: mlflow-env

由於 Databricks 無法判斷你與 Anaconda 的關係是否允許使用 Anaconda 存放庫來與模型互動,因此 Databricks 不會強制客戶進行任何變更。 如果您通過使用 Databricks 在 Anaconda 條款下使用 Anaconda.com 存放庫是被允許的,那麼您就不需要採取任何動作。

如果您想要變更模型環境中所使用的通道,您可以使用新的 conda.yaml將模型重新登錄至模型登錄。 你可以藉由在 conda_env 的參數 log_model() 指定頻道來執行此動作。

如需 log_model() API 的詳細資訊,請參閱你正在使用模型類別的 MLflow 文件,例如 scikit-learn 的 log_model。

如需 conda.yaml 檔案的詳細資訊,請參閱 MLflow 文件。

需求

  • 舊版 MLflow 模型服務適用於 Python MLflow 模型。 您必須在 conda 環境中宣告所有模型相依性。 請參閱 記錄模型相依性。
  • 若要啟用模型服務,您必須擁有 叢集建立許可權。

從模型登錄檔提供模型服務

Azure Databricks 可從模型登錄提供模型服務。

啟用和停用模型服務

您可以從其 註冊模型頁面 啟用模型,以供部署。

  1. 按兩下 [ 服務] 索引標籤。如果模型尚未啟用服務,則會出現 [ 啟用服務] 按鈕。

    啟用服務按鈕

  2. 按兩下 [ 啟用服務]。 [服務] 索引標籤隨即出現,[狀態] 顯示為 [待處理]。 幾分鐘後,[狀態] 會變更為 [就緒]。

若要停用服務模型,請按兩下 [ 停止]。

驗證模型服務

您可以從 [ 服務] 索引標籤,將要求傳送至服務模型並檢視回應。

啟用服務

模型版本 URI

每個已部署的模型版本都會指派一或多個唯一 URI。 每個模型版本至少都會指派一個 URI,如下所示:

<databricks-instance>/model/<registered-model-name>/<model-version>/invocations

例如,若要呼叫註冊為 iris-classifier的模型第 1 版,請使用下列 URI:

https://<databricks-instance>/model/iris-classifier/1/invocations

您也可以依據模型版本的階段來呼叫它。 例如,如果第 1 版是在 生產 階段,也可以使用此 URI 來評分:

https://<databricks-instance>/model/iris-classifier/Production/invocations

可用的模型 URI 清單會出現在服務頁面的 [模型版本] 索引標籤頂端。

管理提供服務的版本

所有作用中 (非封存) 模型版本都會部署,而且您可以使用 URI 進行查詢。 Azure Databricks 會在註冊時自動部署新的模型版本,並在封存時自動移除舊版本。

注意

所有已部署的模型版本都會共用相同的叢集。

管理模型訪問許可權

模型存取權限繼承自模型登錄檔。 啟用或停用服務功能需要已註冊模型的「管理」許可權。 具有讀取許可權的任何人都可以為任何已部署的版本評分。

為已部署的模型版本評分

若要為已部署的模型評分,您可以使用 UI 或將 REST API 要求傳送至模型 URI。

透過UI評分

這是測試模型的最簡單且最快的方式。 您可以插入 JSON 格式的模型輸入資料,然後按下 [傳送要求]。 如果模型已記錄輸入範例(如上圖所示),請按兩下 [載入範例 ] 以載入輸入範例。

透過 REST API 要求評分

您可以使用標準 Databricks 驗證,透過 REST API 傳送評分要求。 下列範例示範搭配 MLflow 1.x 使用個人存取令牌進行驗證。

注意

作為安全性最佳做法,當您使用自動化工具、系統、指令碼和應用程式進行驗證時,Databricks 建議您使用屬於服務主體的個人存取權杖,而不是工作區使用者。 若要建立服務主體的權杖,請參閱管理服務主體的權杖。

假設 如 (其中 是您 Databricks 實例的 名稱),以及名為 的 Databricks REST API 令牌,下列範例示範如何查詢服務模型:

下列範例會反映使用 MLflow 1.x 建立之模型的評分格式。 如果您要使用 MLflow 2.0,您必須 更新請求負載格式。

Bash

用於查詢接受資料框輸入的模型的程式碼片段。

curl -X POST -u token:$DATABRICKS_API_TOKEN $MODEL_VERSION_URI \
  -H 'Content-Type: application/json' \
  -d '[
    {
      "sepal_length": 5.1,
      "sepal_width": 3.5,
      "petal_length": 1.4,
      "petal_width": 0.2
    }
  ]'

用於查詢接受張量輸入的模型的程式碼片段。 Tensor 輸入的格式應該如 TensorFlow 服務 API 檔中所述。

curl -X POST -u token:$DATABRICKS_API_TOKEN $MODEL_VERSION_URI \
   -H 'Content-Type: application/json' \
   -d '{"inputs": [[5.1, 3.5, 1.4, 0.2]]}'

Python

import numpy as np
import pandas as pd
import requests

def create_tf_serving_json(data):
  return {'inputs': {name: data[name].tolist() for name in data.keys()} if isinstance(data, dict) else data.tolist()}

def score_model(model_uri, databricks_token, data):
  headers = {
    "Authorization": f"Bearer {databricks_token}",
    "Content-Type": "application/json",
  }
  data_json = data.to_dict(orient='records') if isinstance(data, pd.DataFrame) else create_tf_serving_json(data)
  response = requests.request(method='POST', headers=headers, url=model_uri, json=data_json)
  if response.status_code != 200:
      raise Exception(f"Request failed with status {response.status_code}, {response.text}")
  return response.json()

# Scoring a model that accepts pandas DataFrames
data =  pd.DataFrame([{
  "sepal_length": 5.1,
  "sepal_width": 3.5,
  "petal_length": 1.4,
  "petal_width": 0.2
}])
score_model(MODEL_VERSION_URI, DATABRICKS_API_TOKEN, data)

# Scoring a model that accepts tensors
data = np.asarray([[5.1, 3.5, 1.4, 0.2]])
score_model(MODEL_VERSION_URI, DATABRICKS_API_TOKEN, data)

PowerBI

您可以使用下列步驟在 Power BI Desktop 為資料集評分:

  1. 開啟要評分的資料集。

  2. 移至 [轉換資料]。

  3. 以滑鼠右鍵按兩下左面板中,然後選取 [建立新查詢]。

  4. 前往 檢視 > 進階編輯器。

  5. 在填入適當 DATABRICKS_API_TOKEN 與 MODEL_VERSION_URI 之後,以下列指令碼片段取代查詢主體。

    (dataset as table ) as table =>
    let
      call_predict = (dataset as table ) as list =>
      let
        apiToken = DATABRICKS_API_TOKEN,
        modelUri = MODEL_VERSION_URI,
        responseList = Json.Document(Web.Contents(modelUri,
          [
            Headers = [
              #"Content-Type" = "application/json",
              #"Authorization" = Text.Format("Bearer #{0}", {apiToken})
            ],
            Content = Json.FromValue(dataset)
          ]
        ))
      in
        responseList,
      predictionList = List.Combine(List.Transform(Table.Split(dataset, 256), (x) => call_predict(x))),
      predictionsTable = Table.FromList(predictionList, (x) => {x}, {"Prediction"}),
      datasetWithPrediction = Table.Join(
        Table.AddIndexColumn(predictionsTable, "index"), "index",
        Table.AddIndexColumn(dataset, "index"), "index")
    in
      datasetWithPrediction
    
  6. 使用所需模型名稱來命名查詢。

  7. 開啟資料集的進階查詢編輯器,並套用模型函數。

監控已提供服務的模型

[服務] 頁面會顯示服務叢集和個別模型版本的狀態指標。

  • 若要檢查服務叢集的狀態,請使用 [模型事件] 索引卷標,以顯示此模型所有服務事件的清單。
  • 若要檢查單一模型版本的狀態,請按兩下 [ 模型版本 ] 索引標籤並捲動以檢視 [ 記錄 ] 或 [版本事件 ] 索引標籤。

供應索引標籤

自訂服務叢集

若要自訂服務叢集,請在 Serving 索引標籤上使用 Cluster Settings 索引標籤。

叢集設定

  • 若要修改服務叢集的記憶體大小和核心數目,請使用 實例類型 下拉功能表來選取所需的叢集組態。 當您按兩下 [ 儲存] 時,會終止現有的叢集,並使用指定的設定建立新的叢集。
  • 若要新增標籤,請在 [新增卷標] 字段中輸入名稱和值,然後按兩下 [新增]。
  • 若要編輯或刪除現有的標籤,請按下 標籤 資料表之 [ 動作] 資料列中的其中一個圖示。

功能存放區整合

舊版模型服務可以自動從已發佈的在線商店查閱的 特徵值。

Databricks 舊版 MLflow 模型服務支援這些在線商店的自動功能查閱:

  • Azure Cosmos DB (v0.5.0 和更新版本)
  • 適用於 MySQL 的 Azure 資料庫

已知錯誤

ResolvePackageNotFound: pyspark=3.1.0

如果模型相依於 pyspark 且使用 Databricks Runtime 8.x 來記錄,就可能發生此錯誤。 如果您看到此錯誤,請在記錄模型時,使用 conda_env 明確指定 版本。

Unrecognized content type parameters: format

由於新的 MLflow 2.0 計分通訊協定格式,可能會發生此錯誤。 如果您看到此錯誤,您可能會使用過期的評分要求格式。 若要解決錯誤,您可以:

  • 將評分要求格式更新為最新的通訊協定。

    注意

    下列範例會反映 MLflow 2.0 中引進的評分格式。 如果您想要使用 MLflow 1.x,您可以修改 API log_model() 呼叫,以在 參數中包含 extra_pip_requirements 所需的 MLflow 版本相依性。 這麼做可確保使用適當的評分格式。

        mlflow.<flavor>.log_model(..., extra_pip_requirements=["mlflow==1.*"])
    

    Bash

    查詢可接受 pandas 資料框輸入的模型。

    curl -X POST -u token:$DATABRICKS_API_TOKEN $MODEL_VERSION_URI \
      -H 'Content-Type: application/json' \
      -d '{
          "dataframe_records": [{"sepal_length (cm)": 5.1, "sepal_width (cm)": 3.5, "petal_length (cm)": 1.4, "petal_width": 0.2},
                                {"sepal_length (cm)": 4.2, "sepal_width (cm)": 5.0, "petal_length (cm)": 0.8, "petal_width": 0.5}]
          }'
    

    查詢接受張量輸入的模型。 Tensor 輸入的格式應該如 TensorFlow 服務 API 檔中所述。

    curl -X POST -u token:$DATABRICKS_API_TOKEN $MODEL_VERSION_URI \
      -H 'Content-Type: application/json' \
      -d '{"inputs": [[5.1, 3.5, 1.4, 0.2]]}'
    

    Python

    import numpy as np
    import pandas as pd
    import requests
    
    def create_tf_serving_json(data):
      return {'inputs': {name: data[name].tolist() for name in data.keys()} if isinstance(data, dict) else data.tolist()}
    
    def score_model(model_uri, databricks_token, data):
      headers = {
        "Authorization": f"Bearer {databricks_token}",
        "Content-Type": "application/json",
      }
      data_dict = {'dataframe_split': data.to_dict(orient='split')} if isinstance(data, pd.DataFrame) else create_tf_serving_json(data)
      data_json = json.dumps(data_dict)
      response = requests.request(method='POST', headers=headers, url=model_uri, json=data_json)
      if response.status_code != 200:
          raise Exception(f"Request failed with status {response.status_code}, {response.text}")
      return response.json()
    
    # Scoring a model that accepts pandas DataFrames
    data =  pd.DataFrame([{
      "sepal_length": 5.1,
      "sepal_width": 3.5,
      "petal_length": 1.4,
      "petal_width": 0.2
    }])
    score_model(MODEL_VERSION_URI, DATABRICKS_API_TOKEN, data)
    
    # Scoring a model that accepts tensors
    data = np.asarray([[5.1, 3.5, 1.4, 0.2]])
    score_model(MODEL_VERSION_URI, DATABRICKS_API_TOKEN, data)
    

    PowerBI

    您可以使用下列步驟在 Power BI Desktop 為資料集評分:

    1. 開啟要評分的資料集。

    2. 移至 [轉換資料]。

    3. 以滑鼠右鍵按兩下左面板中,然後選取 [建立新查詢]。

    4. 前往 檢視 > 進階編輯器。

    5. 在填入適當 DATABRICKS_API_TOKEN 與 MODEL_VERSION_URI 之後,以下列指令碼片段取代查詢主體。

      (dataset as table ) as table =>
      let
        call_predict = (dataset as table ) as list =>
        let
          apiToken = DATABRICKS_API_TOKEN,
          modelUri = MODEL_VERSION_URI,
          responseList = Json.Document(Web.Contents(modelUri,
            [
              Headers = [
                #"Content-Type" = "application/json",
                #"Authorization" = Text.Format("Bearer #{0}", {apiToken})
              ],
              Content = Json.FromValue(dataset)
            ]
          ))
        in
          responseList,
        predictionList = List.Combine(List.Transform(Table.Split(dataset, 256), (x) => call_predict(x))),
        predictionsTable = Table.FromList(predictionList, (x) => {x}, {"Prediction"}),
        datasetWithPrediction = Table.Join(
          Table.AddIndexColumn(predictionsTable, "index"), "index",
          Table.AddIndexColumn(dataset, "index"), "index")
      in
        datasetWithPrediction
      
    6. 使用所需模型名稱來命名查詢。

    7. 開啟資料集的進階查詢編輯器,並套用模型函數。

  • 如果您的評分要求使用 MLflow 用戶端,例如 mlflow.pyfunc.spark_udf(),請將 MLflow 用戶端升級至 2.0 版或更新版本,以使用最新的格式。 深入瞭解 MLflow 2.0 中更新的 MLflow 模型評分通訊協定。

如需伺服器所接受之輸入數據格式的詳細資訊(例如 pandas 分割導向格式),請參閱 MLflow 檔。