이전에 배포한 Triton Inference Server의 상태를 모니터링하기 위해 Prometheus에 scrape를 등록하여 grafana로 대시보드를 생성하는 방법을 알아보도록 하자.
Triton Server의 metric endpoint
우선 Triton 서버의 쿠버네티스 매니페스트를 배포했을 때 기본 골자는 다음과 같다.
# deployment.yaml port 설정부분
template:
spec:
ports:
- name: http
containerPort: 8000
- name: grpc
containerPort: 8001
- name: metrics
containerPort: 8002
---
# service.yaml
apiVersion: v1
kind: Service
metadata:
name: triton-inference-ner
namespace: triton
spec:
selector:
app: triton-inference-ner
type: NodePort
ports:
- port: 8000
targetPort: http
name: http-inference-server
nodePort: 31959
- port: 8001
targetPort: grpc
name: grpc-inference-server
- port: 8002
targetPort: metrics
name: metrics-inference-server
여기서 deployment와 service의 매니페스트 설정에 metrics가 8002번 포트로 설정되어있는것을 확인할 수 있다.
Triton은 해당 endpoint로 GPU와 request 통계에 대한 prometheus metric을 제공한다.
따라서 해당 endpoint에 curl 요청을 보내면 plain text 형태로 metric이 출력되어 확인할 수 있다.
# metric에 대한 nodeport 확인
$ k get svc -n superapp
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
triton-inference-ner NodePort 10.111.97.173 <none> 8000:31959/TCP,8001:31147/TCP,8002:32586/TCP 63d
# metric endpoint 요청
$ curl <server_ip>:32586/metrics
# HELP nv_inference_request_success Number of successful inference requests, all batch sizes
# TYPE nv_inference_request_success counter
nv_inference_request_success{gpu_uuid="GPU-dd7c47ca-6f4f-349c-c61b-c99ffeddf554",model="ner",version="1"} 708
nv_inference_request_success{model="ner_pipeline",version="1"} 168
nv_inference_request_success{gpu_uuid="GPU-864b3587-c37d-2d53-2c52-d76cd40c8722",model="ner",version="1"} 760
nv_inference_request_success{model="ner_preprocess",version="1"} 1573
nv_inference_request_success{model="ner_postprocess",version="1"} 168
# HELP nv_inference_request_failure Number of failed inference requests, all batch sizes
# TYPE nv_inference_request_failure counter
nv_inference_request_failure{gpu_uuid="GPU-dd7c47ca-6f4f-349c-c61b-c99ffeddf554",model="ner",version="1"} 0
nv_inference_request_failure{model="ner_pipeline",version="1"} 1405
nv_inference_request_failure{gpu_uuid="GPU-864b3587-c37d-2d53-2c52-d76cd40c8722",model="ner",version="1"} 0
nv_inference_request_failure{model="ner_preprocess",version="1"} 0
nv_inference_request_failure{model="ner_postprocess",version="1"} 1405
...
Prometheus scrape 등록
이제 해당 endpoint에서 프로메테우스가 metric을 수집하여 저장할 수 있도록 scrape를 등록해주어야 한다.
본 예제는 프로메테우스를 kube-prometheus-stack이라는 헬름 차트로 설치했을 때의 예시이다.
kube-prometheus-stack/values.yaml 파일에서 "additionalScrapeConfigs"라는 부분에서 추가적인 scrape를 등록할 수 있다.
# scrape 설정 추가
additionalScrapeConfigs: |
- job_name: "triton"
static_configs:
- targets: ["triton-inference-ner.triton.svc.cluster.local:8002"]
간단하게 job_name을 등록하고
static_configs에서 targets 내부에 보고자하는 endpoint를 등록하면 된다.
형식은 <DEPLOYMENT_NAME>.<NAMESPACE>.svc.cluster.local:8002로 각자 환경에 맞게 등록하면 되겠다.
이후 프로메테우스를 업데이트 해준다.
# scrape 추가 후 helm upgrade
helm upgrade prometheus Desktop/kube-prometheus-stack/ -n monitoring
# prometheus dahsboard 연결
k port-forward -n monitoring statefulsets/prometheus-prometheus-kube-prometheus-prometheus --address 0.0.0.0 7654:9090
prometheus dashboard에 포트 포워딩을하여 접속한 후, 맨위 메뉴에서 [Status > Targets]에 들어가 보면
우리가 추가한 job_name인 triton이 있고, endpoint가 추가된 것을 확인할 수 있다.
이 때 보이지 않는다면 prometheus는 scrape interval이 존재하기 때문에 바로 뜨지는 않고 일정 시간 이후에 뜬다.

Triton Metrics
먼저 Grafana dashboard를 생성하기 이전에, triton에서 어떤 metric을 제공하는지 알아보자
Inference Request Metrics
Count
| Metric | Metric Name | Description | Granularity | Frequency |
| Success Count | nv_inference_request_success | 성공한 요청 개수 | Per model | Per request |
| Failure Count | nv_inference_request_failure | 실패한 요청 개수 | Per model | Per request |
| Inference Count | nv_inference_count | 들어온 요청 개수 | Per model | Per request |
| Execution Count | nv_inference_exec_count | 실행한 batch 개수 | Per model | Per request |
| Peding Request Count | nv_inference_pending_request_count | 백엔드에서 실행을 대기중인 요청 개수 | Per model | Per request |
Count metric은 모델이 batching을 지원하지 않을경우 request count, inference count, execution count가 동일하다.
batching을 지원할 경우 다음과 같은 예시로 진행된다.
- 클라이언트가 batch-1 1개 request. Request Count = 1, Inference Count = 1, Execution Count = 1.
- 클라이언트가 batch-8 1개 request. Request Count = 1, Inference Count = 8, Execution Count = 1.
- 클라이언트가 batch-1 and batch-8 2개 request. Dynamic batcher 지원하지 않음.
Request Count = 2, Inference Count = 9, Execution Count = 2. - 클라이언트가 batch-1 and batch-1 2개 request. Dynamic batcher 지원, 2 requests가 서버에 의해 dynamic batching 수행. Request Count = 2, Inference Count = 2, Execution Count = 1.
- 클라이언트가 batch-1 and batch-8 2개 request. Dynamic batcher 지원, 2 requests가 서버에 의해 dynamic batching 수행 . Request Count = 2, Inference Count = 9, Execution Count = 1.
Latencies
| Metric | Metric Name | Description | Granularity | Frequency |
| Request Time | nv_inference_request_duration_us | 요청 처리 누적 시간(캐싱 포함) | Per model | Per request |
| Queue Time | nv_inference_queue_duration_us | 요청이 스케쥴링 Queue에서 대기한 누적 시간(캐싱 포함) | Per model | Per request |
| Compute Input Time | nv_inference_compute_input_duration_us | Input 처리 누적 시간 | Per model | Per request |
| Compute Time | nv_inference_compute_infer_duration_us | Inference model 실행 누적 시간 | Per model | Per request |
| Compute Output Time | nv_inference_compute_output_duration_us | Output 처리 누적 시간 | Per model | Per request |
CPU & GPU Metrics
| Metric | Metric Name | Description | Granularity | Frequency |
| Power Usage | nv_gpu_power_usage | 사용중인 GPU 파워(watt) | Per GPU | Per interval |
| Power Limit | nv_gpu_power_limit | 최대 GPU 파워 limit(watt) | Per GPU | Per interval |
| Energy Consumption | nv_energy_consumption | Triton이 시작된 후 GPU 에너지 사용량(J) | Per GPU | Per interval |
| GPU Utilization | nv_gpu_utilization | GPU utilization rate (0.0~1.0) | Per GPU | Per interval |
| GPU Total Memory | nv_gpu_memory_total_bytes | 전체 GPU 메모리 (bytes) | Per GPU | Per interval |
| GPU Used Memory | nv_gpu_memory_used_bytes | 사용중인 GPU 메모리(bytes) | Per GPU | Per interval |
| CPU Utilization | nv_cpu_utilization | CPU utilization rate (0.0 ~ 1.0) | 전체 코어 | Per interval |
| CPU Total Memory | nv_cpu_memory_total_bytes | 전체 메모리 (bytes) | System-wide | Per interval |
| CPU Used Memory | nv_cpu_memory_used_bytes | 사용중인 메모리(bytes) | System-wide | Per interval |
Grafana Dashboard 설정
Grafana Dashoboard에 접속하여 새로운 대시보드를 생성한 후, Add > Visualization을 선택하여 새로운 panel을 생성한다.

패널에 들어가면 아래와 같이 Data source로 Prometheus가 선택되어 있을 것이다.
여기서 위에서 설명한 Triton metrics 중 원하는 지표들을 선택하여 시각화 패널을 구성하면 된다.
Metrics explorer에서 "nv_ " prefix로 검색하면 triton metric들이 출력된다.

예를 들어 분당 request 수를 보고 싶다면 nv_inference_count를 선택하면 된다.
본인은 ensemble 모델인 ner_pipeline으로 filtering을 걸어 ensemble 모델의 결과만 출력하도록 했다.
이후 Operation을 추가하여 increase의 range를 1분으로 설정하면 1분동안 증가한 request 수,
즉 1분동안 ner_pipeline model로 들어온 request 개수를 파악할 수 있다.

이외에도 예시로 request 처리시간, GPU 사용량, request 성공/실패 등 다양한 지표를 시각화할 수 있다.

'인프라' 카테고리의 다른 글
| 쿠버네티스에서의 컨테이너, 가상화 기술 정리 (0) | 2025.03.04 |
|---|---|
| [Docker] Dockerfile 명령어 및 작성예시 (1) | 2024.12.17 |
| 쿠버네티스에서 Prometheus+Grafana 모니터링 시스템 구축하기 (0) | 2024.12.03 |
| [Kubernetes] Helm과 Kustomize 비교 (0) | 2024.10.07 |
| [Kubernetes] 쿠버네티스 Component 동작으로 이해하기 (0) | 2024.05.03 |