[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)

    경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
    어린이용이며, 설치가 필요없는 브라우저 게임입니다.
    https://s1004games.com

    • /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 배포 완료!


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

 

나의 말:

섹션별로 관련 코드/구성요소를 다시 정리

아래는 영상에서 설명한 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 → 언어 예측

 

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
142 [Python 인터넷] PM2로 Python Flask 앱 관리하기 : Managing Python Flask App with PM2 file 졸리운_곰 2025.01.08 94
141 [Python 인터넷] Telegram bot! 봇 만들기 with 파이썬 file 졸리운_곰 2024.06.19 395
140 [Python 인터넷] python-screenshot-to-FTP /screengrab.py 졸리운_곰 2024.06.07 106
139 [Python 인터넷] IP 주소를 찾는 Python 프로그램 file 졸리운_곰 2024.06.07 116
138 [Python 인터넷] python 을 사용한 instagram (인스타그램) 자동 포스팅 : Automate Instagram Posts with Python: A Step-by-Step Guide 졸리운_곰 2024.05.19 87
137 [Python 인터넷] python 을 사용한 instagram (인스타그램) 자동 포스팅 : Automating Instagram Posts with Python: A Quick Guide file 졸리운_곰 2024.05.19 84
136 [Python 인터넷] 파이썬 셀레늄 네이버 포스트 자동 포스팅 방법 졸리운_곰 2024.05.05 88
135 [Python 인터넷] websocket을 이용한 python server에 대용량 파일 전송하기 졸리운_곰 2023.12.14 81
134 [Python 인터넷] [Python] Websocket을 사용하는 방법 file 졸리운_곰 2023.12.12 114
133 [Python 인터넷] 네이버 뉴스 기사 크롤링 졸리운_곰 2023.05.13 127
132 [Python 인터넷] 웹 페이지를 mhtml로 저장하기 python web page save as mthml 졸리운_곰 2023.04.12 142
131 [Python 인터넷] 16 - 셀레니움 이미지 크롤링, 스크롤 다운 file 졸리운_곰 2023.04.06 82
130 [Python 인터넷] 15 - 셀레니움 크롤링 (input) file 졸리운_곰 2023.04.06 69
129 [Python 인터넷] 14 - 셀레니움 click file 졸리운_곰 2023.04.06 81
128 [Python 인터넷] 13 - 셀레니움 사용해보기 file 졸리운_곰 2023.04.06 84
127 [Python 인터넷] 12 - 데이터 엑셀로 저장 file 졸리운_곰 2023.03.31 111
126 [Python 인터넷] 11 - Page 숫자 설정 file 졸리운_곰 2023.03.31 62
125 [Python 인터넷] 10 - 다음 뉴스 키워드로 크롤링 file 졸리운_곰 2023.03.30 94
124 [Python 인터넷] 9 - Flask POST file 졸리운_곰 2023.03.30 133
123 [Python 인터넷] 8 - 약간의 레이아웃 설정하기 file 졸리운_곰 2023.03.30 106
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED