カスタムモデルのサービングエンドポイントをクエリする

プレビュー

Mosaic AI Model Serving は パブリック プレビュー 段階にあり、 us-east1us-central1でサポートされています。

この記事では、サーブされたモデルのスコアリング要求を書式設定する方法と、それらの要求をモデルサービングエンドポイントに送信する方法について説明します。 このガイダンスは、Databricks が従来の ML モデルまたは MLflow 形式でパッケージ化されたカスタマイズされた Python モデルとして定義する カスタム モデルの提供に関連しています。 モデルは Unity Catalogに登録されている必要があります。 例としては、scikit-learn、XGBoost、PyTorch、Hugging Face トランスフォーマーモデルなどがあります。 この機能とサポートされているモデルカテゴリの詳細については、Databricks付きモデルサービングを参照してください。

生成AI および LLM ワークロードのクエリ要求については、「 クエリ生成AI モデル」を参照してください。

要件

クエリの方法と例

Mosaic AI Model Serving では、サービス提供モデルにスコアリング リクエストを送信するための次のオプションが提供されます。

手法

詳細

UI の提供

Databricks ワークスペースの[サービス提供エンドポイント]ページから[クエリ エンドポイント]を選択します。 JSON 形式のモデル入力データを挿入し、 「リクエストの送信」をクリックします。 モデルに入力例がログに記録されている場合は、[ 例を表示 ]を使用して読み込みます。

REST API

REST API を使用してモデルを呼び出し、クエリを実行します。 詳細は POST /serving-endpoints/{name}/invocations を参照してください。 複数のモデルを提供するエンドポイントへの要求のスコアリングについては、「 エンドポイントの背後にある個々のモデルのクエリ」を参照してください。

MLflow デプロイメント SDK

MLflow Deployments SDK のdetect()関数を使用してモデルをクエリします。

Pandas DataFrame スコアリングの例

次の例では、 MODEL_VERSION_URIhttps://<databricks-instance>/model/iris-classifier/Production/invocationsに似ていることを前提としています。ここで、 <databricks-instance> Databricks インスタンスの名前であり、 Databricks REST API トークンはDATABRICKS_API_TOKENと呼ばれます。

「サポートされているスコアリング形式」を参照してください。

データフレーム分割入力形式を受け入れるモデルをスコア付けします。

curl -X POST -u token:$DATABRICKS_API_TOKEN $MODEL_VERSION_URI \
  -H 'Content-Type: application/json' \
  -d '{"dataframe_split": [{
     "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]]
    }]
  }'

テンソル入力を受け入れるモデルをスコアリングします。 Tensor 入力は、 TensorFlow Serving の 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]]}'

重要

次の例では、 MLflow Deployments SDKpredict() API を使用します。


import mlflow.deployments

export DATABRICKS_HOST="https://<workspace_host>.databricks.com"
export DATABRICKS_TOKEN="dapi-your-databricks-token"

client = mlflow.deployments.get_deploy_client("databricks")

response = client.predict(
            endpoint="test-model-endpoint",
            inputs={"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]]
                    }
                }
           )

次のステップを使用して、Power BI Desktop でデータセットにスコアを付けることができます。

  1. スコアを付けたいデータセットを開きます。

  2. [データの変換] に移動します。

  3. 左側のパネルを右クリックし、[ 新しいクエリの作成]を選択します。

  4. [ View > Advanced Editor (詳細エディターの表示)] に移動します。

  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. データセットの高度なクエリ エディターを開き、モデル関数を適用します。

テンソル入力の例

次の例では、テンソル入力を受け入れるモデルをスコアリングします。 Tensor 入力は、 TensorFlow Serving の API ドキュメントで説明されているようにフォーマットする必要があります。 この例では、 MODEL_VERSION_URIhttps://<databricks-instance>/model/iris-classifier/Production/invocationsに似ていることを前提としています。ここで、 <databricks-instance> Databricks インスタンスの名前であり、 Databricks REST API トークンはDATABRICKS_API_TOKENと呼ばれます。

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

サポートされているスコアリング形式

カスタム モデルの場合、モデルサービングは Pandas DataFrame または Tensor 入力でのリクエストのスコアリングをサポートします。

Pandas DataFrame

リクエストは、サポートされているキーの 1 つと入力形式に対応する JSON オブジェクトを使用して JSON シリアル化された Pandas DataFrame を構築して送信する必要があります。

  • (推奨) dataframe_split形式は、 split方向の JSON シリアル化された Pandas DataFrame です。

    {
      "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 DataFrame です。

    注:

    この形式では、列の順序が保持される保証はなく、records形式よりもsplit形式が優先されます。

    {
      "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
      }
      ]
    }
    

エンドポイントからの応答には、JSON でシリアル化され、 predictionsキーでラップされたモデルからの出力が含まれます。

{
  "predictions": [0,1,1,1,0]
}

テンソル入力

TensorFlow モデルやPyTorchモデルなど、モデルがテンソルを必要とする場合、リクエストを送信するためにサポートされている形式オプションが 2 つあります: instancesinputs

行ごとに複数の名前付きテンソルがある場合は、すべての行に各テンソルを1つずつ持つ必要があります。

  • instances は、テンソルを行形式で受け入れるテンソルベースの形式です。 すべての入力テンソルの次元が同じ 0 番目の次元である場合に、この形式を使用します。 概念的には、インスタンスリスト内の各テンソルをリストの残りの部分の同じ名前の他のテンソルと結合して、モデルの完全な入力テンソルを構築できますが、これはすべてのテンソルが同じ0番目の次元を持つ場合にのみ可能です。

    {"instances": [ 1, 2, 3 ]}
    

    次の例は、複数の名前付きテンソルを指定する方法を示しています。

    {
     "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 テンソルを含むクエリを列形式で送信します。 このリクエストは、実際には t2 (3) のテンソルインスタンスの数が t1t3とは異なるため、この入力を instances 形式で表すことはできません。

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

エンドポイントからの応答は、次の形式です。

{
  "predictions": [0,1,1,1,0]
}

ノートブックの例

Python モデルを使用してモデルサービング エンドポイントをテストする方法の例については、次のノートブックを参照してください。

テストモデルサービングエンドポイントノートブック

ノートブックを新しいタブで開く