共用方式為


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

重要

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

重要

  • 此文件已淘汰,且可能未更新。 不再支援此內容中提及的產品、服務或技術。
  • 本文中的指引適用於舊版 MLflow 模型服務。 Databricks 建議您將模型服務工作流程移轉至模型服務,以取得增強的模型端點部署和延展性。 如需詳細資訊,請參閱 使用 Azure 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/)記錄為相依性。 由於此授權變更,針對使用 MLflow v1.18 與更高本記錄的模型 Databricks 已停止使用 defaults 頻道。 預設記錄頻道現為 conda-forge,指向社群管理的 https://conda-forge.org/

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

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 不會強制客戶進行任何變更。 如果 Anaconda 條款允許你透過 Databricks 使用 Anaconda.com 存放庫,則你無需採取任何動作。

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

如需 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 建議您使用屬於服務主體的個人存取權杖,而不是工作區使用者。 若要建立服務主體的權杖,請參閱管理服務主體的權杖

假設有 MODEL_VERSION_URI 類似 https://<databricks-instance>/model/iris-classifier/Production/invocations (其中 <databricks-instance>Databricks 實例的名稱)和名為 DATABRICKS_API_TOKEN的 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
    }
  ]'

查詢接受張量輸入之模型的代碼段。 張量輸入格式應如 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_TOKENMODEL_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. 開啟資料集的進階查詢編輯器,並套用模型函數。

監視服務模型

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

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

服務索引標籤

自訂服務叢集

若要自定義服務叢集,請使用 [服務] 索引標籤上的 [叢集設定] 索引卷標。

叢集設定

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

功能存放區整合

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

.. aws:

Databricks Legacy MLflow Model Serving supports automatic feature lookup from these online stores:

- Amazon DynamoDB (v0.3.8 and above)
- Amazon Aurora (MySQL-compatible)
- Amazon RDS MySQL

.. azure::

Databricks Legacy MLflow Model Serving supports automatic feature lookup from these online stores:

- Azure Cosmos DB (v0.5.0 and above)
- Azure Database for MySQL

已知錯誤

ResolvePackageNotFound: pyspark=3.1.0

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

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}]
          }'
    

    查詢接受張量輸入的模型。 張量輸入格式應如 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_TOKENMODEL_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 檔