Správa koncových bodů obsluhy modelu

Tento článek popisuje, jak spravovat koncové body obsluhující modely pomocí uživatelského rozhraní obsluhy a rozhraní REST API. Viz Poskytování koncových bodů v referenčních informacích k rozhraní REST API.

K vytvoření koncových bodů obsluhy modelu použijte jednu z následujících možností:

Získání stavu koncového bodu modelu

V uživatelském rozhraní obsluhy můžete zkontrolovat stav koncového bodu pomocí indikátoru stavu obsluhy v horní části stránky podrobností koncového bodu.

Stav a podrobnosti koncového bodu můžete použít programově pomocí rozhraní REST API nebo sady SDK pro nasazení MLflow.

Rozhraní REST API

GET /api/2.0/serving-endpoints/{name}

Následující příklad získá podrobnosti o koncovém bodu, který slouží první verzi ads1 modelu zaregistrovaného v registru modelu. Pokud chcete zadat model z katalogu Unity, zadejte úplný název modelu včetně nadřazeného katalogu a schématu, catalog.schema.example-modelnapříklad .

V následující ukázkové odpovědi je pole PŘIPRAVENO, což znamená, state.ready že koncový bod je připravený přijímat provoz. Pole state.update_state se už nevrácelo NOT_UPDATINGpending_config , protože aktualizace byla úspěšně dokončena.

{
  "name": "workspace-model-endpoint",
  "creator": "customer@example.com",
  "creation_timestamp": 1666829055000,
  "last_updated_timestamp": 1666829055000,
  "state": {
    "ready": "READY",
    "update_state": "NOT_UPDATING"
  },
  "config": {
    "served_entities": [
      {
        "name": "ads1-1",
        "entity_name": "ads1",
        "entity_version": "1",
        "workload_size": "Small",
        "scale_to_zero_enabled": false,
        "state": {
          "deployment": "DEPLOYMENT_READY",
          "deployment_state_message": ""
        },
        "creator": "customer@example.com",
        "creation_timestamp": 1666829055000
      }
    ],
    "traffic_config": {
      "routes": [
        {
          "served_model_name": "ads1-1",
          "traffic_percentage": 100
        }
      ]
    },
    "config_version": 1
  },
  "id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "permission_level": "CAN_MANAGE"
}

Sada SDK pro nasazení Mlflow

from mlflow.deployments import get_deploy_client

client = get_deploy_client("databricks")
endpoint = client.get_endpoint(endpoint="chat")
assert endpoint == {
    "name": "chat",
    "creator": "alice@company.com",
    "creation_timestamp": 0,
    "last_updated_timestamp": 0,
    "state": {...},
    "config": {...},
    "tags": [...],
    "id": "88fd3f75a0d24b0380ddc40484d7a31b",
}

Odstranění koncového bodu obsluhy modelu

Pokud chcete zakázat poskytování pro model, můžete odstranit koncový bod, na který se obsluhuje.

Koncový bod můžete odstranit ze stránky podrobností koncového bodu v uživatelském rozhraní obsluhy.

  1. Klikněte na obsluhu na bočním panelu.
  2. Klikněte na koncový bod, který chcete odstranit.
  3. Klikněte na nabídku kebabu v horní části a vyberte Odstranit.

Alternativně můžete prostřednictvím kódu programu odstranit obslužný koncový bod pomocí rozhraní REST API nebo sady SDK pro nasazení MLflow.

Rozhraní REST API

DELETE /api/2.0/serving-endpoints/{name}

Sada SDK pro nasazení Mlflow

from mlflow.deployments import get_deploy_client

client = get_deploy_client("databricks")
client.delete_endpoint(endpoint="chat")

Ladění koncového bodu obsluhy modelu

Pokud chcete ladit všechny problémy s koncovým bodem, můžete načíst:

  • Protokoly sestavení kontejneru modelu serveru
  • Protokoly serveru modelu

Tyto protokoly jsou také přístupné z uživatelského rozhraní koncových bodů na kartě Protokoly.

Pro protokoly sestavení pro obsluha modelu můžete použít následující požadavek:


GET /api/2.0/serving-endpoints/{name}/served-models/{served-model-name}/build-logs
{
  “config_version”: 1  // optional
}

Pro protokoly serveru modelu pro obsluhu modelu můžete použít následující požadavek:


GET /api/2.0/serving-endpoints/{name}/served-models/{served-model-name}/logs

{
  “config_version”: 1  // optional
}

Správa oprávnění pro koncový bod obsluhující model

K úpravě oprávnění musíte mít alespoň oprávnění CAN MANAGE u obslužného koncového bodu. Další informace o úrovních oprávnění najdete v tématu Obsluha seznamů ACL koncového bodu.

Získejte seznam oprávnění pro koncový bod obsluhy.

databricks permissions get servingendpoints <endpoint-id>

Udělte uživateli jsmith@example.com oprávnění CAN QUERY pro obsluhující koncový bod.

databricks permissions update servingendpoints <endpoint-id> --json '{
  "access_control_list": [
    {
      "user_name": "jsmith@example.com",
      "permission_level": "CAN_QUERY"
    }
  ]
}'

Oprávnění koncového bodu můžete také upravit pomocí rozhraní API pro oprávnění.

Získání modelu obsluhujícího schéma koncového bodu

Důležité

Podpora obsluhy schémat dotazů koncového bodu je ve verzi Public Preview. Tato funkce je dostupná v oblastech obsluhy modelů.

Obslužné schéma dotazu koncového bodu je formální popis koncového bodu obsluhy pomocí standardní specifikace OpenAPI ve formátu JSON. Obsahuje informace o koncovém bodu, včetně cesty ke koncovému bodu, podrobností pro dotazování koncového bodu, jako je formát textu požadavku a odpovědi, a datový typ pro každé pole. Tyto informace můžou být užitečné pro scénáře reprodukovatelnosti nebo v případě, že potřebujete informace o koncovém bodu, ale nejsou původním tvůrcem ani vlastníkem koncového bodu.

Pokud chcete získat schéma koncového bodu obsluhovaného modelu, musí mít obsluhovaný model protokolovaný podpis modelu a koncový bod musí být ve READY stavu.

Následující příklady ukazují, jak programově získat model obsluhující schéma koncového bodu pomocí rozhraní REST API. Informace o funkcích obsluhujících schémata koncových bodů najdete v tématu Co je služba funkcí Databricks?.

Schéma vrácené rozhraním API je ve formátu objektu JSON, který se řídí specifikací OpenAPI.


ACCESS_TOKEN="<endpoint-token>"
ENDPOINT_NAME="<endpoint name>"

curl "https://example.databricks.com/api/2.0/serving-endpoints/$ENDPOINT_NAME/openapi" -H "Authorization: Bearer $ACCESS_TOKEN" -H "Content-Type: application/json"

Podrobnosti odpovědi schématu

Odpověď je specifikace OpenAPI ve formátu JSON, obvykle včetně polí jako openapi, infoservers a paths. Vzhledem k tomu, že odpověď schématu je objekt JSON, můžete ji analyzovat pomocí běžných programovacích jazyků a vygenerovat kód klienta ze specifikace pomocí nástrojů třetích stran. Specifikaci OpenAPI můžete vizualizovat také pomocí nástrojů třetích stran, jako je Swagger Editor.

Mezi hlavní pole odpovědi patří:

  • Pole info.title zobrazuje název obsluhujícího koncového bodu.
  • Pole servers vždy obsahuje jeden objekt, obvykle url pole, které je základní adresou URL koncového bodu.
  • Objekt paths v odpovědi obsahuje všechny podporované cesty pro koncový bod. Klíče v objektu jsou adresa URL cesty. Každý z nich path může podporovat více formátů vstupů. Tyto vstupy jsou uvedeny v oneOf poli.

Následuje příklad odpovědi schématu koncového bodu:


{
  "openapi": "3.1.0",
  "info": {
    "title": "example-endpoint",
    "version": "2"
  },
  "servers": [{ "url": "https://example.databricks.com/serving-endpoints/example-endpoint"}],
  "paths": {
    "/served-models/vanilla_simple_model-2/invocations": {
      "post": {
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "oneOf": [
                  {
                    "type": "object",
                    "properties": {
                      "dataframe_split": {
                        "type": "object",
                        "properties": {
                          "columns": {
                            "description": "required fields: int_col",
                            "type": "array",
                            "items": {
                              "type": "string",
                              "enum": [
                                "int_col",
                                "float_col",
                                "string_col"
                              ]
                            }
                          },
                          "data": {
                            "type": "array",
                            "items": {
                              "type": "array",
                              "prefixItems": [
                                {
                                  "type": "integer",
                                  "format": "int64"
                                },
                                {
                                  "type": "number",
                                  "format": "double"
                                },
                                {
                                  "type": "string"
                                }
                              ]
                            }
                          }
                        }
                      },
                      "params": {
                        "type": "object",
                        "properties": {
                          "sentiment": {
                            "type": "number",
                            "format": "double",
                            "default": "0.5"
                          }
                        }
                      }
                    },
                    "examples": [
                      {
                        "columns": [
                          "int_col",
                          "float_col",
                          "string_col"
                        ],
                        "data": [
                          [
                            3,
                            10.4,
                            "abc"
                          ],
                          [
                            2,
                            20.4,
                            "xyz"
                          ]
                        ]
                      }
                    ]
                  },
                  {
                    "type": "object",
                    "properties": {
                      "dataframe_records": {
                        "type": "array",
                        "items": {
                          "required": [
                            "int_col",
                            "float_col",
                            "string_col"
                          ],
                          "type": "object",
                          "properties": {
                            "int_col": {
                              "type": "integer",
                              "format": "int64"
                            },
                            "float_col": {
                              "type": "number",
                              "format": "double"
                            },
                            "string_col": {
                              "type": "string"
                            },
                            "becx_col": {
                              "type": "object",
                              "format": "unknown"
                            }
                          }
                        }
                      },
                      "params": {
                        "type": "object",
                        "properties": {
                          "sentiment": {
                            "type": "number",
                            "format": "double",
                            "default": "0.5"
                          }
                        }
                      }
                    }
                  }
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Successful operation",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "predictions": {
                      "type": "array",
                      "items": {
                        "type": "number",
                        "format": "double"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}