8 7월 2025

[python 인공지능] Deploy ML models with FastAPI, Docker, and Heroku | Tutorial

[python 인공지능] Deploy ML models with FastAPI, Docker, and Heroku | Tutorial

 

🔧 머신러닝 모델 배포 전반

  • (00:00) FastAPI + Docker + Heroku 조합으로 머신러닝 모델을 프로덕션 수준으로 배포하는 전체 과정을 설명.

  • 다양한 프레임워크(Scikit-learn, TensorFlow, PyTorch)에서도 동일한 접근 방식으로 활용 가능.


🧠 모델 개발 및 저장

  • (01:03~03:53)

    • Google Colab에서 언어 감지 모델 개발 (Scikit-learn 기반 Naive Bayes + CountVectorizer).

    • 모델은 Pipeline으로 결합하여 추론을 단일 객체로 수행.

    • pickle로 모델 저장, 버전 관리(major.minor.patch) 권장.

    • 텐서플로나 파이토치 사용 시 zip 압축하여 다운로드하는 팁 소개.


🏗️ FastAPI 애플리케이션 구성

  • (05:10~08:11)

    • app/main.py에서 FastAPI 엔드포인트 구현 (헬스 체크 및 /predict POST API).

    • model.py에서 저장된 모델 로드 및 전처리/예측 로직 구현.

    • pydantic.BaseModel 기반 입력/출력 유효성 검사 적용 (타입 안전성 보장).


🐳 Docker 컨테이너화

  • (08:46~11:27)

    • FastAPI 컨테이너화를 위한 Dockerfile, .dockerignore, requirements.txt 생성.

    • 공식 FastAPI + Gunicorn 기반 Docker 이미지 활용.

    • 의존성은 scikit-learn만 추가 설치 (==1.0.2 등 버전 고정 권장).

    • docker build, docker run 명령어로 로컬 실행 및 포트 매핑 확인.


📋 FastAPI 자동 문서화

  • (12:50~13:34)

    • /docs 경로에서 Swagger 기반 API 문서 자동 생성.

    • 입력 텍스트에 따른 언어 예측 테스트 가능 (Postman 없이도 가능).


☁️ Heroku 배포

  • (14:17~17:51)

    • heroku login, heroku create, git push heroku main으로 CLI 기반 배포 진행.

    • heroku.yaml 파일 작성 필수 (Heroku Dev Center 문서 참고).

    • heroku stack:set container로 Docker 기반 스택 설정.

    • 배포 후 Heroku URL에서 API 접근 가능.


배포 후 테스트

  • (17:51~18:38)

    • Postman으로 GET /Health Check OK, POST /predict"language": "german", "language": "italian" 확인.

    • 실시간 언어 감지 API 배포 완료!


필요 시 각 섹션별로 관련 코드/구성요소를 다시 정리해드릴 수 있습니다.

 

나의 말:
섹션별로 관련 코드/구성요소를 다시 정리
 
ChatGPT의 말:

아래는 영상에서 설명한 FastAPI + Docker + Heroku를 활용한 머신러닝 모델 배포 과정을 섹션별로 코드 및 구성요소 중심으로 재정리한 내용입니다:


1️⃣ 모델 개발 및 저장 (Colab)

✅ 사용 기술:

  • scikit-learn, pandas, re, pickle

📄 주요 코드:

python
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
import pickle

# 데이터 준비 및 전처리
label_encoder = LabelEncoder()
y_encoded = label_encoder.fit_transform(df['language'])

# 모델 파이프라인 정의
pipeline = Pipeline([
('vectorizer', CountVectorizer()),
('classifier', MultinomialNB())
])

# 훈련
pipeline.fit(df['text'], y_encoded)

# 저장
with open('model_v0.1.0.pkl', 'wb') as f:
pickle.dump(pipeline, f)

# 레이블 저장 (선택)
label_classes = label_encoder.classes_


2️⃣ FastAPI 앱 구성

📁 디렉터리 구조:

bash
app/
├── main.py # FastAPI 엔트리포인트
├── model/
│ ├── model.py # 모델 로딩 및 예측 함수
│ └── model_v0.1.0.pkl # 저장된 모델 파일

📄 model/model.py (모델 로딩 및 예측)

python
import pickle
import os
import re

BASE_DIR = os.path.dirname(__file__)
MODEL_PATH = os.path.join(BASE_DIR, "model_v0.1.0.pkl")

with open(MODEL_PATH, "rb") as f:
model = pickle.load(f)

label_classes = ["english", "german", "italian", ...] # 실제 label list

def predict_pipeline(text: str) -> str:
text = re.sub(r"[^\w\s]", "", text)
pred = model.predict([text])[0]
return label_classes[pred]

📄 main.py (FastAPI 엔드포인트)

python
from fastapi import FastAPI
from pydantic import BaseModel
from app.model.model import predict_pipeline

app = FastAPI()

class TextIn(BaseModel):
text: str

class PredictionOut(BaseModel):
language: str

@app.get("/")
def health_check():
return {"status": "ok", "model_version": "0.1.0"}

@app.post("/predict", response_model=PredictionOut)
def predict(payload: TextIn):
language = predict_pipeline(payload.text)
return {"language": language}


3️⃣ Docker 구성

📄 Dockerfile

dockerfile
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.8

WORKDIR /app
COPY ./app /app/app
COPY requirements.txt /app

RUN pip install --no-cache-dir -r /app/requirements.txt

📄 requirements.txt

txt
scikit-learn==1.0.2

📄 .dockerignore

txt
__pycache__/
*.pyc
*.pkl
*.zip
.venv

4️⃣ 로컬 Docker 테스트 명령어

bash
# 빌드
docker build -t language-detection-app .

# 실행 (포트 매핑)
docker run -p 8080:80 language-detection-app


5️⃣ FastAPI 자동 문서화

접속:

bash
http://localhost:8080/docs

자동 생성된 Swagger UI에서 /predict POST API 테스트 가능


6️⃣ Heroku 배포 구성

📄 heroku.yml

yaml
build:
docker:
web: Dockerfile
run:
web: uvicorn app.main:app --host=0.0.0.0 --port=${PORT:-5000}

🧪 Heroku CLI 명령어:

bash
heroku login
heroku create language-detection-app123
heroku stack:set container
git add .
git commit -m "Deploy to Heroku"
git push heroku main

7️⃣ 배포 확인

  • 배포 URL 예시: https://language-detection-app123.herokuapp.com

  • GET / → 헬스체크

  • POST /predict → 언어 예측

Loading


Copyright 2021. All rights reserved.

Posted 2025년 7월 8일 by comphy in category "기술자료", "업무참고자료", "학습자료

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 Akismet을 사용하여 스팸을 줄입니다. 댓글 데이터가 어떻게 처리되는지 알아보세요.