FastAPI와 Docker를 이용하여 Predict하는 모델 만들기

- 프로젝트의 구성도는 위와 같다.
- FastAPI를 통해 Pytorh 모델을 API식으로 빌드하고 Docker를 활용하여 배포한다.
- 이때 배포하는 동안에 컴퓨터를 계속 켜있을 수 없으므로 GCP(Google Cloud Platform)을 이용하여 계속 배포할 수 있게 한다.
- web page에서 사용자가 입력하는 데이터를 전달받아 에측을 하고 예측값을 web page에 전달하여 사용자들이 쉽게 건전 / 비건전을 확인할 수 있게 하였다.
1. Pytorch 모델 FastAPI 빌드
-
학습된 모델 저장 (.pth)
torch.save를 이용하여 .pth형태로 모델 학습에 사용된 텐서(Tensor)와 매개변수를 저장한다.- .pth 파일을 보면 아래 그림과 같이 각 레이어들의 가중치(weight)와 편향(bias)이 텐서 형태로 저장되어있다.
- 학습된 모델을 기반으로 입력되는 데이터를 가지고 예측을 한다.

-
예측하는 코드 작성
- DNN 모델과 매개변수를 저장한 파일을 불러와 값을 입력하면 예측하는 코드를 작성한다.
def predict_model(data): #모델 학습전 실시한 정규화(MinMax-Normalization)을 입력된 데이터에 적용 loaded_scaler = joblib.load('Normalization.pkl' ) data_scaled = loaded_scaler.transform(data) data_tensor = torch.FloatTensor(data_scaled) #DNN 모델 불러오기 model = NeuralNet(5,2) #.pth 형태로 저당된 매개변수를 불러온다. model.load_state_dict(torch.load('DNN_model.pth', map_location=torch.device('cpu'))) #Layer들을 평가 모드로 바꿔준다. model.eval() #torch.no_grad()는 gradient를 계산하지 않게 한다. / backpropagation을 안 하게 한다. with torch.no_grad(): output = model(data_tensor) _, predicted_idx = torch.max(output, 1) predicted_label = predicted_idx.item() return predicted_label -
FastAPI 코드 작성
FastAPI는 Python의 API를 빌드하기 위한 웹 프레임워크이다.
- GET: 서버상의 값이나 내용을 바꾸지 않고 보여줄 때 사용된다.
- POST: 서버상의 값이나 상태를 바꾸기 위해 사용된다.
- 리스트(list)형태로 입력받은 데이터들을 예측하여 건전 / 비건전으로 값을 바꿔야하기 때문에 POST를 사용하였다.
DataClassificationRequest클래스에서 데이터를 검증하고 검증된 데이터를 예측 모델에 전달하고 예측한 결과값을 리턴한다.
@app.get("/") def root(): return "credit classification modle" # 입력되는 데이터들이 리스트 형태인지 검증하는 클래스이다. class DataClassificationRequest(BaseModel): data: list # 검증 클래스에서 검증된 데이터들을 예측 모델에 전달하고 # 예측한 결과값을 리턴한다. @app.post("/predict") async def predict(request: DataClassificationRequest): list_data = request.data prediction = predict_model(list_data) return {prediction}
2. Docker 와 GCP(Google cloud Platform)를 이용하여 모델 배포
Docker: 컨테이너 기술을 이용하여 환경을 구축하고 배포할 수 있게 해주는 플랫폼이다.
GCP: Google이 제공하는 클라우드 플랫폼이다. 그중에서 Computer Engine 클라우드 가상서버를 사용하여 배포를 하였다.
-
FastAPI 빌드 코드들을 Github을 이용하여 GCP에 보낸다.

-
Docker를 이용하여 모델 배포
- Docker image로 build

- Docker image를 Docker container로 배포

- Docker image로 build
3. web page를 이용하여 값을 입력하고 예측값을 반환
streamlit을 이용하여 web page를 만들었다. web에서 입력한 데이터들이 list 형태로 전달되고, 전달된 데이터를 기반으로 건전 / 비건전 중 하나로 예측하여 다시 web으로 전달이 된다.
streamlit : 데이터 시각화를 쉽게 구현하고 간단한 웹서비스를 만들 수 있는 파이썬 라이브러리이다.
web page <— 프로젝트 웹페이지
-
web page 구성
- 왼쪽 부분에 건전성을 확인하고 싶은 기업의 재무 데이터를 각 항목에 맞게 입력한다.

- 데이터들을 아래와 같이 입력을 하고
예측버튼을 누르면
- 입력된 데이터들이 계산이 되어 list 형태의 5개의 평가 요소로 API에 넘어가는 것을 볼 수 있다.

- 넘어간 데이터를 기반으로 모델이 건전 / 비건전을 예측하여 다시 web page에 전달이 된다. 이진으로 분류하였기 때문에 0은 건전이고 1은 비건전이다.

- 결과적으로 web page에서 뜨는 화면은 건전으로 출력이 된다.

- 왼쪽 부분에 건전성을 확인하고 싶은 기업의 재무 데이터를 각 항목에 맞게 입력한다.