YARNでのGPUの使用

前提条件

設定

GPUスケジューリング

resource-types.xml

以下のプロパティを追加します

<configuration>
  <property>
     <name>yarn.resource-types</name>
     <value>yarn.io/gpu</value>
  </property>
</configuration>

yarn-site.xml

GPUスケジューリング/分離を有効にするには、DominantResourceCalculatorを設定する必要があります。

Capacity Schedulerの場合、以下のプロパティを使用してDominantResourceCalculatorを設定します(capacity-scheduler.xml内)

プロパティ デフォルト値
yarn.scheduler.capacity.resource-calculator org.apache.hadoop.yarn.util.resource.DominantResourceCalculator

GPU分離

yarn-site.xml

  <property>
    <name>yarn.nodemanager.resource-plugins</name>
    <value>yarn.io/gpu</value>
  </property>

これは、NodeManager側でGPU分離モジュールを有効にするためです。

デフォルトでは、上記の設定が設定されている場合、YARNは自動的にGPUを検出して設定します。管理者に特別な要件がある場合にのみ、以下の設定をyarn-site.xmlに設定する必要があります。

1) 許可されたGPUデバイス

プロパティ デフォルト値
yarn.nodemanager.resource-plugins.gpu.allowed-gpu-devices auto

YARN NodeManagerによって管理できるGPUデバイスを指定します(コンマ区切り)。GPUデバイスの数は、スケジューリングの決定を行うためにRMに報告されます。auto(デフォルト)に設定すると、YARNはシステムからGPUリソースを自動的に検出します。

GPUデバイスの自動検出に失敗した場合、または管理者がGPUデバイスのサブセットのみをYARNで管理したい場合は、GPUデバイスを手動で指定します。GPUデバイスは、マイナーデバイス番号とインデックスによって識別されます。GPUのマイナーデバイス番号を取得する一般的な方法は、nvidia-smi -qを使用してMinor Number出力を検索することです。

マイナー番号を手動で指定する場合、管理者はGPUのインデックスも含める必要があります。形式はindex:minor_number[,index:minor_number...]です。手動指定の例は、インデックスが0/1/2/3でマイナー番号が0/1/2/4であるGPUデバイスをYARN NodeManagerが管理できるようにするための0:0,1:1,2:2,3:4"です。

2) GPUを検出するための実行可能ファイル

プロパティ
yarn.nodemanager.resource-plugins.gpu.path-to-discovery-executables /absolute/path/to/nvidia-smi

yarn.nodemanager.resource.gpu.allowed-gpu-devices=autoが指定されている場合、YARN NodeManagerはGPU検出バイナリ(現在はnvidia-smiのみをサポート)を実行してGPU関連の情報を取得する必要があります。値が空の場合(デフォルト)、YARN NodeManagerは検出実行可能ファイル自体を検索しようとします。設定値の例:/usr/local/bin/nvidia-smi

3) Dockerプラグイン関連の設定

ユーザーがDockerコンテナ内でGPUアプリケーションを実行する必要がある場合、以下の設定をカスタマイズできます。管理者がnvidia-dockerのデフォルトのインストール/設定に従っている場合は、これらは必要ありません。

プロパティ デフォルト値
yarn.nodemanager.resource-plugins.gpu.docker-plugin nvidia-docker-v1

GPUのdockerコマンドプラグインを指定します。デフォルトではNvidia docker V1.0を使用します。V2.xにはnvidia-docker-v2を使用できます。

プロパティ デフォルト値
yarn.nodemanager.resource-plugins.gpu.docker-plugin.nvidia-docker-v1.endpoint https://127.0.0.1:3476/v1.0/docker/cli

nvidia-docker-pluginのエンドポイントを指定します。ドキュメント:https://github.com/NVIDIA/nvidia-docker/wiki を参照してください。詳細については、こちらをご覧ください。

4) CGroupsマウント

GPU分離では、CGroup デバイスコントローラを使用して、GPUデバイスごとの分離を行います。CGroupサブデバイスを自動的にマウントするには、以下の設定をyarn-site.xmlに追加する必要があります。そうでない場合、管理者はこの機能を使用するためにデバイスサブフォルダを手動で作成する必要があります。

プロパティ デフォルト値
yarn.nodemanager.linux-container-executor.cgroups.mount true

container-executor.cfg

一般的に、以下の設定をcontainer-executor.cfgに追加する必要があります

[gpu]
module.enabled=true

Docker環境以外でGPUアプリケーションを実行する必要がある場合

[cgroups]
# This should be same as yarn.nodemanager.linux-container-executor.cgroups.mount-path inside yarn-site.xml
root=/sys/fs/cgroup
# This should be same as yarn.nodemanager.linux-container-executor.cgroups.hierarchy inside yarn-site.xml
yarn-hierarchy=yarn

Docker環境でGPUアプリケーションを実行する必要がある場合

1) dockerセクションにGPU関連のデバイスを追加します

コンマ区切りの値。ls /dev/nvidia*を実行することで取得できます。

[docker]
docker.allowed.devices=/dev/nvidiactl,/dev/nvidia-uvm,/dev/nvidia-uvm-tools,/dev/nvidia1,/dev/nvidia0

2) ボリュームドライバのホワイトリストにnvidia-dockerを追加します。

[docker]
...
docker.allowed.volume-drivers

3) 読み取り専用マウントのホワイトリストにnvidia_driver_<version>を追加します。

[docker]
...
docker.allowed.ro-mounts=nvidia_driver_375.66

4) gpu docker pluginとしてnvidia-docker-v2を使用する場合は、ランタイムのホワイトリストに`nvidia`を追加します。

[docker]
...
docker.allowed.runtimes=nvidia

使用方法

分散シェル + GPU

分散シェルは現在、メモリとvcore以外の追加のリソースタイプを指定することをサポートしています。

Dockerを使用しない分散シェル + GPU

dockerコンテナを使用せずに分散シェルを実行します(2つのタスクを要求し、各タスクは3GBのメモリ、1つのvcore、2つのGPUデバイスリソースを持ちます)

yarn jar <path/to/hadoop-yarn-applications-distributedshell.jar> \
  -jar <path/to/hadoop-yarn-applications-distributedshell.jar> \
  -shell_command /usr/local/nvidia/bin/nvidia-smi \
  -container_resources memory-mb=3072,vcores=1,yarn.io/gpu=2 \
  -num_containers 2

次のような出力が表示されるはずです

Tue Dec  5 22:21:47 2017
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.66                 Driver Version: 375.66                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla P100-PCIE...  Off  | 0000:04:00.0     Off |                    0 |
| N/A   30C    P0    24W / 250W |      0MiB / 12193MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla P100-PCIE...  Off  | 0000:82:00.0     Off |                    0 |
| N/A   34C    P0    25W / 250W |      0MiB / 12193MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID  Type  Process name                               Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

起動されたコンテナタスクの場合。

Dockerを使用した分散シェル + GPU

Dockerコンテナを使用して分散シェルを実行することもできます。dockerコンテナを使用するには、YARN_CONTAINER_RUNTIME_TYPE/YARN_CONTAINER_RUNTIME_DOCKER_IMAGEを指定する必要があります。

yarn jar <path/to/hadoop-yarn-applications-distributedshell.jar> \
       -jar <path/to/hadoop-yarn-applications-distributedshell.jar> \
       -shell_env YARN_CONTAINER_RUNTIME_TYPE=docker \
       -shell_env YARN_CONTAINER_RUNTIME_DOCKER_IMAGE=<docker-image-name> \
       -shell_command nvidia-smi \
       -container_resources memory-mb=3072,vcores=1,yarn.io/gpu=2 \
       -num_containers 2