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
'kubenetes' 카테고리의 다른 글
JuiceFS CSI driver를 이용해 MinIO와 HDFS를 Kubernetes와 연동하기 (1) | 2024.10.11 |
---|---|
KServe Autoscaler KPA와 HPA 비교 (0) | 2024.10.11 |
KServe v2 프로토콜: 모델 메타데이터 (2) | 2024.10.01 |
KServe Custom Predictor 이미지 빌드 가이드 - v2 protocol (1) | 2024.10.01 |
KServe Transformer 개발 가이드 (1) | 2024.09.29 |
댓글