1. 程式人生 > >Hadoop 3.1.1 - Yarn - 使用 GPU

Hadoop 3.1.1 - Yarn - 使用 GPU

fig tools plugins vid div 控制 target nal endpoint

在 Yarn 上使用 GPU

前提

  • 目前,Yarn 只支持 Nvidia GPU。
  • YARN NodeManager 所在機器必須預先安裝了 Nvidia 驅動器。
  • 如果使用 Docker 作為容器的運行時上下文,需要安裝 nvidia-docker 1.0(這是 Yarn 當前所能支持的版本)。

配置

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,在 capacity-scheduler.xml 中使用如下參數以配置 DominantResourceCalculator

參數默認值
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 設備

PropertyDefault value
yarn.nodemanager.resource-plugins.gpu.allowed-gpu-devices auto

指明由 Yarn NodeManager 管理的 GPU 設備,用逗號分隔。GPU 卡的數量將被匯報給 ResourceManager用於調度。默認值 auto 代表讓 YARN 從系統中自動發現 GPU 卡。

如果自動探測會失敗或者管理員只希望一部分的 GPU 卡被 Yarn 管理,請人為地指明可用的 GPU 卡。GPU 卡由次設備號和順序索引來標識。可以通過執行 nvidia-smi -q 並在標準輸出中查找 Minor Number 關鍵字,來獲取 GPU 卡的次設備號。

當次版本號被特別指定,管理員還需要提供 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 的 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。

參數默認值
yarn.nodemanager.resource-plugins.gpu.docker-plugin.nvidia-docker-v1.endpoint http://localhost:3476/v1.0/docker/cli

指定 nvidia-docker-plugin 的服務入口。請參閱 https://github.com/NVIDIA/nvidia-docker/wiki 以獲得更多信息。

4) CGroup 掛載

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]
# 應和 yarn-site.xml 中的 yarn.nodemanager.linux-container-executor.cgroups.mount-path 保持一致
root=/sys/fs/cgroup
# 應和 yarn-site.xml 中的 yarn.nodemanager.linux-container-executor.cgroups.hierarchy 保持一致
yarn-hierarchy=yarn

如果用戶要在 Docker 環境下運行 GPU 程序:

1) 將 GPU 相關的設備添加到 Docker 段。

執行命令 ls /dev/nvidia* 獲取 GPU 相關的設備,用逗號分隔將它們添加到配置文件中。

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

2) 將 nvidia-docker 添加到 volume-driver 白名單。

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

3) 添加 nvidia_driver_<version> 到只讀掛載的白名單。

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

使用

Distributed-shell + GPU

分布式 Shell 程序在內存和虛擬核之外,還支持申請更多的資源類型。

不使用 Docker 運行 Distributed-shell + GPU

不使用 Docker 運行分布式 Shell 程序(申請 2 個任務,每個任務消費 3GB 內存、1 虛擬核和 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 的 Distributed-shell + GPU

同樣可以使用 Docker 容器來允許分布式 Shell 程序,請提供 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

Hadoop 3.1.1 - Yarn - 使用 GPU