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๋ฅผ ์คํํ๋ ๊ฒ์ ๊ถ์ฅํจ.
์ปจํ ์ด๋ ์์: https://github.com/awslabs/multi-model-server/blob/master/docker/README.md
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 MODELAPI๋ฅผ ๊ตฌํํด์ผ ํจ; 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