Udostępnij za pośrednictwem


Zarządzanie punktami końcowymi obsługującymi model

W tym artykule opisano sposób zarządzania punktami końcowymi obsługującymi model przy użyciu interfejsu użytkownika obsługującego i interfejsu API REST. Zobacz Obsługa punktów końcowych w dokumentacji interfejsu API REST.

Aby utworzyć model obsługujący punkty końcowe, użyj jednego z następujących elementów:

Pobieranie stanu punktu końcowego modelu

W interfejsie użytkownika obsługującego można sprawdzić stan punktu końcowego ze wskaźnika Stanu punktu końcowego obsługującego w górnej części strony szczegółów punktu końcowego.

Możesz użyć sprawdzania stanu i szczegółów punktu końcowego programowo przy użyciu interfejsu API REST lub zestawu SDK wdrożeń MLflow

Interfejs API REST

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

Poniższy przykład tworzy punkt końcowy, który obsługuje pierwszą wersję modelu zarejestrowanego my-ads-model w rejestrze modeli wykazu aparatu Unity. Musisz podać pełną nazwę modelu, w tym katalog nadrzędny i schemat, catalog.schema.example-modeltaki jak .

W poniższej przykładowej odpowiedzi state.ready pole jest "GOTOWE", co oznacza, że punkt końcowy jest gotowy do odbierania ruchu. Pole state.update_state jest NOT_UPDATING i pending_config nie jest już zwracane, ponieważ aktualizacja została zakończona pomyślnie.

{
  "name": "unity-model-endpoint",
  "creator": "customer@example.com",
  "creation_timestamp": 1666829055000,
  "last_updated_timestamp": 1666829055000,
  "state": {
    "ready": "READY",
    "update_state": "NOT_UPDATING"
  },
  "config": {
    "served_entities": [
      {
        "name": "my-ads-model",
        "entity_name": "myCatalog.mySchema.my-ads-model",
        "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": "my-ads-model",
          "traffic_percentage": 100
        }
      ]
    },
    "config_version": 1
  },
  "id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
  "permission_level": "CAN_MANAGE"
}

Zestaw SDK wdrożeń 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",
}

Zatrzymywanie punktu końcowego obsługującego model

Możesz tymczasowo zatrzymać punkt końcowy obsługujący model i uruchomić go później. Po zatrzymaniu punktu końcowego zasoby aprowizowane dla niego są zamykane, a punkt końcowy nie może obsługiwać zapytań, dopóki nie zostanie uruchomiony ponownie. Tylko punkty końcowe obsługujące modele niestandardowe, nie są zoptymalizowane pod kątem tras i nie mogą zostać zatrzymane żadne aktualizacje w toku. Zatrzymane punkty końcowe nie są liczone względem limitu przydziału zasobów. Zapytania wysyłane do zatrzymanego punktu końcowego zwracają błąd 400.

Punkt końcowy można zatrzymać na stronie szczegółów punktu końcowego w interfejsie użytkownika obsługującego.

  1. Kliknij punkt końcowy, który chcesz zatrzymać.
  2. Kliknij przycisk Zatrzymaj w prawym górnym rogu.

Alternatywnie można programowo zatrzymać obsługujący punkt końcowy przy użyciu interfejsu API REST w następujący sposób:

POST /api/2.0/serving-endpoints/{name}/config:stop

Gdy wszystko będzie gotowe do uruchomienia punktu końcowego obsługującego zatrzymany model, możesz to zrobić na stronie szczegółów punktu końcowego w interfejsie użytkownika obsługującego.

  1. Kliknij punkt końcowy, który chcesz uruchomić.
  2. Kliknij przycisk Start w prawym górnym rogu.

Alternatywnie można programowo uruchomić zatrzymany punkt końcowy obsługujący przy użyciu interfejsu API REST w następujący sposób:

POST /api/2.0/serving-endpoints/{name}/config:start

Usuwanie punktu końcowego obsługującego model

Aby wyłączyć obsługę modelu, możesz usunąć obsługiwany punkt końcowy.

Punkt końcowy można usunąć ze strony szczegółów punktu końcowego w interfejsie użytkownika obsługującego.

  1. Kliknij pozycję Obsługa na pasku bocznym.
  2. Kliknij punkt końcowy, który chcesz usunąć.
  3. Kliknij menu kebab u góry i wybierz pozycję Usuń.

Alternatywnie można programowo usunąć obsługujący punkt końcowy przy użyciu interfejsu API REST lub zestawu SDK wdrożeń MLflow

Interfejs API REST

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

Zestaw SDK wdrożeń MLflow

from mlflow.deployments import get_deploy_client

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

Debugowanie punktu końcowego obsługującego model

Aby debugować wszelkie problemy z punktem końcowym, możesz pobrać:

  • Dzienniki kompilacji kontenera serwera modelu
  • Dzienniki serwera modelu

Te dzienniki są również dostępne z poziomu interfejsu użytkownika punktów końcowych na karcie Dzienniki .

W przypadku dzienników kompilacji dla obsługiwanego modelu można użyć następującego żądania. Aby uzyskać więcej informacji, zobacz Przewodnik debugowania obsługi modeli.


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

W przypadku dzienników serwera modelu dla modelu obsługującego można użyć następującego żądania:


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

{
  “config_version”: 1  // optional
}

Zarządzanie uprawnieniami do punktu końcowego obsługującego model

Aby zmodyfikować uprawnienia, musisz mieć co najmniej uprawnienie CAN MANAGE w punkcie końcowym obsługującym. Aby uzyskać więcej informacji na temat poziomów uprawnień, zobacz Obsługa list ACL punktów końcowych.

Pobierz listę uprawnień w punkcie końcowym obsługującym.

databricks permissions get servingendpoints <endpoint-id>

Udziel użytkownikowi jsmith@example.com uprawnienia CAN QUERY w punkcie końcowym obsługującym.

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

Możesz również zmodyfikować uprawnienia obsługujące punkty końcowe przy użyciu interfejsu API uprawnień.

Pobieranie schematu punktu końcowego obsługującego model

Ważne

Obsługa schematów zapytań punktu końcowego jest dostępna w publicznej wersji zapoznawczej. Ta funkcja jest dostępna w regionach obsługa modeli.

Schemat zapytania obsługującego punkt końcowy jest formalnym opisem punktu końcowego obsługującego przy użyciu standardowej specyfikacji interfejsu OpenAPI w formacie JSON. Zawiera on informacje o punkcie końcowym, w tym ścieżkę punktu końcowego, szczegóły dotyczące wykonywania zapytań dotyczących punktu końcowego, takiego jak format treści żądania i odpowiedzi, oraz typ danych dla każdego pola. Te informacje mogą być przydatne w scenariuszach powtarzalności lub gdy potrzebujesz informacji o punkcie końcowym, ale nie jesteś oryginalnym twórcą ani właścicielem punktu końcowego.

Aby uzyskać schemat punktu końcowego obsługującego model, obsługiwany model musi mieć zarejestrowany podpis modelu, a punkt końcowy musi być w READY stanie.

W poniższych przykładach pokazano, jak programowo pobrać schemat punktu końcowego obsługującego model przy użyciu interfejsu API REST. Aby uzyskać informacje na temat schematów punktów końcowych obsługujących funkcje, zobacz Co to jest obsługa funkcji usługi Databricks?.

Schemat zwracany przez interfejs API jest w formacie obiektu JSON zgodnego ze specyfikacją interfejsu 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"

Szczegóły odpowiedzi schematu

Odpowiedź jest specyfikacją interfejsu OpenAPI w formacie JSON, zazwyczaj obejmującą pola, takie jak openapi, infoservers i paths. Ponieważ odpowiedź schematu jest obiektem JSON, możesz przeanalizować go przy użyciu typowych języków programowania i wygenerować kod klienta ze specyfikacji przy użyciu narzędzi innych firm. Można również wizualizować specyfikację interfejsu OpenAPI przy użyciu narzędzi innych firm, takich jak Edytor struktury Swagger.

Główne pola odpowiedzi to:

  • Pole info.title zawiera nazwę punktu końcowego obsługującego.
  • Pole servers zawsze zawiera jeden obiekt, zazwyczaj url pole, które jest podstawowym adresem URL punktu końcowego.
  • Obiekt paths w odpowiedzi zawiera wszystkie obsługiwane ścieżki dla punktu końcowego. Klucze w obiekcie są adresem URL ścieżki. Każdy path może obsługiwać wiele formatów danych wejściowych. Te dane wejściowe są wyświetlane w oneOf polu.

Poniżej przedstawiono przykładową odpowiedź schematu punktu końcowego:


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