
최근 여러 기업의 공고를 보면 MLOps, FastAPI 등 modeling 및 training 뿐만 아니라 serving, monitoring 등 모델의 life cycle에 대한 지식과 기술을 요구한다.
이 중 서빙(serving)은 training이 끝난 모델을 실제 서비스(app, web 등)에서 사용할 수 있도록 제공하는 것
FastAPI는 서빙을 담당하는 모델로, 모델을 배포하기 전, 시험 단계에 사용할 수 있다.
오늘은 FastAPI를 활용, 학습한 모델을 브라우저에서 실행하는 local development을 수행해보려 한다.
🚀 필요 라이브러리 🚀
joblib: 학습 모델 dump, loaduvicorn: 코드를 실행시키는 엔진pydantic: 데이터의 정합성 보장
(실습에서는 간단히 랜덤포레스트 분류기, 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
(저장한 모델과 스크립트 파일은 동일한 경로에 있어야 함)
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를 사용하는 게 좋다.

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