파이토치를 활용하여 학습한 모델을 Docker를 활용하여 배포해보려고 한다.
# 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)
#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
docker build -t my-bt-analysis-model .
해당 명령어를 터미널에서 실행시키면, 다음과 같이 설치된다.
그러다가 오류가 났는데, pytorch/pytorch:1.9.1-cuda11.1-cudnn8-devel은 platform이 linux/amd64 인데, 나의 맥북은 arm64여서 오류가 났다.
그럴 경우에는, 명령어에 --platform linux/amd64
를 추가해주면 해결된다.
docker run --platform linux/amd64 -p 5001:5000 my-bt-analysis-model
지금까지 도커를 활용하여 모델을 배포하는 과정을 설명해보았다.
사실, 여러 오류가 떠서 오래 걸리긴 했는데 라이브러리 설치 문제여서 따로 적진 않았다.