Menjalankan pipeline dengan GPU

Halaman ini menjelaskan cara menjalankan pipeline Apache Beam pada Dataflow dengan GPU. Tugas yang menggunakan GPU akan dikenai biaya seperti yang ditentukan di halaman harga Dataflow.

Untuk mengetahui informasi selengkapnya tentang penggunaan GPU dengan Dataflow, lihat Dukungan dataflow untuk GPU. Untuk mengetahui informasi selengkapnya tentang alur kerja developer untuk membangun pipeline menggunakan GPU, lihat Tentang GPU dengan Dataflow.

Menggunakan notebook Apache Beam

Jika Anda sudah memiliki pipeline yang ingin Anda jalankan dengan GPU pada Dataflow, Anda dapat melewati bagian ini.

Notebook Apache Beam menawarkan cara yang mudah untuk membuat prototipe dan mengembangkan pipeline Anda secara berulang dengan GPU tanpa menyiapkan lingkungan pengembangan. Untuk memulai, baca panduan Mengembangkan dengan notebook Apache Beam, meluncurkan instance notebook Apache Beam, lalu mengikuti contoh notebook Menggunakan GPU dengan Apache Beam.

Menyediakan kuota GPU

Perangkat GPU bergantung pada ketersediaan kuota project Google Cloud Anda. Minta kuota GPU di region pilihan Anda.

Menginstal driver GPU

Untuk menginstal driver NVIDIA di pekerja Dataflow, tambahkan install-nvidia-driver ke opsi layanan worker_accelerator.

Saat Anda menentukan opsi install-nvidia-driver, Dataflow akan menginstal driver NVIDIA ke pekerja Dataflow menggunakan utilitas cos-extensions yang disediakan oleh Container-Optimized OS. Dengan menentukan install-nvidia-driver, Anda setuju untuk menyetujui perjanjian lisensi NVIDIA.

Biner dan library yang disediakan oleh penginstal driver NVIDIA dipasang ke dalam container yang menjalankan kode pengguna pipeline di /usr/local/nvidia/.

Versi driver GPU bergantung pada versi Container-Optimized OS yang digunakan oleh Dataflow. Guna menemukan versi driver GPU untuk tugas Dataflow tertentu, di Dataflow Step Logs dari tugas Anda, telusuri GPU driver.

Membuat image container kustom

Untuk berinteraksi dengan GPU, Anda mungkin memerlukan software NVIDIA tambahan, seperti library yang dipercepat GPU dan CUDA Toolkit. Sediakan library ini dalam container Docker yang menjalankan kode pengguna.

Untuk menyesuaikan image container, sediakan gambar yang memenuhi kontrak gambar container Apache Beam SDK dan memiliki library GPU yang diperlukan.

Untuk menyediakan image container kustom, gunakan Dataflow Runner v2 dan berikan image container menggunakan opsi pipeline sdk_container_image. Jika Anda menggunakan Apache Beam versi 2.29.0 atau yang lebih lama, gunakan opsi pipeline worker_harness_container_image. Untuk mengetahui informasi lebih lanjut, lihat Menggunakan penampung kustom.

Untuk mem-build image container kustom, gunakan salah satu dari dua pendekatan berikut:

Gunakan gambar yang sudah ada yang dikonfigurasi untuk penggunaan GPU

Anda dapat membangun image Docker yang memenuhi kontrak container Apache Beam SDK dari image dasar yang ada yang telah dikonfigurasi untuk penggunaan GPU. Misalnya, image Docker TensorFlow, dan image container NVIDIA telah dikonfigurasi untuk penggunaan GPU.

Contoh Dockerfile yang di-build pada image Docker TensorFlow dengan Python 3.6 terlihat seperti contoh berikut:

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" ]

Saat Anda menggunakan image Docker TensorFlow, gunakan TensorFlow 2.5.0 atau yang lebih baru. Image TensorFlow Docker sebelumnya menginstal paket tensorflow-gpu, bukan paket tensorflow. Perbedaannya tidak penting setelah TensorFlow 2.1.0 dirilis, tetapi beberapa paket downstream, seperti tfx, memerlukan paket tensorflow.

Ukuran container yang besar memperlambat waktu startup pekerja. Perubahan performa ini mungkin terjadi saat Anda menggunakan penampung seperti Deep Learning Containers.

Menginstal versi Python tertentu

Jika memiliki persyaratan yang ketat untuk versi Python, Anda dapat mem-build image dari image dasar NVIDIA yang memiliki library GPU yang diperlukan. Kemudian, instal penafsir Python.

Contoh berikut menunjukkan cara memilih image NVIDIA yang tidak menyertakan penafsir Python dari katalog image container CUDA. Sesuaikan contoh untuk menginstal versi Python 3 dan pip yang diperlukan. Contoh ini menggunakan TensorFlow. Oleh karena itu, saat memilih gambar, versi CUDA dan cuDNN pada image dasar memenuhi persyaratan untuk versi TensorFlow.

Contoh Dockerfile akan terlihat seperti berikut:

# 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" ]

Pada beberapa distribusi OS, mungkin sulit untuk menginstal versi Python tertentu dengan menggunakan pengelola paket OS. Dalam hal ini, instal penafsir python dengan alat seperti Miniconda atau pyenv.

Contoh Dockerfile akan terlihat seperti berikut:

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" ]

Menggunakan image container Apache Beam

Anda dapat mengonfigurasi image container untuk penggunaan GPU tanpa menggunakan image yang sudah dikonfigurasi sebelumnya. Pendekatan ini hanya direkomendasikan jika gambar yang telah dikonfigurasi sebelumnya tidak cocok untuk Anda. Untuk menyiapkan image container sendiri, Anda harus memilih library yang kompatibel dan mengonfigurasi lingkungan eksekusinya.

Contoh Dockerfile akan terlihat seperti berikut:

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

Library driver di /usr/local/nvidia/lib64 harus dapat ditemukan dalam penampung sebagai library bersama. Agar library driver dapat ditemukan, konfigurasikan variabel lingkungan LD_LIBRARY_PATH.

Jika menggunakan TensorFlow, Anda harus memilih kombinasi versi CUDA Toolkit dan cuDNN yang kompatibel. Untuk informasi selengkapnya, baca Persyaratan software dan Konfigurasi build yang diuji.

Pilih jenis dan jumlah GPU untuk pekerja Dataflow

Untuk mengonfigurasi jenis dan jumlah GPU yang akan dipasang ke pekerja Dataflow, gunakan opsi layanan worker_accelerator. Pilih jenis dan jumlah GPU berdasarkan kasus penggunaan Anda dan rencana Anda untuk menggunakan GPU di pipeline Anda.

Untuk daftar jenis GPU yang didukung dengan Dataflow, lihat Dukungan dataflow untuk GPU.

Menjalankan tugas Anda dengan GPU

Pertimbangan untuk menjalankan tugas Dataflow dengan GPU mencakup hal berikut:

  • Karena penampung GPU biasanya berukuran besar, agar tidak kehabisan ruang disk, lakukan hal berikut:

  • Pertimbangkan berapa banyak proses yang secara serentak menggunakan GPU yang sama pada VM pekerja. Kemudian, tentukan apakah Anda ingin membatasi GPU ke satu proses atau membiarkan beberapa proses menggunakan GPU.

    • Jika satu proses Apache Beam SDK dapat menggunakan sebagian besar memori GPU yang tersedia, misalnya dengan memuat model besar ke GPU, Anda mungkin ingin mengonfigurasi pekerja agar menggunakan satu proses dengan menetapkan opsi pipeline --experiments=no_use_multiple_sdk_containers. Atau, gunakan pekerja dengan satu vCPU menggunakan jenis mesin kustom, seperti n1-custom-1-NUMBER_OF_MB atau n1-custom-1-NUMBER_OF_MB-ext, untuk memori yang diperluas. Untuk mengetahui informasi selengkapnya, lihat Menggunakan jenis mesin dengan memori lebih besar per vCPU.
    • Jika GPU digunakan bersama oleh beberapa proses, aktifkan pemrosesan serentak di GPU bersama menggunakan NVIDIA Multi-Processing Service (MPS).

    Untuk mengetahui informasi latar belakang, lihat GPU dan paralelisme pekerja.

Untuk menjalankan tugas Dataflow dengan GPU, gunakan perintah berikut. Untuk menggunakan pengaturan yang tepat, daripada menggunakan opsi layanan worker_accelerator, gunakan petunjuk resource 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"

Ganti kode berikut:

  • PIPELINE: file kode sumber pipeline Anda
  • PROJECT: nama project Google Cloud
  • BUCKET: bucket Cloud Storage
  • REGION: region Dataflow, misalnya, us-central1. Pilih `WILAYAH` yang memiliki zona yang mendukung GPU_TYPE. Dataflow secara otomatis menetapkan pekerja ke zona dengan GPU di region ini.
  • IMAGE: jalur Artifact Registry untuk image Docker
  • DISK_SIZE_GB: Ukuran boot disk untuk setiap VM pekerja, misalnya, 50
  • GPU_TYPE: jenis GPU yang tersedia, misalnya, nvidia-tesla-t4.
  • GPU_COUNT: jumlah GPU yang harus dipasang ke setiap VM pekerja, misalnya, 1

Memverifikasi tugas Dataflow

Untuk mengonfirmasi bahwa tugas tersebut menggunakan VM worker dengan GPU, ikuti langkah-langkah berikut:

  1. Pastikan pekerja Dataflow untuk tugas telah dimulai.
  2. Saat tugas berjalan, cari VM pekerja yang terkait dengan tugas tersebut.
    1. Di perintah Search Products and Resources, tempel Job ID.
    2. Pilih instance VM Compute Engine yang terkait dengan tugas tersebut.

Anda juga dapat menemukan daftar semua instance yang berjalan di konsol Compute Engine.

  1. Di konsol Google Cloud, buka halaman Instance VM.

    Buka instance VM

  2. Klik VM instance details.

  3. Pastikan halaman detail memiliki bagian GPU dan GPU Anda terlampir.

Jika tugas Anda tidak diluncurkan dengan GPU, pastikan opsi layanan worker_accelerator dikonfigurasi dengan benar dan terlihat di antarmuka pemantauan Dataflow di dataflow_service_options. Urutan token dalam metadata akselerator sangat penting.

Misalnya, opsi pipeline dataflow_service_options di antarmuka pemantauan Dataflow mungkin terlihat seperti berikut:

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

Melihat penggunaan GPU

Untuk melihat pemakaian GPU pada VM pekerja, ikuti langkah-langkah berikut:

  1. Di konsol Google Cloud, buka Monitoring atau gunakan tombol berikut:

    Buka Monitoring

  2. Di panel navigasi Monitoring, klik Metrics Explorer.

  3. Untuk Resource Type, tentukan Dataflow Job. Untuk metrik, tentukan GPU utilization atau GPU memory utilization, bergantung pada metrik yang ingin Anda pantau.

Untuk informasi selengkapnya, lihat Metrics Explorer.

Aktifkan Layanan Multi-Pemrosesan NVIDIA

Pada pipeline Python yang berjalan pada pekerja yang memiliki lebih dari satu vCPU, Anda dapat meningkatkan kualitas operasi GPU dengan mengaktifkan NVIDIA Multi-Process Service (MPS). Untuk mengetahui informasi selengkapnya dan langkah-langkah menggunakan MPS, lihat Meningkatkan performa di GPU bersama menggunakan NVIDIA MPS.

Menggunakan GPU dengan Dataflow Prime

Dataflow Prime memungkinkan Anda meminta akselerator untuk langkah tertentu dalam pipeline Anda. Untuk menggunakan GPU dengan Dataflow Prime, jangan gunakan opsi pipeline --dataflow-service_options=worker_accelerator. Sebagai gantinya, minta GPU dengan petunjuk resource accelerator. Untuk mengetahui informasi selengkapnya, lihat Menggunakan petunjuk resource.

Memecahkan masalah tugas Dataflow

Jika Anda mengalami masalah saat menjalankan tugas Dataflow dengan GPU, lihat Memecahkan masalah tugas GPU Dataflow.

Langkah selanjutnya