본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] 만든 AI 모델을 웹 사이트에 올리는 7가지 방법과 Flask vs FastAPI 결정적 차이 해결

by Papa Martino V 2026. 4. 11.
728x90

Flask vs FastAPI
Flask vs FastAPI

 

데이터 사이언티스트나 AI 엔지니어가 겪는 가장 큰 고충 중 하나는 로컬 환경(Jupyter Notebook)에서 완벽하게 돌아가는 모델을 실제 서비스 환경(Production)으로 옮기는 과정입니다. 모델 개발이 1단계라면, 전 세계 사용자가 접속할 수 있는 웹 사이트에 이를 배포하는 것은 완전히 다른 차원의 기술적 숙련도를 요구합니다. 2026년 현재, 파이썬 생태계에서 모델 서빙(Model Serving)의 표준으로 자리 잡은 FlaskFastAPI는 각각의 장단점이 명확합니다. 본 가이드에서는 두 프레임워크의 구조적 차이를 규명하고, 실무에서 즉시 활용 가능한 7가지 배포 해결 전략을 심층적으로 다룹니다.


1. Flask vs FastAPI: AI 서빙 관점에서의 기술적 차이 분석

전통적인 안정성을 자랑하는 Flask와 비동기 처리에 특화된 현대적인 FastAPI는 프로젝트의 규모와 요구 사항에 따라 선택이 달라져야 합니다.

비교 항목 Flask (전통적 방식) FastAPI (현대적 방식)
주요 특징 마이크로 프레임워크, 단순성, 범용성 비동기(Async), 자동 문서화(Swagger), 속도
비동기 지원 동기 방식 위주 (WSGI) 기본 비동기 지원 (ASGI) - 고성능
유효성 검사 수동 구현 (Marshmallow 등 필요) Pydantic 기반 자동 검사 및 타입 힌트
API 문서화 별도 라이브러리 설치 필요 /docs 접속 시 Swagger UI 자동 생성
학습 곡선 매우 낮음 (파이썬 기초 수준) 중간 (비동기 프로그래밍 이해 필요)
AI 서빙 적합도 프로토타입 및 소규모 프로젝트 실시간 스트리밍, 대규모 트래픽 서비스

2. 실무자를 위한 AI 모델 웹 서빙 해결 예제 7가지 (Python Code)

개발자가 모델 파일을 불러오고 이를 웹 API로 노출하며 성능을 최적화하는 2026년 표준 실무 코드셋입니다.

Example 1: FastAPI를 이용한 기본 AI 추론 API 구현

Pydantic을 사용하여 입력 데이터의 타입을 엄격하게 관리하고 추론 결과를 반환하는 가장 현대적인 해결 방법입니다.

from fastapi import FastAPI
from pydantic import BaseModel
import joblib

# 1. 모델 로드 (학습된 pkl 파일)
model = joblib.load("my_model.pkl")
app = FastAPI()

# 2. 입력 데이터 구조 정의
class InferenceInput(BaseModel):
    feature1: float
    feature2: float

@app.post("/predict")
async def predict(data: InferenceInput):
    # 입력 데이터를 리스트 형식으로 변환 후 추론
    prediction = model.predict([[data.feature1, data.feature2]])
    return {"result": float(prediction[0])}
    

Example 2: Flask를 이용한 단순 모델 서빙 해결 방법

빠르게 프로토타입을 만들어야 할 때 사용하는 가벼운 방식입니다.

from flask import Flask, request, jsonify
import pickle

app = Flask(__name__)
with open("model.pkl", "rb") as f:
    model = pickle.load(f)

@app.route("/predict", methods=["POST"])
def predict():
    data = request.get_json()
    result = model.predict([data["input"]])
    return jsonify({"prediction": result.tolist()})

if __name__ == "__main__":
    app.run(port=5000)
    

Example 3: 대용량 딥러닝 모델의 비동기 배치(Batch) 처리

GPU 자원을 효율적으로 쓰기 위해 요청을 하나씩 처리하지 않고 묶어서 처리하는 고차원 해결 전략입니다.

import asyncio

# 비동기 큐를 이용한 배치 수집
request_queue = asyncio.Queue()

async def batch_processor():
    while True:
        items = []
        # 일정 시간 동안 혹은 일정 개수만큼 큐에서 꺼내기
        item = await request_queue.get()
        items.append(item)
        # 묶음 추론 로직 수행
        print(f"Batch inference for {len(items)} requests")

# API 진입점에서 큐에 삽입 후 대기
    

Example 4: 모델 로딩 최적화를 위한 싱글톤(Singleton) 패턴

요청이 올 때마다 모델을 읽으면 속도가 매우 느려집니다. 서버 시작 시 단 한 번만 로드하는 해결책입니다.

class ModelServer:
    _instance = None
    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
            # 서버 메모리에 모델 적재
            cls._instance.model = joblib.load("huge_model.pkl")
        return cls._instance

# app = FastAPI()
# server = ModelServer()
    

Example 5: Docker를 이용한 배포 환경 컨테이너화

"내 컴퓨터에선 되는데 왜 서버에선 안 되지?" 문제를 원천 차단하는 해결 전략입니다.

# Dockerfile
FROM python:3.10-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
# Gunicorn 혹은 Uvicorn을 이용해 실행
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"]
    

Example 6: 대용량 이미지/파일 업로드 처리 API

이미지 분류 모델 배포 시 파일을 안전하게 수신하고 처리하는 코드입니다.

from fastapi import File, UploadFile
from PIL import Image
import io

@app.post("/upload-image")
async def process_image(file: UploadFile = File(...)):
    contents = await file.read()
    image = Image.open(io.BytesIO(contents)).convert("RGB")
    # image_tensor = preprocess(image)
    return {"filename": file.filename, "size": len(contents)}
    

Example 7: Prometheus를 이용한 실시간 추론 지연 시간 모니터링

모델의 응답 속도가 느려지는지 실시간으로 감시하는 운영 레벨 해결 방법입니다.

from prometheus_fastapi_instrumentator import Instrumentator

# 서버 실행 시 매트릭 수집 활성화
Instrumentator().instrument(app).expose(app)
print("모니터링 엔드포인트 /metrics가 활성화되었습니다.")
    

3. AI 모델 웹 배포 시 반드시 해결해야 할 3가지 이슈

  1. 메모리 관리: 대형 모델(Transformer 등)은 여러 개의 프로세스가 뜰 경우 RAM 부족으로 서버가 다운됩니다. 해결: --preload 옵션을 사용하거나 공유 메모리 설정을 검토하세요.
  2. 동시성 처리: 추론 연산은 CPU/GPU를 많이 소모합니다. 해결: Celery와 같은 비동기 태스크 큐를 도입하여 무거운 작업은 백그라운드에서 처리하세요.
  3. 보안: API 키 없이 배포하면 모델 자원을 도용당할 수 있습니다. 해결: API Key 인증 미들웨어를 추가하세요.

4. 결론 및 향후 전망

모델을 웹에 올리는 것은 AI 프로젝트의 마침표가 아니라 실제 가치를 창출하는 시작점입니다. FastAPI는 높은 성능과 개발 편의성 덕분에 2026년 현재 압도적인 표준으로 자리 잡았지만, 간단한 내부 툴이나 레거시 시스템과의 통합에는 여전히 Flask가 유효한 선택지가 될 수 있습니다. 단순히 모델을 올리는 것에 그치지 않고, Docker모니터링 도구를 결합하여 지속 가능한 서빙 인프라를 구축하시기 바랍니다.

 

내용 출처 및 참조 (Sources):

  • FastAPI 공식 문서: Modern, high-performance web framework (fastapi.tiangolo.com)
  • Flask 공식 사이트: The Pallets Projects (flask.palletsprojects.com)
  • "Machine Learning Engineering with Python" by Andrew P. McMahon.
  • NVIDIA Triton Inference Server: High-performance AI serving documentation.
  • Google Cloud Architecture Framework: Deploying Machine Learning Models.
728x90