AI를 활용해 맞춤형 건강 조언을 제공하는 과민대장증후군 관리 어플리케이션 Bellywelly의 AI 서버 배포 과정을 정리하고자 한다.
시스템 아키텍처
AI 파트 팀원이 FastAPI로 AI 서버를 개발했다.
YOLOv8 모델을 사용하여 이미지를 인식하고, 프롬프트 엔지니어링을 적용한 GPT-4o 모델을 이용하여 식단 추천과 주간 분석 레포트를 제공했다.
나는 FastAPI 서버의 CI/CD 파이프라인 구축과 HTTPS 환경 배포를 담당했다.
전반적인 순서는 Springboot 서버 배포 때와 같다. (Springboot 서버 배포는 이전 글 참조)
fastapi
├── runs
│ ├── detect/train/weights/best2.pt
│ ├── ...
├── ...
└── server.py
code
└── fastapi
├── runs
│ ├── detect/train/weights/best2.pt
│ ├── ...
├── ...
└── server.py
최종적으로 작성한 파일은 다음과 같다.
FROM python:3.10
RUN apt-get update && \
apt-get install -y --no-install-recommends \
libgl1-mesa-glx
WORKDIR /code
COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
COPY ./fastapi /code
CMD ["uvicorn", "server:app", "--host", "0.0.0.0", "--port", "8000"]
ImportError: libGL.so.1: cannot open shared object file: No such file or directory
Docker 환경에서 이러한 오류가 발생했다. 이는 opencv를 포함한 Docker 이미지를 만들 때 cv2의 의존 패키지가 없어서 발생한 문제였다.
Dockerfile
에 아래 명령문을 추가하여 의존 패키지를 추가로 설치했다.
RUN apt-get update && \
apt-get install -y --no-install-recommends \
libgl1-mesa-glx
INFO: Started server process [1]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
애플리케이션이 실행되었지만, 브라우저에서 접속이 되지 않았다. 도커 파일에 포트를 명시하지 않아서 포트가 안 열렸던 것이었다.
기존 명령문에는 포트를 명시하지 않았다.
CMD ["uvicorn", "server:app"]
명령문을 변경하였더니 정상적으로 접속되었다.
CMD ["uvicorn", "server:app", "--host", "0.0.0.0", "--port", "8000"]
ERROR: Error loading ASGI app. Could not import module "code.server".
이 오류는 배포 환경의 파일 구조와 상대 경로를 잘못 이해했던 문제 때문에 발생했다.
적절한 경로로 변경해서 해결했다.
FileNotFoundError: [Errno 2] No such file or directory: 'fastapi/runs/detect/train/weights/best2.pt'
로컬 환경에서는 요청을 받았을 때 정상적으로 처리하였는데, 배포 후에는 이런 오류가 떴다.
알고보니 로컬과 배포 환경의 파일 구조가 달라서, server.py 내에서 다른 경로의 파일을 호출하는 경우에는 적절한 경로로 수정해야 했다.
원래 ./fastapi/runs/detect/train/weights/best2.pt
로 작성했던 경로를 배포 환경에 맞게 ./runs/detect/train/weights/best2.pt
로 수정했다.