RDG:面向 ML 和 HPC 工作负载的 RoCE 加速 vSphere 6.7 集群部署

创建于 2019 年 6 月 30 日,作者 Boris Kovalev。本参考部署指南 (RDG) 介绍了如何安装和配置采用 GPUDirect RDMA、NVIDIA ConnectX®-4/5 VPI PCI Express 网卡、NVIDIA Spectrum 交换机(运行 ONYX OS)以及基于 DSCP 的 QoS 模式的无损网络上的 RoCE 的 ML 环境。

文档目录

创建于 2019 年 6 月 30 日,作者 Boris Kovalev

简介

参考部署指南 (RDG) 介绍了如何安装和配置采用 GPUDirect RDMA、NVIDIA ConnectX®-4/5 VPI PCI Express 网卡、NVIDIA Spectrum 交换机(运行 ONYX OS)以及基于 DSCP 的 QoS 模式的无损网络上的 RoCE 的 ML 环境。

本指南假设使用 VMware ESXi 6.7 Update 1 原生环境和 NVIDIA Onyx™ 版本 3.6.8190 及以上版本。

参考资料

概述

NVIDIA 加速机器学习

NVIDIA 解决方案加速了许多世界领先的人工智能和机器学习平台以及广泛的应用,涵盖安全、金融、图像和语音识别、自动驾驶汽车和智慧城市等领域。NVIDIA 解决方案使百度、NVIDIA、JD.com、Facebook、PayPal 等公司和组织能够利用机器学习平台增强其竞争优势。

在本文中,我们将展示如何构建由 100 Gbps 以太网上的 RoCE 增强的最高效机器学习集群。

设备分区 (SR-IOV)

PCI 标准包含单根 I/O 虚拟化 (SR-IOV) 规范。单个 PCI 设备可以作为多个逻辑设备(虚拟功能或 VF)呈现给 ESX 和虚拟机。SR-IOV 需要 ESXi 驱动程序和客户机驱动程序。NVIDIA 支持 InfiniBand 和 RoCE 互连的 ESXi SR-IOV。

如何在 ESXi 6.5/6.7 服务器(原生以太网)上为 NVIDIA ConnectX-4/5 网卡系列配置 SR-IOV

缺点无 vMotion,无快照。

VM Direct Path I/O

允许客户机操作系统直接访问 PCI 设备。

  • 示例:用于计算的 GPU (GPGPU)、超低延迟互连(如 InfiniBand 和 RoCE)。

整个设备可供单个虚拟机使用——无共享。无需 ESXi 驱动程序——只需标准供应商设备驱动程序。

如何在 VMware ESXi 6.x 服务器上配置 Nvidia GPU 设备进入和退出 VMDirectPath I/O 直通模式

缺点无 vMotion,无快照。

NVIDIA OFED GPUDirect RDMA

GPUDirect RDMA 是 IB CORE 与对等内存客户端(如 NVIDIA Tesla(Volta、Pascal 类)GPU)之间的 API。它允许 HCA 读/写对等内存数据缓冲区,从而使基于 RDMA 的应用能够利用对等设备的计算能力和 RDMA 互连,而无需将数据复制到主机内存。它通过 RoCE 技术与 NVIDIA ConnectX®-4 及更高版本的 VPI 适配器无缝协作。

GPU-GPU 通信的最新进展是 GPUDirect RDMA。这项新技术提供了 GPU 内存与 NVIDIA HCA 设备之间的直接 P2P(点对点)数据路径。这显著降低了 GPU-GPU 通信延迟,并完全卸载了 CPU,将其从所有跨网络的 GPU-GPU 通信中移除。

1.png

硬件和软件要求

  1. 基于以下 NVIDIA ConnectX®-4/5 HCA 设备之一的网卡的服务器平台。
  2. 交换机为以下 NVIDIA 交换机之一:
  3. 已安装并配置 VMware vSphere 6.7 u1 集群。
  4. 已安装并配置 VMware vCenter 6.7 u1
  5. 对于在直通模式下使用基于 Pascal 和 Volta 架构的 GPU:
  6. NVIDIA® 驱动程序
  7. 安装程序权限:安装需要在目标机器上具有管理员权限。

设置概述

在开始之前,请确保您熟悉 VMware vSphere 和 vCenter 的部署和管理流程。本指南不包含执行所有必需的标准 vSphere 和 vCenter 安装和配置任务的分步说明,因为这些任务通常取决于客户需求。

请确保您了解 Uber Horovod 分布式训练框架,更多信息请参见 GitHub - uber/horovod:TensorFlow、Keras 和 PyTorch 的分布式训练框架

在本指南描述的分布式 TensorFlow/Horovod 配置中,我们使用以下硬件规格。

设备

2.PNG

逻辑设计

3.png

物料清单 (BOM)

物料清单(BOM)

在本指南描述的分布式ML配置中,我们使用以下硬件规格。

image2020-5-21_13-46-42.png

注意: 本文档不涉及服务器的存储方面。您应根据用例(数据集大小)配置服务器的存储组件。

物理网络连接

5.png

vSphere集群设计

网络配置

在我们的参考中,每台服务器使用一个端口。对于单端口网卡,我们连接可用端口;对于双端口网卡,我们将第一个端口连接到以太网交换机,第二个端口不使用。 我们将在后面的“安装NVIDIA OFED”部分介绍具体步骤。 每台服务器通过100GbE铜缆连接到SN2700交换机。 我们的交换机端口连接如下:

  • 第1至第8端口 – 连接到ESXi服务器

服务器名称及网络配置如下:

服务器类型 服务器名称 内部网络 - 100 GigE 管理网络 - 1 GigE
Node 01 clx-mld-41 enp1f0: 31.31.31.41 eno0: 从DHCP获取(保留)
Node 02 clx-mld-42 enp1f0: 31.31.31.42 eno0: 从DHCP获取(保留)
Node 03 clx-mld-43 enp1f0: 31.31.31.43 eno0: 从DHCP获取(保留)
Node 04 clx-mld-44 enp1f0: 31.31.31.44 eno0: 从DHCP获取(保留)
Node 05 clx-mld-45 enp1f0: 31.31.31.45 eno0: 从DHCP获取(保留)
Node 06 clx-mld-46 enp1f0: 31.31.31.46 eno0: 从DHCP获取(保留)
Node 07 clx-mld-47 enp1f0: 31.31.31.47 eno0: 从DHCP获取(保留)
Node 08 clx-mld-48 enp1f0: 31.31.31.48 eno0: 从DHCP获取(保留)

网络交换机配置

如果您不熟悉NVIDIA交换机软件,请从如何开始使用NVIDIA交换机指南开始。 更多信息请参考NVIDIA ONYX用户手册,位于docs.nvidia.com/networking/交换机软件

注意: 第一步请将交换机操作系统更新到最新的ONYX OS软件。请参考社区指南:如何升级NVIDIA交换机系统上的ONYX软件

我们将通过RDMA传输加速HPC或ML应用集群。 RoCE部署有多种行业标准网络配置。 欢迎参考RoCE部署推荐网络配置示例获取我们的建议和说明。 在我们的部署中,我们将配置网络为无损网络,并在主机和交换机侧使用DSCP:

以下是我们的交换机配置,供您参考。您可以复制粘贴到交换机,但请注意这是干净的交换机配置。

并且可能会破坏现有配置:

swx-mld-1-2 [standalone: master] > enable
swx-mld-1-2 [standalone: master] # configure terminal
swx-mld-1-2 [standalone: master] (config) # show running-config
##
## Running database "initial"
## Generated at 2018/03/10 09:38:38 +0000
## Hostname: swx-mld-1-2
##
##
## Running-config temporary prefix mode setting
##
no cli default prefix-modes enable

##
## License keys
##
license install LK2-RESTRICTED_CMDS_GEN2-44T1-4H83-RWA5-G423-GY7U-8A60-E0AH-ABCD

##
## Interface Ethernet buffer configuration
##
traffic pool roce type lossless
traffic pool roce memory percent 50.00
traffic pool roce map switch-priority 3

##
## LLDP configuration
##
lldp
##
## QoS switch configuration
##
interface ethernet 1/1-1/32 qos trust L3
interface ethernet 1/1-1/32 traffic-class 3 congestion-control ecn minimum-absolute 150 maximum-absolute 1500

##
## DCBX ETS configuration
##
interface ethernet 1/1-1/32 traffic-class 6 dcb ets strict

##
## Other IP configuration
##
hostname swx-mld-1-2

##
## AAA remote server configuration
##
# ldap bind-password ********
# radius-server key ********
# tacacs-server key ********

##
## Network management configuration
##
# web proxy auth basic password ********

##
## X.509 certificates configuration
##
#
# Certificate name system-self-signed, ID 108bb9eb3e99edff47fc86e71cba530b6a6b8991
# (public-cert config omitted since private-key config is hidden)

##
## Persistent prefix mode setting
##
cli default prefix-modes enable

环境准备

1. 主机 BIOS

  • 在主机 BIOS 中启用“above 4G decoding”或“memory mapped I/O above 4GB”或“PCI 64-bit resource handing above 4G”。
  • 确保已启用 SR-IOV。
  • 确保已启用“Intel Virtualization Technology”。

2. ESXi 主机软件

ESXi 主机包括:

7.png

💡 ConnectX 网卡驱动在 ESXi 主机上的安装步骤请参见此处

3. VM 模板准备

VM 模板包括:

8.png

3.1. 配置 EFI 启动模式

在 VM 中安装客户机操作系统之前,请确保在固件区域中启用了“EFI”。 为了在虚拟机中正确使用 GPU,客户机操作系统必须以“EFI”模式启动。 访问此设置的步骤:

  1. 右键单击虚拟机,然后单击“编辑设置”。
  2. 单击“VM 选项”。
  3. 单击“启动选项”。
  4. 在“固件”区域中选择“EFI”。

9.png

3.2. 在 VM 中安装客户机操作系统

在虚拟机中安装 Ubuntu 16.04 作为客户机操作系统。

3.3. 在 VM 中安装 Nvidia 驱动

还必须在客户机操作系统中安装标准的供应商 GPU 驱动。

3.4. 为 NVIDIA ConnectX® 5 网卡配置 SR-IOV 并以 SR-IOV 模式向 VM 添加网络适配器

💡 此文章描述了如何为 ESXi 6.7 Native 驱动配置 NVIDIA ConnectX-5 网卡的 SR-IOV(以太网),并以 SR-IOV 模式向 VM 添加网络适配器。

3.5. 将 Nvidia GPU 设备配置为 VMDirectPath I/O 直通模式并将 GPU 设备分配给 VM

💡 此文章描述了如何在 VMware ESXi 6.x 服务器上将 Nvidia GPU 设备配置为 VMDirectPath I/O 直通模式,并将 GPU 设备分配给 VM。

3.6. 调整 VM 的内存映射 I/O 设置

满足上述要求后,必须在 VM 的 VMX 文件中添加两个条目,可以通过直接修改文件或使用 vSphere 客户端添加这些功能。第一个条目是:

pciPassthru.use64bitMMIO="TRUE"

指定第二个条目需要进行简单计算。将所有要直通到 VM 的 GPU 设备的内存大小相加,然后向上取整到下一个 2 的幂。例如,要直通两个 16 GB 的 P100 设备,计算值为:16 + 16 = 32,向上取整到下一个 2 的幂得到 64。在第二个条目中使用此值:

pciPassthru.64bitMMIOSizeGB="64"

对 VMX 文件进行这两项更改后,请按照 vSphere 说明在主机级别启用直通设备,并指定哪些设备应直通到 VM。现在,VM 应该能够以直通模式正确启动设备。

3.7. 在虚拟机模板中安装 NVIDIA OFED

💡 此文章描述了如何在 Linux 上安装 NVIDIA OFED。

完成!

(可选)部署并运行 Horovod 框架

在 VM 模板中安装并配置 Docker。

卸载旧版本

建议运行以下命令卸载旧版本:

sudo apt-get remove docker docker-engine docker.io

如果apt-get报告未安装这些软件包,则无需担心。

/var/lib/docker/目录中的内容(包括镜像、容器、卷和网络)将被保留。

对于Ubuntu 16.04及更高版本,Linux内核包含对OverlayFS的支持,Docker CE将默认使用overlay2存储驱动。

在首次在新主机上安装Docker CE之前,需要设置Docker仓库。之后,您可以从仓库安装和更新Docker。

设置仓库

更新apt软件包索引:

sudo apt-get update

安装允许apt通过HTTPS使用仓库的软件包:

sudo apt-get install apt-transport-https ca-certificates curl software-properties-common

添加Docker的官方GPG密钥:

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

验证密钥指纹是否为9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88

sudo apt-key fingerprint 0EBFCD88
pub 4096R/0EBFCD88 2017-02-22
Key fingerprint = 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid Docker Release (CE deb) <docker@docker.com>
sub 4096R/F273FCD8 2017-02-22

安装Docker CE

安装最新版本的Docker CE,或转到下一步安装特定版本。任何现有的Docker安装都将被替换:

$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce

自定义docker0桥接

推荐使用位于Linux上/etc/docker/目录中的daemon.json文件来配置Docker守护进程。如果文件不存在,请创建它。您可以指定以下一个或多个设置来配置默认桥接网络:

{
"bip": "172.16.41.1/24",
"fixed-cidr": "172.16.41.0/24",
"mtu": 1500,
"dns": ["8.8.8.8","8.8.4.4"]
}

这些选项也可以作为dockerd的标志提供,每个选项的说明如下:

  • --bip=CIDR:为docker0桥接提供特定的IP地址和子网掩码,使用标准CIDR表示法。例如:172.16.41.1/16
  • --fixed-cidr=CIDR:限制docker0子网的IP范围,使用标准CIDR表示法。例如:172.16.41.0/16
  • --mtu=BYTES:覆盖docker0上的最大数据包长度。例如:1500
  • --dns=[]:要使用的DNS服务器。例如:--dns=8.8.8.8,8.8.4.4

修改daemon.json文件后重启Docker:

sudo /etc/init.d/docker restart

设置与外部世界的通信

检查内核中是否启用了IP转发:

sysctl net.ipv4.conf.all.forwarding
net.ipv4.conf.all.forwarding = 1

如果禁用:

net.ipv4.conf.all.forwarding = 0

请启用并再次检查:

sysctl net.ipv4.conf.all.forwarding=1

出于安全原因,Docker配置iptables规则以防止来自主机外部的流量转发到容器。Docker将FORWARD链的默认策略设置为DROP

要覆盖此默认行为,您可以手动更改默认策略:

sudo iptables -P FORWARD ACCEPT

添加特定子网的IP路由

在每个主机上,您需要添加指向其他主机上容器子网的路由。以下是在一个host-41上添加路由的示例:

sudo ip route add 172.16.42.0/24 via 31.13.13.42
sudo ip route add 172.16.43.0/24 via 13.13.13.43
sudo ip route add 172.16.44.0/24 via 13.13.13.44

在每个主机上快速检查

通过启动一个简单容器来快速测试环境:

docker run hello-world

将Nvidia-docker部署到VM模板中

要在Ubuntu 16.04上部署nvidia-docker,请按照以下步骤操作:

  1. 如果已安装nvidia-docker 1.0,需要移除它以及所有现有的GPU容器:
docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
sudo apt-get purge -y nvidia-docker
  1. 添加软件包仓库:
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | \
  sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | \
  sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
  1. 安装nvidia-docker2并重新加载Docker守护进程配置:
sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd
  1. 使用最新的官方CUDA镜像测试nvidia-smi
docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi

将Horovod部署到VM模板中

  1. 该过程说明了如何在Docker容器中构建和运行Horovod框架。

    安装额外的软件包:

sudo apt install libibverbs-dev
sudo apt install libmlx5-dev
  1. 通过链接安装NVIDIA OFED:如何在Linux上安装Mellanox OFED

Horovod VGG 16基准测试结果

Horovod基准测试按照此链接运行。

[图片:Horovod VGG 16基准测试结果]

10.png

完成!

关于作者

image2020-5-21_13-51-10.png Boris Kovalev过去几年,Boris Kovalev在NVIDIA担任解决方案架构师,负责复杂的机器学习和基于VMware的高级云研究与设计。此前,他在多家公司担任高级顾问和解决方案架构师超过15年,最近在VMware工作。他在NVIDIA文档网站上撰写了多份参考设计,涵盖VMware、机器学习、Kubernetes和容器解决方案。

相关文档