다음을 통해 공유


엔드포인트를 제공하는 모델 관리

이 문서에서는 서비스 UI 및 REST API를 사용하여 모델 서비스 엔드포인트를 관리하는 방법을 설명합니다. REST API 참조에서 서비스 엔드포인트를 참조하세요.

엔드포인트를 제공하는 모델을 만들려면 다음 중 하나를 사용합니다.

모델 엔드포인트의 상태 가져오기

서비스 UI에서 엔드포인트의 세부 정보 페이지 맨 위에 있는 서비스 엔드포인트 상태 표시기에서 엔드포인트의 상태를 확인할 수 있습니다.

REST API 또는 MLflow 배포 SDK를 사용하여 프로그래밍 방식으로 엔드포인트의 상태 및 세부 정보를 확인합니다.

REST API

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

다음 예제에서는 Unity 카탈로그 모델 레지스트리에 등록된 모델의 첫 번째 버전을 my-ads-model 제공하는 엔드포인트를 만듭니다. 부모 카탈로그 및 스키마(예: catalog.schema.example-model.)를 포함한 전체 모델 이름을 제공해야 합니다.

다음 예제 응답 state.ready 에서 필드는 "READY"이며, 이는 엔드포인트가 트래픽을 받을 준비가 됨을 의미합니다. 업데이트가 state.update_stateNOT_UPDATING 성공적으로 완료되었으므로 필드 pending_config 가 더 이상 반환되지 않습니다.

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

MLflow 배포 SDK

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

엔드포인트를 제공하는 모델 중지

엔드포인트를 제공하는 모델을 일시적으로 중지하고 나중에 시작할 수 있습니다. 엔드포인트가 중지되면 엔드포인트에 대해 프로비전된 리소스가 종료되고 엔드포인트가 다시 시작될 때까지 쿼리를 제공할 수 없습니다. 사용자 지정 모델을 제공하는 엔드포인트만 경로 최적화되지 않으며 진행 중인 업데이트가 없는 경우 중지할 수 있습니다. 중지된 엔드포인트는 리소스 할당량에 계산되지 않습니다. 중지된 엔드포인트로 전송된 쿼리는 400 오류를 반환합니다.

서비스 UI의 엔드포인트 세부 정보 페이지에서 엔드포인트를 중지할 수 있습니다.

  1. 중지할 엔드포인트를 클릭합니다.
  2. 오른쪽 위 모서리에서 중지를 클릭합니다.

또는 다음과 같이 REST API를 사용하여 프로그래밍 방식으로 서비스 엔드포인트를 중지할 수 있습니다.

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

엔드포인트를 제공하는 중지된 모델을 시작할 준비가 되면 서비스 UI의 엔드포인트 세부 정보 페이지에서 이 작업을 수행할 수 있습니다.

  1. 시작하려는 엔드포인트를 클릭합니다.
  2. 오른쪽 위 모서리에서 시작을 클릭합니다.

또는 다음과 같이 REST API를 사용하여 프로그래밍 방식으로 중지된 서비스 엔드포인트를 시작할 수 있습니다.

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

엔드포인트를 제공하는 모델 삭제

모델에 대한 서비스를 사용하지 않도록 설정하려면 제공된 엔드포인트를 삭제할 수 있습니다.

서비스 UI의 엔드포인트 세부 정보 페이지에서 엔드포인트를 삭제할 수 있습니다.

  1. 사이드바에서 서비스(Serving)를 클릭합니다.
  2. 삭제할 엔드포인트를 클릭합니다.
  3. 위쪽의 케밥 메뉴를 클릭하고 삭제를 선택합니다.

또는 REST API 또는 MLflow 배포 SDK를 사용하여 프로그래밍 방식으로 서비스 엔드포인트를 삭제할 수 있습니다.

REST API

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

MLflow 배포 SDK

from mlflow.deployments import get_deploy_client

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

엔드포인트를 제공하는 모델 디버그

엔드포인트와 관련된 문제를 디버그하려면 다음을 가져올 수 있습니다.

  • 모델 서버 컨테이너 빌드 로그
  • 모델 서버 로그

이러한 로그는 로그 탭의 엔드포인트 UI에서도 액세스할 수 있습니다 .

제공된 모델에 대한 빌드 로그 의 경우 다음 요청을 사용할 수 있습니다. 자세한 내용은 모델 제공에 대한 디버깅 가이드를 참조하세요.


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

서비스 모델에 대한 모델 서버 로그의 경우 다음 요청을 사용할 수 있습니다.


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

{
  “config_version”: 1  // optional
}

엔드포인트를 제공하는 모델에 대한 권한 관리

사용 권한을 수정하려면 서비스 엔드포인트에 대한 CAN MANAGE 권한이 있어야 합니다. 사용 권한 수준에 대한 자세한 내용은 엔드포인트 ACL 제공을 참조 하세요.

서비스 엔드포인트에 대한 사용 권한 목록을 가져옵니다.

databricks permissions get servingendpoints <endpoint-id>

사용자에게 jsmith@example.com 서비스 엔드포인트에 대한 CAN QUERY 권한을 부여합니다.

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

권한 API를 사용하여 서비스 엔드포인트 권한을 수정할 수도 있습니다.

엔드포인트를 제공하는 모델에 대한 예산 정책 추가

Important

이 기능은 공개 미리 보기 상태이며, 외부 모델 또는 파운데이션 모델 API의 토큰 기반 사용량에 대해 청구되는 워크로드를 제공하는 엔드포인트에서는 사용할 수 없습니다.

예산 정책을 사용하면 조직에서 서버리스 사용량에 대해 상세한 청구 명세를 위해 맞춤형 태그를 적용할 수 있습니다. 작업 영역에서 예산 정책을 사용하여 서버리스 사용을 특성으로 지정하는 경우 엔드포인트를 제공하는 모델에 예산 정책을 추가할 수 있습니다. 예산 정책를 통해 서버리스 사용 속성을 참조하세요.

모델 서빙 엔드포인트를 생성하는 동안, 서비스 UI의 예산 정책 메뉴에서 엔드포인트에 대한 예산 정책을 선택할 수 있습니다. 예산 정책이 할당된 경우 예산 정책 메뉴에서 정책을 선택하지 않더라도 만든 모든 엔드포인트에 해당 예산 정책이 할당됩니다.

서비스 UI를 사용하여 엔드포인트를 만드는 모델을 제공하는 동안 예산 정책을 추가합니다.

기존 엔드포인트에 대한 MANAGE 권한이 있는 경우 UI의 엔드포인트 세부 정보 페이지에서 해당 엔드포인트에 예산 정책을 편집하고 추가할 수 있습니다.

서비스 UI를 사용하여 엔드포인트를 제공하는 기존 모델에 대한 예산 정책을 편집합니다.

메모

예산 정책이 할당된 경우 기존 엔드포인트는 해당 정책으로 자동으로 태그가 지정되지 않습니다. 예산 정책을 연결하려면 기존 엔드포인트를 수동으로 업데이트해야 합니다.

엔드포인트 스키마를 제공하는 모델 가져오기

Important

엔드포인트 쿼리 스키마를 제공하는 지원은 공개 미리 보기제공됩니다. 이 기능은 모델 서비스 지역에서 사용할 수 있습니다.

서비스 엔드포인트 쿼리 스키마는 JSON 형식의 표준 OpenAPI 사양을 사용하는 서비스 엔드포인트에 대한 공식적인 설명입니다. 엔드포인트 경로, 요청 및 응답 본문 형식과 같은 엔드포인트 쿼리에 대한 세부 정보 및 각 필드에 대한 데이터 형식을 포함한 엔드포인트에 대한 정보가 포함됩니다. 이 정보는 재현성 시나리오 또는 엔드포인트에 대한 정보가 필요한 경우 유용할 수 있지만 원래 엔드포인트 작성자 또는 소유자는 아닙니다.

엔드포인트 스키마를 제공하는 모델을 얻으려면 제공된 모델에 모델 서명이 기록되고 엔드포인트가 상태에 있어야 READY 합니다.

다음 예제에서는 REST API를 사용하여 엔드포인트 스키마를 제공하는 모델을 프로그래밍 방식으로 가져오는 방법을 보여 줍니다. 엔드포인트 스키마를 제공하는 기능은 Databricks 기능 제공이란?을 참조하세요.

API에서 반환되는 스키마는 OpenAPI 사양을 따르는 JSON 개체 형식입니다.


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"

스키마 응답 세부 정보

응답은 JSON 형식의 OpenAPI 사양으로, 일반적으로 , openapiinfoservers 및 .paths 스키마 응답은 JSON 개체이므로 일반적인 프로그래밍 언어를 사용하여 구문 분석하고 타사 도구를 사용하여 사양에서 클라이언트 코드를 생성할 수 있습니다. Swagger 편집기 같은 타사 도구를 사용하여 OpenAPI 사양을 시각화할 수도 있습니다.

응답의 주요 필드는 다음과 같습니다.

  • 필드에는 info.title 서비스 엔드포인트의 이름이 표시됩니다.
  • 필드에는 servers 항상 하나의 개체(일반적으로 url 엔드포인트의 기본 URL인 필드)가 포함됩니다.
  • 응답의 개체에는 paths 엔드포인트에 대해 지원되는 모든 경로가 포함됩니다. 개체의 키는 경로 URL입니다. 각각 path 은 여러 형식의 입력을 지원할 수 있습니다. 이러한 입력은 필드에 나열 oneOf 됩니다.

다음은 엔드포인트 스키마 응답의 예입니다.


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