クラスタへの GPU の接続

Cloud Dataproc では、Cloud Dataproc クラスタ内の Compute Engine のマスターノードとワーカーノードに、グラフィック プロセッシング ユニット(GPU)を接続できます。これらの GPU を使用して、機械学習やデータ処理などの特定のワークロードをインスタンス上で高速化できます。

GPU の機能と、使用できる GPU ハードウェアのタイプの詳細については、Compute Engine の GPU をご覧ください。

準備

  • GPU には、特別なドライバとソフトウェアが必要です。これらは Cloud Dataproc クラスタにプリインストールされていません。
  • お使いのインスタンスで GPU を使用する場合のコストについては、Compute Engine での GPU の料金をご覧ください。
  • GPU を Dataproc クラスタのプリエンプティブルな仮想マシンに接続することはできません。
  • GPU を使用するインスタンスと GPU を使用しないインスタンスの機能面の違いについては、GPU を使用したインスタンスに関する制限をご覧ください。
  • プロジェクトの [割り当て] ページで、プロジェクトに十分な GPU 割り当て(NVIDIA_K80_GPUSNVIDIA_P100_GPUSNVIDIA_V100_GPUS)を使用できることを確認してください。GPU が割り当てページにリストされていない場合、またはさらに GPU 割り当てが必要な場合は、割り当ての増量をリクエストしてください。

GPU のタイプ

Cloud Dataproc ノードは、以下の GPU タイプをサポートしています。Cloud Dataproc クラスタに GPU を接続するときには、GPU のタイプを指定する必要があります。

  • 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 仮想ワークステーション
  • nvidia-tesla-p4-vws - NVIDIA® Tesla® P4 仮想ワークステーション
  • nvidia-tesla-t4-vws - NVIDIA® Tesla® T4 仮想ワークステーション

クラスタへの GPU の接続

gcloud

‑‑master-accelerator フラグと ‑‑worker-accelerator フラグを使用して、クラスタを作成するときに GPU を Cloud Dataproc クラスタのマスターノードおよびワーカーノードに接続します。これらのフラグの値は、次の 2 つになります。

  1. ノードに接続する GPU のタイプ
  2. ノードに接続する GPU の数

GPU のタイプは必須で、GPU の数は省略可能です(デフォルトは 1 GPU)。

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

クラスタで GPU を使用するには、GPU ドライバをインストールする必要があります。

REST API

GPU を Cloud Dataproc クラスタのマスターノードおよびワーカーノードに接続するには、InstanceGroupConfig.AcceleratorConfig acceleratorTypeUri フィールドと acceleratorCount フィールドに、値を cluster.create API リクエストの一部として入力します。

Console

GCP Console で GPU を接続したクラスタを作成するためのサポートは、Cloud Dataproc の将来のリリースで追加されます。

GPU ドライバのインストール

Cloud Dataproc ノードに接続された GPU を利用するには、GPU ドライバが必要です。ドライバをインストールする最も簡単な方法は、クラスタを作成するときに使用される初期化アクションを作成することです。初期化アクションで GPU ドライバおよびライブラリをインストールすると、数分かかる場合があります。

この初期化アクションは、Debian 8 Jessie backports リポジトリの有償のコンポーネントから NVIDIA GPU ドライバをインストールします。最新のドライバは、NVIDIA ドライバ ダウンロード サイトから入手できます(Debian 8 互換ドライバの場合、[Operating System] で [Show all Operating Systems] → [Linux 64 Bit] を選択します)。初期化アクションで GPU ドライバおよびライブラリをインストールすると、数分かかる場合があります。この初期化アクションのコピーを Cloud Storage バケットに保存し、Cloud Dataproc で使用できます。

#!/bin/bash

set -e -x

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

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

# Install proprietary NVIDIA Drivers and CUDA
# See https://wiki.debian.org/NvidiaGraphicsDrivers
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 http://docs.nvidia.com/cuda/nvblas/
NVBLAS_CONFIG_FILE=/etc/nvidia/nvblas.conf
cat << EOF >> ${NVBLAS_CONFIG_FILE}
# Insert here the CPU BLAS fallback library of your choice.
# The standard libblas.so.3 defaults to OpenBLAS, which does not have the
# requisite CBLAS API.
NVBLAS_CPU_BLAS_LIB /usr/lib/libblas/libblas.so

# Use all GPUs
NVBLAS_GPU_LIST ALL

# Add more configuration here.
EOF
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
fi

GPU ドライバのインストールの確認

Cloud Dataproc ノードへの GPU ドライバのインストールが終了した後は、ドライバが正常に機能していることを確認できます。Cloud Dataproc クラスタのマスターノードに SSH 接続して、次のコマンドを実行します。

nvidia-smi

ドライバが正常に機能している場合は、ドライバのバージョンと GPU の統計情報が出力に表示されます(GPU ドライバのインストールの確認をご覧ください)。

Spark の構成

Spark にジョブを送信するときは、次の Spark 構成を使用して、必要なライブラリを読み込むことができます。

spark.executorEnv.LD_PRELOAD=libnvblas.so

GPU ジョブの例

GPU で実行するとメリットのある次のどちらかのジョブを実行することで、Cloud Dataproc での GPU をテストできます。

  1. Spark ML の例のいずれかを実行します。
  2. spark-shell で次の例を実行して、行列計算を実行します。
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(
      indices.map(
          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)
mat3.blocks.persist.count
println("Processing complete!")

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Cloud Dataproc ドキュメント
ご不明な点がありましたら、Google のサポートページをご覧ください。