GPU로 Dataflow 작업을 실행하는 데 문제가 발생하면 다음 단계를 수행합니다.
- Dataflow GPU 작업 권장사항의 워크플로를 따라 파이프라인이 올바르게 구성되었는지 확인합니다.
- Dataflow 작업에서 GPU를 사용하고 있는지 확인합니다. 'GPU로 파이프라인 실행'의 Dataflow 작업 확인을 참조하세요.
- 독립형 VM 또는 Dataflow를 사용하여 작업을 디버그합니다.
- 문제가 지속되면 이 페이지의 나머지 문제 해결 단계를 수행합니다.
작업 디버그
독립형 VM으로 디버깅하는 것이 일반적으로 더 빠르므로 가능하면 독립형 VM으로 작업을 디버그하세요. 그러나 조직 정책으로 인해 독립형 VM으로 디버그할 수 없는 경우 Dataflow를 사용하여 디버그할 수 있습니다.
독립형 VM으로 디버깅
적합한 컨테이너 이미지를 설계하고 이를 반복하는 동안, 독립형 VM에서 컨테이너 이미지를 시험해 보면 피드백 루프를 더 빠르게 줄일 수 있습니다.
Container-Optimized OS에서 GPU를 실행하는 Compute Engine VM을 만들고, 드라이버를 설치하고, 다음과 같이 컨테이너를 시작하여 GPU가 있는 독립형 VM에서 커스텀 컨테이너를 디버깅할 수 있습니다.
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
ssh
를 사용하여 VM에 연결합니다.gcloud compute ssh INSTANCE_NAME --project "PROJECT"
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
커스텀 컨테이너를 시작합니다.
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 경로로 바꿉니다.
컨테이너에 설치된 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에서 작동하지 않음