TorchServe 에 대한 소개를 살펴보았으니 이제 실제 PyTorch에서 TorchServe 를 활용하는 방법에 대해 알아봅시다. 실제 배포 과정을 시행 하면서 TorchServe의 구성요소인 Handler와 mar 파일의 사용법에 대해 파악해보겠습니다.
TorchServe Handler
TorchServe 를 통해 모델을 배포하고자 할 때 꼭 등장하는 것이 Handler입니다. Handler는 내가 정성껏 만든 모델을 배포하기 위해서 TorchServe가 이해할 수 있는 형태로 정의된 녀석입니다. TorchServe에서는 기본적인 Handler example을 제공하고 있습니다. (기본 제공 handler) 그러나 모델을 wrapping하는 툴이 대부분 그렇듯, 기본 제공 핸들러는 내가 만든 모델에 딱 맞지 않는 경우가 많으므로 CustomHandler를 만들어야 합니다.

AI모델을 다루는 개발자라면 모델을 감싸는 코드를 접했을 때 대체로 함수명만 봐도 어떤 기능을 하겠구나 짐작할 수 있을 거라 생각합니다. Handler도 마찬가지입니다. TorchServe에서 제공하는 base_handler.py의 BaseHandler는 추상클래스로 되어있으며, 주석과 함께 해석해 보면 각 메소드가 어떤 기능을 수행하고 있는지 직관적으로 쉽게 이해가 가능합니다. 그리고 우리는 이 handler를 입맛에 맞게 변환하여 사용하면 되는 것입니다. TorchServe에서는 친절하게 이 base_handler를 사용한 실제 예시까지 튜토리얼로 보여주고 있습니다. (실제 Transformer Handler 코드 링크)
그럼 BaseHandler의 구성 요소 중, 주로 사용하게 될만한 메소드를 살펴보겠습니다.
Initialize - code
오버라이드하여 모델을 선언하거나 config를 세팅할 때 사용하면 되는 메소드 입니다. 함수명과 같이 init의 의미를 가지고 있습니다.
handle - code
API 콜 할 경우 Entrypoint
설명처럼 TorchServe를 통한 배포 후에 API콜을 할 경우의 Entrypoint입니다. 요 안에 preprocess, inference, postprocess등의 메소드가 모두 들어있어 자유롭게 커스터마이징하면 원하는 형태로 모델 배포가 가능합니다.
initialize와 handle 두개만 오버라이드해서 구현하면 원하는 배포가 가능하기 때문에 참 간단합니다.
MLOps 정의와 구조 비교 분석 [2023년 버전]
TorchServe .mar 파일
TorchServe가 무엇인지 대략적으로 감을 잡고, 배포를 위해 필요한 handler도 알아보았습니다. 그럼에도 아직까지 배포를 위한 사전 준비가 모두 끝난것이 아닙니다. 우리가 만들어놓은 모델을 TorchScript로 변환하고, 필요한 파일들을 모아 .mar 파일을 만드는 과정이 필요합니다.
TorchScript란?
많은 AI개발자들이 모델 개발 시 주로 pytorch를 사용하곤 합니다. 워낙 편리한 기능을 많이 제공하고 직관적인 개발이 가능하기 때문입니다. 그만큼 사람이 사용하기 적합한 형태로 보여주기 위해 wrapping이 많이 되어 있고, 이는 당연하게도 속도 측면에서 문제를 야기합니다. 때문에 배포를 위해서는 모델을 Pytorch에서 c++과 같이 고성능 환경에서 실행할 수 있는 형태로 변환이 필요합니다. 여기서는 해당 과정을 따로 다루지는 않습니다. 자세한 내용은 TorchScript의 공식 문서나 Huggingface의 예제를 참조하면 좋을것 같습니다.
.mar 파일 만들기
Torchserve를 실행하기 위해서는 .mar파일이 필요합니다. handler를 만들고, 모델을 직렬화하고, 그 외 각종 필요한 코드나 파일 등을 준비 한 뒤 .mar파일로 묶는 것입니다. 이후 Torchserve 실행 시 이 .mar을 가지고 가서 알아서 서버를 구축하게 됩니다. .mar 파일을 만드는 명령어는 torch-model-archiver입니다. TorchServe의 오피셜 깃의 안내에 따라 torch-model-archiver를 설치하는 것이 물론 선행되어야 합니다. 해당 명령어 실행 시 주로 쓰게될 옵션들은 아래와 같습니다.
- --model-name
모델 명 입니다. 원하는대로 설정하면 해당 모델 명.MAR로 파일이 생성됩니다. - --version
Torchserve는 버전을 관리할 수 있는 기능이 있습니다. 필수는 아니고, 일종의 태그와 비슷하다고 볼 수 있습니다. 원하는 버전을 입력하면 됩니다 - --serialized-file
script혹은 trace된 모델이 여기에 들어갑니다. - --handler
사용자의 필요에 따라 작성한 handler입니다. - --extra-files
모델 실행 시 필요한 각종 외부 파일들을 여기에 넣어주어야 합니다. 만약 handler등에서 별도의 script를 가져다 쓸 경우, 여기에 해당 스크립트도 포함시켜야 합니다.
필요한 옵션들을 넣고 torch-model-archiver 명령을 실행하면 오래 걸리지 않고 .mar파일이 생성됩니다.