在 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 |
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 目前支持指定除了内存和 vcore 之外的其他资源类型。
在不使用 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 | +-----------------------------------------------------------------------------+
对于已启动的容器任务。
您还可以使用 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