반응형
Notice
Recent Posts
Recent Comments
Link
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

Ethan's Values

MLOps Engineering(8) - Fast API를 사용하여 모델의 예측값 반환하는 REST API 구현 본문

MLOps

MLOps Engineering(8) - Fast API를 사용하여 모델의 예측값 반환하는 REST API 구현

Ethan_hyk 2024. 3. 27. 12:30
반응형

앞서 구현한 내용들을 기반으로 FastAPI를 사용하여 모델의 예측값을 받아오는 작업을 수행하겠습니다.

 

참고.

https://mlops-for-mle.github.io/tutorial/docs/api-serving/model-api

 

1) Model API | ML Engineer를 위한 MLOps

📌 Iris 데이터를 입력받아 예측값을 반환하는 API 를 작성합니다.

mlops-for-mle.github.io

1. Dockerfile 작성

 


python 버전은 3.8.18 입니다. app.py 파일에서 mlflow.sklearn.load_model 함수 실행 시 3.9 버전이면 오류가 나더라구요. 혹시나 3.9로 진행해보시고 오류나시면 버전을 바꿔 진행해보시는 것을 추천드립니다. 그리고 위의 블로그에서는 sk_model을 mlflow에서 다운받아 해당 모델을 COPY하여 사용하게 되는데 app.py 파일에서 바로 mlflow에서 모델을 불러와 사용하는 코드로 수정하였습니다.

#Dockerfile
FROM amd64/python:3.8.18

WORKDIR /usr/app

RUN pip install -U pip &&\
    pip install mlflow==2.11.1 boto3 pandas scikit-learn "fastapi[all]"

RUN pip install --upgrade requests

COPY schemas.py schemas.py
COPY app.py app.py
#COPY sk_model/ sk_model/

CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--reload"]

 

코드해석

  • RUN 부분에서는 패키지 설치 부분
  • COPY는 해당 Dockerfile 경로의 schemas, app 파이썬 파일을 fastapi 컨테이너에서 사용하기 위해 컨테이너 내부로 복사
  • CMD: app이라는 파이썬 파일에서 app이라고 정의한 FastAPI 앱 개체를 Uvicorn을 이용하여 실행, --reload 옵션은 코드가 변경될 때마다 서버를 자동으로 재시작 하는 옵션

 

2. schemas.py 파일 작성


Pydantic Model 로 스키마의 클래스를 작성합니다. 

from pydantic import BaseModel

class PredictIn(BaseModel):
    sepal_length: float
    sepal_width: float
    petal_length: float
    petal_width: float
    
class PredictOut(BaseModel):
    iris_class: int

 

코드 해석

  • pydantic에서 BaseModel을 import
  • input schema: api에서 입력으로 들어가게 될 데이터의 스키마를 클래스로 작성
  • output schema: api에서 반환할 데이터의 스키마를 클래스로 작성

3. app.py 파일 작성(Predict API 구현)

import mlflow
import pandas as pd
import os
from fastapi import FastAPI
from schemas import PredictIn, PredictOut
import mlflow.pyfunc
from mlflow import MlflowClient
import boto3
import mlflow.sklearn

os.environ["MLFLOW_S3_ENDPOINT_URL"] = "http://34.22.73.120:9000"
os.environ["MLFLOW_TRACKING_URI"] = "http://34.22.73.120:5001"
os.environ["AWS_ACCESS_KEY_ID"] = "minio"
os.environ["AWS_SECRET_ACCESS_KEY"] = "miniostorage"

MLFLOW_TRACKING_URI ="http://34.22.73.120:5001"
mlflow.set_tracking_uri(MLFLOW_TRACKING_URI)


def get_model():
    return mlflow.sklearn.load_model("runs:/83229d1b85cf4b55a7b37a95a260d934/sk_model")

MODEL = get_model()

print(MODEL)

app = FastAPI()

@app.post("/predict", response_model = PredictOut)
def predict(data: PredictIn) -> PredictOut:
    df = pd.DataFrame([data.dict()])
    pred = MODEL.predict(df).item()
    return PredictOut(iris_class=pred)

 

코드 해석

  • 필요한 패키지를 import
  • os: mlflow, minio 접속 환경 설정
  • mlflow uri: tracking uri 설정. 모델을 트래킹할 uri를 설정하여 모델을 가져옴
  • get_model 함수 정의:  mlflow.sklearn.load_model api를 사용하여 모델을 가져옴("runs:/run_id/model이름")
  • app = FastAPI(): API 구현을 위한 FastAPI 인스턴스 생성
  • @app.post: POST /predict를 수행 시 학습한 모델의 inference 결과를 반환할 수 있도록 작성

4. yaml파일 작성(FastAPI 서비스 생성)

#fast-api
  api-with-model:
    build:
      context: ./Dockerfiles/fastapi/
      dockerfile: Dockerfile
    container_name: api-with-model
    ports:
      - 8000:8000
    depends_on:
      - postgres-mlflow  
    healthcheck:
      test:
        - CMD
        - curl -X POST http://34.47.73.174:8000/predict
        - -H
        - "accept: application/json"
        - -H
        - "Content-Type: application/json"
        - -d
        - '{"sepal_length": 6.7, "sepal_width": 3.3, "petal_length": 5.7, "petal_width": 2.1}'
      interval: 10s
      timeout: 5s
      retries: 5

5. Docker 실행 및 API 서버 작동 확인

docker compose up을 통해 docker를 띄우고, IP:8000/docs로 들어가면 아래와 같은 화면을 볼 수 있다.

이후, POST를 클릭하여 try it out을 클릭 후 Input data를 수정하여 Execute로 실행

 

아래 화면과 같이 예측값인 iris_class:1 이 response되는 것을 확인할 수 있다.

 

 

이상, MLOps Engineering 시리즈를 마치도록 하겠습니다. 처음 개발을 진행해보기도 하였고, 진행하면서 블로그를 쓰는것도 처음이였습니다. 그래도 다른 블로그들을 살펴가며 쓰는 방법을 배우고 어떻게 정보가 더 잘 전달될지 고민을 많이 하며 작성하였습니다. 1~2명이 댓글을 써주시면 교류하고 있는 생각에 더 잘써서 효율적인 정보 전달이 되었으면 했습니다. 노력한 만큼 잘 전달이 됬는지는 모르겠습니다만 저와 같은 이들에겐 많은 도움이 되었으면 좋겠습니다 ㅎㅎ

 

저는 이후에는 분리되어 있는 MLOps 기능들을 한개의 플랫폼으로 구축하는 것이 목표입니다. 약 1~2개월 동안 MLOps에 대해 배우고, Linux, Docker, docker compose, airflow, mlflow, minio, fastapi 등 여러 프레임워크를 배우고 익히고 개발을 진행하였습니다. Docker라는 독립된 개발환경의 큰 장점을 한번 더 깨달으면서 진행하였고, 앞으로 ML뿐만 아닌 LLM, Vision Deep Learning 등에 대한 기능들을 추가로 적용될 수있는 솔루션을 개발하고 싶다는 강한 열의가 생겼습니다. 

 

그럼, 앞으로의 행보에도 기록이 함께 하도록 하겠습니다. 읽어주셔서 감사합니다.

Comments