이전에 배포한 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 |