최근 사내에 GPU를 도입하면서 다양한 ML 모델을 개발하고 있다. 반면 ML 모델 서빙 측면에서는 단순히 FastAPI를 사용하고 있다.
알다시피 FastAPI는 파이썬 웹 프레임워크이기 때문에 사실상 모델 서빙 프레임워크는. 그래서 이를 대체 할 수 있는 제대로된(?) 모델서빙 프레임 워크 중 하나인 Trition Infercence Server에 대해서 알아보려고 한다.
ML 모델 서빙이란?
train 된 모델을 실 서비스에 사용할수 있도록, 모델 예측 결과를 전달하는 방식이다. 모델을 훈련하는 것에서 끝나는게 아니라 그걸 어떻게 서비스로 제공할 것 인가, 즉 추론(Inference)을 하는 것까지의 과정이며 DE의 영역에서 더 나아가 MLops의 최종과제라고 볼 수 있다.
Serving pipeline: ML 모델 서빙 과정
모델 서빙 파이프라인은 크게 3가지로 볼수 있다.
- 데이터 파이프라인 : 실시간이나 배치로 데이터를 수집하는 과정
- 모델 파이프라인 : 모델을 학습시키는 과정
- 서빙 파이프라인 : 학습된 모델을 서비스로 서빙하는 과정
그중에서 서빙 파이프라인의 과정은 일반적으로 아래와 같다.
- 전처리: 모델의 추론을 위한 입력데이터 벡터화
- 추론(인퍼런스) : 훈련된 모델이 입력값에 따라 예측결과 도출
- 후처리: confidence 계산하며 응답생성
모델 서빙의 복잡성
Pytorch, TensorFlow, OnnxRuntime 등 여러가지 모델포맷에 맞는 환경설정에 복잡성이 있다.
각 모델을 구동할수 있는 백엔드가 필요할 뿐만 아니라 추론코드 또한 각각 개별적으로 작성하고 관리해야한다.
심지어 GPU와 CPU에 따라서 다양한 모델들을 실행할수 있는 환경까지 각각 필요하다.
현재 상황, FastAPI로 모델서빙
결국 현재 모델 서빙의 수고로움을 인지한채 다양한 모델들을 단순히 FastAPI로 서빙하고 있다.
기본적으로 Python에 익숙하기 떄문에 쉽고 간단하게 API를 구축할수 있었기 때문이다.
그러나 사실 FastAPI는 기본적으로 파이썬 웹 프레임워크이기 때문에 모델 서빙 프레임워크 기능을 지원하는게 거의 없다.
예를 들면, 자동으로 배치를 만들어서 인퍼런스를 수행하는 Dynamic Batch Infernce 기능을 제공하지 않는다.
결국 여러가지 모델에 따라 각각 추론코드를 작성하고, 각각 실행 및 운영 환경을 구축해야니 개발과 유지보수 비용이 크다.
그래서 fastAPI 대신 모델 서빙을 효율적이고 편리하게 할수 있는 모델서빙 프레임워크를 찾고 있다.
대표적으로 Tensorflow Serving 프레임워크, BentoML, 그리고 Trition InferenceServer가 있다.
카카오페이 기술블로그의 각 모델 서빙 프레임워크 비교 글
NVIDA Triton Inference Server
특히 현재 NVIDA GPU를 사용하고 있기에, NVIDA에서 제공하는 Triton Inference Server를 앞으로 도입할 것 같다.
엔비디아 공식문서에 따르면, Triton Inference Server는 GPU 또는 CPU기반에서 훈련된 AI 모델을 배포,실행,확장 할 수 있도록 지원하는 고성능 추론에 최적화된 오픈소스 소프트웨어라고 한다. 그리고 몇가지 특장점을 살펴보면 아래와 같다.
1. 다양한 모델 포맷 지원
Tensorflow, PyTorch, Onnx Runtime, TensorRT 등 다양한 모델포맷을 지원한다.
그리고 기본적인 로직은 C로 작성된것 같지만, python Backend를 지원한다.
https://github.com/triton-inference-server/backend
2. 고성능 추론
NVIDIA GPU, CPU 및 AWS inferenctia 기반 추론까지 지원한다.
3.모델 배포 및 관리 용이
아래 구조에 맞춰 모델이름, config파일(config.pbtxt), 모델버전(1) 및 모델파일(model.onnx) 만 작성하면 모델이 배포가 된다.
모델 하위에 모델 버전으로 경로를 구분해서 모델 버전닝까지 가능하다.
#ONNX Model repository
<model-repository-path>/
<model-name>/
config.pbtxt
1/
model.onnx
4.모델 서빙 성능 최적화 기능 제공
기본적으로 자동으로 배치를 만들어주는 배치 인퍼런스(Dynamic Batch)를 수행할 수 있다.
한 모델에 GPU나 CPU 실행 인스턴스를 여러개 사용할수 있도록 제공하는 동시실행(Concurrent Model Execution)을 지원한다.
전처리-추론-후처리 등 여러개 모델을 하나의 파이프라인으로 연결하는 앙상블모델(Ensemble Model)을 지원한다.
5.모델관리 API 지원
HTTP/REST, gRPC를 지원하여 모델을 관리하고 쿼리를 제어할수 있는 API를 제공한다.
예를 들면, </v2/models/<model_name>/infer> 라는 endpoint로 바로 인퍼런스 결과를 받을수도 있다.
그 외에도 cuda, ubuntu 버전에 맞는 triton container 선택해서 쿠버네티스로 관리하고 모니터링이 가능하며,
모델 성능 측정 클라이언트 (Performance Analyzer)를 제공해서 간단하게라도 성능을 확인할수도 있다.
그리고 개인적으로 직접 PoC를 진행해보니 몇가지 단점과 불편한점이 느껴졌다. 모델 repository 구조를 변경할 수 없다거나, 아무래도 config기반으로 모델을 로드하다보니 코드상 디버깅도 번거롭다. 다음글에서는 실제모델을 NVIDA trition Inference Server를 통해 서빙하는걸 테스트해볼 예정이다.
https://github.com/triton-inference-server/server?tab=readme-ov-file%EF%BB%BF
'🌿 Data Engineering > MLOps' 카테고리의 다른 글
[로컬에서] Locust사용법, API 부하 테스트 및 성능 지표 해석하기 (0) | 2024.08.06 |
---|---|
Triton Inference Server 모델서빙2 - 직접 우리 모델을 서빙해보자! (0) | 2024.08.03 |