Dataflow GPU 작업 문제 해결

GPU로 Dataflow 작업을 실행하는 데 문제가 발생하면 다음 단계를 수행합니다.

  1. Dataflow GPU 작업 권장사항의 워크플로를 따라 파이프라인이 올바르게 구성되었는지 확인합니다.
  2. Dataflow 작업에서 GPU를 사용하고 있는지 확인합니다. 'GPU로 파이프라인 실행'의 Dataflow 작업 확인을 참조하세요.
  3. 독립형 VM 또는 Dataflow를 사용하여 작업을 디버그합니다.
  4. 문제가 지속되면 이 페이지의 나머지 문제 해결 단계를 수행합니다.

작업 디버그

독립형 VM으로 디버깅하는 것이 일반적으로 더 빠르므로 가능하면 독립형 VM으로 작업을 디버그하세요. 그러나 조직 정책으로 인해 독립형 VM으로 디버그할 수 없는 경우 Dataflow를 사용하여 디버그할 수 있습니다.

독립형 VM으로 디버깅

적합한 컨테이너 이미지를 설계하고 이를 반복하는 동안, 독립형 VM에서 컨테이너 이미지를 시험해 보면 피드백 루프를 더 빠르게 줄일 수 있습니다.

Container-Optimized OS에서 GPU를 실행하는 Compute Engine VM을 만들고, 드라이버를 설치하고, 다음과 같이 컨테이너를 시작하여 GPU가 있는 독립형 VM에서 커스텀 컨테이너를 디버깅할 수 있습니다.

  1. VM 인스턴스 만듭니다.

    gcloud compute instances create INSTANCE_NAME \
      --project "PROJECT" \
      --image-family cos-stable \
      --image-project=cos-cloud  \
      --zone=us-central1-f \
      --accelerator type=nvidia-tesla-t4,count=1 \
      --maintenance-policy TERMINATE \
      --restart-on-failure  \
      --boot-disk-size=200G \
      --scopes=cloud-platform
    
  2. ssh를 사용하여 VM에 연결합니다.

    gcloud compute ssh INSTANCE_NAME --project "PROJECT"
    
  3. GPU 드라이버를 설치합니다. ssh를 사용하여 VM에 연결한 후 VM에서 다음 명령어를 실행합니다.

    # Run these commands on the virtual machine
    cos-extensions install gpu
    sudo mount --bind /var/lib/nvidia /var/lib/nvidia
    sudo mount -o remount,exec /var/lib/nvidia
    /var/lib/nvidia/bin/nvidia-smi
    
  4. 커스텀 컨테이너를 시작합니다.

    Apache Beam SDK 컨테이너는 /opt/apache/beam/boot 진입점을 사용합니다. 디버깅을 위해 다른 진입점을 사용하여 컨테이너를 수동으로 시작할 수 있습니다.

    docker-credential-gcr configure-docker
    docker run --rm \
      -it \
      --entrypoint=/bin/bash \
      --volume /var/lib/nvidia/lib64:/usr/local/nvidia/lib64 \
      --volume /var/lib/nvidia/bin:/usr/local/nvidia/bin \
      --privileged \
      IMAGE
    

    IMAGE를 Docker 이미지의 Artifact Registry 경로로 바꿉니다.

  5. 컨테이너에 설치된 GPU 라이브러리가 GPU 기기에 액세스할 수 있는지 확인합니다.

    TensorFlow를 사용하는 경우 다음을 사용하여 Python 인터프리터에서 사용 가능한 기기를 출력할 수 있습니다.

    >>> import tensorflow as tf
    >>> print(tf.config.list_physical_devices("GPU"))
    

    PyTorch를 사용하는 경우 다음을 사용하여 Python 인터프리터에 사용 가능한 기기를 조사할 수 있습니다.

    >>> import torch
    >>> print(torch.cuda.is_available())
    >>> print(torch.cuda.device_count())
    >>> print(torch.cuda.get_device_name(0))
    

파이프라인을 반복 실행하려면 Direct Runner에서 파이프라인을 실행합니다. 또한 이 환경으로부터 Dataflow Runner에서 파이프라인을 실행할 수도 있습니다.

Dataflow를 사용하여 디버그

조직적 제약으로 인해 독립형 VM에서 디버그할 수 없는 경우 Dataflow를 사용하여 디버그할 수 있습니다.

GPU가 있는지 감지하는 것만 수행하도록 파이프라인을 간소화한 후 Dataflow에서 파이프라인을 실행합니다. 다음 예는 이 파이프라인의 코드가 어떻게 표시되는지 보여줍니다.

def check_if_gpus_present(element):
  import torch
  import tensorflow as tf

  tensorflow_detects_gpus = tf.config.list_physical_devices("GPU")
  torch_detects_gpus = torch.cuda.is_available()
  if tensorflow_detects_gpus and torch_detects_gpus:
    return element

  if tensorflow_detects_gpus:
    raise Exception('PyTorch failed to detect GPUs with your setup')
  if torch_detects_gpus:
    raise Exception('Tensorflow failed to detect GPUs with your setup')
  raise Exception('Both Tensorflow and PyTorch failed to detect GPUs with your setup')

with beam.Pipeline() as p:
  _ = (p | beam.Create([1,2,3]) # Create a PCollection of the prompts.
         | beam.Map(check_if_gpus_present)
  )

파이프라인이 성공하면 코드가 GPU에 액세스할 수 있습니다. 문제 코드를 식별하려면 파이프라인 코드에 점점 더 큰 예시를 삽입하고 각 변경사항 후에 파이프라인을 실행합니다.

파이프라인에서 GPU를 감지하지 못하는 경우 이 문서의 GPU 사용 없음 섹션에 나온 단계를 따르세요.

작업자가 시작되지 않음

작업이 중단되어 Dataflow 작업자가 데이터 처리를 시작하지 않으면 Dataflow에서 커스텀 컨테이너 사용과 관련된 문제일 수 있습니다. 자세한 내용은 커스텀 컨테이너 문제 해결 가이드를 참조하세요.

Python 사용자는 다음 조건이 충족되는지 확인합니다.

  • 컨테이너 이미지의 Python 인터프리터 부 버전은 파이프라인을 시작할 때 사용하는 것과 동일한 버전이어야 합니다. 불일치가 있으면 apache_beam/internal/pickler.py와 관련된 스택 추적에서 SystemError: unknown opcode와 같은 오류가 표시될 수 있습니다.
  • Apache Beam SDK 2.29.0 이하를 사용하는 경우 /usr/local/bin/pip의 이미지에서 pip에 액세스할 수 있어야 합니다.

커스텀 이미지를 처음 사용하는 경우 맞춤설정을 최소의 작업 구성으로 줄이는 것이 좋습니다. 이 페이지의 예시에 제공된 샘플 커스텀 컨테이너 이미지를 사용합니다. GPU를 요청하지 않고 이 컨테이너 이미지로 간단한 Dataflow 파이프라인을 실행할 수 있는지 확인합니다. 그런 다음 솔루션을 반복합니다.

작업자에 컨테이너 이미지를 다운로드할 디스크 공간이 충분한지 확인합니다. 필요한 경우 디스크 크기를 조정합니다. 대용량 이미지는 다운로드하는 데 시간이 오래 걸리므로 작업자 시작 시간이 늘어납니다.

시작할 때 작업이 즉시 실패함

ZONE_RESOURCE_POOL_EXHAUSTED 또는 ZONE_RESOURCE_POOL_EXHAUSTED_WITH_DETAILS 오류가 발생하면 다음 단계를 수행할 수 있습니다.

  • Dataflow가 최적의 영역을 선택하도록 작업자 영역을 지정하지 않습니다.

  • 다른 영역에서 또는 다른 가속기 유형으로 파이프라인을 시작합니다.

런타임 시 작업 실패

런타임에 작업이 실패하면 작업자 머신 및 GPU에 메모리 부족(OOM) 오류가 있는지 확인합니다. GPU OOM 오류는 작업자 로그에서 cudaErrorMemoryAllocation out of memory 오류로 나타날 수 있습니다. TensorFlow를 사용하는 경우 하나의 GPU 기기에 액세스할 때 하나의 TensorFlow 프로세스만 사용하는지 확인합니다. 자세한 내용은 GPU 및 작업자 동시 로드를 참조하세요.

GPU 사용 없음

작업에서 GPU를 사용하지 않는 것처럼 보이면 이 문서의 작업 디버그 섹션에 나온 단계에 따라 Docker 이미지에서 GPU를 사용할 수 있는지 확인합니다.

GPU를 사용할 수 있지만 사용되지 않는 경우 파이프라인 코드에 문제가 있을 수 있습니다. 파이프라인 코드를 디버그하려면 GPU를 성공적으로 사용하는 간단한 파이프라인으로 시작하고 코드를 파이프라인에 점진적으로 추가하여 새로 추가할 때마다 파이프라인을 테스트합니다. 자세한 내용은 이 문서의 Dataflow에서 디버그 섹션을 참고하세요.

파이프라인에서 GPU를 감지하지 못하는 경우 다음을 확인합니다.

  • 컨테이너 이미지에 설치된 NVIDIA 라이브러리는 파이프라인 사용자 코드 및 여기에 사용되는 라이브러리의 요구사항과 일치해야 합니다.
  • 컨테이너 이미지에 설치된 NVIDIA 라이브러리는 공유 라이브러리로 액세스할 수 있어야 합니다.

기기를 사용할 수 없다면 호환되지 않는 소프트웨어 구성을 사용하고 있는 것일 수 있습니다. 이미지 구성을 확인하려면 GPU를 사용할 수 있고 작업자가 액세스할 수 있는지 확인하는 간단한 파이프라인을 실행합니다.

TensorFlow 문제 해결

PyTorch가 파이프라인에서 GPU를 감지하지만 TensorFlow가 감지하지 못하는 경우 다음 문제 해결 단계를 시도해 보세요.

  • TensorFlow, cuDNN 버전, CUDA Toolkit 버전의 호환 가능한 조합이 있는지 확인합니다. 자세한 내용은 TensorFlow 문서의 테스트된 빌드 구성을 참고하세요.
  • 가능하면 호환되는 최신 TensorFlow 및 CUDA 버전으로 업그레이드합니다.
  • TensorFlow 및 CUDA의 알려진 문제를 검토하여 알려진 문제가 파이프라인에서 문제를 일으키는지 확인합니다. 예를 들어 다음과 같은 알려진 문제가 있으면 TensorFlow에서 GPU를 감지하지 못할 수 있습니다.TF 2.17.0 RC0이 GPU에서 작동하지 않음

다음 단계