Monitoring

nvidia dcgm-exporter(gpu-exporter)

토마스.dev 2024. 1. 18. 18:23

nvidia 에서 제공하는 공식 gpu exporter인 dcgm-exporter에 대해 알아본다.

 

DCGM 이란?

DCGM은 DataCenter GPU Manager의 약자로, nvidia gpu 를 위한 종합 관리 및 모니터링 도구다. 이 도구는 데이터 센터 내의 nvidia gpu의 상태를 모니터링하고, 관리하는 데 사용된다. 여기서는 여러 기능 중 하나인 모니터링에 대해서 알아본다.

 

DCGM 은 자체적으로 메트릭을 내보내지 않기 때문에 nvidia 이와 통신해서 메트릭을 만들어서 출력해주는 exporter를 별도로 제공하고 있다.

 

DCGM exporter 동작방식

dcgm-exporter의 동작 방식(출처: https://developer.nvidia.com/blog/monitoring-gpus-in-kubernetes-with-dcgm/)

그림에서와 같이 dcgm exporter는 Kubelet/node-exporter/DCGM과 통신하여 메트릭을 수집한다.

ServiceMonitor는 Prometheus operator에서 제공하는 CustomResource로 Prometheus에 수집 설정을 편하게 해주는 리소스타입이다. DCGM과 통신하기 위해서 C library를 이용하는데 이 라이브러리는 현재 공개되어있지 않다.

 

메트릭을 수집할 때 호출하는 lib API는 다음을 참고한다.

https://github.com/NVIDIA/dcgm-exporter/blob/30d4ddcae9c7153c31dd35301aa4a1f3b90a2096/pkg/dcgmexporter/gpu_collector.go#L77

 

DCGM exporter 메트릭 수집 설정 방법

exporter가 어떤 메트릭을 수집할지 설정하는 옵션은 argument로 제공되며, 다음 두가지가 있다. 

-f : 파일명 지정. csv 포맷
-m : k8s에서 configmap 지정. configmap 데이터 구조는 csv

 

-m 에서 지정한 configmap 이 없으면 -f 에 설정된 파일을 읽는다. 그러니까 두개를 설정할 경우 -m에 설정된 메트릭만 수집된다.

 

exporter를 옵션없이 바이너리로 직접 실행할 경우 다음 설정으로 실행되며,

https://github.com/NVIDIA/dcgm-exporter/blob/main/etc/default-counters.csv

 

차트로 실행할 경우 아래 파일로 설정된다(왜 다르게 만든건지 모르겠다)

https://github.com/NVIDIA/dcgm-exporter/blob/main/etc/dcp-metrics-included.csv

 

DCGM exporter 메트릭 예시와 종류

메트릭이 특이하게도 대문자로 나온다(정말 맘에 안드는 방식이다. prometheus 표준 포맷에 맞춘게 아니라 억지로 끼어넣기 한것처럼 보인다).

DCGM_FI_DEV_SM_CLOCK{gpu="0",UUID="GPU-34319582-d595-d1c7-d1d2-179bcfa61660",device="nvidia0",Hostname="ub20-a100-k8s"} 1215
DCGM_FI_DEV_MEM_CLOCK{gpu="0",UUID="GPU-34319582-d595-d1c7-d1d2-179bcfa61660",device="nvidia0",Hostname="ub20-a100-k8s"} 1215

 

MIG(Multi-Instance GPU) 인 경우에는 두 개의 레이블이(GPU_I_ID, GPU_I_PROFILE) 추가로 더 붙는다.

DCGM_FI_DEV_GPU_TEMP{GPU_I_ID="10", GPU_I_PROFILE="1g.5gb", Hostname="k8-worker-gpu-1", UUID="GPU-5c7d5572-4019-c464-8fdc-71fb97f89156", device="nvidia0", gpu="0", instance="10.130.10.2:9400", job="gpu-metrics", kubernetes_node="k8-worker-gpu-1", modelName="NVIDIA A100-PCIE-40GB"}

 

MIG인 경우 GPU_I_PROFILE 값의 의미

메트릭 포맷에 대한 정의는 다음을 참고한다.

https://github.com/NVIDIA/dcgm-exporter/blob/30d4ddcae9c7153c31dd35301aa4a1f3b90a2096/pkg/dcgmexporter/pipeline.go#L266

 

전체 메트릭 리스트를 확인하고 싶으면 다음을 참고한다.

https://docs.nvidia.com/datacenter/dcgm/latest/dcgm-api/dcgm-api-field-ids.html?highlight=dev_count#field-identifiers

DCGM exporter Helm Chart

exporter 차트는 같은 레포지토리 deployment 디렉토리에 존재하며, Daemonset으로 존재한다. 즉, exporter는 node-exporter와 같이 모든 노드에 하나씩 뜨고, 노드마다 있는 DCGM과 통신하여 메트릭 정보를 가져온다.

어떤 메트릭을 수집할지 설정할수 있는데, 문제는 해당 차트가 특이하게도 설정을 하는 Configmap이 하드코딩되어 있다는 점이다. 

(참고: https://github.com/NVIDIA/dcgm-exporter/blob/main/deployment/templates/metrics-configmap.yaml)

 

보통 차트 개발의 경우 설정값들은 configmap으로 만들고, 해당 configmap을 파드에 마운트해서 파일을 읽는 방식으로 만드는데, 이 exporter 는 configmap을 직접 k8s client 로 읽어서 반영하는 방식을 택했다. 그럼에도 불구하고 신기하게 차트에 포함되어 있는 configmap을 차트 value에서 변경할 수가 없고, default value로 배포할 경우 해당 configmap을 읽지도 않는다. (심지어 configmap이면서도 동적 변경적용도 아니다). 개인적으로 생각했을 때 exporter와 차트를 잘못 만든거 같다.

 

해당 차트를 사용할때 수집메트릭을 커스텀하고 싶다면, csv형식의 데이터를 가진 configmap을 별도로 생성하고, 차트 Value.arguments 에 -m {configmap 이름} 을 추가하도록 한다. 참고 Values: https://github.com/NVIDIA/dcgm-exporter/blob/main/deployment/values.yaml

(이때 해당 configmap 내 data key값은 반드시 "metrics" 여야한다. 관련 코드 참고: https://github.com/NVIDIA/dcgm-exporter/blob/30d4ddcae9c7153c31dd35301aa4a1f3b90a2096/pkg/dcgmexporter/parser.go#L183)

arguments: 
# Use "-m" to specify the namespace and name of a configmap containing
# the watched exporter fields.
# Example arguments: ["-m", "default:exporter-metrics-config-map"]

그 외 옵션

-f, -m 외에도 다른 옵션들이 있다. 해당 옵션에 대해서는 다음을 참고한다.

https://github.com/NVIDIA/dcgm-exporter/blob/30d4ddcae9c7153c31dd35301aa4a1f3b90a2096/pkg/cmd/app.go#L80

 

관련 자료

exporter repo: https://github.com/NVIDIA/dcgm-exporter

exporter 차트: https://github.com/NVIDIA/dcgm-exporter/tree/main/deployment

설명: https://docs.nvidia.com/datacenter/cloud-native/gpu-telemetry/latest/index.html

go-dcgm repo: https://github.com/NVIDIA/go-dcgm

블로그: https://developer.nvidia.com/blog/monitoring-gpus-in-kubernetes-with-dcgm/