ML Goodput Measurement 라이브러리로 굿풋 모니터링

ML Goodput Measurement 라이브러리 (ml-goodput-measurement)는 Cloud TPU VM에서 실행되는 ML 학습 워크로드의 효율성을 측정하는 데 도움이 되는 Python 패키지입니다. 이 라이브러리는 생산적이고 보존된 학습 진행률을 만드는 데 사용된 TPU 사용 시간의 비율인 워크로드 굿풋을 측정하는 측정항목을 제공합니다. 반대로 비생산적 활동(예: 시작 오버헤드, I/O 정지, 중단 복구)에 소요된 총 시간의 비율이 비생산적 시간입니다.

TensorBoard

자세한 내용은 ML Goodput Measurement GitHub 저장소를 참고하세요.

굿풋 측정항목

ML Goodput Measurement 라이브러리는 Cloud Monitoring 및 TensorBoard에서 볼 수 있는 다음 측정항목을 제공합니다. 이 표의 측정항목에는 compute.googleapis.com/workload/ 접두사가 있어야 합니다. 예를 들어 goodput_time의 전체 측정항목 이름은 compute.googleapis.com/workload/goodput_time입니다.

  • goodput_time: 총 생산적 학습 시간(초) 이는 누적 굿풋으로 해석될 수 있습니다.

  • badput_time: 총 비생산적 학습 시간(초)(시작, 정지, 복구) 이는 누적 비생산적 시간으로 해석될 수 있습니다.

  • total_elapsed_time: 워크로드의 총 경과 시간(실제 시간)입니다(초). 경과 시간은 애플리케이션이 시작된 시간부터 현재 시간 또는 작업 완료 시간까지 측정됩니다.

  • interval_goodput: 지정된 기간 (예: 지난 24시간)의 굿풋 비율입니다. 이 측정항목은 굿풋의 이동 구간을 제공합니다.

  • interval_badput: 지정된 기간의 비생산적 시간 비율입니다. 이 측정항목은 비생산적 시간의 이동 구간을 제공하며 I/O 작업 급증과 같은 일시적인 문제를 식별하는 데 유용합니다.

  • disruptions: 누적 작업 중단 수입니다. 중단은 학습 프로세스가 예기치 않게 중지되어 다시 시작해야 하는 이벤트입니다. 예를 들어 하드웨어 오류 및 유지보수 이벤트가 있습니다.

  • step_time_deviation: 학습 단계 시간의 변동으로 인한 비생산적 시간입니다. 이를 '지터'라고도 합니다. 이 측정항목은 최근 '최악의 경우' 단계의 편차를 초 단위의 과거 기준과 비교하여 급증에 민감한 안정성을 측정합니다. 단계는 학습 루프의 단일 반복입니다.

  • performance: 예상되는 가장 빠른 안정적인 단계 시간(기준)입니다(초). 이상적인 단계 시간은 일시적인 노이즈나 지터가 없는 최적의 조건에서 단일 학습 단계가 걸릴 수 있는 가장 빠른 시간입니다.

  • max_productive_steps: 성공적으로 보존된 최대 걸음 수입니다.

설치

다음 단계에 따라 TPU 워크로드로 ML Goodput Measurement 라이브러리를 설정하세요.

  1. Cloud Logging API 및 Cloud Monitoring API를 사용 설정합니다.
  2. Google Kubernetes Engine (GKE)에 배포하는 경우 cloud-platform 액세스 범위로 모든 노드 풀을 구성합니다.

학습 호스트 및 분석 머신에 ml-goodput-measurement 패키지를 설치합니다.

pip install ml-goodput-measurement

Goodput 라이브러리로 모니터링

ML Goodput Measurement 라이브러리를 사용하려면 GoodputRecorder 인스턴스를 초기화하고, record_event 컨텍스트 관리자로 주요 섹션을 래핑하여 학습 코드를 계측하고, GoodputMonitor로 측정항목을 실시간으로 모니터링합니다. 모니터는 백그라운드 프로세스를 실행하여 기록된 이벤트에서 굿풋 측정항목을 주기적으로 계산하고 실시간 분석 및 시각화를 위해 Cloud Monitoring 및 TensorBoard에 업로드합니다.

Goodput 레코더 초기화

ML Goodput Measurement 라이브러리의 핵심 구성요소인 GoodputRecorder를 초기화합니다.

import datetime
import jax
from ml_goodput_measurement import measurement

# Define a unique logger name for this specific run
logger_name = f'goodput_{config.run_name}'

# Instantiate the recorder
goodput_recorder = measurement.GoodputRecorder(
    job_name=config.run_name,
    logger_name=logger_name,
    logging_enabled=(jax.process_index() == 0)
)

이벤트 기록

record_event 컨텍스트 관리자를 사용하여 학습 코드를 래핑합니다.

def train_loop(config):

  # 1. Wrap the entire Job (Start/End)
  with goodput_recorder.record_event(measurement.Event.JOB):

    # 2. Record Hardware Initialization
    with goodput_recorder.record_event(measurement.Event.ACCELERATOR_INIT):
      # ... perform device mesh setup ...
      initialize_tpu(config)

    # 3. Record Training Prep
    with goodput_recorder.record_event(measurement.Event.TRAINING_PREP):
      # ... create checkpoint managers, setup model ...
      model = training_prep(config)

    # 4. Main Training Loop
    for step in range(config.steps):

      # Record Data Loading
      with goodput_recorder.record_event(measurement.Event.DATA_LOADING):
        batch = get_next_batch()

      # Record Step Start (CRITICAL: Pass the step number!)
      with goodput_recorder.record_event(measurement.Event.STEP, step):
        output = train_step(model, batch)

      # 5. Record Custom Events (e.g., Evaluation)
      if step % eval_interval == 0:
        with goodput_recorder.record_event(measurement.Event.CUSTOM, "eval_step"):
          run_evaluation()

MaxText를 사용하여 학습 코드를 Goodput 라이브러리와 통합하는 방법의 예는 goodput.py를 참고하세요.

이벤트 모니터링

작업이 실행되는 동안 측정항목을 계산하고 업로드하는 백그라운드 프로세스를 시작하는 GoodputMonitor로 측정항목을 모니터링합니다. 업로더 프로세스가 의도한 대로 시작되고 중지되도록 컨텍스트 관리자에서 로직을 래핑합니다.

구성 및 수명 주기 관리를 처리하는 도우미 컨텍스트 관리자를 정의합니다.

import contextlib
from ml_goodput_measurement import monitoring

@contextlib.contextmanager
def maybe_monitor_goodput(config):
  """Monitor goodput if enabled and on the main process."""
  if not config.monitor_goodput or jax.process_index() != 0:
    yield
    return

  goodput_monitor = None
  try:
    # Configure GCPOptions for Cloud Monitoring
    gcp_options = monitoring.GCPOptions(
      enable_gcp_goodput_metrics=config.enable_gcp_goodput_metrics
    )

    # Instantiate the monitor
    goodput_monitor = monitoring.GoodputMonitor(
      job_name=config.run_name,
      logger_name=f"goodput_{config.run_name}",
      tensorboard_dir=config.tensorboard_dir,
      upload_interval=config.goodput_upload_interval_seconds,
      monitoring_enabled=True,
      pathway_enabled=config.enable_pathways_goodput,
      include_badput_breakdown=True,
      gcp_options=gcp_options,
    )

    # Start the background upload process
    goodput_monitor.start_goodput_uploader()
    print("Started Goodput upload to Tensorboard & GCM in the background!")
    yield

  finally:
    # Ensure clean shutdown of the background process
    if goodput_monitor:
      goodput_monitor.stop_goodput_uploader()
      print("Flushed final metrics and safe exited from Goodput monitoring.")

이동 구간 성능을 측정하려면 start_rolling_window_goodput_uploaderstop_rolling_window_goodput_uploader를 사용하도록 모니터를 구성합니다.

try:
    self._rolling_window_monitor.start_rolling_window_goodput_uploader(
        self.config.rolling_window_size
    )
finally:
    if self._rolling_window_monitor:
        self._rolling_window_monitor.stop_rolling_window_goodput_uploader()

컨텍스트 관리자로 기본 학습 진입점을 래핑합니다. 이렇게 하면 학습이 시작되기 전에 모니터링이 시작되고 학습이 종료될 때 최종 측정항목이 삭제됩니다.

def main():
  # ... Load configuration ...

  # Wrap the entire execution
  with maybe_monitor_goodput(config):
    # Run the training loop (which contains the GoodputRecorder events)
    train_loop(config)

후처리 및 분석

표준 CPU VM 또는 노트북과 같은 모든 머신에서 완료된 작업의 굿풋 측정항목을 계산할 수 있습니다. 후처리 및 분석에 TPU를 사용할 필요는 없습니다.

다음 코드는 총 작업 굿풋을 출력합니다.

from ml_goodput_measurement import goodput

calculator = goodput.GoodputCalculator(
    job_name="my-run-name",
    logger_name="goodput_my-run-name"
)

goodput, badput, last_step = calculator.get_job_goodput(
    include_badput_breakdown=True
)

print(f"Goodput: {goodput}%")
print(f"Badput (Infra Recovery): {badput[goodput.BadputType.INFRASTRUCTURE_RECOVERY_FROM_DISRUPTION]}%")

비생산적 시간 유형 (BadputType)에 관한 자세한 내용은 비생산적 시간 분석 세부정보를 참고하세요.

특정 시간 창을 지정하려면 get_job_goodput_interval을 사용합니다.

goodput_pct, badput, _, _, _ = calculator.get_job_goodput_interval(
    start_time_utc,
    end_time_utc
)

시작 시간 (start_time_utc)과 종료 시간 (end_time_utc)은 datetime 객체입니다. 자세한 내용은 goodput.py를 참고하세요.

Goodput 대시보드로 모니터링

머신러닝 학습 워크로드를 모니터링하고 시각화할 수 있도록 Google Cloud GKE JobSet Goodput 대시보드와 Cloud ML Goodput 대시보드의 두 가지 굿풋 대시보드 세트를 제공합니다. GKE JobSet 대시보드를 사용하여 인프라 또는 일정 문제를 진단하고 Cloud ML Goodput 대시보드를 사용하여 학습 코드 내에서 병목 현상을 정확히 파악합니다.

Google Cloud ML Goodput 대시보드

ML Goodput 대시보드는 학습 스크립트의 애플리케이션 수준 효율성을 측정합니다. 생산적 학습에 소요된 시간과 데이터 로드, 초기화 또는 중단 복구와 같은 비생산적 시간 소스에 관한 통계를 제공합니다.

Cloud Monitoring에서 ML Goodput 대시보드 대시보드를 보려면 다음 안내를 따르세요.

  1. 콘솔에서 Cloud Monitoring 페이지로 이동합니다. Google Cloud
    Monitoring 콘솔로 이동
  2. 탐색창에서 대시보드 를 클릭합니다.
  3. 필터 검색 필드에 'Cloud ML Goodput 대시보드'를 입력합니다.

ML Goodput 대시보드에는 다음 측정항목이 포함됩니다 (workload/ 접두사 포함).

  • goodput_time: 생산적 학습 단계에 소요된 누적 시간입니다.
  • badput_time: 비생산적 활동에 소요된 누적 시간과 비생산적 시간 소스입니다.
    • ACCELERATOR_INITIALIZATION: TPU를 설정하는 데 걸리는 시간입니다.
    • TRAINING_PREP: 체크포인트 로드, 모델 및 옵티마이저 생성입니다.
    • PROGRAM_STARTUP: JIT 컴파일, 그래프 추적입니다.
    • DATA_LOADING_SYNC: 데이터 입력에 차단된 시간입니다.
    • CHECKPOINT_SAVE: 모델 상태를 저장하는 데 걸리는 시간입니다.
    • CHECKPOINT_RESTORE: 모델 상태를 복원하는 데 걸리는 시간입니다.
    • WASTED_PROGRESS: 체크포인트 전에 발생한 중단으로 인해 손실된 생산적 시간입니다.
    • INFRASTRUCTURE_RECOVERY: 작업 다시 시작 중 다운타임입니다.
    • CUSTOM_BADPUT_EVENTS: 평가와 같은 사용자 정의 동기 이벤트입니다.
  • step_time_deviation: 학습 단계 시간의 지터와 불안정성을 측정합니다.
  • interval_goodput: 이동 구간 (예: 지난 1시간)에서 계산된 굿풋입니다.

GKE JobSet 대시보드

GKE JobSet Goodput 대시보드는 조정 레이어의 효율성에 중점을 두며 GKE가 포드를 빠르게 스케줄링하고 계속 실행하는지 파악하는 데 도움이 됩니다.

JobSet의 상태와 성능에 관한 포괄적인 정보를 보려면 콘솔의 JobSet 모니터링 대시보드로 이동하세요. Google Cloud

JobSet 모니터링 대시보드로 이동

JobSet 모니터링 대시보드에는 다음 측정항목이 포함됩니다.

  • kubernetes.io/jobset/scheduling_goodput: JobSet의 모든 필수 리소스(포드)가 준비 상태이고 작업을 수행할 수 있는 시간의 비율(JobSet 생성 시간 기준)입니다. 값이 낮으면 GKE 내에서 포드 예약, 이미지 가져오기 또는 리소스 할당이 지연됨을 나타냅니다.

  • kubernetes.io/jobset/proxy_runtime_goodput: 가속기 듀티 사이클과 같은 시스템 수준 신호를 기반으로 TPU가 활발하게 사용되는 시간의 예상 비율입니다. 이를 통해 애플리케이션 계측 없이 런타임 생산성을 대략적으로 파악할 수 있습니다.

  • 노드 풀 측정항목: JobSet을 호스팅하는 노드 풀에 영향을 미치는 상태, 가용성, 중단에 관한 정보입니다. 이를 통해 굿풋 급락을 기본 노드 문제와 상호 연결할 수 있습니다.

GKE JobSet 대시보드에 관한 자세한 내용은 모니터링 JobSet 굿풋을 참고하세요.

문제 해결 가이드

이 섹션에서는 ML Goodput Measurement 라이브러리를 사용하는 동안 발생할 수 있는 일반적인 문제를 식별하고 해결하는 데 도움이 되는 문제 해결 정보를 제공합니다.

Cloud Monitoring 측정항목 누락

Cloud Monitoring 측정항목이 누락된 경우 다음 안내를 따르세요.

  • IAM 권한 확인: 워크로드에 연결된 서비스 계정에 monitoring.timeSeries.createmonitoring.metricDescriptors.create 권한이 있어야 합니다.
  • 구성 확인: 구성에서 굿풋 측정항목을 명시적으로 사용 설정해야 합니다. 예를 들어 GCPOptions 내에서 enable_gcp_goodput_metrics=True가 전달되는지 확인합니다.

일반 측정항목 누락

일반 측정항목이 누락된 경우 다음 안내를 따르세요.

  • 모니터 상태 확인: 모니터 인스턴스화에 모니터링을 사용 설정해야 합니다. monitoring_enabled=True를 모니터에 전달합니다.

손상된 측정항목

측정항목이 손상되었거나 이상한 값이 표시되는 경우 다음 안내를 따르세요.

  • 고유한 실행 이름 보장: 모든 run_name 값은 모든 실험에서 고유해야 합니다. 실행 이름을 재사용하면 이전 실행과 새 실행의 로그가 혼합됩니다.

로그 누락

Cloud Logging에서 로그가 누락된 경우 다음 안내를 따르세요.

  • Cloud Logging API 사용 설정: 프로젝트에서 Cloud Logging API를 사용 설정해야 합니다. Google Cloud
  • 레코더 설정 확인: logging_enabled=True 플래그를 Goodput 레코더에 전달해야 합니다.
  • 기본 프로세스 확인: 기본 프로세스 (jax.process_index() == 0)가 애플리케이션 로그를 적극적으로 보고해야 합니다.

비생산적 시간 체크포인트 누락

비생산적 시간 체크포인트가 누락된 경우 다음 안내를 따르세요.

  • 체크포인트 라이브러리 확인: Goodput 라이브러리는 Orbax의 체크포인트 시간을 자동으로 추적합니다. 하지만 다른 라이브러리 (예: PyTorch 체크포인트)를 사용하는 경우 record_custom_badput_event_start_timerecord_custom_badput_event_end_time을 사용하여 저장 및 복원 호출을 수동으로 래핑해야 합니다.