Data Engineering 및 Infra

Python FastAPI 및 Docker를 활용해 pytorch deep learning 모델 배포하기

이수진의 블로그 2023. 7. 24. 08:12
반응형
728x170

포스팅 개요

본 포스팅은 Python FastAPI에 대해서 정리하는 FastAPI 시리즈 포스팅 중 여섯 번째 글인 FastAPI 및 Docker를 활용해 pytorch 딥러닝(deep learning) 모델 배포하기 (deploy pytorch model using docker, fastapi) 글입니다.

FastAPI 포스팅은 아래와 같은 순서로 정리되어 있고, 정리할 예정입니다.

 

  1. Python FastAPI 시작하기 - FastAPI란? 설치 방법과 기본 예제(FastAPI example) (https://lsjsj92.tistory.com/648)
  2. FastAPI post 간단 예제와 비동기(Asynchronous) async 함수에 대해서 (https://lsjsj92.tistory.com/649)
  3. Python pydantic이란? Python에서 데이터 검증과 설정을 관리해보자(Feat. FastAPI) (https://lsjsj92.tistory.com/650)
  4. FastAPI router란? router 사용법과 예제(fastapi router example) (https://lsjsj92.tistory.com/651)
  5. Pytorch 딥러닝(deep learning) 모델과 FastAPI를 활용한 FastAPI 예제(example) (https://lsjsj92.tistory.com/652)
  6. Docker와 FastAPI를 활용해 pytorch 딥러닝 모델 배포하기(deploy pytorch model using docker, fastapi) (본 포스팅)

 

해당 포스팅을 작성하면서 제가 참고한 글과 데이터는 다음과 같습니다. 

본 글에서 작성하는 모든 코드는 아래 github repository에 올려두었습니다.

 

GitHub - lsjsj92/Fast_API: fast api with machine learning

fast api with machine learning. Contribute to lsjsj92/Fast_API development by creating an account on GitHub.

github.com


포스팅 본문

본 포스팅은 이전 포스팅에서 작성한 Pytorch 기반의 딥러닝 모델을 Python FastAPI를 활용해 배포한 간단한 MLOps 과정(https://lsjsj92.tistory.com/652) 이후 두 번째 글입니다. 본 포스팅에서는 이전에 배포한 FastAPI 환경을 Docker를 활용해서 image화 하고 이 docker 환경을 실행함으로써 API 배포를 진행하도록 하겠습니다.

 

본 글을 읽기 위해서는 앞선 포스팅을 꼭! 먼저 보셔야 합니다.


Dockerfile 생성 및 Docker image 생성

Docker로 코드를 말아 배포하기 위해 Dockerfile을 생성합니다. Dockerfile 내용은 다음과 같이 구성하였습니다.

 

# Base image
FROM python:3.8

# Install pytorch
RUN pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cpu

# Set working directory
WORKDIR /fastapi

# Install python lib
COPY requirements.txt ./requirements.txt
RUN pip3 install -r requirements.txt

# Copy files
COPY ./models /fastapi/models
COPY ./main.py /fastapi/
COPY ./packages /fastapi/packages
COPY ./example/train_model /fastapi/example/train_model

CMD ["python", "main.py", "--host", "0.0.0.0", "--port", "8088"]

Dockerfile 내용은 간단합니다. 먼저, 제 환경이랑 똑같이 Python3.8을 구성하도록 했습니다.

이후에 pytorch를 먼저 설치해주는 명령어를 실행시켰습니다. 그리고 working directory를 구성하고 requirements.txt 파일을 기반으로 라이브러리들을 설치합니다.

 

지난 포스팅에서 작성한 제 전체 project 디렉토리는 다음과 같았습니다.

여기 중에서 실제 배포 및 구현에 필요한 코드는 다음과 같습니다. 

  • models/  : pytorch로 훈련된 추천 시스템 ( recommender system ) 모델이 pickle 형태로 저장되어 있습니다.
  • main.py : FastAPI를 실행하는 본체입니다.
  • packages/ : FastAPI를 실행하는데 필요한 각종 패키지들이 들어가 있습니다.
  • examples/train_model : 파이토치(pytorch)로 구성한 모델 구현체 class가 여기에 있기 때문입니다.

따라서, Dockerfile에는 필요한 file만 복사하도록 했습니다.

마지막은 python main.py --host 0.0.0.0 --port 8088 명령어를 실행하도록 구성하였습니다.

Docker image 생성, 실행 및 결과

1. docker image 생성

 

이제 만들어준 dockerfile을 기반으로 docker image를 만들겠습니다. 아래와 같은 명령어로 간단하게 docker iamge를 생성할 수 있습니다. 

docker build -t lsjsj92_fastapi:0.1 -f Dockerfile .

 

반응형

저는 docker image 이름을 lsjsj92_fastapi로 지정했고 tag는 0.1로 지정했습니다.

위 명령어를 실행하면 Dockerfile을 기반으로 image를 생성해줍니다.

간단한게 docker images 명령어를 입력하면

이렇게 생성한 docker image가 나오는 것을 확인할 수 있습니다.

 

2. docker image 실행하여 FastAPI 결과 확인하기

이제 생성한 이미지를 실행하여 FastAPI 결과를 확인해보겠습니다. 다음과 같은 명령어로 간단하게 실행할 수 있습니다.

docker run -p 8088:8088 lsjsj92_fastapi:0.1

이렇게 하면 8088 포트를 기준으로 제 local pc와 docker 사이에 통신이 연결되고 FastAPI가 실행됩니다.

localhost(또는 127.0.0.1):8088/docs를 확인해보면

위와 같이 FastAPI가 정상적으로 실행된 것을 확인할 수 있습니다. 

또한, post 데이터를 날려봤을 때도

위 사진과 같이 정상적으로 동작되는 것을 확인할 수 있습니다.

 

이제 마지막으로 Python requests를 이용해 docker 환경에서 열린 Pytorch 딥러닝 추천 시스템 model 결과를 FastAPI로 가져와보도록 하겠습니다.

 

import requests

headers = {
    "Content-type": "application/json",
    "accept": "application/json"
}


url = "http://localhost:8088/ncf/predict"
params={
    'user_id': 201,
    'movie_id' : 100,
    'gender' : 0,
    'age' : 5,
    'occupation' : 8,
    'genre' : 4
}

res = requests.post(url, json=params, headers=headers)

print("status : ", res.status_code)
print(res.json())
300x250

 

위 코드를 실행하면 해당되는 파라미터 값에 따라 추천 시스템(recommender system)의 predict 결과를 FastAPI를 통해서 받아올 수 있습니다. 

이렇게 해서 Docker 환경에서 FastAPI를 활용해 pytorch model prediction을 가져오도록 코드를 전부 구성해보았습니다.


마무리

본 포스팅은 Docker를 활용해서 Pytorch 추천 시스템 딥러닝 모델(recommender system deep learning model)을 FastAPI로 배포하는 방법에 대해서 알아보았습니다.

이제 FastAPI 포스팅 시리즈는 마무리 하였습니다. 추후 FastAPI와 관련된 글들은 시리즈 형태가 아닌, 독립된 포스팅으로 다루겠습니다.

긴 글 읽어주셔서 감사합니다.

 

저에게 연락을 주시고 싶으신 것이 있으시다면

으로 연락주시면 감사하겠습니다.

반응형
그리드형