์ด ๊ธ์์ ๋ค๋ฃจ๋ ๊ฒ MLflow์ ๋ฑ๋ก๋ ๋ชจ๋ธ์ FastAPI๋ก ์๋นํ๊ณ , Stage ๊ธฐ๋ฐ ํซ์ค์๊ณผ ๋ชจ๋ธ ์ ๋ณด ์กฐํ API๋ฅผ ๊ตฌ์ถํฉ๋๋ค.
์ ์์ง์ MLOps ํ๋ซํผ ๊ตฌ์ถ 4๋จ๊ณ: Airflow GitSync + Secret ์ฐ๋ โ Helm ๋ฐฐํฌ์ Secret ๋ง์ดํธ ํจํด ์ด ๋จ๊ณ์์ ํด๊ฒฐํ๋ ค๋ ๋ฌธ์ ๋ชจ๋ธ์ ์๋์ผ๋ก ์๋น ์๋ฒ์ ๋ณต์ฌํ๋ฉด ๋ฐฐํฌ ์ค์์ ๋ฒ์ ๋ถ์ผ์น๊ฐ ๋ฐ์ํฉ๋๋ค. MLflow Registry์์ Stage๋ณ ๋ชจ๋ธ์ ์๋ ๋ก๋ฉํ๋ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด, ์ฝ๋ ๋ณ๊ฒฝ ์์ด ๋ชจ๋ธ์ ๊ต์ฒดํ ์ ์๋๋ก ํฉ๋๋ค.
๐ ์ํคํ
์ฒ ๊ตฌ์ฑ๋ ๐ณ FastAPI ์ปค์คํ
์ด๋ฏธ์ง Dockerfile FROM python:3.12 WORKDIR /app COPY app /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] requirements.txt fastapi==0.110.2 uvicorn==0.29.0 mlflow==2.13.0 pandas==2.1.4 scikit-learn==1.6.1 pydantic==2.7.1 boto3==1.34.113 numpy==1.26.4 packaging==24.2 psutil==7.0.0 scipy==1.15.3 setuptools==69.5.1 ๋น๋ & ํธ์ docker build -t ghcr.io/hoizz/fastapi-ml:mlflow-model-info . docker push ghcr.io/hoizz/fastapi-ml:mlflow-model-info ๐ app/main.py (ํต์ฌ ๋ถ๋ถ) app = FastAPI() model = None model_info = {} def load_model_from_mlflow(): global model, model_info tracking_uri = os.environ.get("MLFLOW_TRACKING_URI") model_name = os.environ.get("MODEL_NAME") model_stage = os.environ.get("MODEL_STAGE", "Production") mlflow.set_tracking_uri(tracking_uri) model_uri = f"models:/{model_name}/{model_stage}" model = mlflow.pyfunc.load_model(model_uri) client = MlflowClient() latest = client.get_latest_versions(name=model_name, stages=[model_stage])[0] model_info = { "model_name": model_name, "stage": model_stage, "version": latest.version, "run_id": latest.run_id, "model_uri": model_uri, } @app.on_event("startup") def startup_event(): load_model_from_mlflow() @app.get("/model-info") def get_model_info(): return model_info @app.post("/predict") async def predict(request: Request): input_data = await request.json() prediction = model.predict(input_data) return {"prediction": prediction.tolist()} ์ ์ฒด ์ฝ๋: GitHub (main.py)
...