NVIDIA Triton Inference Server

NVIDIA Triton Inference Server

김 정출 2024. 10. 25. 17:57

NVIDIA Triton Inference Server

 

NVIDIA Triton Inference Server는 AI 및 딥러닝 모델의 배포와 추론 작업을 관리하고 최적화하기 위해 설계된 고성능 서버 소프트웨어입니다. 주로 GPU 클라우드 또는 엣지 환경에서 사용되며, 다양한 딥러닝 프레임워크와 호환되어 다중 모델을 유연하게 배포할 수 있도록 지원합니다. Triton은 NVIDIA에서 제공하는 도구로, 특히 실시간 추론 작업이 필요한 AI 애플리케이션에 적합합니다.

주요 기능과 특징

  1. 다양한 프레임워크 지원: Triton은 TensorFlow, PyTorch, ONNX, TensorRT, XGBoost 등 여러 프레임워크를 지원합니다. 이를 통해 같은 서버에서 서로 다른 프레임워크의 모델을 쉽게 운영할 수 있습니다.
  2. 멀티 프레임워크 및 멀티 모델 서빙: 한 서버에서 여러 모델을 동시에 서비스할 수 있으며, 모델마다 다른 프레임워크를 사용할 수 있습니다. 이 기능은 다중 모델 배포가 필요한 복잡한 시스템에서 매우 유용합니다.
  3. 자동 배치 기능: 실시간 추론에서는 대기 시간을 줄이는 것이 중요한데, Triton은 자동 배치 기능을 통해 요청을 그룹화하여 처리 성능을 최적화할 수 있습니다. 이를 통해 GPU 리소스를 최대한 활용할 수 있습니다.
  4. 동적 모델 관리: 모델을 중단 없이 추가, 제거 또는 업데이트할 수 있습니다. 이는 서비스가 운영 중일 때에도 모델을 변경할 수 있는 유연성을 제공합니다.
  5. 스케줄링 및 로드 밸런싱: Triton은 모델과 서버 리소스를 효율적으로 관리하는 스케줄링과 로드 밸런싱 기능을 내장하고 있습니다. 이를 통해 서버의 리소스 활용도를 높이고, 고가용성 환경을 구현할 수 있습니다.
  6. 다양한 추론 요청 프로토콜 지원: HTTP/gRPC 프로토콜을 지원하여 여러 클라이언트 애플리케이션이 손쉽게 서버에 접근할 수 있도록 합니다. 또한, 클라이언트 SDK도 제공하여 여러 언어에서 쉽게 서버와 연동할 수 있습니다.
  7. 모니터링 및 로깅: Prometheus와 같은 툴과 통합되어 GPU 및 추론 서버의 성능 모니터링을 할 수 있으며, 이는 시스템 상태 파악 및 성능 최적화에 유용합니다.

 

 

Triton의 활용 사례

  • 실시간 추론: 영상 분석, 자율 주행, 음성 인식, 자연어 처리 등 실시간으로 AI 모델의 추론이 필요한 분야에 사용됩니다.
  • 대규모 모델 배포: 여러 모델을 하나의 서버에서 관리해야 하는 경우에 유용합니다. 예를 들어, 의료 영상 분석이나 금융 분석 같은 환경에서는 다양한 모델이 필요할 수 있습니다.
  • 클라우드 및 엣지 배포: Triton은 GPU 리소스를 최대한 활용할 수 있어 클라우드나 엣지 환경에서 효율적인 추론 서비스를 제공합니다.

 

 

Triton 사용 시의 장점

Triton은 NVIDIA의 GPU 최적화 기술이 적용되어 있어 GPU 성능을 극대화할 수 있으며, 다양한 프레임워크 지원과 유연한 모델 관리 기능을 통해 복잡한 AI 시스템의 효율적인 운영을 돕습니다. SAPEON에서 개발 중인 Lunit INSIGHT의 경우처럼 다양한 AI 모델을 사용하는 시스템에서 특히 효과적으로 활용할 수 있을 것입니다.

 

 

NVIDIA Triton Inference Server 실행

NVIDIA Triton Inference Server를 실행하려면 먼저 Triton을 설치하고, 추론을 수행할 모델을 준비해야 합니다. Triton은 Docker를 통해 쉽게 실행할 수 있으며, 다양한 설정을 통해 서버를 맞춤 구성할 수 있습니다.

1. 사전 준비 사항

  1. NVIDIA 드라이버: GPU를 사용하는 경우, NVIDIA 드라이버가 설치되어 있어야 합니다.
  2. Docker 설치 및 NVIDIA Container Toolkit 설정: Triton은 Docker 이미지를 통해 실행되는 것이 일반적이며, GPU 사용을 위해 nvidia-docker도 설정되어 있어야 합니다.

2. Triton Inference Server 설치 및 설정

Triton은 NVIDIA NGC 컨테이너 레지스트리에서 제공하는 Docker 이미지를 이용해 쉽게 설치하고 실행할 수 있습니다.

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

버전 <version>은 사용할 Triton 버전으로 변경하면 됩니다 (예: 23.02-py3).

3. 모델 디렉토리 구조 설정

Triton에서는 모델을 특정 디렉토리 구조에 맞춰 저장해야 합니다. 기본적으로 모델 디렉토리는 다음과 같은 구조를 갖습니다:

/models
└── <model_name>
    └── <version_number>
        └── model_file

예를 들어, TensorFlow로 학습한 모델을 사용할 경우:

/models
└── resnet50
    └── 1
        └── model.savedmodel

여기서 <model_name>은 모델 이름, <version_number>는 모델의 버전 번호입니다. 버전 관리는 여러 버전의 모델을 동시에 배포하고 사용할 때 유용합니다.

4. Triton Inference Server 실행

모델 디렉토리를 준비한 후 Docker를 통해 Triton Inference Server를 실행합니다.

docker run --gpus=1 --rm --name triton_inference_server \\
    -p 8000:8000 -p 8001:8001 -p 8002:8002 \\
    -v /path/to/your/models:/models \\
    nvcr.io/nvidia/tritonserver:<version>-py3
  • -gpus=1: GPU 1개를 사용하도록 지정합니다 (GPU가 없는 환경에서는 이 옵션을 생략).
  • p 8000:8000 -p 8001:8001 -p 8002:8002: HTTP(8000), gRPC(8001), Prometheus(8002) 포트를 설정합니다.
  • v /path/to/your/models:/models: 호스트의 모델 디렉토리를 컨테이너 내부의 /models로 마운트합니다.

5. 서버 테스트 및 추론 요청

서버가 정상적으로 실행되면 HTTP 또는 gRPC 클라이언트를 통해 추론 요청을 할 수 있습니다. 간단히 curl을 이용해 HTTP API를 호출하는 예시는 다음과 같습니다:

curl -v -X POST <http://localhost:8000/v2/models/><model_name>/infer -d '{
    "inputs": [
        {
            "name": "input_name",
            "shape": [1, 224, 224, 3],
            "datatype": "FP32",
            "data": [ ... ]
        }
    ]
}'

여기서 <model_name>은 사용할 모델 이름이며, 요청 데이터 형식은 모델에 따라 다르므로 모델의 입력 형식에 맞게 변경해야 합니다.

6. Triton 클라이언트 SDK 사용

NVIDIA에서는 Python과 C++용 Triton 클라이언트 SDK도 제공하므로, 이 SDK를 사용하여 서버와 상호 작용할 수 있습니다. Python SDK 예시는 다음과 같습니다:

from tritonclient.http import InferenceServerClient
import numpy as np

# 서버에 연결
client = InferenceServerClient(url="localhost:8000")

# 추론 요청
input_data = np.random.randn(1, 224, 224, 3).astype(np.float32)
result = client.infer(
    model_name="resnet50",
    inputs=[{"name": "input", "shape": input_data.shape, "data": input_data}],
)

# 결과 확인
print(result.as_numpy("output_name"))

이 코드는 resnet50 모델에 대한 추론 요청을 보내고, 결과를 받아 출력하는 방식입니다.

참고사항

  • 서버 모니터링을 위해 Prometheus 또는 Grafana와 통합해 성능 데이터를 수집할 수 있습니다.
  • Triton Inference Server는 자동 배치 및 여러 모델의 동시 추론 등을 지원하므로 설정 파일을 통해 최적화가 가능합니다.

Triton Inference Server는 Docker 환경에서 쉽게 실행하고 관리할 수 있으며, 다양한 설정을 통해 GPU 리소스를 효율적으로 사용할 수 있습니다.