토이프로젝트 진행 후 docker를 이용하여 서버에 배포하려고 한다.
해당 프로젝트는 database 없이 진행하였기에 frontend와 backend만 배포하면 된다.
frontend : react app
# frontend Dockerfile
FROM node:alpine
WORKDIR /build
ENV PATH /build/node_modules/.bin:$PATH
COPY ./toy-frontend/package.json ./
COPY ./toy-frontend/package-lock.json ./
RUN npm install --force
COPY ./toy-frontend .
RUN npm install -g serve
RUN npm run build
ENTRYPOINT ["serve", "-s", "build"]
backend : flask app
FROM tensorflow/tensorflow:2.7.0
WORKDIR /usr/src/app
COPY ./toy-backend .
RUN apt-get update -y && \
apt-get install libglib2.0-0 -y && \
apt install python3.8 python3.8-dev -y && \
apt-get install libgl1-mesa-glx -y && \
apt clean && \
rm -rf /var/lib/apt/lists/* && \
rm /usr/local/bin/python && \
ln -s /usr/bin/python3.8 /usr/local/bin/python && \
python3.8 -m pip install --no-cache-dir -U pip && \
pip install --upgrade setuptools six && \
pip install wheel cmake && \
pip install -r requirements.txt
ENV PYTHONPATH="${PYTHONPATH}:/"
ENV HOME=.
ENV ENV=test
ENV FLASK_ENV=deployment
EXPOSE 5000
CMD ["python", "toy_backend/app.py"]
분석을 시작하면 out of memory 발생
내가 생각한 메모리 부족 원인은
1. 기존 tensorflow image를 이용한 backend image 자체가 너무 크다.
2. 예전에 사용한 Dockerfile 가져다 쓰면서 추가된 불필요한 패키지
FROM python:3.8
WORKDIR /usr/src/app
COPY ./toy-backend .
RUN apt-get update -y && \
apt-get install libglib2.0-0 -y && \
apt-get install libgl1-mesa-glx -y && \
pip install tensorflow==2.7.0 --no-cache-dir && \
pip install -r requirements.txt
ENV PYTHONPATH="${PYTHONPATH}:/"
ENV HOME=.
ENV ENV=test
ENV FLASK_ENV=deployment
EXPOSE 5000
CMD ["python3", "toy_backend/app.py"]
backend
docker build --tag backend-image -f Dockerfile_backend .
frontend
docker build --tag frontend-image -f Dockerfile_frontend .
version: "3"
services:
toy-backend:
image: backend-image
container_name: toy-backend
restart: always
volumes:
- /home/ubuntu/data/toy-project/toy-backend/log:/usr/src/app/toy_backend/log
ports:
- "5000:5000"
environment:
TZ: "Asia/Seoul"
toy-frontend:
image: frontend-image
container_name: toy-frontend
depends_on:
- toy-backend
restart: always
volumes:
- ./:/frontend
ports:
- "3000:3000"
frontend & backend 애플리케이션 실행까지 성공했다.
backend에서 이미지(및 영상) 분석을 위해 선택한 모델이 메모리에 없으면 tensorflow hub에서 다운로드 받아 모델을 메모리에 옮기는 구조였다.
1. 모델을 다운로드 하는 것이 무리일거 같았다.
-> tensorflow hub에서 제공하는 모델을 다운로드 받아 컨테이너 속에 넣고 이미지 분석할 때 로드 하는 구조로 변경하였다.
2. 여전히 out of memory
-> 테스트로 사용하는 서버는 oracle cloud free로 CPU 1개, Memory 1GB 이다.
자원 부족이 아닐까 싶었다. 모델(60MB), flask app(tensorflow 실행 때문에 1363MB)
무료 서버를 이용해서 toy project는 배포할 수 없다는 판단이다.
꼬박 이틀간의 삽질은 마무리 하고 다음 토이 프로젝트는 무료 서버에 배포할 수 있는 아이디어로 진행해봐야겠다.
더불어 무조건 코딩만 하면 되는게 아니라 조금 더 경량화 할 수 있고 구조에 대해 한번 더 고민하겠다는 다짐을 한다.