ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • FastAPI와 Docker, AWS ECS로 머신러닝 모델 배포하기
    AWS/ECS 2025. 9. 4. 15:17
    반응형

    단계별 ML 모델 배포 여정

    머신러닝 모델을 실제 서비스로 만들려면, 단순히 학습만으로 끝나지 않고 다양한 배포 과정을 거쳐야 합니다. 이 글에서는 scikit-learn으로 만든 모델을 FastAPI로 감싸고, Docker로 컨테이너화해 AWS ECS(Fargate)를 통해 클라우드에 올리는 일련의 과정을 소개합니다.

    모델 학습 및 저장

    먼저 머신러닝 모델을 훈련시킨 후 파일로 저장합니다. 여기서는 유명한 아이리스 데이터셋을 사용해 랜덤 포레스트 분류기를 만들었고, 결과를 iris_model.pkl로 저장했습니다.

    # train_model.py
    from sklearn.datasets import load_iris
    from sklearn.ensemble import RandomForestClassifier
    import joblib
    X, y = load_iris(return_X_y=True)
    model = RandomForestClassifier()
    model.fit(X, y)
    joblib.dump(model, iris_model.pkl)

    FastAPI로 모델을 API화

    저장된 모델을 바로 사용할 수 있도록 FastAPI 웹 프레임워크로 REST API를 만듭니다. 사용자는 입력값(feature)을 JSON 형태로 POST해서 결과를 받을 수 있습니다.

    # app/main.py
    from fastapi import FastAPI
    from pydantic import BaseModel
    import joblib
    import numpy as np
    
    app = FastAPI()
    model = joblib.load(iris_model.pkl)
    
    class IrisFeatures(BaseModel):
        features: list[float]
    
    @app.post(/predict)
    def predict(iris: IrisFeatures):
        X = np.array(iris.features).reshape(1, -1)
        prediction = model.predict(X)
        return {prediction: int(prediction[0])}

    테스트와 필요한 패키지 준비

    서비스에 필요한 파이썬 라이브러리는 requirements.txt에 모았습니다.

    fastapi
    uvicorn[standard]
    scikit-learn
    joblib
    numpy

    로컬에서 아래 명령어로 실행하며 올바로 동작하는지 점검합니다.

    uvicorn app.main:app --host 0.0.0.0 --port 8000

    Docker로 컨테이너화

    코드를 Docker로 포장하면 어디서든 동일하게 실행할 수 있습니다. Dockerfile을 만들어 이미지를 생성하고, 로컬에서 실행하여 환경이 잘 갖춰졌는지 확인합니다.

    # Dockerfile
    FROM python:3.11-slim
    WORKDIR /app
    COPY requirements.txt .
    RUN pip install --no-cache-dir -r requirements.txt
    COPY . .
    CMD [uvicorn, app.main:app, --host, 0.0.0.0, --port, 8000]

    이미지 만들기:

    docker build -t fastapi-iris-app .

    실행해보기:

    docker run -p 8000:8000 fastapi-iris-app

    AWS ECR에 이미지 업로드

    이제 AWS에서 서비스를 준비합니다. 도커 이미지를 AWS ECR 저장소에 올려야 하므로, 다음 절차를 거칩니다.

    1. AWS CLI로 로그인 및 설정
    2. ECR 저장소 생성
    3. 이미지를 태그하고 ECR에 푸시
    aws configure
    aws ecr create-repository --repository-name fastapi-iris

    이미지 태그 지정 및 푸시:

    docker tag fastapi-iris-app:latest <ECR URI>
    docker push <ECR URI>

    ECS Fargate로 서비스 배포

    클라우드에서 도커 이미지를 실행하기 위해 ECS(Fargate) 클러스터와 서비스, 태스크 정의를 만듭니다.

    • ECS 클러스터 생성 (“네트워킹 only”)
    • 태스크 정의에서 이미지, 포트(8000), 네트워크 설정
    • 서비스 생성 후 태스크 수, 서브넷, 퍼블릭 IP 활성화
    • 완료 후 공개 IP 혹은 로드밸런서 주소 확인 가능

    배포 완료 후 서비스 테스트

    배포가 성공했다면, 클라우드상 API서버에 아래와 같이 테스트 요청을 보내 결과를 받습니다.

    curl -X POST http://<배포된 서버 주소>:8000/predict 
    -H Content-Type: application/json 
    -d {features: [5.1, 3.5, 1.4, 0.2]}

    성공하면 나만의 ML 서비스가 세상에 공개된 것입니다!

    실전 배포의 의의

    노트북 안에만 머무르던 모델을 실제 세계에 공개하는 것은 데이터 과학자의 진짜 성장입니다. 위 단계들을 통해 모델은 언제 어디서나 활용될 수 있는 서비스가 되었고, 여러분 역시 DevOps 및 백엔드 실무를 경험하게 됩니다. 앞으로 다양한 ML 모델도 쉽게 배포할 수 있게 됩니다!

     

    반응형
Designed by Tistory.