본문 바로가기
kubenetes

KServe Autoscaling & Zero Scale

by kyeongseo.oh 2024. 10. 9.

KServe는 Knative를 기반으로 한 강력한 자동 확장 및 제로 스케일 기능을 제공한다. 이 기능들을 통해 사용자는 효율적인 추론 서비스를 구축할 수 있다.

 

Autoscaling 개요

KServe의 자동 확장은 트래픽 패턴에 따라 pod의 수를 동적으로 조정한다. 주요 개념은 다음과 같다.

 

  • scaleMetric: 확장의 기준이 되는 메트릭
  • scaleTarget: 해당 메트릭의 목푯값. 이 값은 hard limit이 아닌 soft limit으로 요청이 갑자기 급증하여 이 값을 초과하면 새로운 pod가 생성되는 동안 기존 pod가 지정된 값을 초과하여 처리할 수 있다.

 

scaleMetric 옵션은 다음과 같다.

 

  • concurrency: 동시 처리 중인 요청 수
  • rps: 초당 요청 수
  • cpu: CPU 사용률
  • memory: 메모리 사용률

Zero Scale 개요

zero scale은 트래픽이 없을 때 pod 수를 0으로 줄이는 기능으로, 를 통해 리소스 사용을 최적화할 수 있다.

zero scale을 활성화 위해서는 아래 설정을 확인해야 한다.

  • enable-scale-to-zero: 클러스터 애플리케이션에 대해 전역적으로 zero scale을 활성화한다.
  • scale-to-zero-grace-period: 트래픽이 없는 상태에서 pod를 완전히 제거하기 전에 대기하는 시간을 설정한다. grace period 동안 최소 1개의 pod를 유지하고, grace period 동안 트래픽이 발생하지 않으면, 모든 pod를 종료한다.

config-autoscaler ConfigMap에서 해당 값을 확인하고 수정할 수 있다.

[root@km ~]# k get cm -n knative-serving config-autoscaler -oyaml | grep enable-scale-to-zero | head -n 1
    enable-scale-to-zero: "true"
[root@km ~]# k get cm -n knative-serving config-autoscaler -oyaml | grep scale-to-zero-grace-period | head -n 1
    scale-to-zero-grace-period: "30s"

 

Autoscaling 설정 방법

KPA 기반의 autoscaler는 cpu, memory 기반 Autoscaling을 지원하지 않기 때문에 HPA 기반의 autoscaler를 사용하도록 설정해야 한다.

1. concurrency 기반 Autoscaling

아래와 같이 설정하면 각 pod가 평균적으로 2개의 동시 요청을 처리한다. pod 수는 1에서 3 사이에서 조정된다.

apiVersion: "serving.kserve.io/v1beta1"
kind: "InferenceService"
metadata:
  name: "concurrency"
spec:
  predictor:
    serviceAccountName: s3-sa
    scaleTarget: 2
    minReplicas: 1
    maxReplicas: 3
    scaleMetric: concurrency
    model:
      modelFormat:
        name: sklearn
      storageUri: "s3://sandbox/iris_svm/v1/"

 

기본적으로는 1개의 pod가 실행 중인 상태로 존재한다.

[root@km ~]# k get pod -n kubeflow-user-example-com -l app=concurrency-predictor-00001
NAME                                                      READY   STATUS    RESTARTS   AGE
concurrency-predictor-00001-deployment-68bdf6ff9b-ttzxz   3/3     Running   0          49m

 

pod에 scaleTarget을 초과한 요청이 전송되면, pod는 최대 maxReplicas까지 증가한다.

[root@km ~]# k get pod -n kubeflow-user-example-com -l app=concurrency-predictor-00001
NAME                                                      READY   STATUS    RESTARTS   AGE
concurrency-predictor-00001-deployment-68bdf6ff9b-7d5ft   3/3     Running   0          62s
concurrency-predictor-00001-deployment-68bdf6ff9b-m9mvq   3/3     Running   0          62s
concurrency-predictor-00001-deployment-68bdf6ff9b-ttzxz   3/3     Running   0          42m

 

요청이 처리된 후 더 이상의 추론 요청이 들어오지 않으면, pod는 다시 1개로 줄어든다.

[root@km ~]# k get pod -n kubeflow-user-example-com -l app=concurrency-predictor-00001
NAME                                                      READY   STATUS        RESTARTS   AGE
concurrency-predictor-00001-deployment-68bdf6ff9b-7d5ft   3/3     Terminating   0          79s
concurrency-predictor-00001-deployment-68bdf6ff9b-m9mvq   3/3     Terminating   0          79s
concurrency-predictor-00001-deployment-68bdf6ff9b-ttzxz   3/3     Running       0          43m

 

2. rps 기반 Autoscaling

각 pod가 초당 10개의 요청을 처리하도록 설정한다.

apiVersion: "serving.kserve.io/v1beta1"
kind: "InferenceService"
metadata:
  name: "rps"
spec:
  predictor:
    serviceAccountName: s3-sa
    scaleTarget: 10
    scaleMetric: rps
    maxReplicas: 3
    model:
      modelFormat:
        name: sklearn
      storageUri: "s3://sandbox/iris_svm/v1/"

 

3. cpu 기반 Autoscaling

CPU 사용률이 75%에 도달하면 새로운 pod를 생성한다.

annotation을 사용해 hpa 기반 autoscaler를 사용하도록 설정한다.

apiVersion: "serving.kserve.io/v1beta1"
kind: "InferenceService"
metadata:
  name: "cpu"
  annotations:
    autoscaling.knative.dev/class: "hpa.autoscaling.knative.dev"
spec:
  predictor:
    serviceAccountName: s3-sa
    scaleTarget: 75
    scaleMetric: cpu
    maxReplicas: 3
    resources:
      requests:
        cpu: "100m"
        memory: "100Mi"
      limits:
        cpu: "1"
        memory: "200Mi"
    model:
      modelFormat:
        name: sklearn
      storageUri: "s3://sandbox/iris_svm/v1/"

 

4. memory 기반 Autoscaling

메모리 사용률이 80%에 도달하면 새로운 pod를 생성한다.

annotation을 사용해 hpa 기반 autoscaler를 사용하도록 설정한다.

apiVersion: "serving.kserve.io/v1beta1"
kind: "InferenceService"
metadata:
  name: "cpu"
  annotations:
    autoscaling.knative.dev/class: "hpa.autoscaling.knative.dev"
spec:
  predictor:
    serviceAccountName: s3-sa
    scaleTarget: 75
    scaleMetric: cpu
    maxReplicas: 3
    resources:
      requests:
        cpu: "100m"
        memory: "100Mi"
      limits:
        cpu: "1"
        memory: "200Mi"
    model:
      modelFormat:
        name: sklearn
      storageUri: "s3://sandbox/iris_svm/v1/"

 

5. containerConcurrency 기반 Autoscaling

containerConcurrency는 다른 metric과 다르게 hard limit으로, 아래의 예제에서는 각 pod가 동시에 처리할 수 있는 최대 요청 수를 4개로 제한한다.

이 값을 초과하는 요청은 해당 Pod에서 처리되지 않고, 대기하거나 다른 Pod로 라우팅된다.

concurrency는 soft limit으로 이 값을 초과할 수 있으나, containerConcurrency은 초과할 수 없어, pod의 과부하를 방지하고 안정적인 성능을 보장할 수 있다.

apiVersion: "serving.kserve.io/v1beta1"
kind: "InferenceService"
metadata:
  name: "container"
spec:
  predictor:
    serviceAccountName: s3-sa
    containerConcurrency: 4
    scaleMetric: concurrency
    scaleTarget: 2
    maxReplicas: 3
    model:
      modelFormat:
        name: sklearn
      storageUri: "s3://sandbox/iris_svm/v1/"

 

Zero Scale 설정 방법

minReplicas를 0으로 설정하면 zero scale이 적용된다. 이 상태에서는 InferenceService는 생성되나, pod는 생성되지 않는다.

apiVersion: "serving.kserve.io/v1beta1"
kind: "InferenceService"
metadata:
  name: "zero"
spec:
  predictor:
    serviceAccountName: s3-sa
    minReplicas: 0
    model:
      modelFormat:
        name: sklearn
      storageUri: "s3://sandbox/iris_svm/v1/"

 

추론 요청을 보내면 pod가 생성되고, pod가 시작되기 전까지는 추론이 시작되지 않아, 결과를 받기까지 시간이 걸리는 데,이를 cold start라고 한다.

zero-predictor-00001-deployment-56bd568687-g9n5l           0/3     Init:0/2   0          3s

 

댓글