Model Serving with FastAPI

JunD·2025년 12월 29일
post-thumbnail
  • 최근 여러 기업의 공고를 보면 MLOps, FastAPI 등 modeling 및 training 뿐만 아니라 serving, monitoring 등 모델의 life cycle에 대한 지식과 기술을 요구한다.

  • 이 중 서빙(serving)은 training이 끝난 모델을 실제 서비스(app, web 등)에서 사용할 수 있도록 제공하는 것

  • FastAPI는 서빙을 담당하는 모델로, 모델을 배포하기 전, 시험 단계에 사용할 수 있다.

  • 오늘은 FastAPI를 활용, 학습한 모델을 브라우저에서 실행하는 local development을 수행해보려 한다.

🚀 필요 라이브러리 🚀

  • joblib : 학습 모델 dump, load
  • uvicorn : 코드를 실행시키는 엔진
  • pydantic : 데이터의 정합성 보장


Serving 실습

1) script 작성

(실습에서는 간단히 랜덤포레스트 분류기, iris 데이터를 사용하여 모델을 학습하였다)

  • train.py

    import joblib
     from sklearn.ensemble import RandomForestClassifier
     from sklearn.datasets import load_iris
    
     data = load_iris()
     model = RandomForestClassifier(random_state=43)
    model.fit(data.data, data.target)
    
     joblib.dump(model, 'iris_model.pkl')
     print("모델 저장!")

  • main.py

    import joblib
     from fastapi import FastAPI
     import numpy as np
     from pydantic import BaseModel
     from typing import List
     app = FastAPI()
    
     model = joblib.load('iris_model.pkl')
    
     class IrisInput(BaseModel):
       features: List[List[float]]
    
     @app.get("/")
     def read_root():
         return {"message":"머신러닝 모델 서버가 작동 중입니다."}
    
     @app.post("/predict")
     def predict(input_data : IrisInput):
         target_names = ['setosa', 'versicolor', 'virginica']
         data = np.array(input_data.features)
    
         predictions = model.predict(data)
         
         results = [target_names[i] for i in predictions]
          
         return {"predictions": predictions.tolist(),
                "target_names": results}
    
     @app.post("/new")
     def new_print():
         a = "post 추가됨"
         return a
    


2) CMD에서 실행

(저장한 모델과 스크립트 파일은 동일한 경로에 있어야 함)

  • cd를 사용하여 파일이 모여있는 경로로 옮긴 뒤

  • 아래 명령어를 사용하여 웹 서버에서 main.py를 실행할 수 있게 한다.

    • python -m uvicorn [실행할 스크립트파일명]:[FastAPI 객체명] --reload
      • --reload : 코드 수정 시 서버 자동 재시작 옵션이기 때문에 사용하는 게 좋음
  • 명령어 수행 시, 아래와 같이 사용할 URL이 뜬다.

  • 위 URL을 실행하면 main.py에서 app.get이 반환된다.
    (get은 필수는 아니지만 확인 위해 사용하는 게 좋음)

  • URL+/docs에 들어가면
    위와 같이 데이터를 직접 입력, 결과를 확인할 수 있는 창이 뜬다.

💡왜 URL에 /docs를 사용할까?

  • URL은 get 전용으로, get은 단순 이미지 또는 텍스트만 띄울 수 있지만,
  • 필자는 학습된 모델에 데이터를 입력하고 출력한 결과까지 봐야하는 테스트이기 떄문에. 즉, 데이터를 전달하고 결과까지 보여줄 post가 필요하기 때문에 /docs를 사용하는 게 훨씬 편리하다.
  • URL 사용하고 싶다면 requests 라이브러리 추가, 터미널에서 직접 데이터를 보내야 하는 복잡한 과정이 필요하기 때문에 /docs를 사용하는 게 좋다.

  • 사용할 post(predict)를 눌러 펼치고, Try it out을 누르면 사용자가 데이터를 입력할 수 있게 되고, example value는 입력해야할 데이터 타입 예시를 보여준다.
    • 이는 pydantic을 사용하기 때문에 가능하며, 만약 사용하지 않고 바로 input을 입력하도록 구현하면 example value가 없는 것을 확인할 수 있다.
    • 즉, 스키마(schema) 제공


3) 테스트 결과

{
  "features": [
    [5.7, 4.4, 1.5, 0.4],
    [5.4, 3.9, 1.3, 0.4],
    [5.1, 3.5, 1.4, 0.3],
    [6.9, 3.1, 5.1, 2.3],
    [5.8, 2.7, 5.1, 1.9],
    [6.8, 3.2, 5.9, 2.3],
    [5.1, 3.7, 1.5, 0.4],
    [5.2, 3.5, 1.5, 0.2],
    [5.2, 3.4, 1.4, 0.2]   
  ]
}
  • 위와 같이 9개 데이터를 입력했을 때, 아래와 같이 모델의 예측 결과와 target의 이름까지 출력된 것을 볼 수 있다.

profile
Data Scientist & Data Analyst

0개의 댓글