NVIDIA Triton Inference Server

NVIDIA Triton Inference Server with KNative Serving

김 정출 2024. 10. 26. 10:27

NVIDIA Triton Inference Server with KNative Serving

  • NVIDIA Triton Inference Server와 Knative Serving는 AI 모델의 배포와 운영을 위한 강력한 도구들로, 각각 고유한 특징을 갖고 있습니다.
  • 이 둘을 결합하면 확장성 높은 AI 서비스 인프라를 구축할 수 있습니다. 아래에서 각각에 대해 설명드리겠습니다.

NVIDIA Triton Inference Server

Triton Inference Server는 NVIDIA가 개발한 고성능의 AI 모델 추론 서버로, 다양한 모델 포맷과 프레임워크를 지원하며, GPU 및 CPU에서의 추론을 최적화하는 데 초점을 맞춥니다. 주요 특징은 다음과 같습니다.

  1. 다양한 모델 포맷 지원:
    • Triton은 TensorFlow, PyTorch, ONNX, TensorRT 등 다양한 딥러닝 프레임워크를 지원하며, 모델을 ONNX, SavedModel, TorchScript 등 여러 형식으로 배포할 수 있습니다.
  2. 모델 엔세이블링(Model Ensembling):
    • 여러 모델을 연결하여 추론을 수행할 수 있는 기능으로, 복잡한 추론 파이프라인을 구성할 때 유용합니다.
  3. 동적 배치 처리 (Dynamic Batching):
    • 다수의 요청을 효율적으로 병합하여 처리하는 배치 기능으로, GPU 활용도를 최적화하고 추론 속도를 향상시킵니다.
  4. 확장성 및 배포 용이성:
    • Triton은 쿠버네티스와 같은 컨테이너 환경에서 확장 가능한 방식으로 배포할 수 있으며, gRPC 및 HTTP/REST API를 지원하여 다양한 클라이언트와의 통신이 가능합니다.
  5. 모니터링 및 텔레메트리 지원:
    • Prometheus를 통해 모니터링을 할 수 있으며, 추론 성능, 메모리 사용량 등 중요한 메트릭을 수집하여 관리할 수 있습니다.

Triton은 이러한 기능을 통해 모델 추론의 속도를 최적화하고 리소스를 효율적으로 사용할 수 있도록 도와줍니다. 특히 GPU 활용을 극대화할 수 있어 대규모 AI 서비스 배포에 적합합니다.


Knative Serving

Knative는 Kubernetes 위에서 서버리스 애플리케이션을 실행할 수 있도록 돕는 오픈소스 프로젝트로, 그중 Knative Serving은 확장성 높은 서버리스 애플리케이션을 위한 기능을 제공합니다. 주요 특징은 다음과 같습니다.

  1. 자동 스케일링 (Auto-Scaling):
    • Knative Serving은 트래픽에 따라 자동으로 애플리케이션의 인스턴스를 스케일링하는 기능을 제공합니다. 요청이 없을 때는 자동으로 0 인스턴스까지 축소되며, 트래픽 증가 시 자동으로 확장합니다.
  2. 버저닝 및 롤아웃 관리:
    • Knative Serving은 새로운 버전의 애플리케이션을 손쉽게 배포할 수 있도록 도와줍니다. 롤아웃 정책을 설정하여 트래픽을 여러 버전으로 분배할 수도 있어, 버전 간 테스트 또는 점진적 배포가 가능합니다.
  3. 네트워크 라우팅 및 트래픽 관리:
    • HTTP 요청 기반의 서비스이며, 트래픽을 여러 버전으로 분산시키는 트래픽 관리 기능을 지원하여 AB 테스트나 점진적 배포를 용이하게 합니다.
  4. 컨테이너화된 애플리케이션 지원:
    • Knative Serving은 완전히 컨테이너화된 애플리케이션을 배포하는 것을 기본으로 하며, 이러한 특성으로 인해 다양한 애플리케이션과 조합하여 사용할 수 있습니다.
  5. Event-Driven:
    • Knative Eventing과 통합하여 이벤트 기반 서버리스 애플리케이션을 구축할 수 있으며, 다양한 이벤트 소스로부터 트리거를 받아 애플리케이션을 구동할 수 있습니다.

Knative Serving을 사용하면 AI 추론 서버가 수요에 따라 자동으로 확장 및 축소되므로, 리소스 사용을 최적화하고 비용을 절감할 수 있습니다.


NVIDIA Triton과 Knative Serving의 결합

Triton과 Knative Serving을 함께 사용하면 다음과 같은 이점을 얻을 수 있습니다.

  • 자동 스케일링을 통한 효율적 자원 관리: Knative Serving을 통해 Triton 추론 서버가 수요에 맞춰 자동으로 스케일링되어, AI 모델의 추론 수요가 변화할 때 리소스를 효율적으로 활용할 수 있습니다.
  • 버저닝을 통한 유연한 모델 관리: Knative의 버저닝 기능을 사용하면 Triton의 여러 버전 모델을 동시에 테스트하거나 점진적으로 업데이트할 수 있어, 모델 배포 및 테스트가 용이해집니다.
  • 서버리스 환경에서의 고성능 AI 서비스: 서버리스 환경을 통해 불필요한 리소스 소비를 줄이며, Triton의 고성능 추론 기능을 활용해 AI 서비스의 품질을 유지할 수 있습니다.

KNative Serving으로 NVIDIA Triton Inference Server 배포

Knative Serving을 이용해 NVIDIA Triton Inference Server를 배포하려면 Kubernetes 환경에서 Triton의 컨테이너 이미지를 사용하고, Knative Serving의 설정을 통해 트래픽에 따라 자동 스케일링이 이루어지도록 구성합니다. 다음은 이 과정을 단계별로 설명한 가이드입니다.

1. 환경 설정

먼저 Kubernetes 클러스터와 Knative가 설치되어 있어야 합니다. 또한, NVIDIA GPU를 사용하는 경우 GPU 지원을 위해 NVIDIA Container Toolkit 및 관련 드라이버 설치가 필요합니다.

  • Kubernetes 클러스터 준비: Minikube, GKE, EKS 등 클라우드 또는 로컬 환경에서 Kubernetes 클러스터를 준비합니다.
  • Knative 설치: Knative Serving을 설치합니다. Knative 설치 가이드에 따라 진행합니다.
  • NVIDIA 드라이버 설치: 클러스터에서 GPU를 사용할 계획이라면, NVIDIA 드라이버와 CUDA 툴킷을 설정해 GPU 지원이 가능하게 합니다.

2. Triton Docker 이미지 준비

NVIDIA Triton의 Docker 이미지는 NVIDIA NGC에 배포되어 있으며, 필요한 모델을 포함하여 이미지를 커스터마이즈할 수 있습니다.

docker pull nvcr.io/nvidia/tritonserver:<version>-py3

위 <version> 부분은 사용하고자 하는 Triton 버전을 명시합니다. (예: 23.09-py3)

3. Triton 모델 저장소 설정

Triton은 model_repository 폴더에 모델을 두고 추론 서비스를 제공합니다. 이를 위해 Kubernetes Persistent Volume (PV) 및 Persistent Volume Claim (PVC)을 설정해 모델 데이터를 클러스터 내에 저장하는 방식으로 배포할 수 있습니다.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: triton-models-pv
spec:
  storageClassName: standard
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /path/to/your/model/repository

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: triton-models-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: standard
  resources:
    requests:
      storage: 10Gi

4. Knative Service 설정 파일 작성

Knative Serving을 통해 NVIDIA Triton을 배포하려면, Service YAML 파일을 작성합니다. 이 파일은 Triton 서버의 컨테이너 이미지를 사용하고 자동 스케일링 설정을 포함하게 됩니다.

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: triton-inference-service
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/minScale: "1"
        autoscaling.knative.dev/maxScale: "10"   # 최대 스케일 설정
    spec:
      containers:
        - image: "nvcr.io/nvidia/tritonserver:<version>-py3"  # Triton 이미지
          ports:
            - containerPort: 8000  # HTTP/REST API 포트
            - containerPort: 8001  # gRPC 포트
          resources:
            limits:
              nvidia.com/gpu: "1"  # GPU를 사용하는 경우 설정
              cpu: "4"
              memory: "16Gi"
          args:
            - "--model-repository=/models"  # 모델 저장소 경로 설정
          volumeMounts:
            - mountPath: /models
              name: triton-models
      volumes:
        - name: triton-models
          persistentVolumeClaim:
            claimName: triton-models-pvc

이 파일의 주요 설정은 다음과 같습니다:

  • autoscaling.knative.dev/minScale: 최소 인스턴스 수. 이 값을 0으로 설정하면 유휴 상태에서 모든 인스턴스가 내려갑니다.
  • autoscaling.knative.dev/maxScale: 최대 인스턴스 수. 트래픽에 따라 자동으로 확장될 수 있습니다.
  • resources: GPU와 메모리, CPU 사용량 제한을 설정합니다.
  • -model-repository: Triton Inference Server에서 사용할 모델 경로를 명시합니다.

5. Knative Service 배포

작성한 YAML 파일을 사용해 Knative Service를 배포합니다.

kubectl apply -f triton-knative-service.yaml

이 명령어를 실행하면 triton-inference-service라는 Knative Service가 생성됩니다. 이후 Knative Serving이 요청에 맞춰 Triton Inference Server를 자동으로 스케일링하게 됩니다.

6. 서비스 확인

Knative가 성공적으로 Triton Inference Server를 배포했는지 확인하려면 다음 명령어를 사용합니다.

kubectl get ksvc triton-inference-service

서비스의 URL을 확인한 후, 해당 URL을 통해 HTTP/REST API 요청을 보내 Triton Server에 접근할 수 있습니다.

7. 테스트 및 모니터링

Triton Inference Server가 정상적으로 동작하는지 확인하려면, HTTP API 엔드포인트 (http://<service-url>:8000/v2/models)에 요청을 보내 모델 정보를 확인합니다.

curl http://<service-url>:8000/v2/models

모니터링은 Prometheus와 Grafana를 연동하거나 Kubernetes Dashboard에서 확인 가능합니다.


KNative Pod Autoscaler(KPA) 적용

Knative Pod Autoscaler(KPA)는 Knative Serving의 오토스케일링 컴포넌트로, 서비스에 트래픽이 증가할 때 자동으로 Pod 수를 조정하여 확장성을 제공합니다. 이 오토스케일링 기능은 기본적으로 설치되는 컴포넌트이며, HTTP 요청 수에 따라 Pod의 수를 조절하는 방식으로 동작합니다. 다음은 KPA를 적용하고 설정하는 방법입니다.

1. Knative Service 정의에 Autoscaler 설정 추가하기

Knative Service YAML 파일에 오토스케일링 관련 애노테이션을 추가해 KPA를 설정할 수 있습니다. 아래는 예시 YAML 파일입니다.

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: example-service
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/class: "kpa.autoscaling.knative.dev"  # KPA 사용 설정
        autoscaling.knative.dev/target: "10"                         # Pod당 처리해야 하는 요청 수 목표
        autoscaling.knative.dev/minScale: "1"                         # 최소 Pod 수
        autoscaling.knative.dev/maxScale: "20"                        # 최대 Pod 수
        autoscaling.knative.dev/scaleToZero: "true"                   # 트래픽 없을 때 0으로 스케일다운
    spec:
      containers:
        - image: "nvcr.io/nvidia/tritonserver:<version>-py3"  # Triton 이미지
          ports:
            - containerPort: 8000  # HTTP/REST API 포트
            - containerPort: 8001  # gRPC 포트
          resources:
            limits:
              nvidia.com/gpu: "1"  # GPU를 사용하는 경우 설정
              cpu: "4"
              memory: "16Gi"
          args:
            - "--model-repository=/models"  # 모델 저장소 경로 설정
          volumeMounts:
            - mountPath: /models
              name: triton-models
      volumes:
        - name: triton-models
          persistentVolumeClaim:
            claimName: triton-models-pvc
  • autoscaling.knative.dev/class: 오토스케일링 클래스를 설정합니다. KPA를 사용하려면 "kpa.autoscaling.knative.dev"로 설정합니다.
  • autoscaling.knative.dev/target: Pod당 처리해야 하는 요청 수의 목표값을 설정합니다. 예를 들어, 10으로 설정하면 각 Pod이 최대 10개의 요청을 처리할 때까지 스케일링됩니다.
  • autoscaling.knative.dev/minScale 및 autoscaling.knative.dev/maxScale: 최소 및 최대 Pod 수를 설정합니다.
  • autoscaling.knative.dev/scaleToZero: 트래픽이 없는 경우 0으로 스케일링될 수 있도록 설정합니다.

2. Service 배포 및 적용

설정한 YAML 파일을 통해 Service를 배포합니다.

kubectl apply -f example-service.yaml

배포가 완료되면 KPA가 설정한 target 값을 기준으로 자동으로 Pod 수를 조정하며, 트래픽에 따라 Knative가 필요한 만큼 Pod를 생성합니다.

3. 오토스케일링 동작 확인하기

서비스에 트래픽을 발생시켜 KPA가 제대로 동작하는지 확인할 수 있습니다. HTTP 요청을 일정 시간 동안 반복하여 전송하고, Pod의 증가를 확인합니다.

kubectl get pods -l serving.knative.dev/service=example-service -w

이 명령어를 통해 example-service에 할당된 Pod의 수가 트래픽 증가에 따라 조정되는 것을 실시간으로 확인할 수 있습니다.

4. KPA의 오토스케일링 조건 조정하기

오토스케일링 조건을 더 세부적으로 설정하려면 아래와 같은 추가 애노테이션을 사용할 수 있습니다.

  • autoscaling.knative.dev/panicThresholdPercentage: 요청이 급격히 증가할 때 추가 Pod를 생성하는 임계치(기본값은 200%).
  • autoscaling.knative.dev/panicWindowPercentage: 급격히 스케일업되는 시간 간격(기본값은 10초).
  • autoscaling.knative.dev/window: 오토스케일링을 고려하는 시간 창을 정의 (기본값은 60초).

예를 들어, 급격한 트래픽 증가를 대비해 다음과 같이 설정할 수 있습니다.

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: example-service
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/panicThresholdPercentage: "300"
        autoscaling.knative.dev/panicWindowPercentage: "5"
        autoscaling.knative.dev/window: "30s"

위 설정은 트래픽이 300% 이상 증가하면 빠르게 확장하고, 확장 시 고려하는 시간 창을 30초로 단축합니다.

5. KPA 설정 최적화

Knative Pod Autoscaler는 설정된 target에 따라 스케일링을 조정하므로, target 값을 트래픽 패턴에 맞게 조정하여 최적의 성능을 발휘하도록 설정할 수 있습니다. 예를 들어, 평균적으로 낮은 요청율이 예상되는 서비스라면 target 값을 높여 Pod의 수를 줄이고 리소스를 절약할 수 있습니다.


Horizontal Pod Autoscaler 적용

1. Kubernetes 클러스터 및 Metric Server 설치 확인

HPA가 작동하려면 클러스터에 Metric Server가 설치되어 있어야 합니다. Metric Server는 클러스터 내의 리소스 사용률을 수집하는 역할을 합니다. 대부분의 클라우드 환경(Kubernetes Engine, AKS, EKS 등)에는 기본적으로 설치되어 있지만, 로컬 환경에서는 별도로 설치해야 합니다.

Metric Server 설치 명령:

kubectl apply -f <https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml>

설치 후 Metric Server가 정상 동작하는지 확인:

kubectl get deployment metrics-server -n kube-system

2. HPA를 적용할 Deployment 생성

먼저, Triton Inference Server를 Kubernetes에 배포할 Deployment를 작성합니다. 아래 예시는 triton-inference-server라는 이름의 Deployment를 생성합니다.

# triton-deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: triton-inference-server
  labels:
    app: triton
spec:
  replicas: 1  # 기본 Pod 수
  selector:
    matchLabels:
      app: triton
  template:
    metadata:
      labels:
        app: triton
    spec:
      containers:
        - image: "nvcr.io/nvidia/tritonserver:<version>-py3"  # Triton 이미지
          ports:
            - containerPort: 8000  # HTTP/REST API 포트
            - containerPort: 8001  # gRPC 포트
          resources:
            limits:
              nvidia.com/gpu: "1"  # GPU를 사용하는 경우 설정
              cpu: "4"
              memory: "16Gi"
          args:
            - "--model-repository=/models"  # 모델 저장소 경로 설정
          volumeMounts:
            - mountPath: /models
              name: triton-models
      volumes:
        - name: triton-models
          persistentVolumeClaim:
            claimName: triton-models-pvc

이 triton-deployment.yaml 파일에서 Pod당 CPU 및 메모리 요청과 한도를 설정했습니다. HPA는 기본적으로 requests 값을 기준으로 오토스케일링을 수행합니다.

배포 명령:

kubectl apply -f triton-deployment.yaml

2. Horizontal Pod Autoscaler 설정

HPA를 설정하여 triton-inference-server가 CPU 사용률에 따라 자동으로 스케일링되도록 합니다. 예를 들어, 평균 CPU 사용률이 50%를 초과하면 Pod를 최대 10개까지 확장하도록 설정할 수 있습니다.

(1) kubectl autoscale 명령으로 설정

kubectl autoscale deployment triton-inference-server --cpu-percent=50 --min=1 --max=10

(2) YAML 파일로 설정

아래 YAML 파일을 작성하여 HPA를 정의할 수 있습니다.

# triton-hpa.yaml
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: triton-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: triton-inference-server
  minReplicas: 1
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 50  # 평균 CPU 사용률 50% 목표

배포 명령:

kubectl apply -f triton-hpa.yaml

이 설정은 Triton Inference Server의 CPU 사용률이 50%를 초과할 때마다 HPA가 Pod 수를 자동으로 늘려주고, 50% 이하로 떨어지면 Pod 수를 줄여줍니다.

3. HPA 동작 확인

HPA가 설정되었는지 확인하고, Triton 서버가 CPU 사용률에 따라 자동으로 스케일링되는지 확인할 수 있습니다.

kubectl get hpa

이 명령을 통해 CPU 사용률, 목표, 현재 Pod 개수 등을 확인할 수 있습니다.

4. 부하 테스트

Triton Inference Server에 부하를 발생시켜 HPA가 제대로 동작하는지 확인할 수 있습니다. 예를 들어, curl 명령을 사용하여 REST API를 통해 반복적으로 요청을 보내 CPU 부하를 높이고 HPA의 자동 확장 기능이 작동하는지 테스트할 수 있습니다.

while true; do curl http://<triton-service-url>:8000/v2/models/<model-name>/infer; done

위 요청을 여러 번 반복하여 보내면 CPU 사용률이 증가하여 HPA가 자동으로 Pod 수를 늘리게 됩니다.

5. 모니터링 및 조정

HPA 설정이 예상한 대로 작동하는지 지속적으로 모니터링하면서 필요한 경우 설정을 조정할 수 있습니다. 예를 들어, averageUtilization 값을 조정하거나 maxReplicas 값을 변경하여 더욱 유연하게 확장되도록 설정할 수 있습니다.


결론

이 과정을 통해 Knative Serving을 통해 Triton Inference Server를 배포할 수 있습니다. Knative의 서버리스 기능과 Triton의 고성능 추론 기능이 결합되므로, AI 서비스의 트래픽에 따라 자동으로 리소스가 최적화되며, 안정적이고 확장 가능한 인프라를 구성할 수 있습니다.