배경
2023년 2학기 학부 캡스톤디자인(1) 수업에서 진행했던 프로젝트에서 PyTorch로 학습이 완료된 딥러닝 모델을 Spring Boot에서 사용할 수 있도록 해야 했다. PyTorch 모델은 Pretrained model 중 Vision Transformer 딥러닝 아키텍처. 백엔드에서 할 일은 클라이언트에서 넘겨받은 이미지를 딥러닝 모델에 input으로 넣어 분류값(0 또는 1의 정수)을 output으로 받아 저장하는 간단한 작업이었다.
- input: 224 x 224 Color img
- output: 1 or 0
개요
PyTorch 모델을 Spring Boot에서 서빙하기 위해 레퍼런스를 찾아보니 Flask 위에서 모델을 돌리는 방법이 많이 소개되어 있었다. 이렇게 되면 Flask와 Spring Boot가 동작할 수 있도록 2개의 별도 서버를 운영해야 했다. 멘토링 때 이 방법으로 진행하겠다고 말씀드리니 굳이 서버를 2개 띄울 필요가 있는지, 직접 모델을 배포하는 것보다 성능이 떨어질 수 있다는 답변을 받았다. 사실 별다른 고민 없이 Flask를 사용하겠다고 결정한 것이었고 다른 방법이 있을지 생각해보지 않았기 때문에 직접 PyTorch 모델을 돌릴 수 있는 찾아보게 되었다. 한국어로 되어 있는 래퍼런스는 거의 없었고 영어로 쓰여있는 래퍼런스도 프로젝트에서 사용하는 스프링 버전과 다르거나 실제로 동작하지 않는 라이브러리가 많았다. 결론적으로 말하면 앞서 말한 서버를 2개 띄우는 방식을 사용하긴 했지만 삽질했던 기록을 남겨 보고자 한다.
TorchServe
Pytorch KR 커뮤니티에서 모델 서빙에 관한 게시글을 보게 되었다. Flask 그리고 별도의 모델 서빙 프레임워크 중 무엇이 더 좋을지 고민하는 글이었는데 간단하게 구축하려면 전자를, 성능 면을 고민한다면 후자 그중에서도 TorchServe를 활용하는 방법을 추천하였다.
TorchServe는 PyTorch로 구현된 모델을 서빙하기 위해 만들어진 툴(model serving tool)이다. 다음은 TorchServe 공식문서에 나와있는 소개글이다.
TorchServe is a performant, flexible and easy to use tool for serving PyTorch models in production.
위 그림에서 볼 수 있듯 TorchServe는 Management API, Inference API 두 가지 API를 제공하고 있다.
Management API를 사용하여 모델을 직접 'Model Store'에 등록하고 관리할 수 있다. 만약 하나의 서비스에서 여러 모델을 병렬적으로 동작시켜야 한다면 고려해 볼 수 있을 것이다. 예를 들어, 프로젝트에서도 이미지를 input으로 하여 사용자의 집중도를 판단하는 모델과 Pose Estimation 기반 거북목 판단 모델 두 개의 모델을 운영하는 것으로 초기에 말이 나왔었는데 이처럼 여러 모델을 관리하고 사용하는 상황에서 유용할 것이다.
Inference API는 말그대로 inference(추론), 모델이 데이터를 받아 도출하는 분류값을 뽑아내는 API이다.
TorhcServe를 활용하는 방법이 성능 면에서, PyTorch 공식 오픈 소스 프레임워크라는 점에서 가장 이상적이었겠지만, 당시의 나는 Spring Boot, Java 코드로 승부를 보고 싶었기 때문에 Python으로 되어 있는 모델 파일을 직접 서빙하는 방법은 엄두를 내지 못했다.
DJL
AWS에서 2019년 발표한 오픈소스 라이브러리 Deep Java Library는 딥러닝에 활용할 수 있는 리소스가 거의 없는 Java의 한계를 개선하기 위해 등장하였다. Python이 아닌 Java에서 엔드 투 엔드 딥 러닝 개발을 지원함으로써 소프트웨어 종속성의 수를 줄인다는 장점을 내세웠다. 그러나 이미 Python으로 학습이 완료되어 있던 이번 프로젝트 특성 상 Java로 딥러닝 모델을 개발해야 할 필요성은 없었기 때문에 프로젝트에서 사용하기엔 거리가 있었다.
그러나 Spring Boot에서 Pytorch를 통합하는 방법이 있다는 블로그 글을 보고 resources 디렉토리에 PyTorch 파일 (. pt)을 넣고 Java에서 클래스로 파일을 읽도록 시도해 보았지만 실제로 동작하진 않았다.
We don't recommend that developers use classes in this module directly. Use of these classes will couple your code with PyTorch and make switching between frameworks difficult.
DJL 공식 문서에서도 설명하고 있는 것처럼 직접 클래스에서 모듈을 사용하는 것은 권장하지 않는 방법인 것 같다. 이외에도 안드로이드 개발에 사용할 수 있는 pytorch_android 라이브러리가 있어 시도해 봤지만 안드로이드 개발에 한정되어 있는 라이브러리였기 때문에 REST API 개발에는 적합하지 않았다.
정리
MLOps라는 분야가 따로 존재할 정도로 모델을 서빙, 더 나아가 관리하는 방법은 매우 다양하다. 이번 프로젝트에서는 머신러닝 분야에 깊이 관여하지 않고 단순히 API로 모델의 inference를 받아오는 데 집중했기 때문에 TorchServe와 같은 프레임워크를 사용하진 못 했다. 그러나 프로젝트를 진행해 오며 모델 코드를 읽고 조금씩 고쳐보며 손대지 못할 어려운 분야는 아니라는 자신감이 생겨서 다음에 모델을 서빙할 때는 Flask나 FastAPI 위에 단순히 동작시키는 방법이 아닌 새로운 방법을 시도해 봐야겠다. 다음 글에서는 Flask로 모델을 서빙했던 방법을 적어보고자 한다.
출처
https://www.facebook.com/groups/PyTorchKR/permalink/1702599986546342/
'백엔드 > model serving' 카테고리의 다른 글
PyTorch 모델 서빙 (3) - EC2 환경에서 모델 실행+ 에러 (1) | 2024.01.04 |
---|---|
PyTorch 모델 서빙 (2) - Flask 모델 서빙 (3) | 2024.01.02 |