1. 개요
본 프로젝트는 음성 기반 피싱 탐지 시스템을 Flask API 형태로 구축하고,
이를 GCP 서버에 Docker로 배포하는 데에 목적이 있었습니다.
KoBERT를 활용한 텍스트 분류, Whisper 기반 음성 인식(STT),
그리고 Gunicorn을 통한 서버 실행 환경을 통합하였습니다.
이 과정에서 발생한 주요 이슈와 그 해결 방법을 정리하였습니다.
2. 시스템 구성
- 운영 환경: Google Cloud Platform (Ubuntu 22.04 LTS)
- 배포 방식: Docker + Gunicorn + Flask
- 모델:
- monologg/kobert (텍스트 분류용)
- openai/whisper base 모델 (음성 인식용)
- 포트: 5000번 외부 개방
- 추론 방식: Whisper + KoBERT 앙상블 기반 예측
3. 발생했던 문제점
(1) PyTorch 인식 오류
ImportError: BertModel requires the PyTorch library but it was not found...
- Whisper 설치 이후 PyTorch가 덮어씌워져서 인식이 되지 않았던 문제
- 설치 순서를 조정하여 해결하였습니다
(2) Whisper 모델 체크섬 오류
RuntimeError: Model has been downloaded but the SHA256 checksum does not match...
- Whisper의 .cache 디렉터리에 이전 모델이 남아 있었던 경우 발생
- Dockerfile 내에서 해당 캐시를 강제로 삭제하여 해결하였습니다
(3) Gunicorn 메모리 부족 (OOM)
[ERROR] Worker was sent SIGKILL! Perhaps out of memory?
- 기본 설정값인 4개의 worker가 동시에 KoBERT와 Whisper를 로딩하면서 메모리를 초과
- Gunicorn의 worker 수를 1개로 줄임으로써 해결하였습니다
4. Dockerfile 수정 사항
# PyTorch는 Whisper보다 먼저 설치
RUN pip install torch==1.10.1+cpu torchvision==0.11.2+cpu torchaudio==0.10.1+cpu \
-f https://download.pytorch.org/whl/torch_stable.html
# Whisper 설치 및 캐시 정리
RUN pip install git+https://github.com/openai/whisper.git@v20230124
RUN rm -rf /root/.cache/whisper
# Gunicorn worker 수를 1개로 제한 (메모리 초과 방지)
CMD ["gunicorn", "-w", "1", "-b", "0.0.0.0:5000", "server:app"]
5. 빌드 및 실행 절차
# 이전 컨테이너 및 이미지 제거
docker rm -f voicephishing-container docker rmi -f voicephishing-app
# 캐시 완전 삭제
docker builder prune -af docker system prune -af --volumes
# 이미지 재빌드
docker build --no-cache -t voicephishing-app .
# 컨테이너 실행
docker run -d -p 5000:5000 --name voicephishing-container voicephishing-app
# 로그 확인
docker logs -f voicephishing-container
6. GCP 포트 개방 상태
- VPC 방화벽 규칙에서 tcp:5000, 0.0.0.0/0, 허용 상태로 설정되어 있어야 합니다
- GCP 인스턴스 외부 IP 접속 가능 여부 확인 필요
7. 정상 실행 확인
브라우저 접속
http://[GCP 서버 IP]:5000/
API 호출 테스트
curl -X POST http://[GCP-IP]:5000/predict \
-H "Content-Type: application/json" \
-d '{"text": "금융감독원입니다."}'
정상적으로 동작할 경우, JSON 형태의 예측 결과가 반환됩니다.
8. 결론 및 교훈
- Whisper 설치 순서, 캐시 제거, Gunicorn worker 설정은
모델 통합 배포 시 반드시 고려해야 할 요소입니다. - GCP 인스턴스는 RAM 8GB 이상, 또는 worker 수 제한을 통해
OOM(메모리 초과) 문제를 방지하는 것이 좋습니다. - Dockerfile 내 명령어 순서와 캐시 정리 여부가
배포의 성공 여부를 좌우할 수 있습니다.
'Backend & Infra > Docker' 카테고리의 다른 글
| 로컬에서 프로젝트(PDFMASK) 서비스를 Docker로 실행하는 방법 (0) | 2025.11.26 |
|---|---|
| Docker 명령어 정리 (자주 사용하던 명령어_2) (1) | 2025.06.04 |
| GCP + Docker 기반 Flask API 서버 배포 중 발생한 3가지 핵심 문제와 해결 방법 (0) | 2025.05.23 |
| GCP에서 Docker를 활용한 딥러닝 모델 API 서버 배포 실습 (0) | 2025.05.20 |
| Docker를 사용할 때 가장 자주 쓰는 명령어 정리 (0) | 2025.05.20 |