[Airflow κΈ°μ΄ μλν - Airflow β MLflow β FastAPI]
π§ μ 체 νλ¦ μμ [AIRFLOW DAG μ€ν] β [train_mlflow.py] - iris λͺ¨λΈ νμ΅ - νλΌλ―Έν°/λ©νΈλ¦ λ‘κΉ - λͺ¨λΈ Registry λ±λ‘ β [promote_mlflow.py] - μ΅μ λͺ¨λΈμ ProductionμΌλ‘ μ ν β [FastAPI] - models:/IrisModel/Production β μ€μκ° μμΈ‘ π μ€μ΅ μ½λλ π GitHub (Airflow + MLflow + FastAPI) β [1λ¨κ³] νλ‘μ νΈ κΈ°λ³Έ ν΄λ ꡬ쑰 μ€κ³ π 1. μ 체 λλ ν 리 ꡬμ±λ mlops_project/ βββ airflow/ π« Airflow μ€μ λ° DAG μ€μΌμ€λ¬ β βββ dags/ β DAG μ μ λλ ν 리 β β βββ train_with_mlflow.py β νμ΅ DAG (MLflow μ°λ) β βββ Dockerfile.airflow β Airflowμ© Dockerfile β βββ requirements.txt β Airflow μμ‘΄μ± β βββ .dockerignore β βββ fastapi/ β‘ FastAPI μμΈ‘ API μλ² β βββ app/ β β βββ main.py β λͺ¨λΈ μλΉ μλν¬μΈνΈ β βββ Dockerfile.api β FastAPIμ© Dockerfile β βββ requirements.txt β FastAPI μμ‘΄μ± β βββ .dockerignore β βββ ml_code/ π§ ML νμ΅ λ° νλ‘λͺ¨μ μ½λ β βββ train_mlflow.py β λͺ¨λΈ νμ΅ λ° MLflow λ‘κΉ β βββ promote_mlflow.py β λͺ¨λΈ νλ‘λͺ¨μ (Staging β Production) β βββ mlflow_store/ ποΈ MLflow μ μ₯μ κ²½λ‘ (λ³Όλ₯¨) β βββ Dockerfile.mlflow β MLflow μλ² μ»€μ€ν°λ§μ΄μ§ β βββ mlflow.db β Model Registry DB (sqlite) β βββ mlruns/ β μ€ν λ‘κ·Έ λλ ν 리 β βββ artifacts/ β λͺ¨λΈ μν°ν©νΈ μ μ₯μ β βββ .dockerignore β βββ docker-compose.yaml π§© μ 체 μλΉμ€ κ΅¬μ± μ μ βββ .env π λ―Όκ° μ 보 (.envλ‘ λΆλ¦¬) βββ README.md π μ 체 νλ‘μ νΈ λ¬Έμν βββ .gitignore βββ .dockerignore β [2λ¨κ³] docker-compose.yaml ν΅ν© κ΅¬μ± π§ κ΅¬μ± λͺ©ν μλΉμ€λͺ μ€λͺ ν¬νΈ airflow DAG μ€ν νκ²½ (webserver/scheduler) 8080 postgres Airflow λ©νλ°μ΄ν° μ μ₯μ© DB λ΄λΆ ν΅μ mlflow MLflow UI + Registry κΈ°λ₯ 5000 fastapi μΆλ‘ API μλ² (λͺ¨λΈ λ‘λ©) 8000 μ΄λ―Έμ§ μ¬μ©μ μ£Όμ (UIλ§ μ 곡νλ μ΄λ―Έμ§ μ‘΄μ¬) π docker-compose.yaml μ 체 μμ version: '3.8' services: # π¦ PostgreSQL: Airflow λ©νλ°μ΄ν° μ μ₯μ© DB postgres: image: postgres:13 container_name: postgres env_file: - .env # β λ―Όκ°μ 보 λΆλ¦¬ (μμ΄λ/λΉλ²) environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} volumes: # β μ½λ/λ°μ΄ν° 곡μ λ° μμμ± λ³΄μ₯ - postgres_data:/var/lib/postgresql/data # β DB λ°μ΄ν° μ μ§ (μ¬μμ λλΉ) # π« Airflow: DAG μ€μΌμ€λ¬ λ° νμ€ν¬ μ€ν airflow: build: context: ./airflow # β Airflow μ μ© Dockerfile κ²½λ‘ dockerfile: Dockerfile.airflow container_name: airflow command: standalone # β λ‘컬 ν μ€νΈμ© κ°λ¨ μ€ν λͺ λ Ή # (- Scheduler + Webserver + DB μ΄κΈ°νκΉμ§ μλμΌλ‘ νλ²μ μ€ν) # (- μ€λ¬΄/μ΄μμμλ airflow-webserver, airflow-scheduler νλ λΆλ¦¬) ports: - "8080:8080" # β Airflow μΉ UI (localhost:8080) depends_on: - postgres # β DBκ° λ¨Όμ μ¬λΌμμΌ Airflow μμ κ°λ₯ env_file: - .env environment: # Airflow λ©νλ°μ΄ν° DB μ°κ²° μ£Όμ AIRFLOW__CORE__SQL_ALCHEMY_CONN: ${AIRFLOW__CORE__SQL_ALCHEMY_CONN} # Airflow μμ DAG λΆλ¬μ¬μ§ μ¬λΆ AIRFLOW__CORE__LOAD_EXAMPLES: ${AIRFLOW__CORE__LOAD_EXAMPLES} MLFLOW_TRACKING_URI: http://mlflow:5000 # β DAG μ½λμμ MLflow μ°λ volumes: - ./airflow/dags:/opt/airflow/dags # DAG νμΌ mount - ./ml_code:/opt/airflow/ml_code # νμ΅ μ½λ 곡μ - ./mlflow_store:/mlflow # λͺ¨λΈ μ μ₯μ 곡μ # π¬ MLflow: μ€ν μΆμ + λͺ¨λΈ λ μ§μ€νΈλ¦¬ μλ² mlflow: build: context: ./mlflow_store # 컀μ€ν Dockerfile μμΉ dockerfile: Dockerfile.mlflow ports: - "5000:5000" # β MLflow UI (localhost:5000) volumes: - ./mlflow_store:/mlflow # μ€ν λ‘κ·Έ + DB + artifacts μ μ₯ environment: - MLFLOW_TRACKING_URI=http://0.0.0.0:5000 # λ΄λΆ 컨ν μ΄λ κΈ°μ€ URI # β‘ FastAPI: λͺ¨λΈ μλΉ API fastapi: build: context: ./fastapi dockerfile: Dockerfile.api container_name: fastapi ports: - "8000:8000" # β μμΈ‘ API μλν¬μΈνΈ (localhost:8000) volumes: - ./fastapi/app:/app/app # FastAPI app λλ ν 리 mount - ./ml_code:/app/ml_code # νμ΅/λͺ¨λΈ μ½λ 곡μ - ./mlflow_store:/mlflow # μ μ₯λ λͺ¨λΈ λΆλ¬μ€κΈ° μν mount # ποΈ λ³Όλ₯¨ μ μ (Postgres DB μμμ± μ μ§) volumes: postgres_data: π μΆκ°λ‘ ν΄μΌ ν κ² Airflow 첫 μ€ν νμ λ³΄ν΅ κ΄λ¦¬μ κ³μ μμ±λ ν΄μ€μΌ ν¨: # airflow 컨ν μ΄λ μ μ docker exec -it airflow bash # κ΄λ¦¬μ κ³μ μμ± airflow users create \ --username airflow \ --password airflow \ --firstname Keoho \ --lastname Ban \ --role Admin \ --email airflow@example.com π [κ΅¬μΆ Tip] Airflow, FastAPI, MLflow κ° κ³΅μ λ³Όλ₯¨ ꡬ쑰 νμΈ κ³΅μ 리μμ€ μ€λͺ ./mlflow_store:/mlflow (MLflow) MLflow μλ²κ° μ°λ λ‘κ·Έ/λͺ¨λΈ μ μ₯μ ./mlflow_store:/mlflow (Airflow) νμ΅ ν λͺ¨λΈ μ μ₯ μμΉ κ³΅μ ./mlflow_store:/mlflow (FastAPI) λͺ¨λΈ μΆλ‘ μ λ‘λ κ²½λ‘ κ³΅μ β‘ κ²½λ‘ ν΅μΌμ±μ΄ μ€μν¨! μ§κΈμ λͺ¨λ ./mlflowλ‘ κ³΅μ (./mlflow νμμ /mlruns μ‘΄μ¬) ...