지난해 8월부터 개인적인 다른 부업(?)을 준비하고 있어 블로그를 한참동안 못썼다. 사실 그것보단 일이 너무 많아서 포스팅을 못하기도 했다,,
조금 시간이 난 김에 한 가지를 소개하고자 한다.
많은 AI 관련 프로젝트를 하면서 받았던 요청 중 LLM 모델의 사용량 관련 모니터링과 관련된 게 많았다. 때문에 그와 관련된 내용을 다뤄볼 것이다.
Cloud Monitoring은 GCP 리소스의 메트릭, 로그, 이벤트를 수집하고 시각화하는 모니터링 서비스다. 대시보드를 통해 시계열 데이터를 차트나 테이블로 확인할 수 있고, 알림 정책을 설정하여 ex) CPU, Memory 임계값 초과 시 통보를 받거나 하는 등의 설정이 모두 여기서 가능하다.
GCP에선 콘솔에서 Cloud Monitoring의 대시보드로 접속하면 알 수 있듯이 리소스별로 Default 대시보드가 구성되어 있다.
이 중 Vertex AI Model Garden (Monitoring)를 클릭해보자.
아래처럼 잘 구성된 기본 대시보드를 확인할 수 있다.

하지만 이 기본 대시보드는 잘 보면 아쉬운 점이 있다. 단위가 모두 /s, /m과 같은 비율 단위인것..!
(물론 기본 대시보드를 이렇게 설계한 구글의 철학이 있겠지만 나는 개인적으로 불편했다.)
이를 수정해보려고 한다.
기본 대시보드는 위젯 수정이 안되고, 우측 상단에 '대시보드 복사'를 클릭해야 한다.
Model requests per second (QPS) 위젯을 우측 상단에 '위젯 수정'을 클릭하여 수정해보자.
Y축을 변경하려 했더니 다음과 같이 '1/s'로 값이 고정되어 있고 수정이 불가하다.

알고보니 콘솔에서 디테일한 작업을 하는 것엔 한계가 있었다. 이를 위해 전체 대시보드 설정을 JSON으로 확인하고 설정했어야 했다.
우측 상단 톱니바퀴 모양을 클릭하면 대시보드 전체를 JSON으로 다운로드하거나 편집기에서 JSON으로 구축된 대시보드를 업로드할 수 있다.

다운받은 기본 대시보드의 JSON을 토대로 Cloud Monitoring의 메트릭 종류, Aligner와 같은 개념에 대해서 이해하고 스터디한 걸 소개하고자 한다.
Cloud Monitoring의 시계열 데이터는 Metric 유형에 따라 세 가지로 나뉜다.
GAUGE 메트릭
DELTA 메트릭
CUMULATIVE 메트릭
이 변환을 담당하는 것이 바로 Aligner이다.
Aligner는 시계열 데이터의 원시 포인트들을 일정한 시간 간격(alignment period) 으로 정렬하고 변환하는 함수다.
Cloud Monitoring에서 차트를 그리려면 데이터 포인트들이 균일한 간격으로 정렬되어야 하기 때문에, 모든 시계열 쿼리에는 반드시 Aligner가 적용된다.
참고로 Cloud Monitoring의 시계열 처리에는 Aligner 외에 Reducer라는 개념도 있다. Aligner가 시계열 하나 안에서 시간 축을 정렬하는 것이라면, Reducer는 여러 시계열을 REDUCE_SUM(합산), REDUCE_PERCENTILE_99(p99) 같은 함수로 합치는 역할.
하지만 여기선 Reducer는 기본 대시보드와 동일하게 유지하고, Aligner만 변경해도 대시보드 구현엔 큰 문제가 없었으므로 간단히만 언급하고 넘어가쟈..
아래와 같은 DELTA 메트릭 원시 데이터가 있다고 가정.
| 구간 (분) | 값 (MiB) |
|---|---|
| (0, 2] | 8 |
| (2, 5] | 6 |
| (6, 9] | 9 |
alignment period를 3분으로 설정하면, 먼저 데이터가 1분 단위로 보간(interpolation)된 후 3분 구간으로 합산된다.
ALIGN_DELTA 적용 시 — 각 3분 구간의 합계가 그대로 출력된다.
| 구간 (분) | aligned value (MiB) |
|---|---|
| (0, 3] | 10 |
| (3, 6] | 4 |
| (6, 9] | 9 |
ALIGN_RATE 적용 시 — ALIGN_DELTA의 결과를 alignment period(180초)로 나눈다.
| 구간 (분) | aligned value (MiB/second) |
|---|---|
| (0, 3] | 0.056 |
| (3, 6] | 0.022 |
| (6, 9] | 0.050 |
같은 데이터인데 Aligner 하나 차이로 "10건"이 "0.056/s"가 되는 것. Vertex AI 기본 대시보드가 항상 /s 단위로 보이는 이유가 바로 이것 때문..!!
| Aligner | 출력 | 용도 | 예시 |
|---|---|---|---|
ALIGN_DELTA | 구간 내 합계 그대로 | 총 사용량 파악 | "3분간 요청 10건" |
ALIGN_RATE | 구간 내 합계 ÷ 초 | 초당 처리량(throughput) | "초당 0.056건" |
ALIGN_MEAN / MIN / MAX | 구간 내 평균/최소/최대 | GAUGE 메트릭 집계 | CPU 평균 사용률 |
ALIGN_PERCENTILE_XX | 구간 내 백분위수 추출 | Distribution 메트릭 | Latency p50, p99 |
ALIGN_COUNT | 구간 내 포인트 개수 | 보고 횟수 확인 | 데이터 수집 빈도 |
Vertex AI 기본 대시보드는 모든 메트릭에 ALIGN_RATE를 적용하고 있다! 그래서 항상 /s 단위로만 표시되었던 것이고, 결국 이걸 ALIGN_DELTA로 바꾸면 실제 건수를 볼 수 있다는 뜻이다.
가장 핵심적인 변경이다. 이 한 줄이 "초당 0.035건"과 같이 나오던 걸 "총 1,337건"으로 바꿔준다.
// Before (기본 대시보드)
"perSeriesAligner": "ALIGN_RATE"
// After
"perSeriesAligner": "ALIGN_DELTA"
이 옵션을 true로 설정하면 대시보드의 시간 범위 전체를 하나의 alignment period로 취급한다. 즉, 시간 범위를 "지난 7일"로 설정하면 7일간의 총합이 하나의 숫자로 표시된다.
// Before
"outputFullDuration": false
// After
"outputFullDuration": true
단, 모든 위젯에 outputFullDuration: true가 적합한 것은 아니다. Latency나 에러처럼 시간에 따른 추이가 중요한 메트릭은 false로 유지하고 꺾은선/막대 차트로 시각화하는 것이 낫다. 총합으로 뭉개면 스파이크 패턴을 놓칠 수 있기 때문!!
기본값인 빈 문자열은 시스템이 자동으로 단위를 결정하게 하는데, ALIGN_RATE에서 결정된 /s 단위가 남아 있을 수 있다. "1"로 명시하면 단위 없는 순수 숫자로 표시된다.
// Before
"unitOverride": ""
// After
"unitOverride": "1"
기존에 /s, /m의 단위로 볼 수 있던 걸 이제 총 사용량으로 확인할 수 있다!

| 위젯 | Aligner | Reducer | 차트 유형 | outputFullDuration |
|---|---|---|---|---|
| 모델별 총 호출 횟수 | ALIGN_DELTA | REDUCE_SUM | 테이블 | true |
| 모델별 총 토큰 사용량 | ALIGN_DELTA | REDUCE_SUM | 테이블 | true |
| 에러 발생 추이 | ALIGN_DELTA | REDUCE_SUM | 누적 막대 | false |
| Latency 추이 (p50/p99) | ALIGN_DELTA | REDUCE_PERCENTILE | 꺾은선 | false |
호출 횟수와 토큰은 "기간 내 총합"이 의미 있는 숫자이므로 테이블로 정확한 값을 보여주고, 에러와 Latency는 "언제 발생/변동했는가"가 핵심이므로 시계열 차트로 추이를 보여줄 수 있다.
대시보드 우측 상단의 시간 범위를 바꾸면 해당 기간의 총합이 자동으로 재계산되므로, 별도의 쿼리 수정 없이 일간/주간/월간 리포트 용도로도 활용할 수 있을듯하다.
[Vertex AI Model Monitoring Dashboard 구축 참고]