본문 바로가기
  • 조금 느려도, 꾸준히
Image Processing

[Dlib][GCP] google cloud run 을 통한 이미지 AI 모델 배포하기

by chan 2020. 11. 30.
반응형

# Environments

필자의 상황

 - 이미지를 분석하고 판단하는 AI 모델을 서버리스 or 그에 준하는 방법으로 배포해야 하는 상황

 - Tensorflow, OpenCV, Dlib 등의 라이브러리를 사용

 - 저장소는 S3 Storage, Google Cloud Storage를 사용

 

 

초기 결정 사항

 - 서버리스 방법으로 Google Cloud Functions 를 쓴다. AWS Lamda 보다 편하게 배포가 가능하기 때문.

(예를 들어  python package 종속성을 명시할 때 AWS는 Docker 환경에서 여러가지 작업을 해줘야 하나, GCFS 에서는 requirements.txt 파일로 명시가 가능 / 메모리의 용량 제한도 GCFS 가 더 크다.)

 - 사전에 구축해 놓은 딥러닝 모델은 불가피하게 Cloud Storage에 올려놓고, 서버리스가 실행 시 다운받도록 한다.

 

 

초기 결정 사항에서 직면한 문제점

 

 - 얼굴 인식을 위해 중요하게 사용되는 라이브러리인 Dlib 설치가 불가능하다.

원인: GCFS 에서는 파이썬 패키지를 설치할 때 requirements.txt 파일을 참고하게 되며,  requirements.txt 에 명시된 파이썬 패키지 리스트는 모두 병렬로 설치가 실행된다. 이때 Dlib 라이브러리는 애초에 C++ 라이브러리로, 빌드하기 위해 CMake 패키지가 사전 설치가 되어 있어야 하나, requirements.txt 파일에 cmake 패키지를 명시해도 dlib 패키지와 병렬 설치되기 때문에 cmake not found error가 발생하게 된다. 이를 해결해보고자 3일동안 삽질했지만 해결 방법을 찾을 수 없었다.

 

 - Cold Start 시 부팅 시간이 아주 길어진다.

원인: 서버리스의 고질병인 cold start. 서버처럼 항상 켜져 있는 방식이 아니기 때문에 서버리스가 꺼져 있다가 처음 실행 시 부팅시간이 필요하다. 게다가 사전에 만들어 놓은 AI 모델 역시 Cloud Storage에서 로딩까지 해야 되기 때문에 이런 상황의 경우 request를 보내고 응답을 받기 까지 최대 10~20초 까지 시간이 걸리는 경우가 발생한다. 이를 해결하기 위해 주기적으로 health check을 하는 함수를 하나 더 만들어 놓을 수도  있지만 근본적인 해결책이 아니며, 무언가 다른 방법이 필요했다.

 

 

문제점을 해결하기 위한 결정 사항

 

서버리스 방식을 버리는 대신 최대한 서버리스 다운 프레임워크를 선택한다 -> Google Cloud Run 을 사용한다.

- 서버 어플리케이션을 미리 구축 후 Cloud Run 에 Deploy

- Knative 기반 운영 방식

- 패키지 종속성은 Docker 컨테이너 기반 방식을 통해 해결

- 서버 구축은 Python Flask를 이용하여 최대한 간단하게 구현한다.

- 사전 구축된 AI 모델 등을 서버 어플리케이션 내에 같이 배포하는 방법을 찾아본다.

 

DockerFile 상 Dlib을 설치하기 위해 성공한 명시 소스는 다음과 같다

FROM python:3.7-slim

# RUN apt-get update && apt-get install build-essential cmake pkg-config -y
RUN apt-get -y update
RUN apt-get install -y --fix-missing \
    build-essential \
    cmake \
    gfortran \
    git \
    wget \
    curl \
    graphicsmagick \
    libgraphicsmagick1-dev \
    libatlas-base-dev \
    libavcodec-dev \
    libavformat-dev \
    libgtk2.0-dev \
    libjpeg-dev \
    liblapack-dev \
    libswscale-dev \
    pkg-config \
    python3-dev \
    python3-numpy \
    software-properties-common \
    zip \
    && apt-get clean && rm -rf /tmp/* /var/tmp/*
    

RUN cd ~ && \
    mkdir -p dlib && \
    git clone -b 'v19.9' --single-branch https://github.com/davisking/dlib.git dlib/ && \
    cd  dlib/ && \
    python3 setup.py install --yes USE_AVX_INSTRUCTIONS

 

 구축을 완료하고 디테일한 구현 사항 및 환경 설정에 대해 포스팅하도록 한다.

반응형

댓글