Multi Model Server and SageMaker Multi-Model Endpoint Overview
1. Introduction
MMS(Multi Model Server)
https://github.com/awslabs/multi-model-server (2017년 12월 초 MXNet 1.0 릴리스 시 최초 공개, MXNet용 모델 서버로 시작)
Prerequisites: Java 8, MXNet (단, MXNet 사용 시에만)
MMS는 프레임워크에 구애받지 않도록 설계되었기 때문에, 모든 프레임워크의 백엔드 엔진 역할을 할 수 있는 충분한 유연성 제공
마이크로 서비스 기반 아키텍처로 자체적으로 엔드포인트를 생성하여 추론 서버를 구축하므로, MMS만 사용한다면 SageMaker와 무관
프론트엔드: REST API를 제공하는 자바 기반 웹 서비스
백엔드: Custom Service 코드를 실행하는 worker
Flask 대비 다양한 버전의 모델을 관리하는 측면 및 logging & 지표 확인 측면의 ML 편의성이 좋음.
추론용 서버의 CPU가 메모리가 충분할 때 다양한 모델을 하나의 엔드포인트에 배포할 수 있는 기능 내장; Multi-Model Endpoint 사용 가능
간략한 사용 방법
Model Handler 구현 (Custom Service class 구현)
How to initialize Multi-Model Endpoint on SageMaker? 참조
model-archiver
로 모델 패키징 → MMS가 파싱할 수 있는 아카이브 생성모델 아티팩트들을 MMS가 파싱할 수 있는 단일 모델 아카이브 파일로 패키징
[필수] Model artifacts (weights, layer 등)
[필수] Model signature file (입력 데이터 텐서의 shape)
[선택] Custom service file: 입/출력 전처리; 모델 초기화, raw 데이터를 tensor로 변환 등
[선택] Auxiliary files (추론 수행에 필요한 추가 파일 및 Python 모듈)
예: object detection 시, 각 클래스의 string 저장
export_path
로 지정한 경로에 추론 요청을 처리하기 위해 MMS에 제공하는<model-name>.mar
파일이 생성됨. (https://github.com/awslabs/multi-model-server/tree/master/model-archiver#creating-a-model-archive 참조)
MMS 시작
컴퓨팅 리소스가 많은 호스트의 경우 서버 시작에 시간이 많이 걸릴 수 있음.
아래 예시에서는 MMS 로컬 파일 시스템에서 .mar 파일을 로드하지만, AWS S3에 .mar 파일을 저장하고
http://
또는https://
와 같은 URL을 사용하여 모델 아카이브 로드 가능
추론 예시; MMS 프로세스가 모델 아카이브를 다운로드 및 압축 해제 후, 모델 아티팩트로 서비스를 구성하고 엔드포인트를 통해 들어오는 요청을 수신하기 시작
MMS 서비스 중단 예시
공식 문서에서는 더 강력한 보안을 위해 Docker 컨테이너 내에서 MMS를 실행하는 것을 권장함.
SageMaker Inference Toolkit
SageMaker 상에서 MMS를 좀 더 쉽고 편하게 배포할 수 있는 high-level 어플리케이션으로 배포한 툴킷
또한, SageMaker Multi-Model endpoint를 쉽게 시작할 수 있는 구성 및 설정 및 인터페이스를 지원함.
단, Python 모델 핸들러만 지원하며, 다른 언어로 핸들러를 구현하려면 MMS를 사용해야 함.
MMS를 래핑하여 SageMaker 추론 컨테이너로 작동하기 때문에 컨테이너 작성 난이도가 MMS를 직접 가져다 쓰는 것보다 낮음.
MXNet, PyTorch 추론 컨테이너에는 이 toolkit를 디폴트로 사용하므로, inference handler script 인터페이스가 동일함
향후 PyTorch 추론 컨테이너는 TorchServe로 마이그레이션될 예정. 기본적인 근간은 MMS이지만 PyTorch 특화 feature가 있음; 출처: https://twitter.com/shshnkp/status/1290801831518433280?s=20
Option 1.
model_fn(), input_fn, predict_fn(), output_fn()
Option 2.
model_fn(), transform_fn()
SageMaker Multi-Model Endpoint
2019년 11월 말 re:Invent 2019 직전에 공개
보통은 엔드포인트 생성 시 S3에 저장된 모델을 추론 컨테이너로 다운로드하고 지속적으로 메모리에 로드하지만, Multi-Model Endpoint는 모델을 S3에서 동적으로 로드
특정 모델에 대해 첫 번째 요청이 들어오면, 그 때 S3에서 모델을 추론 컨테이너로 다운로드하고 메모리에 로드 → Cold start 발생
한 번 호출된 모델은 인스턴스에 다운로드되어 메모리에 로드되므로, 추론이 빠르게 수행됨.
신규 모델을 위한 공간을 확보하기 위해 캐시 공간이 부족할 때, 모델을 동적으로 언로드
ModelCacheHit, ModelUnloadingTime 지표를 활용해 모델 캐싱/언로드를 모니터링할 수 있고, 모델 언로드 빈도가 잦은 경우, 인스턴스 갯수를 늘리거나 인스턴스 사양을 높이는 것이 좋음.
따라서, 만약 low latency 및 high TPS가 필요하면 Multi-Model Endpoint는 적절한 솔루션이 아님.
하지만, 신규 모델 배포 시, Endpoint 중단-업데이트-시작 과정이 필요 없이 S3에 복사하기만 되므로 많은 수의 모델을 배포하거나 A/B 테스트 시에 유리 (단, framework, 네트워크 구조, 입/출력이 동일해야 함)
Multi-Model Endpoint는 딥러닝 프레임워크 중 MXNet 추론 컨테이너 및 PyTorch 추론 컨테이너에서만 디폴트로 지원되며, 다른 프레임워크에 적용하려면 MMS 서비스를 시작하고 호출하는 컨테이너 빌드 필요 (BYOC)
TensorFlow, Chainer는 구축된 딥러닝 프레임워크 Docker 이미지 기반으로 확장하는 것을 권장.
TFS(TensorFlow Serving) 컨테이너도 2020년부터 Multi-Model Endpoint 지원
2020년 8월 기준 1.5.0과 2.1.0만 Multi-Model Endpoint 지원
대부분의 SageMaker built-in 알고리즘들은 Multi-Model Endpoint 미지원 (상황에 따라 변동 가능)
Scikit-learn, XGBoost 컨테이너는 Multi-Model Endpoint 지원; https://github.com/aws/sagemaker-xgboost-container/blob/mme/src/sagemaker_xgboost_container/serving.py
직접 Inference 컨테이너에서 Multi-Model Endpoint를 사용하려면
LOAD MODEL, LIST MODEL, GET MODEL, UNLOAD MODEL, INVOKE MODEL
API를 구현해야 함; https://docs.aws.amazon.com/sagemaker/latest/dg/mms-container-apis.html 참조다중 모델에 대한 Model Monitoring 기능은 향후 지원 예정
주의
Elastic Inference와 동시 사용이 불가능하고 GPU 미지원
Multi-container endpoint가 아님. 컨테이너, 엔드포인트는 단일로 구성되어 있음
Trade-off between Server Load and Response Latency
Horizontal scaling
AutoScaling 기능을 사용하여 사전 정의된 CloudWatch 지표 중 InvocationsPerInstance 지표를 기반으로 scale-out/in을 수행할 수 있음.
Vertical scaling
적절한 컴퓨팅 인스턴스를 선택하되, 비용 및 latency가 중요하면 Elastic Inference / Inferentia을 고려할 것
단, Multi-Model Endpoint는 GPU, Elastic Inference, Inferentia 미지원
2. How to initialize Multi-Model Endpoint on SageMaker?
구현 개요
Handler 구현
Method 1. SageMaker Inference Toolkit의 Handler 및 HandlerService 구현
Method 2. MMS 템플릿의 Custom Service 파일 구현
Model Server를 시작하는 Serving 엔드리포인트 구현
Dockerfile 생성
Handler 구현 방법
Method 1. SageMaker Inference Toolkit의 Handler 및 HandlerService 구현
Inference handler 구현: 흔히 SageMaker Endpoint 딥러닝 프레임워크에서 추론 시 사용하는
input_fn, predict_fn, output_fn, model_fn
과 동일한 형태SageMaker inference toolkit의 레퍼런스 구현이지만, 템플릿 코드만 존재하고 실제 예제 코드가 없음.
DefaultHandlerService
를 상속받아HandlerService
클래스 구현
Method 2. MMS 템플릿의 Custom Service 파일 구
SageMaker inference toolkit 클래스를 상속받지 않고 자체 커스텀 서비스 구현
SageMaker Notebook 공식 예제는 이 방법을 기반으로 하고 있음.
handle(data, context)
메서드는 MMS에 의해 호출되는 entrypointcontext는
transform()
함수로 전달되지만, 추론 handler 함수들(model_fn()
등)로는 전달되지 않음따라서, 만약 multi-GPU를 최대한 활용하고 싶으면 Custom Transformer class를 생성 후, context를
model_fn()
모듈에 전달할 수 있게 수정해야 함 (예: model_server_workers = 4일 때, 각 worker마다 각자 다른 GPU로 처리)
Docker Entrypoint 정의 예
References
Last updated