Dataflow TPU 작업 문제 해결

TPU로 Dataflow 작업을 실행하는 데 문제가 발생하면 다음 문제 해결 단계에 따라 문제를 해결하세요.

컨테이너 이미지 문제 해결

독립형 VM에서 컨테이너 및 TPU 소프트웨어를 디버그하는 것이 유용할 수 있습니다. GKE 노드 풀에서 만든 VM으로 디버깅하거나 실행 중인 Dataflow 작업자 VM에서 디버깅할 수 있습니다.

독립형 VM으로 디버깅

독립형 VM에서 컨테이너를 디버그하려면 로컬 실험에 동일한 TPU VM을 사용하는 GKE 노드 풀을 만들면 됩니다. 예를 들어 us-west1-c에서 TPU V5 Lite 기기 하나로 GKE 노드 풀을 만드는 방법은 다음과 같습니다.

  1. GKE 클러스터 만들기

    gcloud container clusters create TPU_CLUSTER_NAME \
      --project PROJECT_ID \
      --release-channel=stable \
      --scopes=cloud-platform \
      --enable-ip-alias \
      --location us-west1-c
    
  2. GKE 노드 풀을 만듭니다.

    gcloud container node-pools create TPU_NODE_POOL_NAME \
      --project PROJECT_ID \
      --location=us-west1-c \
      --cluster=TPU_CLUSTER_NAME \
      --node-locations=us-west1-c \
      --machine-type=ct5lp-hightpu-1t \
      --num-nodes=1 \
      [ --reservation RESERVATION_NAME \
      --reservation-affinity=specific ]
    
  3. GKE UI 또는 다음 명령어를 사용하여 노드 풀에서 TPU 노드의 VM 이름을 찾습니다.

    gcloud compute instances list --filter='metadata.kube-labels:"cloud.google.com/gke-nodepool=TPU_NODEPOOL_NAME"'
    
  4. SSH를 사용하여 GKE 노드 풀에서 만든 VM에 연결합니다.

    gcloud compute ssh --zone "us-west1-c" "VM_NAME" --project PROJECT_ID
    
  5. SSH를 사용하여 VM에 연결한 후 사용 중인 Artifact Registry에 맞게 Docker를 구성합니다.

    docker-credential-gcr configure-docker --registries=us-west1-docker.pkg.dev
    
  6. 그런 다음 사용하는 이미지에서 컨테이너를 시작합니다.

    docker run --privileged --network=host -it --rm --entrypoint=/bin/bash IMAGE_NAME
    
  7. 컨테이너 내부에서 TPU에 액세스할 수 있는지 테스트합니다.

    예를 들어 PyTorch를 사용하여 TPU를 활용하는 이미지가 있는 경우 Python 인터프리터를 엽니다.

    python3
    

    그런 다음 TPU 기기에서 계산을 실행합니다.

    import torch
    import torch_xla.core.xla_model as xm
    dev = xm.xla_device()
    t1 = torch.randn(3,3,device=dev)
    t2 = torch.randn(3,3,device=dev)
    print(t1 + t2)
    

    샘플 출력:

    >>> tensor([[ 0.3355, -1.4628, -3.2610],
    >>>        [-1.4656,  0.3196, -2.8766],
    >>>        [ 0.8667, -1.5060,  0.7125]], device='xla:0')
    
  8. 계산이 실패하면 이미지가 올바르게 구성되지 않았을 수 있습니다.

    예를 들어 이미지 Dockerfile에서 필수 환경 변수를 설정해야 할 수 있습니다. 확인하려면 다음과 같이 환경 변수를 수동으로 설정한 후 계산을 다시 시도하세요.

    export TPU_SKIP_MDS_QUERY=1 # Don't query metadata
    export TPU_HOST_BOUNDS=1,1,1 # There's only one host
    export TPU_CHIPS_PER_HOST_BOUNDS=1,1,1 # 1 chips per host
    export TPU_WORKER_HOSTNAMES=localhost
    export TPU_WORKER_ID=0 # Always 0 for single-host TPUs
    export TPU_ACCELERATOR_TYPE=v5litepod-1 # Since we use v5e 1x1 accelerator.
    

    PyTorch 또는 LibTPU 종속 항목이 누락된 경우 다음 명령어를 사용하여 설치한 후 계산을 다시 시도할 수 있습니다.

    # Install PyTorch with TPU support
    pip install torch torch_xla[tpu] torchvision -f https://storage.googleapis.com/libtpu-releases/index.html
    

Dataflow VM을 사용하여 디버그

또는 작업이 실행되는 동안 SSH를 사용하여 Dataflow 작업자 VM 인스턴스에 연결할 수 있습니다. 파이프라인이 완료되면 Dataflow 작업자 VM이 종료되므로 장시간 대기하는 계산을 실행하여 런타임을 인위적으로 늘려야 할 수 있습니다.

TPU 기기는 여러 프로세스 간에 공유할 수 없으므로 TPU에서 계산을 실행하지 않는 파이프라인을 실행해야 할 수 있습니다.

  1. Google Cloud 콘솔 검색창에서 Dataflow 작업 ID를 검색하거나 다음 gcloud 명령어를 사용하여 실행 중인 TPU 작업의 VM을 찾습니다.

    gcloud compute instances list --project PROJECT_ID --filter "STATUS='RUNNING' AND description ~ 'Created for Dataflow job: JOB_ID'"
    
  2. SSH를 사용하여 TPU가 있는 VM에 연결한 후 사용하는 이미지에서 컨테이너를 시작합니다. 예를 보려면 독립형 VM으로 디버깅을 참고하세요.

  3. 컨테이너 내에서 TPU 설정을 재구성하고 설정을 테스트하는 데 필요한 라이브러리를 설치합니다. 예를 보려면 독립형 VM으로 디버깅을 참고하세요.

작업자가 시작되지 않음

문제 해결을 시작하기 전에 다음 파이프라인 옵션이 올바르게 설정되어 있는지 확인하세요.

  • --dataflow_service_option=worker_accelerator 옵션
  • --worker_zone 옵션
  • --machine_type 옵션

콘솔 로그에 작업자가 시작되는 것으로 표시되지만 다음과 유사한 메시지와 함께 작업이 실패하는지 확인합니다.

  Workflow failed. Causes: The Dataflow job appears to be stuck because no worker
  activity has been seen in the last 25m.

이러한 문제의 원인은 용량 또는 작업자 시작 문제와 관련이 있을 수 있습니다.

  • 용량: 주문형 TPU 용량 또는 소진된 예약을 사용하는 경우 용량이 확보될 때까지 새 파이프라인이 시작되지 않을 수 있습니다. 예약을 사용하는 경우Google Cloud 콘솔의 컴퓨팅 예약 페이지 또는 다음 명령어를 사용하여 남은 용량을 확인합니다.

    gcloud compute reservations describe RESERVATION_NAME --zone ZONE
    

    작업에서 작업자 VM을 시작했는지 확인합니다. 작업에서 작업자를 시작하면 일반적으로 worker, worker_startup, kubelet 등의 로거가 출력을 제공합니다. 또한 Google Cloud 콘솔의 작업 측정항목 페이지에서 현재 작업자 수가 0보다 커야 합니다.

  • 작업자 시작: job-messagelauncher 로그를 확인합니다. 파이프라인에서 작업자를 시작하지만 부팅할 수 없는 경우 커스텀 컨테이너에 오류가 있을 수 있습니다.

  • 디스크 공간: 작업에 사용할 수 있는 디스크 공간이 충분한지 확인합니다. 디스크 공간을 늘리려면 --disk_size_gb 옵션을 사용합니다.

오류와 함께 작업이 실패함

작업이 오류와 함께 실패하는 경우 다음 문제 해결 조언을 따르세요.

작업자 풀 시작 실패

다음 오류가 표시되면 파이프라인에 --worker_zone가 지정되어 있고 영역이 예약 영역과 일치하는지 확인합니다.

JOB_MESSAGE_ERROR: Startup of the worker pool in zone ZONE failed to
bring up any of the desired 1 workers. [...] INVALID_FIELD_VALUE:
Instance 'INSTANCE_NAME' creation failed: Invalid value for field
'resource.reservationAffinity': '{ "consumeReservationType":
"SPECIFIC_ALLOCATION", "key":
"compute.googleapis.com/RESERVATION_NAME...'. Specified reservations
[RESERVATION_NAME] do not exist.

관리형 인스턴스 그룹은 Cloud TPU를 지원하지 않습니다.

다음 오류가 표시되면 계정팀에 문의하여 프로젝트가 TPU를 사용하도록 등록되었는지 확인하거나 Google 문제 추적기를 사용하여 버그를 신고하세요.

apache_beam.runners.dataflow.dataflow_runner.DataflowRuntimeException: Dataflow
pipeline failed. State: FAILED, Error: Workflow failed. Causes: One or more
operations had an error [...]: [INVALID_FIELD_VALUE] 'Invalid value
for field 'resource.instanceTemplate': Managed Instance Groups do not support
Cloud TPUs. '.

필드 값이 잘못됨

다음 오류가 표시되면 파이프라인 호출이 worker_accelerator Dataflow 서비스 옵션을 설정하는지 확인합니다.

JOB_MESSAGE_ERROR: Workflow failed. Causes: One or more operations had an error:
'operation-[...]': [INVALID_FIELD_VALUE] 'Invalid value for field
'resource.instanceTemplate': 'projects/[...]-harness'. Regional
Managed Instance Groups do not support Cloud TPUs.'

기기 또는 리소스 사용 중

다음 오류가 표시되면 파이프라인을 처리하는 Dataflow 작업자가 동시에 TPU에 액세스하는 프로세스를 두 개 이상 실행하고 있는 것일 수 있습니다. 이 기능은 지원되지 않습니다. 자세한 내용은 TPU 및 작업자 동시 로드를 참고하세요.

RuntimeError: TPU initialization failed: open(/dev/vfio/0): Device or resource
busy: Device or resource busy; Couldn't open iommu group /dev/vfio/0

VM에서 파이프라인을 디버깅하는 동안 위의 오류가 표시되면 다음 명령어를 사용하여 TPU를 차단하는 프로세스를 검사하고 종료할 수 있습니다.

apt update ; apt install lsof
lsof -w /dev/vfio/0
kill -9 PROCESS_ID    # to terminate the process.

게스트 가속기가 있는 인스턴스는 라이브 마이그레이션을 지원하지 않습니다.

다음 오류가 표시되면 파이프라인이 가속기가 있는 명시적으로 설정된 머신 유형으로 실행되었지만 가속기 구성을 올바르게 지정하지 않은 것일 수 있습니다. 파이프라인 호출이 worker_accelerator Dataflow 서비스 옵션을 설정하는지 확인하고 옵션 이름에 오타가 없는지 확인합니다.

JOB_MESSAGE_ERROR: Startup of the worker pool in zone ZONE failed to
bring up any of the desired 1 workers. [...] UNSUPPORTED_OPERATION:
Instance INSTANCE_ID creation failed: Instances with guest
accelerators do not support live migration.

워크플로가 서비스에 의해 자동으로 거부됨

필수 파이프라인 옵션 중 일부가 누락되었거나 잘못된 경우 다음 오류가 표시될 수도 있습니다.

The workflow was automatically rejected by the service. The requested
accelerator type tpu-v5-lite-podslice;topology:1x1 requires setting
the worker machine type to ct5lp-hightpu-1t. Learn more at:
https://cloud.google.com/dataflow/docs/guides/configure-worker-vm

작업자의 업데이트를 기다리는 동안 타임아웃됨

vCPU가 많은 TPU VM에서 파이프라인을 실행하고 기본 작업자 스레드 수를 줄이지 않으면 작업에 다음과 같은 오류가 발생할 수 있습니다.

Workflow failed. Causes WORK_ITEM failed.
The job failed because a work item has failed 4 times.
Root cause: Timed out waiting for an update from the worker.

이 오류를 방지하려면 스레드 수를 줄이세요. 예를 들어 다음과 같이 설정할 수 있습니다. --number_of_worker_harness_threads=50

TPU 사용량 없음

파이프라인이 성공적으로 실행되지만 TPU 기기가 사용되지 않거나 액세스할 수 없는 경우 JAX 또는 PyTorch와 같은 사용 중인 프레임워크가 연결된 기기에 액세스할 수 있는지 확인합니다. 단일 VM에서 컨테이너 이미지를 문제 해결하려면 독립형 VM으로 디버깅을 참고하세요.