GPU 4枚の実測で遊んでいるカードを判定する
한국어 원문으로 표시합니다.
목표
GPU 넉 장의 실측 3시간치로 "이 카드는 노는가" 를 판정하고, 그 판정의 근거를 보고서로 남깁니다. 마지막에는 vLLM 형식의 서빙 지표에서 첫 토큰 지연을 구합니다.
왜 중요한가
GPU 는 비싸고 잘 안 늘어나서, 용량 판정을 틀리면 바로 돈과 시간이 샙니다. 그런데 사용률 하나만 보면 반드시 틀립니다 — 사용률 0 인 카드가 메모리 13.7 GiB 를 잡고 있으면 그 카드는 노는 동시에 차 있습니다. 게다가 어느 파드가 쓰는지 알려 주는 귀속 라벨은 노드 구성에 따라 통째로 비어 있을 수 있어서, "누가 쓰는지 모르는 GPU" 가 실제로 생깁니다. 이 실습은 그 두 가지를 지표로 판정하는 연습입니다.
자료에 대해
- GPU·컨테이너·노드 지표는 이 사이트를 돌리는 7노드 클러스터의 실측입니다.
vllm:로 시작하는 계열만은 실측이 아닙니다. 이 클러스터의 vLLM 배포는 지금 꺼져 있어 지표가 없습니다. 형식만 본뜬 합성 표본이고, 모든 계열에source="synthetic"라벨이 붙어 있습니다.- 창은 고정된 3시간입니다.
lab-realdata로 확인하고promq-at으로 질의하세요. - 노출 형식 원문은
/opt/lab/realdata/expo/에, 출처 설명은 같은 디렉터리의README.md에 있습니다.
단계
- DCGM 이 보고하는 GPU 개수를 세는 쿼리를
/root/pca-gpu/01-inventory.promql에 씁니다. - 창 내내 사용률이 0 이면서 프레임버퍼를 가장 많이 잡고 있는 GPU 의 노드 이름을
/root/pca-gpu/02-idle.txt에 한 줄로 씁니다. - 그 GPU 의
DCGM_FI_DEV_FB_USED를 내는 쿼리를/root/pca-gpu/03-fbused.promql에 씁니다. exported_pod라벨이 비어 있는 GPU 의 노드 이름을/root/pca-gpu/04-attribution.txt에 한 줄로 씁니다.nuc1GPU 의 누적 에너지 카운터에서 평균 전력(W)을 내는 쿼리를/root/pca-gpu/05-energy.promql에 씁니다.- 창 전체로 보아 사용률이 한 번도 0 을 넘지 않은 GPU 의 개수를 세는 쿼리를
/root/pca-gpu/06-idle-window.promql에 씁니다. - 서빙 표본의 첫 토큰 지연 p95 를 구하는 쿼리를
/root/pca-gpu/07-ttft.promql에 씁니다. - 판정 두 개와 근거, 그리고 무엇이 실측이고 무엇이 표본인지를
/root/pca-gpu/08-report.md에 300자 이상으로 적습니다.
참고
promq-at 'DCGM_FI_DEV_GPU_UTIL'처럼 던지면 라벨이 그대로 보입니다. 노드 이름은node라벨에 있습니다.- 흔한 실수 1:
max_over_time없이 순간값으로 판정하기. 바쁜 카드도 마침 0 인 순간이 있습니다. - 흔한 실수 2:
FB_USED를 바이트로 환산하기. 이 지표의 단위는 MiB 입니다.
DCGM 이 보고하는 GPU 세기
DCGM 은 GPU 한 장마다 계열 하나를 냅니다. count() 로 세면 됩니다. 질의는 promq-at 으로 던지세요 — 지금 시각으로 던지면 창 밖이라 빈 결과가 옵니다.
메모리는 잡고 있는데 창 내내 노는 GPU 찾기
순간값 하나로 판정하면 바쁜 카드도 마침 0 인 순간에 걸립니다. max_over_time(...[3h]) 으로 창 전체의 최댓값이 0 인 GPU 를 고르고, 그중 FB_USED 가 가장 큰 것을 topk 로 찾으세요. 답은 node 라벨 값입니다.
그 GPU 가 잡고 있는 프레임버퍼 재기
DCGM_FI_DEV_FB_USED 의 단위는 MiB 입니다. 앞 단계에서 찾은 노드로 좁히세요. 바이트로 환산하면 기준값과 어긋납니다 — 지표가 주는 단위 그대로 답합니다.
누가 쓰는지 알 수 없는 GPU 찾기
dcgm-exporter 는 exported_namespace·exported_pod·exported_container 라벨로 어느 파드가 그 GPU 를 쓰는지 알려 줍니다. 그런데 노드 구성에 따라 이 라벨이 비어 있을 수 있습니다. 빈 라벨은 {exported_pod=""} 로 고릅니다.
누적 에너지 카운터에서 평균 전력 끌어내기
DCGM_FI_DEV_TOTAL_ENERGY_CONSUMPTION 은 누적 에너지이고 단위는 mJ 입니다. rate 로 미분하면 mW 가 되고, 1000 으로 나누면 W 가 됩니다. 노드는 nuc1 입니다. 같은 시각 POWER_USAGE 게이지와 견주면 값이 거의 같아야 정상입니다.
창 전체로 노는 GPU 개수 세기
순간값으로 세면 바쁜 GPU 도 마침 0 인 순간에 걸립니다. max_over_time 으로 창 전체의 최댓값을 구한 뒤 == 0 으로 거르고 세세요.
서빙 지표에서 첫 토큰 지연 p95 구하기
vllm: 로 시작하는 계열은 실측이 아니라 형식을 본뜬 합성 표본입니다(source="synthetic" 라벨이 붙어 있습니다). 히스토그램이므로 버킷에 rate 를 걸고 le 로 집계한 뒤 histogram_quantile 을 씌웁니다. le 를 버리고 집계하면 값이 무의미해집니다.
판정과 근거를, 무엇이 실측인지와 함께 적기
보고서에는 두 판정(메모리만 잡고 노는 GPU 의 노드, 귀속을 알 수 없는 GPU 의 노드)과 그 근거로 쓴 지표 이름이 들어가야 합니다. 그리고 vllm: 계열이 실측이 아니라 합성 표본이라는 사실을 함께 적으세요. 300자 이상입니다.