在 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 并搜索 Minor Number 输出。

当手动指定次要编号时,管理员还需要包括 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 http://localhost:3476/v1.0/docker/cli

指定 nvidia-docker-plugin 的端点。请参阅文档:https://github.com/NVIDIA/nvidia-docker/wiki 了解更多详情。

4) CGroups 挂载

GPU 隔离使用 CGroup 设备控制器 来执行每个 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