Attaching GPUs to clusters

Dataproc provides the ability for graphics processing units (GPUs) to be attached to the master and worker Compute Engine nodes in a Dataproc cluster. You can use these GPUs to accelerate specific workloads on your instances, such as machine learning and data processing.

For more information about what you can do with GPUs and what types of GPU hardware are available, read GPUs on Compute Engine.

Before you begin

  • GPUs require special drivers and software. These items are not pre-installed on Cloud Dataproc clusters.
  • Read about GPU pricing on Compute Engine to understand the cost to use GPUs in your instances.
  • GPUs cannot be attached to preemptible virtual machines in Dataproc clusters.
  • Read about restrictions for instances with GPUs to learn how these instances function differently from non-GPU instances.
  • Check the quotas page for your project to ensure that you have sufficient GPU quota (NVIDIA_K80_GPUS, NVIDIA_P100_GPUS, or NVIDIA_V100_GPUS) available in your project. If GPUs are not listed on the quotas page or you require additional GPU quota, request a quota increase.

Types of GPUs

Cloud Dataproc nodes support the following GPU types. You must specify GPU type when attaching GPUs to your Cloud Dataproc cluster.

  • nvidia-tesla-k80 - NVIDIA® Tesla® K80
  • nvidia-tesla-p100 - NVIDIA® Tesla® P100
  • nvidia-tesla-v100 - NVIDIA® Tesla® V100
  • nvidia-tesla-p4 - NVIDIA® Tesla® P4
  • nvidia-tesla-t4 - NVIDIA® Tesla® T4
  • nvidia-tesla-p100-vws - NVIDIA® Tesla® P100 Virtual Workstations
  • nvidia-tesla-p4-vws - NVIDIA® Tesla® P4 Virtual Workstations
  • nvidia-tesla-t4-vws - NVIDIA® Tesla® T4 Virtual Workstations

Attaching GPUs to clusters


Attach GPUs to the master and primary and preemptible worker nodes in a Cloud Dataproc cluster when creating the cluster using the ‑‑master-accelerator, ‑‑worker-accelerator, and ‑‑preemptible-accelerator flags. These flags take the following two values:

  1. the type of GPU to attach to a node, and
  2. the number of GPUs to attach to the node.

The type of GPU is required, and the number of GPUs is optional (the default is 1 GPU).


gcloud dataproc clusters create args \
  --master-accelerator type=nvidia-tesla-k80 \
  --worker-accelerator type=nvidia-tesla-k80,count=4 \
  --preemptible-worker-accelerator type=nvidia-tesla-k80,count=4

To use GPUs in your cluster, you must install GPU drivers.


Attach GPUs to the master and primary and preemptible worker nodes in a Dataproc cluster by filling in the InstanceGroupConfig.AcceleratorConfig acceleratorTypeUri and acceleratorCount fields as part of the cluster.create API request.


Click Customize in the master and worker nodes sections of the Create a cluster page in the Cloud Console to specify the number of GPUs and GPU type for the nodes.

Installing GPU drivers

GPU drivers are required to utilize any GPUs attached to Cloud Dataproc nodes. The easiest way to do this is to create an initialization action, which is used when you create a cluster. Installing GPU drivers and libraries in an initialization action may require several minutes.

This initialization action installs NVIDIA GPU drivers from the non-free component of Debian 9 Stretch backports repository. More recent drivers may be available from the NVIDIA driver download site (for "Operating System", select "Show all Operating Systems"→"Linux 64 Bit" for Debian 9 compatible drivers.). Installing GPU drivers and libraries in an initialization action may require several minutes. You can save a copy of this initialization action in a Cloud Storage bucket for use with Cloud Dataproc.


set -e -x

apt-get update
apt-get install -y pciutils
if ! (lspci | grep -q NVIDIA); then
  echo 'No NVIDIA card detected. Skipping installation.' >&2
  exit 0

# Add non-free Debian 9 Stretch packages.
# See
for type in deb deb-src; do
  for distro in stretch stretch-backports; do
    for component in contrib non-free; do
      echo "${type} ${distro} ${component}" \
          >> /etc/apt/sources.list.d/non-free.list
apt-get update

# Install proprietary NVIDIA Drivers and CUDA
# See
export DEBIAN_FRONTEND=noninteractive
apt-get install -y "linux-headers-$(uname -r)"
# Without --no-install-recommends this takes a very long time.
apt-get install -y -t stretch-backports --no-install-recommends \
  nvidia-cuda-toolkit nvidia-kernel-common nvidia-driver nvidia-smi

# Create a system wide NVBLAS config
# See
# Insert here the CPU BLAS fallback library of your choice.
# The standard defaults to OpenBLAS, which does not have the
# requisite CBLAS API.
NVBLAS_CPU_BLAS_LIB /usr/lib/libblas/

# Use all GPUs

# Add more configuration here.
echo "NVBLAS_CONFIG_FILE=${NVBLAS_CONFIG_FILE}" >> /etc/environment

# Rebooting during an initialization action is not recommended, so just
# dynamically load kernel modules. If you want to run an X server, it is
# recommended that you schedule a reboot to occur after the initialization
# action finishes.
modprobe -r nouveau
modprobe nvidia-current
modprobe nvidia-drm
modprobe nvidia-uvm
modprobe drm

# Restart any NodeManagers so they pick up the NVBLAS config.
if systemctl status hadoop-yarn-nodemanager; then
  systemctl restart hadoop-yarn-nodemanager

Verifying GPU driver install

After you have finished installing the GPU driver on your Cloud Dataproc nodes, you can verify that the driver is functioning properly. SSH into the master node of your Cloud Dataproc cluster and run the following command:


If the driver is functioning properly, the output will display the driver version and GPU statistics (see Verifying the GPU driver install).

Spark configuration

When submitting jobs to Spark, you can use the following Spark Configuration to load needed libraries.

Example GPU job

You can test GPUs on Cloud Dataproc by running any of the following jobs, which benefit when run with GPUs:

  1. Run one of the Spark ML examples.
  2. Run the following example with spark-shell to run a matrix computation:
import org.apache.spark.mllib.linalg._
import org.apache.spark.mllib.linalg.distributed._
import java.util.Random

def makeRandomSquareBlockMatrix(rowsPerBlock: Int, nBlocks: Int): BlockMatrix = {
  val range = sc.parallelize(1 to nBlocks)
  val indices = range.cartesian(range)
  return new BlockMatrix(
          ij => (ij, Matrices.rand(rowsPerBlock, rowsPerBlock, new Random()))),
      rowsPerBlock, rowsPerBlock, 0, 0)

val N = 1024 * 5
val n = 2
val mat1 = makeRandomSquareBlockMatrix(N, n)
val mat2 = makeRandomSquareBlockMatrix(N, n)
val mat3 = mat1.multiply(mat2)
println("Processing complete!")

What's Next

Kunde den här sidan hjälpa dig? Berätta:

Skicka feedback om ...

Cloud Dataproc Documentation
Behöver du hjälp? Besök vår supportsida.