> ## 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.

# 모델 권한 체계와 Model Serving 연동

> 이 문서는 **[머신러닝](/training/09-machine-learning/overview)** 섹션의 일부입니다.

## 왜 모델 권한 관리가 중요한가

머신러닝 모델은 단순한 코드 파일이 아닙니다. 프로덕션 환경에서 실행되는 모델은 **비즈니스 의사결정** 에 직접 영향을 미치며, 잘못된 모델이 배포되면 금전적 손실이나 규제 위반으로 이어질 수 있습니다.

### 무분별한 모델 배포의 위험성

* **검증되지 않은 모델 배포**: 실험 중인 모델이 실수로 프로덕션에 배포되어 예측 품질 저하
* **모델 오염 (Model Poisoning)**: 악의적 사용자가 학습 데이터나 모델 가중치를 변조
* **규제 위반**: 금융/의료 도메인에서 승인되지 않은 모델 사용 시 법적 제재 (GDPR, HIPAA 등)
* **추적 불가**: 누가 언제 어떤 모델을 배포했는지 기록이 없으면 사고 원인 분석 불가

### 규제 준수 (Compliance) 요구사항

| 규제        | 관련 요구사항                        |
| --------- | ------------------------------ |
| **GDPR**  | 자동화된 의사결정 모델의 설명 가능성, 접근 권한 기록 |
| **HIPAA** | 의료 데이터를 사용한 모델의 접근 제어 및 감사 로그  |
| **SOC 2** | 모델 변경 이력, 배포 승인 프로세스 문서화       |
| **금융 규제** | 신용 심사 모델의 변경 통제 및 독립적 검증 요구    |

### Unity Catalog (UC)가 제공하는 보호

Unity Catalog 기반 Model Registry는 **테이블과 동일한 거버넌스 체계** 를 모델에 적용합니다. 단일 접근 제어 계층에서 데이터 → 피처 → 모델 → 엔드포인트까지 일관된 권한 관리가 가능합니다.

***

## Unity Catalog 기반 모델 권한 체계

### 권한 계층 구조

UC 모델 권한은 **Catalog → Schema → Model** 3단계 네임스페이스를 따릅니다. 상위 레벨 권한이 없으면 하위 레벨에 접근할 수 없습니다.

```sql theme={null}
-- 1단계: Catalog 접근 권한 (모든 하위 객체 접근의 전제 조건)
GRANT USE CATALOG ON CATALOG ml_catalog TO `ds_team`;

-- 2단계: Schema 접근 권한
GRANT USE SCHEMA ON SCHEMA ml_catalog.fraud_models TO `ds_team`;

-- 3단계: 모델 등록 권한 (새 모델 생성)
GRANT CREATE MODEL ON SCHEMA ml_catalog.fraud_models TO `ds_team`;

-- 3단계: 모델 실행 권한 (추론/예측 호출)
GRANT EXECUTE ON MODEL ml_catalog.fraud_models.fraud_detection TO `inference_service`;

-- 권한 확인
SHOW GRANTS ON MODEL ml_catalog.fraud_models.fraud_detection;

-- 권한 회수
REVOKE EXECUTE ON MODEL ml_catalog.fraud_models.fraud_detection FROM `inference_service`;
```

### 주요 권한 설명

| 권한               | 적용 대상   | 허용 작업             |
| ---------------- | ------- | ----------------- |
| `USE CATALOG`    | Catalog | Catalog 내 객체 탐색   |
| `USE SCHEMA`     | Schema  | Schema 내 객체 탐색    |
| `CREATE MODEL`   | Schema  | 새 모델 등록 (새 버전 포함) |
| `EXECUTE`        | Model   | 모델 버전 조회, 추론 호출   |
| `APPLY TAG`      | Model   | 모델에 태그 추가/수정      |
| `ALL PRIVILEGES` | Model   | 모든 작업 (소유자 수준)    |

> **참고**: `EXECUTE` 권한은 모델 가중치 파일 다운로드를 허용하지 않습니다. 모델 아티팩트 (Artifact) 접근은 별도의 Storage Credential 권한으로 제어됩니다.

**참고 링크**: [Unity Catalog privileges for ML models](https://docs.databricks.com/en/data-governance/unity-catalog/manage-privileges/privileges.html#ml-model-privileges)

***

## 역할별 권한 설계

실제 조직에서는 역할 (Role) 기반으로 권한을 그룹화하는 것이 권장됩니다.

### 데이터 사이언티스트 (Data Scientist)

실험을 수행하고 모델을 등록하는 역할. 프로덕션 배포 권한은 없습니다.

```sql theme={null}
-- DS 팀 그룹에 최소 권한 부여
GRANT USE CATALOG ON CATALOG ml_catalog TO `data_scientists`;
GRANT USE SCHEMA ON SCHEMA ml_catalog.experiments TO `data_scientists`;
GRANT USE SCHEMA ON SCHEMA ml_catalog.staging_models TO `data_scientists`;

-- 실험용 Schema에 모델 등록 허용
GRANT CREATE MODEL ON SCHEMA ml_catalog.staging_models TO `data_scientists`;

-- 스테이징 모델 읽기/실행 허용
GRANT EXECUTE ON SCHEMA ml_catalog.staging_models TO `data_scientists`;
```

### ML 엔지니어 (ML Engineer)

승인된 모델을 프로덕션에 배포하고 모니터링하는 역할.

```sql theme={null}
-- ML 엔지니어는 프로덕션 Schema에 대한 쓰기 권한 보유
GRANT USE CATALOG ON CATALOG ml_catalog TO `ml_engineers`;
GRANT USE SCHEMA ON SCHEMA ml_catalog.production_models TO `ml_engineers`;
GRANT CREATE MODEL ON SCHEMA ml_catalog.production_models TO `ml_engineers`;
GRANT EXECUTE ON SCHEMA ml_catalog.production_models TO `ml_engineers`;

-- Alias 관리를 위한 ALL PRIVILEGES (champion/challenger 전환)
GRANT ALL PRIVILEGES ON SCHEMA ml_catalog.production_models TO `ml_engineers`;
```

### 모델 소비자 (Model Consumer)

추론 API를 호출하는 애플리케이션 또는 팀. 읽기 전용 권한만 부여합니다.

```sql theme={null}
-- 추론만 허용 (모델 수정 불가)
GRANT USE CATALOG ON CATALOG ml_catalog TO `analytics_team`;
GRANT USE SCHEMA ON SCHEMA ml_catalog.production_models TO `analytics_team`;
GRANT EXECUTE ON MODEL ml_catalog.production_models.fraud_detection TO `analytics_team`;
```

### 관리자 (Admin)

전체 모델 생명주기를 관리하는 역할. 서비스 프린시펄 (Service Principal) 계정으로 운영하는 것을 권장합니다.

```sql theme={null}
-- Catalog 소유자 지정 (일반적으로 관리자 그룹)
ALTER CATALOG ml_catalog SET OWNER TO `ml_platform_admins`;

-- Schema 소유자 지정
ALTER SCHEMA ml_catalog.production_models SET OWNER TO `ml_platform_admins`;
```

***

## Model Serving 연동

### 모델 → 엔드포인트 배포 워크플로

```
[Model Registry (UC)]
    ↓ Alias: "champion"
[Model Serving Endpoint]
    ↓ REST API
[애플리케이션 / 대시보드]
```

Alias (별칭) 를 활용하면 엔드포인트 설정을 변경하지 않고 **새 모델 버전으로 무중단 전환** 이 가능합니다.

```python theme={null}
import mlflow
from databricks.sdk import WorkspaceClient

w = WorkspaceClient()

# Alias를 참조하여 배포 → Alias 변경 시 자동 전환
w.serving_endpoints.create(
    name="fraud-detection-endpoint",
    config={
        "served_entities": [{
            "entity_name": "ml_catalog.production_models.fraud_detection",
            "entity_version": "champion",  # Alias 사용 (버전 번호 대신)
            "workload_size": "Small",       # Small / Medium / Large
            "scale_to_zero_enabled": True   # 비용 최적화
        }]
    }
)
```

### 서비스 프린시펄 (Service Principal) 설정

엔드포인트가 UC 모델에 접근하려면 **서비스 프린시펄** 에 권한을 부여해야 합니다. 개인 계정 대신 서비스 프린시펄을 사용하면 담당자 이직/퇴사 시에도 서비스가 중단되지 않습니다.

```python theme={null}
# 1. 서비스 프린시펄 ID 확인
sp = w.service_principals.get(application_id="<app-id>")
print(f"Service Principal ID: {sp.id}")
```

```sql theme={null}
-- 2. 서비스 프린시펄에 모델 접근 권한 부여
GRANT USE CATALOG ON CATALOG ml_catalog TO `<service-principal-name>`;
GRANT USE SCHEMA ON SCHEMA ml_catalog.production_models TO `<service-principal-name>`;
GRANT EXECUTE ON MODEL ml_catalog.production_models.fraud_detection TO `<service-principal-name>`;
```

**참고 링크**: [Model Serving with Unity Catalog](https://docs.databricks.com/en/machine-learning/model-serving/model-serving-intro.html)

***

## 엔드포인트 권한 관리

Model Serving 엔드포인트 자체에도 별도의 권한 체계가 있습니다. UC 모델 권한과는 독립적으로 관리됩니다.

### 엔드포인트 권한 레벨

| 권한           | 허용 작업                         |
| ------------ | ----------------------------- |
| `CAN_MANAGE` | 엔드포인트 생성/수정/삭제, 권한 관리         |
| `CAN_QUERY`  | 엔드포인트에 추론 요청 전송 (REST API 호출) |
| `CAN_VIEW`   | 엔드포인트 상태 및 설정 조회              |

```python theme={null}
from databricks.sdk.service.serving import ServingEndpointAccessControlRequest, ServingEndpointPermissionLevel

# 엔드포인트 권한 설정
w.serving_endpoints.set_permissions(
    serving_endpoint_id="fraud-detection-endpoint",
    access_control_list=[
        ServingEndpointAccessControlRequest(
            group_name="analytics_team",
            permission_level=ServingEndpointPermissionLevel.CAN_QUERY
        ),
        ServingEndpointAccessControlRequest(
            group_name="ml_engineers",
            permission_level=ServingEndpointPermissionLevel.CAN_MANAGE
        )
    ]
)
```

### PAT (Personal Access Token) vs OAuth 토큰

| 방식                         | 장점                 | 단점                  |
| -------------------------- | ------------------ | ------------------- |
| **PAT**                    | 설정 간단              | 만료 관리 필요, 개인 계정에 종속 |
| **OAuth M2M**              | 서비스 프린시펄 기반, 자동 갱신 | 초기 설정 복잡            |
| **Instance Profile (AWS)** | IAM 기반, 자격증명 불필요   | EC2/클러스터에서만 사용 가능   |

프로덕션 환경에서는 **OAuth M2M (Machine-to-Machine)** 방식을 권장합니다.

```python theme={null}
# OAuth M2M 토큰으로 엔드포인트 호출
import requests

# 1. 서비스 프린시펄 클라이언트 자격증명으로 OAuth 토큰 발급
token_response = requests.post(
    "https://<workspace-url>/oidc/v1/token",
    data={
        "grant_type": "client_credentials",
        "client_id": "<client-id>",
        "client_secret": "<client-secret>",
        "scope": "all-apis"
    }
)
access_token = token_response.json()["access_token"]

# 2. 토큰으로 엔드포인트 호출
response = requests.post(
    "https://<workspace-url>/serving-endpoints/fraud-detection-endpoint/invocations",
    headers={"Authorization": f"Bearer {access_token}"},
    json={"inputs": [{"feature_1": 0.5, "feature_2": 1.2}]}
)
```

***
