NVIDIA Triton Inference Server

NVIDIA Triton Inference Server with KubeFlow

김 정출 2024. 10. 25. 22:43

NVIDIA Triton Inference Server with KubeFlow

  • NVIDIA Triton Inference Server를 Kubeflow와 연동하는 것은 AI 모델 서빙 파이프라인을 자동화하고 확장성을 높이는 데 유용합니다.
  • Kubeflow는 파이프라인을 관리하고, Triton은 고성능의 모델 추론을 담당하게 됩니다. 아래는 Triton과 Kubeflow를 연동하는 일반적인 절차입니다

1. Kubeflow 설치

Kubeflow는 Kubernetes 클러스터 위에 배포됩니다. 이미 설치되어 있는 경우 이 단계를 건너뛰어도 됩니다.

  • kubectl을 사용하여 클러스터에 Kubeflow를 설치합니다.
  • 설치 후 Kubeflow 대시보드에 접근하여 올바르게 설치되었는지 확인합니다.

2. Triton Inference Server Docker Image 준비

Kubeflow에서 Triton을 사용하려면, Triton Inference Server를 Docker 이미지로 패키징해야 합니다.

  • NVIDIA는 기본 Triton Docker 이미지를 제공하므로 NVIDIA NGC에서 이미지를 다운로드할 수 있습니다.
  • 이미지가 준비되면, 추론에 필요한 모델을 모델 리포지토리에 넣습니다. 예를 들어, /models 디렉터리 내에 모델을 추가할 수 있습니다.

3. Triton Inference Server를 Kubernetes에 배포

Triton Inference Server를 Kubernetes에서 사용하기 위해 Kubernetes 리소스 (Deployment 및 Service)를 정의합니다.

1) Deployment 및 Service 설정

apiVersion: apps/v1
kind: Deployment
metadata:
  name: triton-inference-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: triton
  template:
    metadata:
      labels:
        app: triton
    spec:
      containers:
      - name: triton-server
        image: nvcr.io/nvidia/tritonserver:<version>-py3
        args: ["tritonserver", "--model-repository=/models"]
        resources:
          limits:
            nvidia.com/gpu: 1 # GPU 리소스 설정
        volumeMounts:
        - mountPath: /models
          name: model-repo
      volumes:
      - name: model-repo
        persistentVolumeClaim:
          claimName: model-pvc # 모델이 있는 PVC 이름
---
apiVersion: v1
kind: Service
metadata:
  name: triton-service
spec:
  selector:
    app: triton
  ports:
    - protocol: TCP
      port: 8000
      targetPort: 8000 # Triton 기본 포트

  • 위 YAML 파일에서 model-pvc는 모델 리포지토리를 위한 Persistent Volume Claim입니다. 모델이 저장된 위치를 미리 Kubernetes Persistent Volume에 연결합니다.

2) Kubectl 명령어로 배포

bash
Copy code
kubectl apply -f triton-deployment.yaml


4. Kubeflow Pipeline에서 Triton Inference Server 호출

Kubeflow Pipeline을 통해 Triton Inference Server에 요청을 보내려면, KFP SDK 또는 Kubeflow Pipeline YAML을 사용하여 요청 단계(Task)를 정의할 수 있습니다.

예: Pipeline Task에서 Triton 요청

from kfp import dsl
import kfp.components as comp

def call_triton_server():
    import requests
    url = "<http://triton-service:8000/v2/models/><model_name>/infer"
    data = { "inputs": [ ... ] } # 예제 입력 데이터
    response = requests.post(url, json=data)
    print("Inference result:", response.json())

call_triton_op = comp.create_component_from_func(call_triton_server, base_image='python:3.8')

@dsl.pipeline(
    name='Triton Kubeflow Integration',
    description='Pipeline to call Triton server'
)
def triton_pipeline():
    call_triton_task = call_triton_op()

if __name__ == '__main__':
    from kfp import Client
    client = Client()
    client.create_run_from_pipeline_func(triton_pipeline, arguments={})
  • 위 코드에서 call_triton_server 함수는 Triton Server의 REST API에 요청을 보내는 작업을 수행합니다.
  • URL 경로에 triton-service라는 Service 이름을 사용하여 Triton에 요청을 보냅니다.

 

5. Kubeflow Pipeline 실행

위의 파이프라인을 Kubeflow 대시보드에서 실행하여 Triton 서버에 추론 요청이 가는지 확인합니다.

이제 Kubeflow와 NVIDIA Triton Inference Server가 연동되어 파이프라인 내에서 고성능 AI 모델 추론을 자동화할 수 있습니다.