zoukankan      html  css  js  c++  java
  • 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--Populating Next Right Pointers in Each Node II
    leetcode—Populating Next Right Pointers in Each Node
    Pascal's Triangle II
    leetcode—pascal triangle
    leetcode—triangle
    October 23rd, 2017 Week 43rd Monday
    October 22nd, 2017 Week 43rd Sunday
    October 21st 2017 Week 42nd Saturday
    October 20th 2017 Week 42nd Friday
    October 19th 2017 Week 42nd Thursday
  • 原文地址:https://www.cnblogs.com/shishaochen/p/9654973.html
Copyright © 2011-2022 走看看