DatabricksのGPU有効化クラスター

[GPU\-enabled clusters \| Databricks on AWS](https://docs.databricks.com/clusters/gpu.html) [2023/1/31時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

:::note
**注意**
いくつかのGPU有効化インスタンスタイプは**ベータ**であり、クラスター作成時にドライバーやワーカータイプを選択する際、ドロップダウンにその旨を知らせるマークが表示されます。
:::

# 概要

Databricksでは、graphics processing units (GPU)による高速化クラスターをサポートしています。本書では、どのようにGPU有効化クラスターを作成するのか、それらのインスタンスにインストールされているGPUドライバーとライブラリを説明します。

GPU有効化クラスターにおけるディープラーニングに関しては、[Deep learning](https://docs.databricks.com/machine-learning/train-model/deep-learning.html)をご覧ください。

# GPUクラスターの作成

GPUクラスターの作成は他のSparkクラスターの作成と同様です([Databricksクラスター](https://qiita.com/taka_yayoi/items/c5d99cd77fe4bfcf69f0)をご覧ください)。以下に注意する必要があります。

- **Databricks Runtime Version**は、**Runtime 9.1 LTS ML (GPU, Scala 2.12, Spark 3.1.2)**のようにGPU有効化バージョンである必要があります。
- **Worker Type**と**Driver Type**はGPUインスタンスタイプである必要があります。
- Sparkを必要としないシングルマシンのワークフローにおいては、ワーカー数をゼロに設定することができます。

Databrikcsでは以下のGPU高速化インスタンスタイプをサポートしています。

- [P2 instance type series](https://aws.amazon.com/ec2/instance-types/p2/): p2.xlarge, p2.8xlarge, p2.16xlarge
    - P2インスタンスは特定のAWSリージョンでのみ使用できます。詳細については、[Amazon EC2 Pricing](https://aws.amazon.com/ec2/pricing/on-demand/)をご覧ください。GPU有効化クラスターを起動するために、ご自身のDatabricksデプロイメントがサポートされているリージョンに存在している必要があります。
    - P2インスタンスの[オンデマンドのデフォルト制限数は1です](https://aws.amazon.com/ec2/faqs/#How_many_instances_can_I_run_in_Amazon_EC2)。
    - P2インスタンスではストレージのためのEBSが必要です。
- [P3 instance type series](https://aws.amazon.com/ec2/instance-types/p3/): p3.2xlarge, p3.8xlarge, p3.16xlarge
    - P3インスタンスは特定のAWSリージョンでのみ使用できます。詳細については、[Amazon EC2 Pricing](https://aws.amazon.com/ec2/pricing/on-demand/)をご覧ください。GPU有効化クラスターを起動するために、ご自身のDatabricksデプロイメントがサポートされているリージョンに存在している必要があります。
- [P4d instance type series](https://aws.amazon.com/ec2/instance-types/p4/): p4d.24xlarge
    - P4dインスタンスではDatabricksランタイム9.1 LTS ML以降が必要です。
- プロダクションに機械学習モデルをデプロイすることに最適化されている[G4 instance type series](https://aws.amazon.com/ec2/instance-types/g4/)
- 画像を大量に使用する様々なユースケースや機械学習ユースケースで使用できる[G5 instance type series](https://aws.amazon.com/ec2/instance-types/g5/)
    - G5インスタンスではDatabricksランタイム9.1 LTS ML以降が必要です。

すべてのGPU高速化インスタンスタイプでは、以下のことに留意してください。
- Amazonのスポットインスタンス価格の高騰によって、GPUスポットインスタンスを保持することは困難です。必要であればオンデマンドを使用してください。
- GPU有効化クラスターを作成するためには、[制限の増加をリクエスト](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-resource-limits.html)する必要があるかもしれません。

サポートされているGPUインスタンスタイプとそれらの特性の一覧については、[Supported Instance Types](https://databricks.com/product/aws-pricing/instance-types)をご覧ください。

# GPUのスケジューリング

Databricksランタイムは、Apache Spark 3.0による[GPUアウェアスケジューリング](https://spark.apache.org/docs/3.0.0-preview/configuration.html#custom-resource-scheduling-and-configuration-overview)をサポートしています。GPUクラスターでは事前に設定がなされています。

GPUスケジューリングはシングルノードクラスターでは有効化されていません。

`spark.task.resource.gpu.amount`は、あなたによって変更する必要があるかもしれない唯一のGPUアウェアスケジューリングに関係するSpark設定です。デフォルト設定ではタスク当たり一つのGPUを使用し、すべてのGPUノードを使用している際、分散推論ワークロードや分散トレーニングでは理想的なものとなります。分散トレーニングの過程で生じる通信のオーバーヘッドを削減するために、ノードのサブセットで分散トレーニングを行う際、[Spark設定](https://qiita.com/taka_yayoi/items/8d951b660cd87c6c5f18#spark%E3%81%AE%E8%A8%AD%E5%AE%9A)でワーカーノードあたりのGPU数に`spark.task.resource.gpu.amount`を設定することをお勧めしています。

PySparkタスクにおいては、Databricksは割り当てられたGPUにインデックス0,1,...を自動で再マッピングします。タスクあたり1つのGPUを使用するデフォルト設定では、どのGPUがタスクに割り当てられているのかをチェックすることなしに、シンプルにデフォルトGPUを使用します。たとえば4つなど、タスクに複数のGPUを割り当てると、お使いのコードは割り当てられたGPUのインデックスは常に0,1,2,3であると仮定します。割り当てられたGPUの物理的なインデックスを必要とするのであれば、環境変数`CUDA_VISIBLE_DEVICES`から取得することができます。

Scalaを使用している場合、タスクに割り当てら得ているGPUのインデックスは`TaskContext.resources().get("gpu")`で取得することができます。

Databricksランタイム7.0以前では、複数のSparkタスクが同じGPUを使用することによる競合を避けるために、Databricksはノードあたりの実行タスクの最大数が1になるようにGPUクラスターを設定します。これによって、他のタスクと競合することなしに、タスクはノードのすべてのGPUを使用することができます。

# NVIDIA GPUドライバー、CUDA、cuDNN

Databricksでは、SparkドライバーとワーカーのインスタンスでGPUを使用するために必要なNVDIAドライバーとライブラリをインストールします。

- `/usr/local/cuda`にインストールされる[CUDA Toolkit](https://developer.nvidia.com/cuda-toolkit)
- [cuDNN](https://developer.nvidia.com/cudnn): NVIDIA CUDA Deep Neural Network Library
- [NCCL](https://developer.nvidia.com/nccl): NVIDIA Collective Communications Library

インストールされるNVIDIAドライバーのバージョンは、CUDA 11.0をサポートする470.57.02です。

インストールされるライブラリのバージョンに関しては、使用しているDatabricksランタイムバージョンの[release notes](https://docs.databricks.com/release-notes/runtime/index.html#runtime-release-notes)をご覧ください。

:::note
**注意**
このソフトウェアにはNVIDIA Corporationによって提供されるソースコードが含まれています。得に、GPUをサポートするためにDatabricksでは[CUDA Samples](https://docs.nvidia.com/cuda/eula/#nvidia-cuda-samples-preface)のコードを含めています。
:::

# NVIDIAエンドユーザーライセンスアグリーメント(EULA)

DatabricksでGPU有効化「Databricksランタイムバージョン」を選択する際、暗黙的にCUDA、cuDNN、Teslaライブラリに関する[NVIDIA EULA](https://docs.databricks.com/_extras/documents/nvidia-cloud-end-user-license-agreement_clean.pdf)で説明されている利用条件、NCCLライブラリに関する[NVIDIA End User License Agreement \(with NCCL Supplement\)](https://docs.nvidia.com/deeplearning/sdk/nccl-sla/index.html#supplement/)に同意することになります。

# GPUクラスターにおけるDatabricksコンテナサービス

:::note info
**プレビュー**
本機能は[パブリックプレビュー](https://docs.databricks.com/release-notes/release-types.html)です。
:::

可搬性のあるディープラーニング環境とカスタマイズしたライブラリを作成するために、GPUクラスターで[Databricksコンテナサービス](https://qiita.com/taka_yayoi/items/506fa9b15fd07fcac141)を使用することができます。手順については、[Databricksコンテナサービスによるコンテナのカスタマイズ](https://qiita.com/taka_yayoi/items/506fa9b15fd07fcac141)をご覧ください。

GPUクラスター向けカスタムイメージを作成するには、GPU向けDatabricks機械学習ランタイムではなく、標準のランタイムバージョンを選択する必要があります。**Use your own Docker container**を選択する際、標準ランタイムバージョンのGPUクラスターを選択することができます。GPUクラスターのカスタムイメージは[official CUDA containers](https://hub.docker.com/r/nvidia/cuda/)をベースとしており、これはGPU向けDatabricks機械学習ランタイムとは異なるものです。

GPUクラスターのカスタムイメージを作成する際、NVIDAドライバーのバージョンを変更することができません。これは、ホストマシンとドライバーバージョンが一致しなくてはならないためです。

`databricksruntime` [Docker Hub](https://hub.docker.com/u/databricksruntime)には、GPU機能を伴うサンプルベースイメージが含まれています。これらのイメージを生成するために使用されるDockerfileは[example containers GitHub repository](https://github.com/databricks/containers/tree/master/ubuntu/gpu)に配置されており、提供されているサンプルイメージの詳細やカスタマイズ方法も含まれています。

# エラーメッセージ

- 以下のエラーはAWSクラウドプロバイダーがリクエストされた計算資源を満たす十分なキャパシティがないことを意味します。

    `Error: Cluster terminated. Reason: AWS Insufficient Instance Capacity Failure`

   これを解決するには、別のアベイラビリティゾーンでクラスターを作成してみることができます。**Advanced options**の下の[クラスター設定](https://qiita.com/taka_yayoi/items/8d951b660cd87c6c5f18#aws%E3%81%AE%E8%A8%AD%E5%AE%9A)でアベイラビリティゾーンを設定することができます。追加のクォータを発注するために[AWS reserved instances pricing](https://aws.amazon.com/ec2/pricing/reserved-instances/pricing/)を確認いただくこともできます。
- クラスターでP4dやG5インスタンスタイプとDatabricks Runtime 7.3 LTS MLを使用している場合、CUDAパッケージバージョン7.3は新しいGPUインスタンスタイプと互換性がありません。この場合、TensorFlow KerasやPyTorchのようなMLパッケージは以下のようなエラーを引き起こします。
    - TensorFlow Keras: `InternalError: CUDA runtime implicit initialization on GPU:x failed. Status: device kernel image is invalid`
    - PyTorch: `UserWarning: NVIDIA A100-SXM4-40GB with CUDA capability sm_80 is not compatible with the current PyTorch installation.`

Databricks Runtime 10.4 LTS ML以降にアップグレードすることでこれらのエラーを解消することができます。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)