MLOps κ°œμš”

MLOps κ°œμš”

1. MLOpsλž€?

MLOps(Machine Learning Operations)λŠ” λ¨Έμ‹ λŸ¬λ‹ λͺ¨λΈμ˜ 개발, 배포, μš΄μ˜μ„ μžλ™ν™”ν•˜κ³  효율적으둜 κ΄€λ¦¬ν•˜κΈ° μœ„ν•œ 싀무 λ°©λ²•λ‘ μž…λ‹ˆλ‹€.

κΈ°μ‘΄ ML ν”„λ‘œμ νŠΈμ˜ 문제점:
- λͺ¨λΈμ΄ λ…ΈνŠΈλΆμ—μ„œλ§Œ μž‘λ™
- μ‹€ν—˜ μž¬ν˜„ λΆˆκ°€λŠ₯
- 배포 ν›„ μ„±λŠ₯ μ €ν•˜ 감지 어렀움
- μˆ˜λ™ μž¬ν•™μŠ΅ ν•„μš”

MLOps의 λͺ©ν‘œ:
- μžλ™ν™”λœ ML νŒŒμ΄ν”„λΌμΈ
- μž¬ν˜„ κ°€λŠ₯ν•œ μ‹€ν—˜
- 지속적인 λͺ¨λΈ λͺ¨λ‹ˆν„°λ§
- μžλ™ μž¬ν•™μŠ΅ 및 배포

1.1 MLOps의 핡심 원칙

"""
MLOps의 핡심 원칙
"""

# 1. μž¬ν˜„μ„± (Reproducibility)
# - λ™μΌν•œ 데이터와 μ½”λ“œλ‘œ λ™μΌν•œ κ²°κ³Όλ₯Ό 얻을 수 μžˆμ–΄μ•Ό 함
experiment_config = {
    "data_version": "v1.2.0",
    "code_version": "git:abc123",
    "random_seed": 42,
    "hyperparameters": {"lr": 0.001, "epochs": 100}
}

# 2. μžλ™ν™” (Automation)
# - μˆ˜λ™ μž‘μ—… μ΅œμ†Œν™”, νŒŒμ΄ν”„λΌμΈμœΌλ‘œ μžλ™ν™”
pipeline_stages = [
    "data_validation",
    "feature_engineering",
    "model_training",
    "model_evaluation",
    "model_deployment"
]

# 3. λͺ¨λ‹ˆν„°λ§ (Monitoring)
# - λͺ¨λΈ μ„±λŠ₯κ³Ό 데이터 ν’ˆμ§ˆ 지속 κ°μ‹œ
monitoring_metrics = {
    "model_accuracy": 0.95,
    "prediction_latency_p99": "50ms",
    "data_drift_score": 0.02
}

# 4. 버전 관리 (Versioning)
# - 데이터, μ½”λ“œ, λͺ¨λΈ λͺ¨λ‘ 버전 관리
versions = {
    "data": "s3://bucket/data/v2.0/",
    "model": "models/classifier_v3.2.1",
    "config": "configs/production.yaml"
}

2. DevOps vs MLOps

2.1 전톡적 DevOps

개발자 β†’ μ½”λ“œ μž‘μ„± β†’ λΉŒλ“œ β†’ ν…ŒμŠ€νŠΈ β†’ 배포 β†’ λͺ¨λ‹ˆν„°λ§
                   ↑                        β”‚
                   └────────── ν”Όλ“œλ°± β”€β”€β”€β”€β”€β”€β”€β”˜

2.2 MLOps의 μΆ”κ°€ μš”μ†Œ

데이터 κ³Όν•™μž β†’ 데이터 β†’ ν”Όμ²˜ μ—”μ§€λ‹ˆμ–΄λ§ β†’ λͺ¨λΈ ν•™μŠ΅ β†’ 검증 β†’ 배포 β†’ λͺ¨λ‹ˆν„°λ§
                 ↑                                              β”‚
                 β”‚            ← 데이터 λ“œλ¦¬ν”„νŠΈ 감지 β†β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                 β”‚            ← λͺ¨λΈ μ„±λŠ₯ μ €ν•˜ 감지 β†β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                 └─────────────── μž¬ν•™μŠ΅ 트리거 β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

2.3 μ£Όμš” 차이점

"""
DevOps vs MLOps 차이점
"""

# DevOps: μ½”λ“œ 쀑심
devops_artifacts = {
    "source": "application_code",
    "build": "docker_image",
    "test": "unit_tests, integration_tests",
    "deploy": "kubernetes_manifests"
}

# MLOps: 데이터 + μ½”λ“œ + λͺ¨λΈ
mlops_artifacts = {
    "data": "training_data, validation_data",
    "features": "feature_definitions, feature_store",
    "code": "training_scripts, serving_code",
    "model": "model_weights, model_metadata",
    "experiments": "hyperparameters, metrics, artifacts"
}

# MLOps 고유의 과제
mlops_challenges = [
    "데이터 ν’ˆμ§ˆ 관리",
    "ν”Όμ²˜ 일관성 μœ μ§€",
    "λͺ¨λΈ 버전 관리",
    "A/B ν…ŒμŠ€νŠΈ",
    "λ“œλ¦¬ν”„νŠΈ 감지",
    "λͺ¨λΈ 해석 κ°€λŠ₯μ„±"
]
ꡬ뢄 DevOps MLOps
μ£Όμš” μ‚°μΆœλ¬Ό μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œ 데이터 + λͺ¨λΈ + μ½”λ“œ
ν…ŒμŠ€νŠΈ μœ λ‹›/톡합 ν…ŒμŠ€νŠΈ + 데이터 검증, λͺ¨λΈ 검증
배포 λ‹¨μœ„ μ»¨ν…Œμ΄λ„ˆ/μ„œλΉ„μŠ€ λͺ¨λΈ + μ„œλΉ™ 인프라
λͺ¨λ‹ˆν„°λ§ μ‹œμŠ€ν…œ λ©”νŠΈλ¦­ + λͺ¨λΈ μ„±λŠ₯, 데이터 λ“œλ¦¬ν”„νŠΈ
λ‘€λ°± 이전 버전 배포 λͺ¨λΈ 버전 λ‘€λ°± + 데이터 κ³ λ €

3. MLOps μ„±μˆ™λ„ 레벨

3.1 Google의 MLOps μ„±μˆ™λ„ λͺ¨λΈ

Level 0: μˆ˜λ™ ν”„λ‘œμ„ΈμŠ€
β”œβ”€β”€ μ£Όν”Όν„° λ…ΈνŠΈλΆμ—μ„œ μ‹€ν—˜
β”œβ”€β”€ μˆ˜λ™μœΌλ‘œ λͺ¨λΈ 배포
β”œβ”€β”€ λͺ¨λ‹ˆν„°λ§ μ—†μŒ
└── μž¬ν•™μŠ΅ 트리거 μ—†μŒ

Level 1: ML νŒŒμ΄ν”„λΌμΈ μžλ™ν™”
β”œβ”€β”€ μžλ™ν™”λœ ν•™μŠ΅ νŒŒμ΄ν”„λΌμΈ
β”œβ”€β”€ μ‹€ν—˜ 좔적
β”œβ”€β”€ λͺ¨λΈ λ ˆμ§€μŠ€νŠΈλ¦¬
└── κΈ°λ³Έ λͺ¨λ‹ˆν„°λ§

Level 2: CI/CD νŒŒμ΄ν”„λΌμΈ
β”œβ”€β”€ μžλ™ ν…ŒμŠ€νŠΈ (μ½”λ“œ + 데이터 + λͺ¨λΈ)
β”œβ”€β”€ 지속적 ν•™μŠ΅ (CT)
β”œβ”€β”€ μžλ™ 재배포
└── μ™„μ „ν•œ λͺ¨λ‹ˆν„°λ§ 및 μ•Œλ¦Ό

3.2 μ„±μˆ™λ„λ³„ νŠΉμ§•

"""
MLOps μ„±μˆ™λ„ λ ˆλ²¨λ³„ κ΅¬ν˜„
"""

# Level 0: μˆ˜λ™ ML
class Level0_ManualML:
    """
    - 데이터 κ³Όν•™μžκ°€ λ…ΈνŠΈλΆμ—μ„œ μ‹€ν—˜
    - μ—”μ§€λ‹ˆμ–΄κ°€ μˆ˜λ™μœΌλ‘œ λͺ¨λΈ 배포
    - λ“œλ¬Έ 배포 (뢄기별/μ—°κ°„)
    """
    def train(self):
        # λ…ΈνŠΈλΆμ—μ„œ μ‹€ν–‰
        model = train_model(data)
        model.save("model.pkl")
        # μˆ˜λ™μœΌλ‘œ μ„œλ²„μ— 볡사

# Level 1: ML νŒŒμ΄ν”„λΌμΈ
class Level1_Pipeline:
    """
    - μžλ™ν™”λœ ν•™μŠ΅ νŒŒμ΄ν”„λΌμΈ
    - μ‹€ν—˜ 좔적 (MLflow)
    - λͺ¨λΈ λ ˆμ§€μŠ€νŠΈλ¦¬
    """
    def train_pipeline(self):
        with mlflow.start_run():
            data = load_data()
            model = train_model(data)
            mlflow.log_metrics(evaluate(model))
            mlflow.sklearn.log_model(model, "model")

# Level 2: CI/CD/CT
class Level2_CICDCT:
    """
    - μ½”λ“œ λ³€κ²½ μ‹œ μžλ™ ν…ŒμŠ€νŠΈ
    - 데이터 λ³€κ²½ μ‹œ μžλ™ μž¬ν•™μŠ΅
    - μ„±λŠ₯ μ €ν•˜ μ‹œ μžλ™ λ‘€λ°±
    """
    def continuous_training(self):
        if detect_drift() or new_data_available():
            trigger_training_pipeline()
        if model_performance_degraded():
            rollback_to_previous_version()

3.3 μ„±μˆ™λ„ 체크리슀트

# mlops_maturity_checklist.yaml
level_0:
  - λ…ΈνŠΈλΆ 기반 μ‹€ν—˜
  - μˆ˜λ™ λͺ¨λΈ 배포
  - λ¬Έμ„œν™” μ—†μŒ

level_1:
  - μžλ™ν™”λœ ν•™μŠ΅ νŒŒμ΄ν”„λΌμΈ
  - μ‹€ν—˜ 좔적 μ‹œμŠ€ν…œ (MLflow/W&B)
  - λͺ¨λΈ 버전 관리
  - κΈ°λ³Έ λͺ¨λ‹ˆν„°λ§

level_2:
  - CI/CD for ML
  - μžλ™ν™”λœ ν…ŒμŠ€νŠΈ (데이터/λͺ¨λΈ)
  - 지속적 ν•™μŠ΅ (Continuous Training)
  - λ“œλ¦¬ν”„νŠΈ 감지 및 μ•Œλ¦Ό
  - A/B ν…ŒμŠ€νŠΈ 인프라
  - ν”Όμ²˜ μŠ€ν† μ–΄

4. MLOps 도ꡬ μƒνƒœκ³„

4.1 μΉ΄ν…Œκ³ λ¦¬λ³„ 도ꡬ

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         MLOps 도ꡬ μƒνƒœκ³„                            β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                     β”‚
β”‚  [μ‹€ν—˜ 좔적]          [νŒŒμ΄ν”„λΌμΈ]         [ν”Όμ²˜ μŠ€ν† μ–΄]              β”‚
β”‚  - MLflow             - Kubeflow          - Feast                   β”‚
β”‚  - Weights & Biases   - Airflow           - Tecton                  β”‚
β”‚  - Neptune            - Prefect           - Hopsworks               β”‚
β”‚  - Comet ML           - Dagster                                     β”‚
β”‚                                                                     β”‚
β”‚  [λͺ¨λΈ λ ˆμ§€μŠ€νŠΈλ¦¬]     [μ„œλΉ™]              [λͺ¨λ‹ˆν„°λ§]                 β”‚
β”‚  - MLflow Registry    - TorchServe        - Evidently               β”‚
β”‚  - Vertex AI          - Triton            - Grafana                 β”‚
β”‚  - SageMaker          - TFServing         - Prometheus              β”‚
β”‚  - Neptune            - BentoML           - WhyLabs                 β”‚
β”‚                       - Seldon                                      β”‚
β”‚                                                                     β”‚
β”‚  [데이터 버전]         [라벨링]            [인프라]                   β”‚
β”‚  - DVC                - Label Studio      - Kubernetes              β”‚
β”‚  - Delta Lake         - Labelbox          - Docker                  β”‚
β”‚  - LakeFS             - Prodigy           - Terraform               β”‚
β”‚                                                                     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

4.2 μ£Όμš” 도ꡬ 비ꡐ

"""
MLOps 도ꡬ 비ꡐ
"""

# μ‹€ν—˜ 좔적 도ꡬ
experiment_tracking = {
    "MLflow": {
        "type": "μ˜€ν”ˆμ†ŒμŠ€",
        "features": ["μ‹€ν—˜ 좔적", "λͺ¨λΈ λ ˆμ§€μŠ€νŠΈλ¦¬", "μ„œλΉ™"],
        "deployment": "self-hosted / managed",
        "best_for": "μ—”ν„°ν”„λΌμ΄μ¦ˆ, μ»€μŠ€ν„°λ§ˆμ΄μ§•"
    },
    "Weights & Biases": {
        "type": "μƒμš© (무료 ν‹°μ–΄ 있음)",
        "features": ["μ‹€ν—˜ 좔적", "ν•˜μ΄νΌνŒŒλΌλ―Έν„° νŠœλ‹", "μ•„ν‹°νŒ©νŠΈ"],
        "deployment": "SaaS / self-hosted",
        "best_for": "λ”₯λŸ¬λ‹, ν˜‘μ—…, μ‹œκ°ν™”"
    },
    "Neptune": {
        "type": "μƒμš© (무료 ν‹°μ–΄ 있음)",
        "features": ["μ‹€ν—˜ 좔적", "메타데이터 관리"],
        "deployment": "SaaS",
        "best_for": "λŒ€κ·œλͺ¨ μ‹€ν—˜ 관리"
    }
}

# μ„œλΉ™ 도ꡬ
serving_tools = {
    "TorchServe": {
        "supported": ["PyTorch"],
        "features": ["REST/gRPC", "배치 μΆ”λ‘ ", "A/B ν…ŒμŠ€νŠΈ"],
        "best_for": "PyTorch λͺ¨λΈ"
    },
    "Triton": {
        "supported": ["PyTorch", "TensorFlow", "ONNX", "TensorRT"],
        "features": ["λ©€ν‹°λͺ¨λΈ", "GPU μ΅œμ ν™”", "동적 λ°°μΉ­"],
        "best_for": "κ³ μ„±λŠ₯ μΆ”λ‘ , λ©€ν‹° ν”„λ ˆμž„μ›Œν¬"
    },
    "TFServing": {
        "supported": ["TensorFlow"],
        "features": ["REST/gRPC", "버전 관리"],
        "best_for": "TensorFlow λͺ¨λΈ"
    }
}

4.3 ν΄λΌμš°λ“œ κ΄€λ¦¬ν˜• μ„œλΉ„μŠ€

"""
ν΄λΌμš°λ“œ MLOps ν”Œλž«νΌ
"""

cloud_platforms = {
    "AWS SageMaker": {
        "components": [
            "SageMaker Studio",      # 개발 ν™˜κ²½
            "SageMaker Pipelines",   # νŒŒμ΄ν”„λΌμΈ
            "Model Registry",         # λͺ¨λΈ 관리
            "SageMaker Endpoints",   # μ„œλΉ™
            "Model Monitor"          # λͺ¨λ‹ˆν„°λ§
        ]
    },
    "Google Vertex AI": {
        "components": [
            "Workbench",             # 개발 ν™˜κ²½
            "Vertex Pipelines",      # νŒŒμ΄ν”„λΌμΈ
            "Model Registry",         # λͺ¨λΈ 관리
            "Prediction",            # μ„œλΉ™
            "Model Monitoring"       # λͺ¨λ‹ˆν„°λ§
        ]
    },
    "Azure ML": {
        "components": [
            "Azure ML Studio",       # 개발 ν™˜κ²½
            "Azure Pipelines",       # νŒŒμ΄ν”„λΌμΈ
            "Model Registry",         # λͺ¨λΈ 관리
            "Managed Endpoints",     # μ„œλΉ™
            "Data Drift"             # λͺ¨λ‹ˆν„°λ§
        ]
    }
}

5. MLOps μ•„ν‚€ν…μ²˜ νŒ¨ν„΄

5.1 κΈ°λ³Έ μ•„ν‚€ν…μ²˜

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                        MLOps κΈ°λ³Έ μ•„ν‚€ν…μ²˜                         β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                  β”‚
β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”           β”‚
β”‚   β”‚  Data   │────▢│   Feature   │────▢│   Model     β”‚           β”‚
β”‚   β”‚  Lake   β”‚     β”‚   Store     β”‚     β”‚  Training   β”‚           β”‚
β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜           β”‚
β”‚                                               β”‚                  β”‚
β”‚                                               β–Ό                  β”‚
β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β”‚
β”‚   β”‚ Monitor │◀────│   Model     │◀────│    Model     β”‚          β”‚
β”‚   β”‚  /Alert β”‚     β”‚   Serving   β”‚     β”‚   Registry   β”‚          β”‚
β”‚   β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β”‚
β”‚        β”‚                                                         β”‚
β”‚        └────────── Retrain Trigger ─────────────────▢ Training  β”‚
β”‚                                                                  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

5.2 μ½”λ“œ μ˜ˆμ‹œ

"""
MLOps νŒŒμ΄ν”„λΌμΈ κΈ°λ³Έ ꡬ쑰
"""

from typing import Dict, Any

class MLOpsPipeline:
    """κΈ°λ³Έ MLOps νŒŒμ΄ν”„λΌμΈ"""

    def __init__(self, config: Dict[str, Any]):
        self.config = config
        self.experiment_tracker = None
        self.model_registry = None
        self.feature_store = None

    def data_ingestion(self):
        """데이터 μˆ˜μ§‘ 및 검증"""
        raw_data = self.load_data(self.config["data_source"])
        validated_data = self.validate_data(raw_data)
        return validated_data

    def feature_engineering(self, data):
        """ν”Όμ²˜ μ—”μ§€λ‹ˆμ–΄λ§"""
        features = self.feature_store.get_features(
            entity_ids=data["entity_ids"],
            feature_list=self.config["features"]
        )
        return features

    def train(self, features):
        """λͺ¨λΈ ν•™μŠ΅"""
        with self.experiment_tracker.start_run():
            model = self.train_model(features)
            metrics = self.evaluate(model)
            self.experiment_tracker.log_metrics(metrics)
            return model

    def register(self, model):
        """λͺ¨λΈ 등둝"""
        if self.passes_quality_gate(model):
            self.model_registry.register(
                model=model,
                stage="staging"
            )

    def deploy(self, model_version: str):
        """λͺ¨λΈ 배포"""
        model = self.model_registry.load(model_version)
        self.serving_endpoint.update(model)

    def monitor(self):
        """λͺ¨λΈ λͺ¨λ‹ˆν„°λ§"""
        if self.detect_drift():
            self.trigger_retraining()

6. μ‹œμž‘ν•˜κΈ°

6.1 첫 MLOps ν”„λ‘œμ νŠΈ

"""
MLOps μ‹œμž‘ν•˜κΈ°: MLflow둜 μ‹€ν—˜ 좔적
"""

import mlflow
import mlflow.sklearn
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

# MLflow μ„€μ •
mlflow.set_tracking_uri("http://localhost:5000")
mlflow.set_experiment("iris-classification")

# 데이터 μ€€λΉ„
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(
    iris.data, iris.target, test_size=0.2, random_state=42
)

# MLflow μ‹€ν—˜ μ‹œμž‘
with mlflow.start_run(run_name="random-forest-v1"):
    # ν•˜μ΄νΌνŒŒλΌλ―Έν„° λ‘œκΉ…
    params = {"n_estimators": 100, "max_depth": 5}
    mlflow.log_params(params)

    # λͺ¨λΈ ν•™μŠ΅
    model = RandomForestClassifier(**params, random_state=42)
    model.fit(X_train, y_train)

    # 평가 및 λ©”νŠΈλ¦­ λ‘œκΉ…
    y_pred = model.predict(X_test)
    accuracy = accuracy_score(y_test, y_pred)
    mlflow.log_metric("accuracy", accuracy)

    # λͺ¨λΈ μ €μž₯
    mlflow.sklearn.log_model(model, "model")

    print(f"Run ID: {mlflow.active_run().info.run_id}")
    print(f"Accuracy: {accuracy:.4f}")

6.2 둜컬 ν™˜κ²½ μ„€μ •

# MLflow μ„œλ²„ μ‹œμž‘
mlflow server \
    --backend-store-uri sqlite:///mlflow.db \
    --default-artifact-root ./mlruns \
    --host 0.0.0.0 \
    --port 5000

# λΈŒλΌμš°μ €μ—μ„œ 확인
# http://localhost:5000

μ—°μŠ΅ 문제

문제 1: MLOps μ„±μˆ™λ„ 평가

ν˜„μž¬ νŒ€μ˜ ML ν”„λ‘œμ„ΈμŠ€λ₯Ό ν‰κ°€ν•˜κ³  μ„±μˆ™λ„ λ ˆλ²¨μ„ κ²°μ •ν•˜μ„Έμš”.

문제 2: 도ꡬ 선택

λ‹€μŒ 상황에 μ ν•©ν•œ MLOps 도ꡬλ₯Ό μ„ νƒν•˜μ„Έμš”: - μ†Œκ·œλͺ¨ νŒ€, PyTorch μ‚¬μš©, μ˜ˆμ‚° μ œν•œ - λŒ€κ·œλͺ¨ νŒ€, λ©€ν‹° ν”„λ ˆμž„μ›Œν¬, κ³ μ„±λŠ₯ ν•„μš”


μš”μ•½

κ°œλ… μ„€λͺ…
MLOps ML λͺ¨λΈμ˜ 개발, 배포, 운영 μžλ™ν™”
DevOps vs MLOps MLOpsλŠ” 데이터와 λͺ¨λΈ 관리가 좔가됨
μ„±μˆ™λ„ Level 0 μˆ˜λ™ ν”„λ‘œμ„ΈμŠ€, λ…ΈνŠΈλΆ 기반
μ„±μˆ™λ„ Level 1 μžλ™ν™”λœ νŒŒμ΄ν”„λΌμΈ, μ‹€ν—˜ 좔적
μ„±μˆ™λ„ Level 2 CI/CD/CT, 지속적 ν•™μŠ΅
핡심 도ꡬ MLflow, W&B, Kubeflow, Feast, Triton

참고 자료

to navigate between lessons