• Hadoop 3.1.1


    在 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
  • 相关阅读:
    leetcode 之 Palindrome Partitioning
    虚拟机共享文件夹下tar
    leetcode 之 Excel Sheet Column Number
    AndroidHttpClient & jsoup 解析 正方教务系统
    查看android下的分区表
    ubuntukylin 下编译 android4.4
    android:layout_weight 和 android: weightSum的使用
    Intent 与Bundle的传值关系
    使用自定义的Toast
    SlideMenu例子解析2
  • 原文地址:https://www.cnblogs.com/shishaochen/p/9654973.html
Copyright © 2020-2023  润新知