GPU 및 TPU의 GKE 노드 중단 관리


이 페이지는 다음을 포함하여 인공지능(AI) 또는 머신러닝(ML) 워크로드를 실행하는 Google Kubernetes Engine(GKE) 노드에서 발생할 수 있는 서비스 중단 이벤트를 이해, 구성, 모니터링하는 데 도움이 됩니다.

장기 실행 GKE 클러스터 수명 주기 동안 GKE 인프라의 기반이 되는 Compute Engine 리소스에 대해 Google Cloud에서 발행한 자동 유지보수 이벤트로 인해 주기적으로 워크로드가 중단됩니다. 이러한 중단이 AI/ML 워크로드를 실행하는 GKE 노드에 영향을 미치는 경우 GKE에서 실행 중인 워크로드와 기본 노드 모두 다시 시작해야 합니다.

GKE 클러스터는 GKE 노드 수명 주기를 관리합니다. 이러한 노드는 Compute Engine VM에 프로비저닝됩니다. Compute Engine VM에서는 하드웨어 또는 소프트웨어 업데이트, 유지보수, 하드웨어 오류와 같은 다양한 이유로 인해 주기적으로 호스트 이벤트가 발생합니다. 호스트 이벤트는 기본 Google Cloud 인프라에 발생하며 GKE 유지보수 정책과 제외를 우회합니다.

일부 예외를 제외하고 대부분의 Compute Engine VM에는 라이브 마이그레이션으로 설정된 호스트 유지보수 정책이 있습니다. 즉, 실행 중인 워크로드가 거의 또는 전혀 중단되지 않습니다. 하지만 AI/ML 워크로드가 실행되는 GPUTPU가 연결된 VM을 포함하여 특정 클래스의 VM에서는 라이브 마이그레이션을 지원하지 않습니다. 또한 GKE는 디스크 조각 모음으로 인해 GKE에서 더 큰 TPU를 프로비저닝할 수 있게 해주는 선점 기능을 사용하여 주문형 TPU를 다시 시작할 수도 있습니다.

호스트 이벤트가 발생하면 GKE에서 노드와 해당 포드를 종료합니다. 포드가 작업 또는 배포와 같은 더 큰 워크로드의 일부로 배포되면 GKE는 영향을 받는 노드에서 포드를 다시 시작합니다. 중단에 적절하게 대응하는 것은 개발자 또는 워크로드나 작업을 처리하는 데 사용하는 프레임워크에 달려 있습니다. 예를 들어 AI 학습 작업 상태를 저장하여 데이터 손실을 줄일 수 있습니다.

정상 종료 절차

다음 워크플로에서는 Compute Engine에서 중단이 발생한 후 GKE에서 정상 노드 종료를 실행하는 방법을 보여줍니다.

  1. Compute Engine은 VM 메타데이터maintenance-eventTERMINATE_ON_HOST_MAINTENANCE 값을 업데이트합니다.
  2. 60초 이내에 다음이 발생합니다.

    1. 시스템 구성요소는 true로 설정된 다음 새 노드 라벨을 적용하여 유지보수가 진행 중임을 나타냅니다. cloud.google.com/active-node-maintenance

    2. GKE는 새 포드가 노드에서 예약되지 않도록 노드 taint를 적용합니다(cloud.google.com/impending-node-termination:NoSchedule). 발생하는 알려진 종료로 인해 이 taint를 허용하도록 워크로드를 수정하는 것이 좋습니다.

  3. maintenance-handler 구성요소는 워크로드 포드부터 시스템 포드(예: kube-system) 순으로 포드를 제거하기 시작합니다.

  4. GKE는 종료 신호 SIGTERM을 전송하여 종료가 임박한 노드에서 실행 중인 워크로드 포드에 알립니다. 포드는 이 알림을 사용하여 진행 중인 모든 태스크를 마칠 수 있습니다. GKE는 이러한 포드가 정상적으로 종료되도록 최선을 다합니다.

maintenance-event 알림은 GKE 노드의 기본 Compute Engine VM에서 노드를 종료시키는 호스트 이벤트 중단이 발생하면 발생합니다. 이 경우 Compute Engine은 maintenance-event 메타데이터 키를 업데이트합니다. 노드가 종료되기 전의 고급 유지보수 알림 기간은 다음과 같습니다.

  • GPU: 60분
  • TPU: 5분

그런 다음 노드 종료가 발생하고 교체 노드가 할당됩니다. 프로세스가 완료되면 GKE에서 라벨과 taint를 삭제합니다. GPU 또는 TPU를 사용하는 워크로드의 종료 기간을 늘리려면 워크로드를 정상적으로 종료하도록 GKE 구성 섹션의 단계를 완료합니다.

GKE에서 워크로드 중단 처리

GKE는 GKE 종료 이벤트를 관리하고 클러스터의 워크로드 중단을 줄이기 위해 이러한 알림을 자동으로 모니터링하고 다음을 실행합니다.

  • GKE에서 종료가 임박하기 전에 워크로드에 알림: 호스트 유지보수 이벤트를 위해 GKE 노드를 중지해야 하는 경우 GKE는 사전 알림 기간이 시작될 때 SIGTERM 신호를 노드에서 실행 중인 포드에 전송합니다. 기본적으로 SIGTERM과 같은 OS 신호는 대부분의 표준 라이브러리(예: Python, Go)에서 처리될 수 있습니다. SIGTERM을 캡처할 수 있는 프레임워크에는 MaxText, Pax, JAX(Orbax 사용)가 포함됩니다.
  • GKE에서 워크로드를 정상적으로 종료: 포드 종료 유예 기간을 사용하여 GKE에서 워크로드를 정상적으로 종료하도록 구성할 수 있습니다. 포드는 SIGTERM 신호에 반응하여 진행 중인 태스크를 완료하고 개발자가 정의한 종료 작업(예: 학습 상태 저장)을 실행할 수 있습니다. 정상 종료 중에 GKE는 포드를 정상적으로 종료하고 개발자가 애플리케이션에 정의하는 삭제 프로세스나는 종료 작업(예: 데이터 손실이 줄어들도록 워크로드 데이터 저장 또는 학습 상태 저장)을 실행하기 위해 최선을 다합니다.

GKE에서 워크로드를 정상적으로 종료하도록 구성

이 섹션에서는 GKE에서 애플리케이션 수명 주기를 관리하고 워크로드 중단을 최소화하도록 구성합니다. 유예 기간을 구성하지 않으면 유예 기간은 기본적으로 30초로 설정됩니다.

GKE는 이러한 포드를 정상적으로 종료하고 개발자가 정의한 종료 작업(예: 학습 상태 저장)을 실행하기 위해 최선을 다합니다. GKE는 유예 기간이 시작될 때 SIGTERM 신호를 포드에 전송합니다. 유예 기간이 종료될 때까지 포드가 종료되지 않으면 GKE는 후속 SIGKILL 신호를 포드의 컨테이너에서 계속 실행 중인 모든 프로세스에 전송합니다.

워크로드의 정상 종료 기간을 구성하려면 GPU 또는 TPU의 안내를 따르세요.

GPU

포드 매니페스트에서 spec.terminationGracePeriodSeconds 필드를 최대 3,600초(60분) 값으로 설정합니다. 예를 들어 10분의 알림 시간을 가져오려면 포드 매니페스트에서 다음과 같이 spec.terminationGracePeriodSeconds 필드를 다음과 같이 600초로 설정합니다.

    spec:
      terminationGracePeriodSeconds: 600

진행 중인 작업이 알림 기간 내에 완료될 수 있도록 종료 유예 기간을 충분히 길게 설정하는 것이 좋습니다.

TPU

정리 프로세스를 수행하도록 최대 시간을 할당하려면 포드 매니페스트에서 spec.terminationGracePeriodSeconds 필드를 300초(5분)로 설정합니다. 예를 들면 다음과 같습니다.

    spec:
      terminationGracePeriodSeconds: 300

진행 중인 작업이 알림 기간 내에 완료될 수 있도록 종료 유예 기간을 충분히 길게 설정하는 것이 좋습니다.

워크로드에서 MaxText, Pax 또는 JAX(Orbax 사용)와 같은 ML 프레임워크를 사용하면 종료 SIGTERM 신호를 캡처하고 체크포인트 프로세스를 시작할 수 있습니다. 자세한 내용은 TPU 자동 체크포인트를 참조하세요.

정상적인 활성 종료 진행 상황 모니터링

1.29.1-gke.1425000 이상을 실행하는 컨트롤 플레인이 있는 GKE 클러스터에서 GKE는 gpu-maintenance-handler라는 노드 수준 구성요소를 배포합니다. 이 구성요소는 해당 컨트롤 플레인 구성요소와 함께 모든 GPU 및 TPU 노드에서 실행됩니다. 이러한 구성요소는 다음을 수행합니다.

  • 정상 종료 이벤트를 처리합니다.
  • SIGTERM 신호를 노드에서 실행 중인 워크로드로 전달하여 GKE VM의 임박한 중단 이벤트에 대응합니다. 이러한 중단은 포드 제거삭제 요청으로 로깅됩니다.

GKE는 라벨과 taint를 종료가 임박한 노드에 추가합니다. GKE는 각 GPU 및 TPU 노드에서 실행되는 시스템 구성요소 maintenance-handler를 사용하여 유지보수와 같은 호스트 이벤트 알림을 모니터링합니다.

GKE는 다음과 같은 정상 종료 이벤트를 로깅합니다.

GKE에서 정상 종료를 완료하면 라벨과 taint가 삭제됩니다.

중단으로 인한 정상적인 활성 종료 상태를 모니터링하려면 콘솔이나 Google Cloud CLI를 사용하여 gpu-maintenance-handler 로그를 확인하면 됩니다.

  1. 다음 명령어를 실행하여 gpu-maintenance-handler 인스턴스가 실행 중인 노드와 포드의 이름을 찾습니다.

    kubectl get pods -l name=maintenance-handler -A -o wide
    

    출력의 각 행에는 노드 이름, 포드 이름, 상태가 포함됩니다.

  2. 로그 확인하기:

    kubectl logs -n=kube-system MAINTENANCE_HANDLER_POD_NAME
    

    MAINTENANCE_HANDLER_POD_NAME을 핸들러 인스턴스 이름으로 바꿉니다.

    유지보수 이벤트가 감지되면 포드가 메시지를 기록하고 라벨을 적용하며 제거가 시작됩니다.

  3. 노드 라벨과 taint를 확인합니다.

    kubectl describe node NODE_NAME
    

    NODE_NAME을 보려는 노드의 이름으로 바꿉니다.

    출력에 감시할 노드 라벨 및 taint 목록이 표시됩니다.

  1. Google Cloud 콘솔의 로그 탐색기 페이지로 이동합니다.

    로그 탐색기로 이동

  2. 쿼리 필드에 다음 쿼리를 지정합니다.

    resource.type="k8s_container"
    resource.labels.namespace_name="kube-system"
    resource.labels.container_name="maintenance-handler"
    resource.labels.cluster_name="CLUSTER_NAME"
    

    CLUSTER_NAME을 클러스터 이름으로 바꿉니다.

다음 단계