본문 바로가기
kubenetes

KServe의 Inference Batcher

by kyeongseo.oh 2024. 10. 12.

KServe Inference Batcher는 여러 개의 개별 예측 요청을 하나의 배치로 묶어 처리함으로써 전체적인 처리량을 증가시키는 기능이다.

 

주요 특징

  • 구현 위치: KServe 모델 에이전트 사이드카
  • 주입 메커니즘: 웹훅을 통한 InferenceService 파드에 주입
  • 내부 통신: Go 채널을 사용한 데이터 전송
  • 프로토콜 지원: KServe v1 HTTP 프로토콜 (gRPC 미지원)

 

작동 방식

  1. 예측 요청이 모델 에이전트 사이드카에 도착
  2. Batcher가 요청을 모아 배치 생성
  3. 배치 완성 시 예측기 컨테이너로 추론 요청 전송

 

배치 트리거

  • maxBatchSize: 최소 배치 크기. HTTP 요청의 수가 아닌 배치에 포함된 데이터 인스턴스의 수를 의미한다. 최소한 maxBatchSize 만큼의 데이터 인스턴스가 입력되어야 추론 요청을 전달한다.
  • maxLatency: 최대 대기 시간 (ms)

maxBatchSize 만큼의 데이터 인스턴스가 충족되면, 추론 컨테이너로 요청이 전송되고, maxBatchSize가 요구를 충족시키지 못한 상태로 maxLatency가 초과하면 추론 컨테이너로 요청이 전송된다.

 

maxBatchSize가 `32` 일 때 20 + 32의 요청이 오면 52개의 데이터 인스턴스는 하나의 batch로 처리된다.

 

Batcher 사용 예시

InferenceService YAML 파일에서 `batcher` 섹션을 추가하여 구성할 수 있다.

maxBatchSize는 32로 maxBatchSize는 10초로 설정했다. 

apiVersion: "serving.kserve.io/v1beta1"
kind: "InferenceService"
metadata:
  name: "batcher"
spec:
  predictor:
    serviceAccountName: s3-sa
    batcher:
      maxBatchSize: 32
      maxLatency: 10000
    model:
      modelFormat:
        name: sklearn
      protocolVersion: v1
      storageUri: "s3://sandbox/iris_svm/v1/"

 

추론 요청을 보낸다. maxBatchSize보다 작은 데이터 인스턴스를 사용했기에 10초 후 추론 결과가 출력된다.

import requests
import json
import numpy as np
from sklearn import datasets
from pprint import pprint

# Iris 데이터셋 로드
iris = datasets.load_iris()
input_data = iris.data[:3]

# KServe 요청 형식에 맞게 데이터 구성 (단일 텐서로)
v1_data = dict(instances = input_data.tolist())

v2_data = {
    "inputs": [
        {
            "name": "input-0",
            "shape": list(input_data.shape),
            "datatype": "FP64",
            "data": input_data.tolist()
        }
    ]
}

# KServe 엔드포인트 URL
url = "http://batcher.kubeflow-user-example-com.10.0.2.6.sslip.io/v1/models/batcher:predict"

# 요청 보내기
resp = requests.post(url, data=json.dumps(v1_data))
pprint(resp.json())

 

결과 예시

동일한 batch에서 처리된 결과들은 동일한 batchId를 가진다.

{'batchId': '3bc87547-c1bc-4315-8eb0-1b0b9c04af5a',
 'message': '',
 'predictions': [0, 0, 0]}

 

댓글