在 YARN 上使用 GPU

先決條件

設定檔

GPU 排程

resource-types.xml

新增以下屬性

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

yarn-site.xml

DominantResourceCalculator 必須設定為啟用 GPU 排程/隔離。

對於 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 裝置失敗,或管理員只想讓 YARN 管理部分 GPU 裝置,請手動指定 GPU 裝置。GPU 裝置由其次要裝置編號和索引識別。取得 GPU 次要裝置編號的常見方法是使用 nvidia-smi -q 並搜尋 次要編號 輸出。

當手動指定次要編號時,管理員也需要包含 GPU 的索引,格式為 index:minor_number[,index:minor_number...]。手動指定的範例為 0:0,1:1,2:2,3:4",允許 YARN NodeManager 管理索引為 0/1/2/3,次要編號為 0/1/2/4 的 GPU 裝置。

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,nvidia-docker-v2 可用於 V2.x。

屬性 預設值
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 devices 控制器 來執行每個 GPU 裝置隔離。應將下列組態新增至 yarn-site.xml 以自動掛載 CGroup 子裝置,否則管理員必須手動建立裝置子資料夾才能使用此功能。

屬性 預設值
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) 將 GPU 相關裝置新增至 docker 區段

以逗號分隔的值,您可以透過執行 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) 如果使用 nvidia-docker-v2 作為 gpu docker 外掛程式,請將 nvidia 新增至執行時期白名單。

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

使用它

分散式 shell + GPU

分散式 shell 目前支援指定記憶體和 vcore 以外的其他資源類型。

分散式 shell + GPU(不含 Docker)

在不使用 docker 容器的情況下執行分散式 shell(要求 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                                                 |
+-----------------------------------------------------------------------------+

對於已啟動的容器工作。

分散式 shell + GPU(含 Docker)

您也可以使用 Docker 容器執行分散式 shell。必須指定 YARN_CONTAINER_RUNTIME_TYPE/YARN_CONTAINER_RUNTIME_DOCKER_IMAGE 才能使用 docker 容器。

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