WjExplor Story

위클리페이퍼_2026.03.22 본문

AI 엔지니어 부트캠프/추론 최적화와 모델 배포

위클리페이퍼_2026.03.22

더블유제이플로어 2026. 3. 22. 22:47

Q1. Streamlit을 사용해서 AI 모델을 웹 애플리케이션에 통합하려면 모델 로드, 사용자 입력, 결과 출력의 단계를 거쳐야합니다. 각각의 단계에 대해 설명해주세요.

Streamlit에서 AI 모델을 효율적으로 다루기 위해서는 다음의 흐름을 따릅니다.

  1. 모델 로드 (Model Loading):
    • 앱이 시작될 때 모델을 메모리에 올리는 과정입니다.
    • 핵심: st.cache_resource를 사용하여 모델이 매번 새로 로드되지 않게 해야 합니다. (용량이 큰 AI 모델은 한 번만 로드하여 메모리를 절약합니다.)
  2. 사용자 입력 (User Input):
    • 사용자가 텍스트, 이미지, 파일 등을 업로드하는 단계입니다.
    • Streamlit의 st.text_input, st.file_uploader 등의 위젯을 통해 직관적으로 데이터를 받습니다.
  3. 결과 출력 (Result Output):
    • 모델이 추론(Inference)한 결과를 시각화하는 단계입니다.
    • 점수를 그래프로 보여주거나(st.bar_chart), 대화형 UI (st.chat_message)를 통해 긍정/부정 상태를 배지 형태로 출력하여 사용자 경험을 높입니다.

Q2. FastAPI 기반 AI API 서버의 이상적인 구조

FastAPI는 성능이 뛰어나고 자동 문서화(Swagger)를 지원하여 AI 백엔드로 인기가 높습니다. 기능별로 분리된 구조는 유지보수에 유리합니다.

/backend
├── main.py            # FastAPI 앱 객체 생성 및 라우터 연결
├── api/
│   └── endpoints.py   # API 경로(URL) 정의 (예: /predict, /movies)
├── schemas/
│   └── request.py     # 데이터 검증용 Pydantic 모델 (입출력 형식 정의)
├── services/
│   └── inference.py   # 실제 AI 모델 로드 및 추론 로직 (핵심 엔진)
├── db/
│   └── database.py    # SQLAlchemy 등 DB 연결 및 모델 설정
└── .env               # DB 주소, API 키 등 보안 설정

Q3. 실전 아키텍처: 🍿 팝콘 감성 측정소 서비스

https://github.com/JJang-404/study/tree/main/mission/mission18

1. 서비스 개요 (Selection)

  • 서비스명: 팝콘 감성 측정소 (Popcorn Mood Lab)
  • 핵심 가치: 사용자의 영화 리뷰를 실시간 AI로 분석하여 긍정/부정 수치를 시각화하고, 데이터 기반의 영화 평점 시스템을 제공함.

2. 전체 시스템 아키텍처 (Architecture)

기술 스택 (Tech Stack)

  • Frontend: Streamlit (Python 기반 데이터 웹 앱)
  • Backend: FastAPI + Uvicorn (고성능 비동기 API 서버)
  • AI Engine: KoELECTRA-Small (ONNX Runtime 최적화)
  • Database: PostgreSQL (Cloud Managed)
  • Container: Docker (환경 일관성 및 확장성 확보)

데이터 흐름 (Data Flow)

  1. User: Streamlit 웹 인터페이스를 통해 리뷰 작성.
  2. Frontend: HTTPS를 통해 FastAPI /reviews/ 엔드포인트 호출.
  3. Backend (FastAPI):
    • 요청을 비동기(async)로 수신.
    • CPU 집약적인 AI 추론은 ThreadPoolExecutor를 통해 별도 스레드에서 처리 (Event Loop 차단 방지).
    • 결과를 DB에 저장하고 최신화된 영화 평점을 계산하여 반환.
  4. Database: 영속적 데이터 저장 및 관리.

3. 고도화 전략: 보안 및 동시성 처리 (How to Improve)

현재 프로토타입에서 상용 수준으로 가기 위해 적용해야 할 핵심 요소들입니다.

보안 요소 (Security)

  • CORS (Cross-Origin Resource Sharing):
    • 현재: allow_origins=["*"] (모든 도메인 허용 - 취약함)
    • 개선: allow_origins=["https://your-app.streamlit.app"]와 같이 실제 프론트엔드 도메인만 명시적으로 허용하여 CSRF 공격을 방지합니다.
  • API 인증: API-KEY 또는 JWT Token을 도입하여 허가되지 않은 사용자가 백엔드 리소스를 소모하지 못하도록 제한합니다.

멀티유저 요청 처리 (Concurrency)

  • 추론 대기 큐 (Message Queue):
    • 현재: ThreadPoolExecutor (간이 비동기 처리)
    • 개선: 트래픽이 몰릴 경우 Redis + Celery 조합을 도입합니다. 사용자의 요청을 큐(Queue)에 쌓아두고, 백엔드 워커(Worker)들이 순차적으로 처리하여 서버 다운을 방지합니다.
  • Auto-Scaling: 트래픽에 따라 FastAPI 컨테이너 개수를 자동으로 늘리는(HPA) 설정을 적용합니다.

4. 클라우드 배포 및 모니터링 전략

클라우드 배포 구조

  • GCP/AWS 환경 가정:
    • Frontend: AWS Amplify 또는 Google Cloud Run (Frontend 전용).
    • Backend: Google Cloud Run (Serverless) - 요청이 없을 때 비용이 발생하지 않으며, 필요 시 수백 개로 자동 확장.
    • Database: AWS RDS 또는 GCP Cloud SQL (PostgreSQL).

모니터링 및 로깅 (Monitoring)

  • Logging: Python의 logging 라이브러리를 통해 모든 API 요청/응답 로그를 CloudWatch 또는 Google Cloud Logging에 수집합니다.
  • Alerting: AI 모델의 응답 속도가 2초를 넘어가거나, 서버 메모리 사용량이 80%를 초과할 경우 개발자에게 Slack 알림을 전송하는 임계값 설정을 포함합니다.
  • 추론 최적화 (Inference): ONNX Runtime을 사용하여 PyTorch 원본 모델 대비 약 2~3배 빠른 속도와 적은 메모리 사용량을 달성(Railway와 같은 저사양 환경에서 필수).

서비스 아키텍처 다이어그램

  1. Frontend: Streamlit Cloud (사용자 UI)
  2. Backend: Railway (FastAPI + KoELECTRA AI 모델)
  3. Database: Railway PostgreSQL (영화 및 리뷰 데이터 저장)
  4. AI Engine: ONNX Runtime (CPU 환경에서 모델 추론 최적화)

보안 및 운영 전략 (꼭 알아야 할 개념)

1) CORS (Cross-Origin Resource Sharing)

  • 개념: "서로 다른 도메인"끼리 데이터를 주고받을 때 브라우저가 보안상 허용 여부를 체크하는 규약입니다.
  • 상황: Streamlit Cloud(*.streamlit.app)에서 Railway(*.railway.app)로 데이터를 요청할 때 발생합니다.
  • 해결: FastAPI 코드에서 CORSMiddleware를 설정하여 Streamlit의 도메인을 허용(Allow)해줘야 통신이 가능합니다.

2) 멀티유저 요청 처리 (Concurrency)

  • AI 추론은 CPU 연산량이 많아 여러 명이 동시에 접속하면 서버가 멈출 수 있습니다.
  • 비동기 처리: async def를 사용하여 입출력 대기 시간에 다른 작업을 처리합니다.
  • 스레드 풀: 추론 작업이 무거울 경우 ThreadPoolExecutor를 사용하여 메인 흐름이 방해받지 않게 분리합니다.

3) 클라우드 배포 및 모니터링

  • 배포: Docker를 사용하여 로컬과 동일한 환경을 Railway/GCP/AWS에 배포합니다.
  • 로깅: Railway의 실시간 로그를 통해 Out of Memory (OOM)404 Error를 모니터링하고 대응합니다.