> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sifi.life/llms.txt
> Use this file to discover all available pages before exploring further.

# 모델 배포 & 서빙

> 이 문서는 **[ML 핵심 개념](/blog/guides/ml-fundamentals/overview)** 섹션의 일부입니다.

## 5. 모델 배포 (Serving)

### Model Serving Endpoints (실시간 추론)

**왜 등장했는가**: ML 모델을 프로덕션 API로 노출하려면 컨테이너 이미지 빌드, 로드 밸런서 구성, 오토스케일링 설정 등 인프라 작업이 필요합니다. Databricks Model Serving은 이 복잡성을 **완전 관리형 서비스** 로 추상화합니다.

| 기능           | 설명                                                               |
| ------------ | ---------------------------------------------------------------- |
| **원클릭 배포**   | Unity Catalog 모델을 선택하면 REST API 엔드포인트 자동 생성                      |
| **오토스케일링**   | 트래픽에 따라 인스턴스 자동 확장/축소. Scale-to-zero 지원                          |
| **A/B 테스팅**  | 하나의 엔드포인트에 여러 모델 버전을 트래픽 비율로 라우팅                                 |
| **GPU 서빙**   | GPU 인스턴스를 선택하여 DL 모델 서빙 가능                                       |
| **피처 자동 조회** | Feature Spec이 등록된 모델은 서빙 시 Online Table에서 피처를 자동 조회              |
| **환경 버전 관리** | 모델이 기록된 시점의 Python 환경(conda.yaml)을 자동으로 재현하여 "내 로컬에서는 됐는데" 문제 방지 |

```python theme={null}
import requests

# 서빙 엔드포인트 호출 예시
endpoint_url = "https://<workspace-url>/serving-endpoints/<endpoint-name>/invocations"
headers = {"Authorization": f"Bearer {token}"}

payload = {
    "dataframe_records": [
        {"device_id": "sensor-001", "temperature": 85.2, "pressure": 1.2}
    ]
}

response = requests.post(endpoint_url, json=payload, headers=headers)
print(response.json())
```

### Batch Inference (대규모 배치 추론)

실시간 응답이 필요하지 않은 경우, **배치 추론** 이 비용 효율적입니다. Databricks에서 배치 추론을 수행하는 대표적인 방법은 다음과 같습니다.

| 방법                                | 적합한 경우                     | 장점                            |
| --------------------------------- | -------------------------- | ----------------------------- |
| **`mlflow.pyfunc.spark_udf()`**   | 대규모 데이터 (수백만\~수십억 건)       | Spark 병렬 처리, Delta 테이블에 직접 쓰기 |
| **MLflow `predict()`**            | 소규모 데이터 (pandas DataFrame) | 간단한 코드, 로컬 테스트 용이             |
| **Feature Store `score_batch()`** | 피처 테이블 조인이 필요한 경우          | 피처 자동 조회 + 추론 한 번에            |

```python theme={null}
import mlflow

# Spark UDF로 대규모 배치 추론
model_uri = "models:/catalog.schema.fraud_detection@Champion"
predict_udf = mlflow.pyfunc.spark_udf(spark, model_uri)

predictions = (
    spark.table("catalog.schema.transactions")
    .withColumn("prediction", predict_udf())
)
predictions.write.mode("overwrite").saveAsTable("catalog.schema.predictions")
```

### Foundation Model APIs

**왜 등장했는가**: LLM을 사용하려면 모델을 직접 호스팅하거나 외부 API를 호출해야 합니다. Databricks **Foundation Model APIs** 는 오픈소스 LLM을 Databricks 인프라에서 최적화된 상태로 제공하는 서버리스 API입니다.

아래 표는 두 가지 제공 유형의 차이와 각각 적합한 시나리오를 비교합니다.

| 구분         | Pay-per-token                         | Provisioned Throughput            |
| ---------- | ------------------------------------- | --------------------------------- |
| **과금 방식**  | 입출력 토큰 수 기반 종량제                       | 시간당 처리량(토큰/초) 단위 예약               |
| **지원 모델**  | 사전 배포된 인기 모델 (DBRX, Llama, Mixtral 등) | Foundation 모델 + **커스텀 파인튜닝 모델**   |
| **레이턴시**   | 공유 인프라이므로 피크 시 변동 가능                  | 전용 GPU 할당으로 **일관된 레이턴시 보장**       |
| **적합한 경우** | PoC, 개발/테스트, 간헐적 호출                   | 프로덕션 워크로드, SLA가 중요한 서비스, 높은 동시 요청 |
| **콜드 스타트** | 없음 (항상 준비됨)                           | 최초 배포 시 수분 소요 후 즉시 응답             |
| **비용 효율**  | 낮은 사용량에서 유리                           | 지속적/대량 호출에서 유리 (토큰당 단가가 낮아짐)      |

> **참고**
> **선택 기준**: 월 토큰 사용량이 수백만 토큰 이하이면 Pay-per-token이 경제적입니다. 프로덕션 서비스에서 초당 수십\~수백 요청을 처리하거나, 파인튜닝한 커스텀 모델을 서빙해야 한다면 Provisioned Throughput을 선택하세요.

Foundation Model APIs는 **OpenAI 호환 API** 를 지원하므로, 기존 OpenAI SDK 코드를 최소한의 변경으로 마이그레이션할 수 있습니다.

```python theme={null}
from openai import OpenAI

client = OpenAI(
    api_key=databricks_token,
    base_url="https://<workspace-url>/serving-endpoints"
)

response = client.chat.completions.create(
    model="databricks-meta-llama-3-1-70b-instruct",
    messages=[{"role": "user", "content": "매출 하락 원인을 분석해주세요."}]
)
```

### External Models

**External Models** 는 Azure OpenAI, Anthropic Claude, Amazon Bedrock 등 **외부 LLM 제공자를 Databricks 엔드포인트로 프록시** 하는 기능입니다.

| 이점                | 설명                                    |
| ----------------- | ------------------------------------- |
| **중앙 집중 거버넌스**    | 모든 LLM 호출을 Unity Catalog 권한으로 제어      |
| **사용량 추적**        | AI Gateway를 통해 토큰 사용량, 비용, 레이턴시를 모니터링 |
| **Rate Limiting** | 사용자/팀별 호출 한도 설정                       |
| **API 키 관리**      | 개별 사용자가 아닌 플랫폼 수준에서 API 키를 안전하게 관리    |
| **폴백(Fallback)**  | 한 제공자가 실패하면 다른 제공자로 자동 전환             |

이 아키텍처의 핵심 가치는 **모델 제공자를 추상화** 하는 것입니다. 애플리케이션 코드에서는 Databricks 엔드포인트만 호출하고, 실제로 어떤 LLM이 뒤에서 동작하는지는 엔드포인트 설정에서 변경할 수 있습니다.

**AI Gateway의 실제 역할**: External Models 기능의 핵심은 **AI Gateway** 레이어입니다. 이것은 단순 프록시가 아니라, 엔터프라이즈 환경에서 LLM 사용을 통제하고 관찰하기 위한 핵심 인프라입니다.

| AI Gateway 기능     | 동작 방식                                               | 실전 가치                |
| ----------------- | --------------------------------------------------- | -------------------- |
| **트래픽 라우팅**       | 하나의 엔드포인트에 여러 제공자(예: GPT-4o + Claude)를 설정하고 가중치로 분배 | A/B 테스트, 점진적 마이그레이션  |
| **Rate Limiting** | 사용자/그룹/엔드포인트별 분당/시간당 토큰 한도 설정                       | 비용 폭주 방지, 공정한 리소스 배분 |
| **Fallback**      | 주 제공자 실패(timeout, 5xx) 시 자동으로 백업 제공자로 전환            | 서비스 가용성 보장           |
| **Guardrails**    | 입력/출력에 안전성 필터 적용 (PII 마스킹, 유해 콘텐츠 차단)               | 규정 준수, 보안            |
| **사용량 로깅**        | 모든 요청/응답의 토큰 수, 레이턴시, 비용을 시스템 테이블에 자동 기록            | 비용 최적화, 감사(Audit)    |
