ML OPS/Inference & Serving

[MLOps] BentoML - Adaptive Batching

seokhyun2 2023. 3. 12. 14:00

오늘은 Adaptive Batching에 대해서 알아보려고 합니다.

 

왜 필요한 지 먼저 알아볼건데, infernce의 경우 하나의 input을 inference 하는 것 보다, batch로 inference하면 훨씬 빠르고 효율적으로 추론을 할 수 있습니다.

하지만 api를 서빙을 하는 경우에는 batch로 inference가 매우 어렵습니다.

예시를 들어보면 챗봇이라고 생각을 하면 intent(의도)를 분류하는 모델을 api로 서빙을 할 텐데, 하나의 질문에 대한 intent만 분류하면 되기 때문에 api에 batch로 inference를 요청할 수 없습니다.

 

api server 입장에서는 한 문장씩 입력이 들어오더라도, 비슷한 시간에 들어오는 문장들을 묶어서 infernce를 해서 결과를 반환해주면 비싼 GPU를 훨씬 효율적으로 쓸 수 있겠지라는 아이디어로 구성된 것이 Adaptive Batching입니다.

 

https://docs.bentoml.org/en/latest/guides/batching.html

 

위 그림은 bentoml에서 가져온 이미지인데, adaptive batching이 어떻게 동작하는 지 한 눈에 볼 수 있습니다.

runner를 별도로 구성하여 api server로 들어온 여러개의 request를 runner에서 batch로 만들어서 inference를 하는 구조로 구성되어 있습니다.

 

bentoml에서는 max batch size와 max latency를 설정할 수 있는데 request들을 queue에 모아서 inference를 하는 구조인데, max batch size보다 작은 수의 request들이 있다면, max latency만큼 기다렸다가 inference를 하는 구조로 구성되어 있습니다.

그래서, max batch size와 max latency는 서비스하려는 구성에 맞게 충분히 테스트를 하여 설정해서 활용해야 합니다.

 

bentoml에서 adaptive batching을 사용하는 방법은 꽤나 간단한 편입니다.

bentoml에 모델을 저장 할 때, 아래와 같이 사용하겠다고 설정해주고 서버를 띄울 때도 옵션만 주면 되도록 구성이 되어 있습니다.

# Python - save to bentoml
bentoml.pytorch.save_model(
    name="mnist",
    model=model,
    signatures={
        "__call__": {
            "batchable": True,
            "batch_dim": (0, 0),
        },
    },
)
# configuration.yaml
runners:
    iris_clf:
        batching:
            enabled: true
            max_batch_size: 100
            max_latency_ms: 500

 

오늘은 adaptive batching의 개념에 대해서 알아보고 bentoml에서 어떻게 사용할 수 있는지 알아보았습니다.

adaptive batching은 bentoml이 아닌 Nvidia에서 개발한 triton inference server(https://developer.nvidia.com/nvidia-triton-inference-server)에서도 사용할 수 있습니다.

 

adaptive batching은 api server에서 GPU를 효율적으로 사용할 수 있게 해주는 매우 중요한 기능인 만큼, 여러 라이브러리에서도 사용할 수 있게 개발되어 제공이 되어 있으니, api로 서빙을 하는 경우에는 꼭 필수로 고려를 해보아야 하는 기능이 아닐까 싶습니다.