본문 바로가기

AI

토치서브(TorchServe) - 파이토치 배포를 위한 모델 서비스 프레임워크 공개

Pytorch

파이토치는 간결하면서 '파이썬스러운' 문법과 그래프 모드의 유연성으로 인해 AI 알고리즘 연구자들이 대대적으로 선호해 온 머신러닝 프레임워크이다. 텐서플로우에서 케라스를 래핑한 TensorFlow2.0을 발표하며 개발의 용이성을 강조했을 때에도 "우리 연구실 학생들이 파이토치에서 갈아탄다면 텐플이 쉽다는 걸 인정하겠네 "라는 meme이 돌았을만큼 파이토치를 사용한 모델 개발과 실험은 매우 쉽다!

 

 

그러나 파이토치로 개발된 모델을 비즈니스 레벨로 디플로이하는 것은 쉽지 않았다. 대규모 추론 환경에서 프로덕션 레벨로 모델을 배포하기 위해서는 안정적인 다중 응대 뿐만 아니라 모델 관리, 보안, 모니터링 등 필요한 기능이 많기 때문이다. 이러한 모델 베포 프로세스를 단순화할 수 있는 방법 중 하나가 모델 서버를 사용하는 것인데, 텐서플로우에서는 텐서플로우 서빙(TensorFlow Serving)을 통해 프로덕션 환경에서 모델 디플로이를 지원하고 있다. 학계에서 파이토치의 꾸준한 인기도에서도 불구하고 많은 개발자가 텐서플로우를 채택하는 이유이다. 그런데 이번에 파이토치에서 모델 배포를 위한 프레임워크인 토치서브를 공개한 것!

 

 

 

AWS, 파이토치 모델 서비스 프레임워크 TorchServe 공개

지난 21일, 페이스북 AI와 아마존 웹서비스(AWS)는 파이토치 기반의 새로운 모델 서비스 프레임워크인 토치서브(TorchServe)를 공개하였다. 토치서브는 오픈소스 모델 서버 라이브러리로, 프로덕션 규모에 맞게 파이토치 머신러닝 모델을 배치하기 위해 만들어진 프레임워크이다.

 

AWS는 클라우드 기반의 파이토치 프로젝트 중 83%가 AWS에서 디플로이 되고 있는 만큼, 토치서브의 공개로 ▲낮은 지연시간의 추론 API 제공, ▲여러 모델 동시 서브, A/B테스팅을 위한 프로덕션 모델 버전 관리, ▲ 다이내믹 모델 로딩/언로딩, ▲로그 및 성능 관리를 용이하게 함으로써 파이토치 모델 디플로이의 어려움을 경감하게 되었다고 말했다.

 

토치서브는 CLI를 통해 로컬에서 디플로이하거나 컨테이너로 패키징하여 아마존 세이지메이커 혹은 아마존 EKS를 통해 scale out하는 것이 가능하다. 뿐만아니라 이미지 분류, 사물 인식, 텍스트 분류 등 일반적인 머신러닝 문제들에 대해 코드 없이도 모델을 디플로이하는 기능을 제공한다. 

 

 


예제 - hugging face BERT🤗 모델 토치서브로 배포하기

** 원본: https://medium.com/@freidankm_39840/deploy-huggingface-s-bert-to-production-with-pytorch-serve-27b068026d18

 

Deploy huggingface‘s BERT to production with pytorch/serve

A glimpse of the future of NLP model deployments and serving.

medium.com

세 줄 요약:

- pytorch/serve는 토치 모델을 프로덕션 레벨로 서빙할 수 있는 새로운, 개쩌는 프레임워크임!

- 허깅페이스의 transformers 레포지토리는 NLU의 SOTA 알고리즘의 집합체!

- huggingface/transformers에 있는 모델들, 그니까 BERT 같은것을 토치서브로 배포하는 법을 배워보자!

 

사전 작업

1. TorchServe 설치하기 - pip install로 쉽게 가능 (토치서브 설치하기)

 

pip install torch torchtext torchvision sentencepiece
pip install torchserve torch-model-archiver

 

현재는 다음의 두 단계로 설치하게 되어 있음

- Java JDK 11 설치

- 파이썬 디펜던시에 따라 torchserve 설치하기

 

2. BERT 모델 학습하기

- 배포할 BERT 모델 학습하기!! (예) BERT를 사용한 감성분류

- 오픈소스로 학습하는 튜토리얼이 많기 때문에 보고 따라하면 됨

- 학습이 끝나면 모델 체크포인트 (pytorch.bin), config 파일(config.json), 단어사전 (vocab.txt)가 생길 것.

 

 

토치서브를 설치하고, 학습된 모델이 준비되었다면, 다음과 같은 과정을 통해 모델을 서브할 수 있다.

 

STEP1. 토치서브 핸들러 정의하기

토치 서브는 handlers라는 개념을 사용해 모델이 어떻게 요청을 처리할지를 정의한다. 이 핸들러를 통해 모델을 패키징할 때 커스텀 코드를 넣을 수 있고, 따라서 유연하게 커스터마이징이 가능하다.

 

BERT 문장 분류기를 위한 간단한 TorchServe 핸들러의 예시로

자연어 텍스트를 인풋으로 받아 전처리 - 모델 추론 - 라벨 매핑을 통해 최종 클래스를 반환하는 코드를 작성해볼 수 있다. 

원한다면 BERT 예측 결과에 대한 후처리 기능, 앙상블 모델 로드 등의 부가적인 기능도 추가할 수 있다.

 

STEP 2. 훈련된 체크포인트를 토치서브 MAR 파일로 변환하기

토치서브는 MAR(Model Archive) 형식을 사용해 모델을 패키징하고 저장소 안에서 버전을 관리한다. 따라서 학습한 BERT 체크포인트를 MAR 형식으로 변환하고 핸들러에 붙여야 한다. 다음과 같은 코드를 이용해 이 작업을 수행할 수 있다:

 

torch-model-archiver --model-name "bert" --version 1.0 --serialized-file ./bert_model/pytorch_model.bin --extra-files "./bert_model/config.json,./bert_model/vocab.txt" --handler "./transformers_classifier_torchserve_handler.py"

 

위 명령어를 시행하면 학습된 BERT 모델 체크포인트(pytorch.bin)를 커스텀 핸들러(transformers_classifier_torchserve_handler.py)에 붙이고, config 파일과 단어사전과 같이 부가적으로 필요한 파일을 추가한다. 최종적으로 bert.mar이라는 파일이 만들어져 토치서브에서 사용할 수 있다.

 

 STEP 3. 토치 서브 서버 시작하기

MAR file을 포함한 model_store에서 토치서브 서버를 시작하면 된다!

 

mkdir model_store && mv bert.mar model_store && torchserve --start --model-store model_store --models bert=bert.mar

 

curl을 통해 쿼리 텍스트를 날려 실제 추론을 해볼 수 있다. (기본 port = 8080, 8081)

 

curl -X POST http://127.0.0.1:8080/predictions/transformers_bert -T unhappy_sentiment.txt

추론 API를 만들려면 Jango를 쓰던 Flask를 쓰던... 귀찮은 작업이 이만저만이 아닌데, 핸들러 작성을 통해 추론 서버에서 할 일을 "파이썬스럽게" 정의하고, 토치서브를 사용해 바로 추론 환경으로 만들 수 있다는 점이 인상적이다!! 토치서브를 사용하면 추론 지연시간도 줄어들고, 또 컨테이너 + 클라우드를 통해 scale out도 가능하다고 하니, 파이토치가 더 손에 익은 1인으로써 넘나 기쁜 소식이다 🤩


참고 자료:

- https://aws.amazon.com/ko/blogs/machine-learning/deploying-pytorch-models-for-inference-at-scale-using-torchserve/

- https://medium.com/@freidankm_39840/deploy-huggingface-s-bert-to-production-with-pytorch-serve-27b068026d18

- https://dzone.com/articles/the-battle-tensorflow-vs-pytorch