[딥러닝] Docker를 활용하여 딥러닝 모델 배포

김영민·2024년 8월 26일
0

DeepLearning

목록 보기
32/33
post-custom-banner

파이토치를 활용하여 학습한 모델을 Docker를 활용하여 배포해보려고 한다.

순서

1. Flask API로 딥러닝 모델 서비스 코드 작성

# app.py
import torch
from flask import Flask, request, jsonify
from torchvision import transforms
from PIL import Image
from gmic_v2 import GMIC
import pydicom
import numpy as np
import io
import base64

app = Flask(__name__)

# PyTorch 모델 로드
parameters = {
    "device_type":"cpu",
    "cam_size": (32, 32),
    "K": 6,
    "crop_shape": (128, 128),
    "percent_t":0.005,
    "post_processing_dim": 512,
    "num_classes": 1
    }

model = GMIC(parameters=parameters)

model.load_state_dict(torch.load('/***.pth', map_location=torch.device('cpu')))
model.eval()  # 추론 모드로 설정

# 이미지 전처리
def transform_image(file_stream):
    input_slice = pydicom.dcmread(file_stream)
    input_img = input_slice.pixel_array

    # normalize image data
    input_img[input_img < 0] = 0
    epsilon = 1e-10
    min_val = np.min(input_img)
    max_val = np.max(input_img)
    input_img = (input_img - min_val) / (max_val - min_val + epsilon)

    input_img = np.expand_dims(input_img, axis=0)  # (H, W) -> (1, H, W)
    input_img = np.expand_dims(input_img, axis=0)  # (1, H, W) -> (1, 1, H, W)

    # Numpy -> PyTorch tensor
    tensor_img = torch.from_numpy(input_img).float()

    return tensor_img

@app.route('/predict', methods=['POST'])
def predict():
    if 'file' not in request.files:
        return jsonify({'error': 'No file provided'})

    file = request.files['file']
    img_bytes = file.read()
    tensor = transform_image(img_bytes)

    # 모델 예측 수행
    with torch.no_grad():
        _,_,abnormal_rate,output_image =  model(tensor)
        
    # output_image를 PIL 이미지로 변환 후 base64로 인코딩
    output_image_np = output_image.squeeze().numpy()
    img = Image.fromarray((output_image_np * 255).astype(np.uint8))
    
    # 이미지를 메모리에 저장 후 base64 인코딩
    buffer = io.BytesIO()
    img.save(buffer, format="PNG")
    img_str = base64.b64encode(buffer.getvalue()).decode('utf-8')

    return jsonify({'predicted_class': abnormal_rate.item(), 'output_image': img_str})



if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
  • Flask를 활용하여 API를 제작.

2. Dockerfile 작성 및 requirements.txt 파일 작성.

  • Docker를 활용하여 모델을 배포할 것이기 때문에, Dockerfile을 작성해주어야 한다.
#Dockerfile
FROM pytorch/pytorch:1.9.1-cuda11.1-cudnn8-devel
FROM python:3.10

#RUN apt-get install -y sudo
  
# 환경
ENV LANG=C.UTF-8
RUN apt-get update && apt-get install -y \
    libgl1-mesa-glx \
    libglib2.0-0

RUN pip install --upgrade pip

WORKDIR /app

COPY requirements.txt /app/
RUN pip install -r requirements.txt

COPY . /app
COPY ./RealFINAL_InterpreSegNet_0601_34.pth /app/


EXPOSE 5000
CMD ["python", "app.py"]


```txt
#requirements.txt
torchvision
torchsummary
pydicom
numpy
scipy
scikit-learn
scikit-image
matplotlib
pandas
easydict
Pillow
opencv-python
jupyter
jupyterlab
py-spy
PyQt5
tensorflow-cpu

python-gdcm
keras
pydicom
yacs
timm

pylibjpeg
pylibjpeg-libjpeg
albumentations

nibabel
  • 나의 모델을 배포하기 위해 필요한 라이브러리들을 미리 선언해주고, Dockerfile에서 설치할 수 있게끔 txt 파일을 만들어준다.

3. 도커 이미지 빌드

  • 이렇게 작성된 dockerfile을 build 한다.
docker build -t my-bt-analysis-model .
  • 해당 명령어를 터미널에서 실행시키면, 다음과 같이 설치된다.

  • 그러다가 오류가 났는데, pytorch/pytorch:1.9.1-cuda11.1-cudnn8-devel은 platform이 linux/amd64 인데, 나의 맥북은 arm64여서 오류가 났다.

  • 그럴 경우에는, 명령어에 --platform linux/amd64 를 추가해주면 해결된다.

  • 빌드가 완료되면 다음과 같은 이미지를 얻을 수 있다.

  • 빌드된 이미지를 컨테이너로 생성하려고 하는데, app.py 파일이 없다는 오류가 떴다.
  • app.py를 도커를 빌드하는 디렉토리 내에 위치하도록 하고, 해당 디렉토리 내에 app 디렉토리로 copy하도록 dockerfile을 수정하였다.

4. 도커 컨테이너 실행

docker run --platform linux/amd64 -p 5001:5000 my-bt-analysis-model


지금까지 도커를 활용하여 모델을 배포하는 과정을 설명해보았다.
사실, 여러 오류가 떠서 오래 걸리긴 했는데 라이브러리 설치 문제여서 따로 적진 않았다.

post-custom-banner

0개의 댓글