본문 바로가기

Python

Docker기반의 RESTful api로 pytorch model 배포하기[5-5]

  1. Flask RESTful을 이용하여, HTTP로 호출할 수 있는 RESTful api 만들기
  2. 학습한 모델의 weight와 graph를 하나의 파일로 만들기(torchscript)
  3. 보안을 위해, 2번에서 만든 torchscript파일을 encryption하기
  4. 보안을 위해, cython을 이용하여 python script를 library형태로 만들기
  5. Docker image 만들고 배포하기

마지막으로 docker 기반으로 image를 만들고 해당 image를 배포하는 방법에 대해 기록을 남겨본다.

 

앞서 RESTful api와 encryption된 model file 그리고 cython으로 build된 native library를 만들었다.

이를 docker 기반의 가상환경으로 옮기고 docker 환경에서 RESTful server를 구동시킴으로서, 배포 환경에 상관없이 docker만 있다면 RESTful server를 배포할 수 있다.

 

먼저 docker를 사용하면서 nvidia gpu를 사용하려면 nvidia에서 배포하는 docker를 설치해야 한다.

docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html#docker

 

Installation Guide — NVIDIA Cloud Native Technologies documentation

On RHEL 7, install the nvidia-container-toolkit package (and dependencies) after updating the package listing: Restart the Docker daemon to complete the installation after setting the default runtime: Note Depending on how your RHEL 7 system is configured

docs.nvidia.com

이전에는 github에 문서가 있었는데 nvidia에서 docs를 만들었다.

문서를 참고해서 nvidia docker를 설치하면 된다. 설치 확인 방법은 docker 내부에서 nvidia-smi를 날려서 gpu 정보를 볼 수 있다면 정상적으로 설치가 된 것이다.

 

docker image를 build하기 위해 Dockerfile을 아래와 같이 작성한다.

 

FROM nvidia/cuda:10.2-cudnn8-runtime-ubuntu16.04

ENV PYTORCH_VERSION=1.6.0
ENV TORCHVISION_VERSION=0.7.0
ENV NUMPY_VERSION=1.19.1
ENV OPENCV_VERSION=4.2.0.32
ENV FLASK_VERSION=0.3.8
ENV YAML_VERSION=5.3.1
ENV PYCRYPTO_VERSION=2.6.1
ENV PORT_NUM=5001

RUN apt-get update && apt-get install -y \
        wget \
        libjpeg-dev \
        libpng-dev \
        libgtk2.0-dev

RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
RUN bash Miniconda3-latest-Linux-x86_64.sh -b -p /miniconda
RUN cd /miniconda/bin && ./conda create -n py368 -y python=3.6.8
RUN rm /usr/bin/python && ln -s /miniconda/envs/py368/bin/python /usr/bin/python && ln -s /miniconda/envs/py368/bin/pip /usr/bin/pip

RUN pip install numpy==${NUMPY_VERSION}
RUN pip install opencv-python==${OPENCV_VERSION}
RUN pip install Flask-RESTful==${FLASK_VERSION}
RUN pip install torch==${PYTORCH_VERSION}
RUN pip install torchvision==${TORCHVISION_VERSION}
RUN pip install PyYAML==${YAML_VERSION}
RUN pip install pycrypto==${PYCRYPTO_VERSION}

EXPOSE ${PORT_NUM}

COPY ./release /release
WORKDIR "/release"
CMD python server.py --port=${PORT_NUM}

 

해당 Dockerfile은 cuda10.2 + cudnn8 + ubuntu16.04 환경이다.

pytorch는 1.6.0, torchvision은 0.7.0 등을 사용하는 환경이다.

 

해당 docker image를 build하고 run하게 되면 바로 server가 실행된다.

run할 때는 network와 관련된 option을 주어야 server 통신이 가능한 경우가 있으니 주의해야 한다.

 

아래는 간단한 run 예시이다.

detach mode로 실행되며, network option은 현재 환경과 동일하게 가져간다.

docker run --gpus all --network host -d myimage