建立和管理無伺服器即時推斷端點

重要

  • 此檔已淘汰,且可能未更新。 不再支援此內容中所提及的產品、服務或技術。
  • 本文中的指引適用於模型服務功能的預覽版本,先前稱為無伺服器即時推斷。 Databricks 建議您將服務工作流程的模型移轉至正式運作的功能。 請參閱 使用 Azure Databricks 提供服務的模型。

重要

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

本文說明如何建立和管理使用 Azure Databricks 無伺服器即時推斷的端點。

重要

  • API 定義和工作流程在公開預覽期間可能會變更。
  • 如果您依賴 Anaconda,請檢閱 服務條款 通知以取得其他資訊。

需求

  • 無伺服器即時推斷僅適用於在 MLflow 模型登錄中註冊的 Python 型 MLflow 模型。 您必須在 conda 環境或需求檔案宣告所有的模型相依性。
  • 您的工作區必須針對無伺服器即時推斷啟用。 若要使用無伺服器即時推斷來啟用模型服務,您必須擁有 叢集建立許可權
  • 如果您從私人鏡像伺服器搭配模型使用自定義連結庫或連結庫,請參閱 在建立模型端點之前,使用具有模型服務的 自定義 Python 連結庫。

建立服務端點的模型

您可以使用 Databricks 機器學習 API 或 Databricks 機器學習 UI 來建立模型服務的無伺服器即時推斷端點。 端點可以提供在模型登錄中註冊的任何已註冊 Python MLflow 模型。

使用 API

您可以使用啟用服務 API 來建立模型服務的端點。 在下列範例中, ElasticNet 是已註冊模型的名稱。

POST https://<databricks-instance>/api/2.0/preview/mlflow/endpoints-v2/enable

{
   "registered_model_name": "ElasticNet"
}

使用UI

您可以從 Databricks 機器學習 UI 中註冊的模型頁面啟用模型來提供服務。

  1. 按兩下 [ 服務] 索引標籤。如果模型尚未啟用服務, [啟用無伺服器即時推斷 ] 按鈕隨即出現。
  2. 按兩下 [ 啟用無伺服器即時推斷]。 [服務] 索引標籤隨即出現, [狀態 ] 顯示為 [擱置]。 幾分鐘后, 狀態 會變更為 [就緒]。

修改端點的計算組態

啟用模型端點之後,您可以使用 API 或 UI 視需要設定計算組態。 如果您需要模型的其他資源,此設定特別有用。 工作負載大小和計算組態在配置資源來為您的模型提供服務方面扮演重要角色。 深入瞭解 WorkloadConfigSpec 物件

使用 API

您可以在 [端點版本] 狀態的欄位中追蹤config_update_status組態更新的狀態

PUT /preview/model-serving-api/endpoints-v2/update-compute-config

在下列內容中,填入desired_workload_config_specWorkloadConfigSpec屬性。

{
  "registered_model_name": "ElasticNet",
  "stage": "Staging|Production",
  "desired_workload_config_spec": {"WorkloadConfigSpec"}
}

使用UI

啟用模型端點之後,您可以在 [計算 設定] 索引卷標上設定所需的計算組態。您可以為預備和生產模型版本設定個別的組態。

您可以選擇幾個工作負載大小,而且自動調整會在工作負載大小內自動設定。 如果您想要端點相應減少為零,您可以核取標題為 「調整為零」的複選框。

評分模型端點

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

您應該呼叫 API 作為其階段來呼叫模型。 例如,如果第 1 版是在 生產 階段,則可以使用此 UR 進行評分:

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

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

要求格式

要求應該藉由使用下列其中一個索引鍵和對應至輸入格式的 JSON 對象來建構 JSON 來傳送。

視您的使用案例而定,輸入 JSON 有四種格式:

  • dataframe_split 是方向為 split JSON 串行化的 Pandas 數據框架。

    {
      "dataframe_split": {
        "index": [0, 1],
        "columns": ["sepal length (cm)", "sepal width (cm)", "petal length (cm)", "petal width (cm)"],
        "data": [[5.1, 3.5, 1.4, 0.2], [4.9, 3.0, 1.4, 0.2]]
      }
    }
    
  • dataframe_records 是方向為 records JSON 串行化的 Pandas 數據框架。

    注意

    此格式不保證保留資料行順序,而且 split 格式優先於 records 格式。

    {
      "dataframe_records": [
      {
         "sepal length (cm)": 5.1,
         "sepal width (cm)": 3.5,
         "petal length (cm)": 1.4,
         "petal width (cm)": 0.2
      },
      {
         "sepal length (cm)": 4.9,
         "sepal width (cm)": 3,
         "petal length (cm)": 1.4,
         "petal width (cm)": 0.2
       },
       {
         "sepal length (cm)": 4.7,
         "sepal width (cm)": 3.2,
         "petal length (cm)": 1.3,
         "petal width (cm)": 0.2
       }
      ]
    }
    
  • instances 是以張量為基礎的格式,可接受數據列格式的張量。 如果所有輸入張量具有相同的 0 維度,請使用這個格式。 從概念上講,實例清單中的每個張量都可以與其他同名的張量聯結在清單的其餘部分,以建構模型的完整輸入張量,只有在所有張量具有相同的 0 維度時,才會可能。

      {"instances": [ "a", "b", "c" ]}
    

    在下列範例中,有三個維度,因此您只有三個輸入張量。

    {
    "instances": [
      {
       "t1": "a",
       "t2": [1, 2, 3, 4, 5],
       "t3": [[1, 2], [3, 4], [5, 6]]
      },
      {
       "t1": "b",
       "t2": [6, 7, 8, 9, 10],
       "t3": [[7, 8], [9, 10], [11, 12]]
      }
    ]
    }
    
  • inputs 以單欄格式傳送具有張量的查詢。 此要求不同,因為與 和 t3實際上有不同數目的t2t1張量實例,因此無法以 instances 格式表示此輸入。

    {
    "inputs": {
      "t1": ["a", "b"],
      "t2": [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]],
      "t3": [[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 10], [11, 12]]]
    }
    }
    

回應格式

來自端點的回應格式如下。 模型的輸出會包裝在「預測」索引鍵中。

{
  "predictions": "<JSON output from model>"
}

使用UI

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

使用 API

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

注意

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

假設有 MODEL_VERSION_URI 類似 https://<databricks-instance>/model/iris-classifier/Production/invocations,其中 <databricks-instance>Databricks 實例的名稱,以及名為 DATABRICKS_API_TOKEN的 Databricks REST API 令牌,以下是如何為服務模型評分的範例代碼段。

Bash

評分接受數據框架記錄輸入格式的模型。

curl -X POST -u token:$DATABRICKS_API_TOKEN $MODEL_VERSION_URI \
  -H 'Content-Type: application/json' \
  -d '{"dataframe_records": [
    {
      "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 = json.dumps({'dataframe_records': 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 = {"dataframe_records": 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. 開啟數據集的進階查詢編輯器,並套用模型函式。

如需如何使用 Python 模型測試無伺服器即時推斷端點的範例,請參閱下列筆記本:

測試無伺服器即時推斷端點筆記本

取得筆記本

更新模型端點所提供的模型版本

模型版本必須位於模型登錄中的預備或生產環境,才能提供給端點。

使用 API

若要將新的模型版本轉換為 [服務],您可以使用模型登錄,將您想要服務的模型版本轉換為適當的階段。

下列程式代碼範例會將第 2 版的模型 ElasticNet 轉換成預備。 藉由將 設定為 archive_existing_versionstrue,任何現有的模型版本都會封存,這會導致預備 URL 在準備好提供服務之後指向新的模型版本。 在新版本準備就緒之前,預備端點會提供舊的模型版本,因此轉換會以零停機時間進行。


POST /mlflow/databricks/model-versions/transition-stage

{
   "name": "ElasticNet",
   "version": "2",
   "stage": "Staging",
   "archive_existing_versions": true,
   "comment": "Deploying version 1 to Staging endpoint!"
}

將多個版本保留在單一階段

您也可以選擇將先前的預備版本保留在預備中。 模型的多個版本可以位於相同的階段。 在此案例中,會提供這兩個版本,但預備 URL 只會 指向最新版本 。 舊版仍可透過其版本 URL 存取。

如果您想要在預備端點后面試用新版本,可以執行與上述相同的動作,但設定 archive_existing_versionsfalse ,以確保先前的預備版本不會封存。

POST /mlflow/databricks/model-versions/transition-stage

{
...
   "archive_existing_versions": false,
...
}

使用UI

若要使用 Databricks 機器學習 UI 將模型版本轉換為預備或生產環境:

  1. 選取 模型圖示提要欄位中的 [模型 ]。
  2. 識別並選取您要更新的已註冊模型。
  3. 選取您要轉換至 預備生產環境的模型版本。 鏈接會開啟該模型版本的詳細數據頁面。
  4. 使用右上方的 [ 階段 ] 下拉功能表,將模型版本轉換為預備或生產環境。

取得模型端點的狀態

使用 API

Databricks 提供下列項目來檢查端點的狀態。 深入瞭解 EndpointStatus 物件

GET /preview/mlflow/endpoints-v2/get-status
{
  "registered_model_name": "ElasticNet"
}

這會傳 EndpointStatus 回物件屬性:

{
  "endpoint_status": {"EndpointStatus"}
}

使用UI

在UI中,您可以從 [服務] 索引標籤頂端的 [狀態] 指標檢查端點的狀態。

取得模型端點版本的狀態

您可以取得已部署的特定端點版本狀態。 這可讓您:

  • 追蹤正在提供的版本。
  • 追蹤這些版本的狀態。
  • 確認特定模型版本是否可供使用。

使用 API

Databricks 提供兩個 API 來檢查端點版本的狀態。 若要檢查特定已註冊模型之所有端點版本的狀態,您可以使用 ListVersions。 深入瞭解 EndpointVersionStatus 物件

GET /preview/mlflow/endpoints-v2/list-versions
{
  "registered_model_name": "ElasticNet"
}

這會傳 EndpointVersionStatus 回物件屬性:

{
  "endpoint_statuses": ["EndpointVersionStatus"]
}

或者,如果您已經知道想要知道其狀態的特定版本,您可以使用 GetVersions

GET /preview/mlflow/endpoints-v2/get-version-status
{
  "registered_model_name": "ElasticNet",
  "endpoint_version_name": "1"
}

這會傳 EndpointVersionStatus 回物件屬性:

{
  "endpoint_status": {"EndpointVersionStatus"}
}

取得階段的狀態

您也可以取得特定階段的狀態。 若要這樣做,您必須先判斷哪個端點版本目前為階段提供服務。 若要擷取該資訊,您可以使用 ListVersionAliases

GET /preview/mlflow/endpoints-v2/list-version-aliases
{
  "registered_model_name": "ElasticNet"
}

這會傳回:

{
  "aliases": [
   {
      "alias": "Staging",
      "endpoint_version_name": "2"
   },
   {
      "alias": "Production",
      "endpoint_version_name": "1"
   }
  ]
}

您可以從該處使用上述專案來取得特定端點版本的狀態。

使用UI

在UI的 [服務] 索引標籤中,您可以在左側看到每個端點版本及其本身的索引標籤。 當您選取每個索引標籤時,特定版本的詳細資訊隨即出現。 目前提供階段的版本可從端點版本的預備生產標籤中看到

停用模型服務

使用 API

您可以使用 API 來停用模型登錄中任何已註冊模型的模型服務。

若要停用模型的模型服務,請使用停用服務 API:

POST /preview/mlflow/endpoints-v2/disable

{
   "registered_model_name": "ElasticNet"
}

使用UI

您可以從其 已註冊的模型頁面停用服務模型。

  1. 按兩下 [ 服務] 索引標籤。如果模型尚未啟用服務, [啟用無伺服器即時推斷 ] 按鈕隨即出現。
  2. 按兩下 [ 停用服務]。

對模型端點進行偵錯

注意

您只能透過UI對模型端點進行偵錯。

您可以在 Databricks 機器學習 UI 的 [端點版本] 索引卷標上檢視模型記錄,以偵錯和疑難解答端點。 模型的所有複本記錄都會合併於 [ 所有複本] 索引標籤 中。

除了模型的記錄之外,您還可以在 [模型事件] 索引標籤中 檢視與模型相關的重大服務事件

核心 API 物件

本節包含無伺服器即時推斷核心 API 對象的設計模式和語法。

重要

API 定義在公開預覽期間可能會變更。

工作負載組態

WorkloadConfigSpec 描述用來調整特定階段計算的組態。

  "WorkloadConfigSpec":
  {
   "workload_size_id": "Small|Medium|Large",
   "scale_to_zero_enabled": false
  }

ComputeConfig 表示用來調整特定階段計算以及隨附元數據的組態。

在下列命令中,將 取代"WorkloadConfigSpec"為您 物件先前定義的屬性WorkloadConfigSpec,以填入 workload_spec

  "ComputeConfig":
  {
   "stage":  "Staging|Production",
   "creation_timestamp": 12345678,
   "user_id": "first.last@databricks.com",
   "workload_spec": {"WorkloadConfigSpec"}
  }

端點狀態

端點的健康情況會反映是否有任何階段可以評分,或為模型的特定版本產生資源。

在下列EndpointStatus物件中,藉由重複使用先前ComputeConfig定義的物件屬性和任何其他屬性做為陣列來填入 compute_config

  "EndpointStatus":
  {
   "registered_model_name": "ElasticNet",
   "state": "PENDING|READY|FAILED",
   "state_message": "State message",
   "compute_config": ["ComputeConfig and additional properties as an array"]
  }

端點版本狀態

端點版本具有可查詢的特定 URI。 URI 代表正在服務的單一模型版本,其計算是由為其階段設定的計算組態所設定。

在下列 EndpointVersionStatus 物件中,填入 字段 configservice_statusconfig_update_status,方法是將 取代 "ComputeConfig" 為您物件先前定義的屬性 ComputeConfig

  "EndpointVersionStatus":
  {
   "registered_model_name": "ElasticNet",
   "endpoint_version_name": "1",
   "service_status": {
      "state": "SERVICE_STATE_UNKNOWN|SERVICE_STATE_PENDING|SERVICE_STATE_READY|SERVICE_STATE_UNKNOWN",
      "message": "Ready",
      "config": {"ComputeConfig"}
   },
   "config_update_status": {
      "state": "SERVICE_STATE_UNKNOWN|SERVICE_STATE_PENDING|SERVICE_STATE_READY|SERVICE_STATE_UNKNOWN",
      "message": "Pending",
      "config": {"ComputeConfig"}
    }
  }

筆記本範例

下列筆記本包含不同的模型,您可以使用這些模型來啟動和執行無伺服器即時推斷端點。 您可以遵循匯入筆記本中的指示,將模型範例匯入工作區。 從其中一個範例中選擇並建立模型之後, 請在 MLflow 模型登錄中註冊模型,然後遵循 模型服務的 UI 工作流程 步驟。

訓練和註冊 scikit-learn 模型來提供筆記本的模型

取得筆記本

針對服務筆記本的模型定型和註冊 Pytorch 模型

取得筆記本

定型和註冊 HuggingFace 模型以用於提供筆記本的模型

取得筆記本

在端點筆記本中裝載多個模型

取得筆記本

Anaconda 授權更新

下列通知適用於依賴 Anaconda 的客戶。

重要

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

在 v1.18 之前記錄的 MLflow 模型(Databricks Runtime 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 檔案中的值。 例如,具有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 條款下允許使用 Anaconda.com 存放庫,您就不需要採取任何動作。

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

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

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