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 |
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
分散シェルは現在、メモリとvcore以外の追加のリソースタイプを指定することをサポートしています。
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コンテナを使用して分散シェルを実行することもできます。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