GPU로 파이프라인 실행

이 페이지에서는 GPU 사용하여 Dataflow에서 Apache Beam 파이프라인을 실행하는 방법을 설명합니다. GPU를 사용하는 작업에는 Dataflow 가격 책정 페이지에 명시된 대로 요금이 청구됩니다.

Dataflow에서 GPU를 사용하는 방법에 대한 상세 정보는 GPU에 대한 Dataflow 지원을 참조하세요. GPU를 사용하여 파이프라인을 빌드하기 위한 개발자 워크플로는 Dataflow를 사용하는 GPU 정보를 참조하세요.

Apache Beam 노트북 사용

Dataflow에서 GPU를 사용하여 실행하려는 파이프라인이 이미 있으면 이 섹션을 건너뛰어도 됩니다.

Apache Beam 노트북은 개발 환경을 설정하지 않고도 GPU를 사용하여 파이프라인을 프로토타입으로 만들고 반복적으로 개발할 수 있는 편리한 방법을 제공합니다. 시작하려면 Apache Beam 노트북으로 개발 가이드를 읽고, Apache Beam 노트북 인스턴스를 실행하고, 노트북 GPU 사용 Apache Beam을 참조하세요.

GPU 할당량 프로비저닝

GPU 기기에는 Google Cloud 프로젝트의 할당량 가용성이 적용됩니다. 원하는 리전에서 GPU 할당량을 요청합니다.

GPU 드라이버 설치

Dataflow 작업자에 NVIDIA 드라이버를 설치하려면 worker_accelerator 서비스 옵션install-nvidia-driver를 추가합니다.

install-nvidia-driver 옵션을 지정하면 Dataflow가 Container-Optimized OS에서 제공된 cos-extensions 유틸리티를 사용하여 Dataflow 작업자에 NVIDIA 드라이버를 설치합니다. install-nvidia-driver를 지정하면 사용자는 NVIDIA 라이선스 계약에 동의하는 것으로 간주됩니다.

NVIDIA 드라이버 설치 프로그램에서 제공하는 바이너리와 라이브러리는 /usr/local/nvidia/의 파이프라인 사용자 코드를 실행하는 컨테이너에 마운트됩니다.

GPU 드라이버 버전은 Dataflow에서 사용되는 Container-Optimized OS 버전에 따라 다릅니다. 특정 Dataflow 작업의 GPU 드라이버 버전을 확인하려면 작업의 Dataflow 단계 로그에서 GPU driver를 검색합니다.

커스텀 컨테이너 이미지 빌드

GPU와 상호작용하려면 GPU 가속 라이브러리CUDA Toolkit과 같은 NVIDIA 소프트웨어가 추가로 필요할 수 있습니다. 사용자 코드를 실행하는 Docker 컨테이너에 이러한 라이브러리를 제공합니다.

컨테이너 이미지를 맞춤설정하려면 Apache Beam SDK 컨테이너 이미지 계약을 충족하고 필요한 GPU 라이브러리가 포함된 이미지를 제공합니다.

커스텀 컨테이너 이미지를 제공하려면 Dataflow Runner v2를 사용하고 sdk_container_image 파이프라인 옵션을 사용하여 컨테이너 이미지를 제공합니다. Apache Beam 버전 2.29.0 이하를 사용하는 경우 worker_harness_container_image 파이프라인 옵션을 사용합니다. 자세한 내용은 커스텀 컨테이너 사용을 참조하세요.

커스텀 컨테이너 이미지를 빌드하려면 다음 두 가지 접근 방법 중 하나를 사용하세요.

GPU 사용을 위해 구성된 기존 이미지 사용

GPU 사용을 위해 사전 구성된 기존 기본 이미지에서 Apache Beam SDK 컨테이너 계약을 충족하는 Docker 이미지를 빌드할 수 있습니다. 예를 들어 TensorFlow Docker 이미지NVIDIA 컨테이너 이미지는 GPU용으로 사전 구성됩니다.

Python 3.6을 사용하여 TensorFlow Docker 이미지에 빌드하는 샘플 Dockerfile은 다음 예시와 같습니다.

ARG BASE=tensorflow/tensorflow:2.5.0-gpu
FROM $BASE

# Check that the chosen base image provides the expected version of Python interpreter.
ARG PY_VERSION=3.6
RUN [[ $PY_VERSION == `python -c 'import sys; print("%s.%s" % sys.version_info[0:2])'` ]] \
   || { echo "Could not find Python interpreter or Python version is different from ${PY_VERSION}"; exit 1; }

RUN pip install --upgrade pip \
    && pip install --no-cache-dir apache-beam[gcp]==2.29.0 \
    # Verify that there are no conflicting dependencies.
    && pip check

# Copy the Apache Beam worker dependencies from the Beam Python 3.6 SDK image.
COPY --from=apache/beam_python3.6_sdk:2.29.0 /opt/apache/beam /opt/apache/beam

# Apache Beam worker expects pip at /usr/local/bin/pip by default.
# Some images have pip in a different location. If necessary, make a symlink.
# This line can be omitted in Beam 2.30.0 and later versions.
RUN [[ `which pip` == "/usr/local/bin/pip" ]] || ln -s `which pip` /usr/local/bin/pip

# Set the entrypoint to Apache Beam SDK worker launcher.
ENTRYPOINT [ "/opt/apache/beam/boot" ]

TensorFlow Docker 이미지를 사용할 때 TensorFlow 2.5.0 이상을 사용합니다. 이전 TensorFlow Docker 이미지는 tensorflow 패키지 대신 tensorflow-gpu 패키지를 설치합니다. 이러한 차이는 TensorFlow 2.1.0 출시 이후 중요하지 않지만 tfx와 같은 일부 다운스트림 패키지에는 tensorflow 패키지가 필요합니다.

컨테이너가 크면 작업자 시작 시간이 느려집니다. Deep Learning Containers와 같은 컨테이너를 사용할 때 이러한 성능 변화가 나타날 수 있습니다.

특정 Python 버전 설치

Python 버전에 대한 엄격한 요구사항이 있는 경우 필수 GPU 라이브러리가 있는 NVIDIA 기본 이미지에서 이미지를 빌드한 다음 Python 인터프리터를 설치할 수 있습니다.

다음 예시에서는 CUDA 컨테이너 이미지 카탈로그의 Python 인터프리터를 포함하지 않는 NVIDIA 이미지를 선택하는 방법을 보여줍니다. 예시를 조정하여 필요한 Python 3 및 pip 버전을 설치합니다. 이 예시에서는 TensorFlow가 사용됩니다. 따라서 이미지를 선택할 때 기본 이미지의 CUDA 및 cuDNN 버전이 TensorFlow 버전의 요구사항을 충족합니다.

샘플 Dockerfile은 다음과 같습니다.

# Select an NVIDIA base image with needed GPU stack from https://ngc.nvidia.com/catalog/containers/nvidia:cuda

FROM nvidia/cuda:11.0.3-cudnn8-runtime-ubuntu20.04

RUN \
    # Add Deadsnakes repository that has a variety of Python packages for Ubuntu.
    # See: https://launchpad.net/~deadsnakes/+archive/ubuntu/ppa
    apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F23C5A6CF475977595C89F51BA6932366A755776 \
    && echo "deb http://ppa.launchpad.net/deadsnakes/ppa/ubuntu focal main" >> /etc/apt/sources.list.d/custom.list \
    && echo "deb-src http://ppa.launchpad.net/deadsnakes/ppa/ubuntu focal main" >> /etc/apt/sources.list.d/custom.list \
    && apt-get update \
    && apt-get install -y curl \
        python3.8 \
        # With python3.8 package, distutils need to be installed separately.
        python3-distutils \
    && rm -rf /var/lib/apt/lists/* \
    && update-alternatives --install /usr/bin/python python /usr/bin/python3.8 10 \
    && curl https://bootstrap.pypa.io/get-pip.py | python \
    && pip install --upgrade pip \
    # Install Apache Beam and Python packages that will interact with GPUs.
    && pip install --no-cache-dir apache-beam[gcp]==2.29.0 tensorflow==2.4.0 \
    # Verify that there are no conflicting dependencies.
    && pip check

# Copy the Apache Beam worker dependencies from the Beam Python 3.8 SDK image.
COPY --from=apache/beam_python3.8_sdk:2.29.0 /opt/apache/beam /opt/apache/beam

# Set the entrypoint to Apache Beam SDK worker launcher.
ENTRYPOINT [ "/opt/apache/beam/boot" ]

일부 OS 분포에서는 OS 패키지 관리자를 사용하여 특정 Python 버전을 설치하는 것이 어려울 수 있습니다. 여기에서는 Miniconda 또는 pyenv와 같은 도구를 사용해서 Python 인터프리터를 설치합니다.

샘플 Dockerfile은 다음과 같습니다.

FROM nvidia/cuda:11.0.3-cudnn8-runtime-ubuntu20.04

# The Python version of the Dockerfile must match the Python version you use
# to launch the Dataflow job.

ARG PYTHON_VERSION=3.8

# Update PATH so we find our new Conda and Python installations.
ENV PATH=/opt/python/bin:/opt/conda/bin:$PATH

RUN apt-get update \
    && apt-get install -y wget \
    && rm -rf /var/lib/apt/lists/* \
    # The NVIDIA image doesn't come with Python pre-installed.
    # We use Miniconda to install the Python version of our choice.
    && wget -q https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh \
    && bash Miniconda3-latest-Linux-x86_64.sh -b -p /opt/conda \
    && rm Miniconda3-latest-Linux-x86_64.sh \
    # Create a new Python environment with needed version, and install pip.
    && conda create -y -p /opt/python python=$PYTHON_VERSION pip \
    # Remove unused Conda packages, install necessary Python packages via pip
    # to avoid mixing packages from pip and Conda.
    && conda clean -y --all --force-pkgs-dirs \
    && pip install --upgrade pip \
    # Install Apache Beam and Python packages that will interact with GPUs.
    && pip install --no-cache-dir apache-beam[gcp]==2.29.0 tensorflow==2.4.0 \
    # Verify that there are no conflicting dependencies.
    && pip check \
    # Apache Beam worker expects pip at /usr/local/bin/pip by default.
    # You can omit this line when using Beam 2.30.0 and later versions.
    && ln -s $(which pip) /usr/local/bin/pip

# Copy the Apache Beam worker dependencies from the Apache Beam SDK for Python 3.8 image.
COPY --from=apache/beam_python3.8_sdk:2.29.0 /opt/apache/beam /opt/apache/beam

# Set the entrypoint to Apache Beam SDK worker launcher.
ENTRYPOINT [ "/opt/apache/beam/boot" ]

Apache Beam 컨테이너 이미지 사용

사전 구성된 이미지를 사용하지 않고 GPU 사용량에 맞게 컨테이너 이미지를 구성할 수 있습니다. 이 방법은 사전 구성된 이미지가 작동하지 않을 때만 권장됩니다. 사용자 고유의 컨테이너 이미지를 설정하려면 호환되는 라이브러리를 선택하고 실행 환경을 구성해야 합니다.

샘플 Dockerfile은 다음과 같습니다.

FROM apache/beam_python3.7_sdk:2.24.0
ENV INSTALLER_DIR="/tmp/installer_dir"

# The base image has TensorFlow 2.2.0, which requires CUDA 10.1 and cuDNN 7.6.
# You can download cuDNN from NVIDIA website
# https://developer.nvidia.com/cudnn
COPY cudnn-10.1-linux-x64-v7.6.0.64.tgz $INSTALLER_DIR/cudnn.tgz
RUN \
    # Download CUDA toolkit.
    wget -q -O $INSTALLER_DIR/cuda.run https://developer.download.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda_10.1.243_418.87.00_linux.run && \

    # Install CUDA toolkit. Print logs upon failure.
    sh $INSTALLER_DIR/cuda.run --toolkit --silent || (egrep '^\[ERROR\]' /var/log/cuda-installer.log && exit 1) && \
    # Install cuDNN.
    mkdir $INSTALLER_DIR/cudnn && \
    tar xvfz $INSTALLER_DIR/cudnn.tgz -C $INSTALLER_DIR/cudnn && \

    cp $INSTALLER_DIR/cudnn/cuda/include/cudnn*.h /usr/local/cuda/include && \
    cp $INSTALLER_DIR/cudnn/cuda/lib64/libcudnn* /usr/local/cuda/lib64 && \
    chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn* && \
    rm -rf $INSTALLER_DIR

# A volume with GPU drivers will be mounted at runtime at /usr/local/nvidia.
ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/nvidia/lib64:/usr/local/cuda/lib64

/usr/local/nvidia/lib64의 드라이버 라이브러리는 컨테이너에서 공유 라이브러리로 검색할 수 있어야 합니다. 드라이버 라이브러리를 검색할 수 있게 하려면 LD_LIBRARY_PATH 환경 변수를 구성합니다.

TensorFlow를 사용하는 경우 CUDA Toolkit과 cuDNN 버전의 호환 가능한 조합을 선택해야 합니다. 더 많은 정보는 소프트웨어 요구사항테스트된 빌드 구성을 참조하세요.

Dataflow 작업자의 GPU 유형과 개수 선택

Dataflow 작업자에 연결할 GPU 유형과 개수를 구성하려면 worker_accelerator 서비스 옵션을 사용합니다. 사용 사례 및 파이프라인에서 GPU를 사용하려는 방법에 따라 GPU 유형과 수를 선택하세요.

Dataflow에서 지원되는 GPU 유형 목록은 Dataflow의 GPU 지원을 참조하세요.

GPU로 작업 실행

GPU로 Dataflow 작업을 실행할 때는 다음과 같은 사항을 고려해야 합니다.

  • GPU 컨테이너가 일반적으로 크기 때문에 디스크 공간 부족을 방지하기 위해 다음을 수행합니다.

  • 작업자 VM에서 동일한 GPU를 동시에 사용하는 프로세스 수를 고려합니다. 그런 후 GPU를 단일 프로세스로 제한하거나 여러 프로세스가 GPU를 사용하도록 허용할지 결정합니다.

    • 하나의 Apache Beam SDK 프로세스가 사용 가능한 GPU 메모리를 대부분 사용할 수 있는 경우(예: 대규모 모델을 GPU에 로드) 파이프라인 옵션 --experiments=no_use_multiple_sdk_containers를 설정하여 작업자가 단일 프로세스를 사용하도록 구성할 수 있습니다. 또는 확장 메모리n1-custom-1-NUMBER_OF_MB 또는 n1-custom-1-NUMBER_OF_MB-ext와 같은 커스텀 머신 유형을 사용하여 vCPU가 하나인 작업자를 사용합니다. 자세한 내용은 vCPU당 메모리가 더 많은 머신 유형 사용을 참조하세요.
    • 여러 프로세스에서 GPU를 공유하는 경우 NVIDIA 멀티 처리 서비스(MPS)를 사용하여 공유 GPU에서 동시 실행 처리를 사용 설정합니다.

    자세한 내용은 GPU 및 작업자 동시 로드를 참조하세요.

GPU로 Dataflow 작업을 실행하려면 다음 명령어를 사용합니다. 적합 맞춤을 사용하려면 worker_accelerator 서비스 옵션 대신 accelerator 리소스 힌트를 사용합니다.

Python

python PIPELINE \
  --runner "DataflowRunner" \
  --project "PROJECT" \
  --temp_location "gs://BUCKET/tmp" \
  --region "REGION" \
  --worker_harness_container_image "IMAGE" \
  --disk_size_gb "DISK_SIZE_GB" \
  --dataflow_service_options "worker_accelerator=type:GPU_TYPE;count:GPU_COUNT;install-nvidia-driver" \
  --experiments "use_runner_v2"

다음을 바꿉니다.

  • PIPELINE: 파이프라인 소스 코드 파일입니다.
  • PROJECT: Google Cloud 프로젝트 이름입니다.
  • BUCKET: Cloud Storage 버킷입니다.
  • REGION: Dataflow 리전입니다(예: us-central1). GPU_TYPE을 지원하는 영역이 포함된 `REGION`을 선택합니다. Dataflow는 이 리전의 GPU를 사용하여 영역에 작업자를 자동으로 할당합니다.
  • IMAGE: Docker 이미지의 Artifact Registry 경로입니다.
  • DISK_SIZE_GB: 각 작업자 VM의 부팅 디스크 크기입니다(예: 50).
  • GPU_TYPE: 사용 가능한 GPU 유형입니다(예: nvidia-tesla-t4).
  • GPU_COUNT: 각 작업자 VM에 연결할 GPU 수입니다(예: 1).

Dataflow 작업 확인

작업에서 GPU가 있는 작업자 VM을 사용하는지 확인하려면 다음 단계를 따르세요.

  1. 작업의 Dataflow 작업자가 시작되었는지 확인합니다.
  2. 작업이 실행되는 동안 작업과 연결된 작업자 VM을 찾습니다.
    1. 제품 및 리소스 검색 프롬프트에 작업 ID를 붙여넣습니다.
    2. 작업에 연결된 Compute Engine VM 인스턴스를 선택합니다.

Compute Engine 콘솔에서 실행 중인 모든 인스턴스의 목록을 확인할 수도 있습니다.

  1. Google Cloud 콘솔에서 VM 인스턴스 페이지로 이동합니다.

    VM 인스턴스로 이동

  2. VM 인스턴스 세부정보를 클릭합니다.

  3. 세부정보 페이지에 GPU 섹션이 있고 GPU가 연결되어 있는지 확인합니다.

작업이 GPU로 시작되지 않은 경우 worker_accelerator 서비스 옵션이 올바르게 구성되어 있고 dataflow_service_options의 Dataflow 모니터링 인터페이스에 표시되는지 확인합니다. 가속기 메타데이터에서 토큰 순서는 중요합니다.

예를 들어 Dataflow 모니터링 인터페이스의 dataflow_service_options 파이프라인 옵션은 다음과 같을 수 있습니다.

['worker_accelerator=type:nvidia-tesla-t4;count:1;install-nvidia-driver', ...]

GPU 사용률 보기

작업자 VM의 GPU 사용률을 보려면 다음 단계를 수행합니다.

  1. Google Cloud 콘솔에서 Monitoring으로 이동하거나 다음 버튼을 사용합니다.

    Monitoring으로 이동

  2. Monitoring 탐색창에서 측정항목 탐색기를 클릭합니다.

  3. 리소스 유형Dataflow Job을 지정합니다. 모니터링할 측정항목에 따라 GPU utilization 또는 GPU memory utilization을 측정항목으로 지정합니다.

자세한 내용은 측정항목 탐색기를 참조하세요.

NVIDIA 다중 처리 서비스 사용 설정

vCPU가 2개 이상인 작업자에서 실행되는 Python 파이프라인에서 NVIDIA Multi-Process Service(MPS)를 사용 설정하여 GPU 작업의 동시 실행을 개선할 수 있습니다. MPS 사용에 대한 자세한 내용 및 단계는 NVIDIA MPS를 사용하여 공유 GPU 성능 개선을 참조하세요.

Dataflow Prime에 GPU 사용

Dataflow Prime을 사용하면 파이프라인의 특정 단계에 대해 가속기를 요청할 수 있습니다. Dataflow Prime에 GPU를 사용하려면 --dataflow-service_options=worker_accelerator 파이프라인 옵션을 사용하지 마세요. 대신 accelerator 리소스 힌트로 GPU를 요청합니다. 자세한 내용은 리소스 힌트 사용을 참조하세요.

Dataflow 작업 문제 해결

GPU로 Dataflow 작업을 실행하는 데 문제가 발생하면 Dataflow GPU 작업 문제 해결을 참조하세요.

다음 단계