Nvidia-Industries

2022-01-10 12:10:05 917

介绍

OpenStack 包括对 HDR(200 Gigabit)InfiniBand 网络上的裸机云服务的原生上游支持,使客户能够在具有安全功能的多租户裸机云上轻松部署和运行具有 RDMA/IPoIB 支持的 HPC 和 AI 工作负载以及 InfiniBand低延迟、高数据吞吐量、网内计算等。

下面Reference Deployment GUIDE(RDG)显示开栈裸机云为HPC / AI多用户负载的完整部署加速由NVIDIA GPU和NVIDIA的InfiniBand HDR 200GB / s的织物。RDG 涵盖单机架参考部署,可轻松扩展为多机架解决方案。

此 RDG 包括解决方案设计、规模注意事项、硬件 BoM(物料清单)以及在 InfiniBand 结构上的 Bare Metal 租户实例之间部署、提供服务和执行基于 GPUDirect 的基准测试的步骤。

以下解决方案基于 OpenStack RDO(“Ussuri”版本)作为云平台,使用 TripleO 软件部署集成的 InfiniBand 支持。


可下载的内容

本文中用到的所有配置文件都可以在这里下载:  OPSTK_IB_BM_RDG.zip

解决方案架构

关键部件和技术

  • NVIDIA Tesla V100 GPU是有史以来先进的数据中心 GPU,用于加速人工智能、高性能计算 (HPC)、数据科学和图形。它采用 NVIDIA Volta 架构,提供 16GB 和 32GB 配置,并在单个 GPU 中提供高达 32 个 CPU 的性能。

  • NVIDIA Mellanox ConnectX-6 VPI HDR/200GbE 智能适配器 ,支持网络计算、可扩展分层聚合和减少协议 (SHARP)™ 的附加组件以及增强的拥塞控制,最大限度地加速高性能计算、机器学习、云、数据分析和存储平台。

  • NVIDIA Mellanox Quantum HDR 200Gb/s InfiniBand 智能交换机是世界上智能的交换机,通过协同设计可扩展分层聚合和缩减协议 (SHARP)™ 技术实现网络内计算。QM8700 系列拥有市场上最高的结构性能,高达 16Tb/s 的无阻塞带宽和低于 130ns 的端口到端口延迟。

  • NVIDIA  Mellanox LinkX 电缆和收发器系列为云、HPC、Web 2.0、企业、电信和存储数据中心应用程序提供业界最完整的10、25、40、50、100、200 和 400G 互连产品系列。

  • GPUDirect RDMA 支持外围 PCIe 设备直接访问 GPU 内存。GPUDirect RDMA 专为满足 GPU 加速需求而设计,提供远程系统中 NVIDIA GPU 之间的直接通信。这消除了系统 CPU 和通过系统内存所需的数据缓冲区副本,从而提高了性能。 本文演示的带宽测试中使用了 GPUDirect RDMA 技术

逻辑设计

下面是解决方案逻辑设计的说明。

Sinoinfo_Pic

图片备注

  • 单个 HDR 200Gb/s IB 结构用于租户和 OpenStack 控制网络。Fabric 向后兼容 EDR 100Gb/s 适配器和电缆

  • Neutron 组件 (api/dhcp/l3) 包括在控制器节点上支持 InfiniBand 所需的代码

  • Fabric 管理节点负责将 OpenStack 操作转换为基于 IB 的安全高速网络层的配置

面料设计

结构拓扑

下面是解决方案的结构拓扑图。

Sinoinfo_Pic

参考架构规模

  1. 单一交换机解决方案的初始设置:

    • 单机架

    • 1 x QM8700 HDR 200Gbps IB 交换机

    • 3 个控制器节点

    • 2 个裸机租户节点

    • 1 个交换矩阵管理节点

  2. 两层胖树拓扑的扩展设置:
    此部署方案最多 可扩展至 20 台 Spine 交换机和 40 台 Leaf 交换机,并支持多达800 台服务器

Sinoinfo_Pic

主机设计

租户隔离

下面是解决方案主机设计的说明。

Sinoinfo_Pic

图片备注

  • PKey 用于隔离其所属租户网络上的 Bare Metal 实例流量。

  • 租户命名空间包括具有 IPoIB 支持的 DHCP 服务器/vRouter(L3 代理),并配置了 PKey 以隔离它们所属租户网络上的流量。

应用逻辑设计

Sinoinfo_Pic


软件堆栈组件

Sinoinfo_Pic

物料清单 (BoM)

Sinoinfo_Pic

笔记

上面的 BoM 是指基于 1xRack 的参考 架构。

部署和 配置

物理布线


Sinoinfo_Pic

笔记

  • 使用双端口 InfiniBand 适配器时,只应将第一个端口连接到结构。
    从操作系统的角度来看,网络设备 ib0 将用于 IPoIB 流量。

  • Provisioning 网络用于 Undercloud 的 Overcloud Nodes 部署,OcProvisioning 网络用于 Overcloud Controller Nodes 的 Bare Metal Tenant Nodes 部署。


  1. 将所有节点连接到 IPMI 网络。

  2. 连接 IB 交换机管理。端口连接到 OpenStack Provisioning 网络并分配 Overcloud 节点范围之外的 IP 地址。

  3. 将 Fabric 管理节点连接到 OpenStack Provisioning 网络并分配 Overcloud 节点范围之外的 IP 地址。

  4. 将 Fabric 管理节点、Overcloud 节点(控制器节点)和裸机租户节点连接到 IB Fabric。

  5. 将 OpenStack Undercloud 和 Overcloud 节点(控制器节点)连接到 OpenStack Provisioning 网络。

  6. 将 Undercloud 节点和 Controller 节点连接到外部(公共)网络。

IPoIB 结构配置

网络名称

网络详情

密钥标识

贮存

172.16.0.0 / 24

800b

存储管理

172.17.0.0 / 24

8015

内部API

172.18.0.0 / 24

801f

OcProvisioning172.70.0.0/248046

租户 VLAN

由租户创建

80

笔记

在以太网、OpenStack 部署中,VLAN 可用于租户隔离。在 InfiniBand 中,分区键 (PKey) 用于获得租户隔离。

租户网络 VLAN ID“N”映射到租户 PKey“80”。在这个 RDG 中,我们使用租户 VLAN ID 101,它被转换为 PKey 0x8065。

解决方案配置和部署

主机配置

先决条件

确保具有相同角色(控制器节点/裸机节点等)的服务器的硬件规格相同

服务器 BIOS

控制器节点

确保在连接到 PXE 网络的接口上设置了网络引导(在我们的例子中是第一个 1GbE 端口),并且这个接口在引导顺序中列在前面。

裸机租户节点

  1. 验证是否在连接到 IB 交换机(在我们的示例中为端口 1)PXE 网络的 ConnectX IB 适配器端口上设置了网络引导,并且该接口在引导顺序中列在首位。 Sinoinfo_Pic

  2. 对于 GPUDirect 使用 - 验证虚拟化和 SR-IOV 在 BIOS 中已禁用

  3. Post-BIOS IB Adapter  FlexBoot界面(使用 ctrl+B 输入)- 验证是否启用了 PXE 并将 PKey 设置为匹配 OcProvisioning 网络 VLAN ID(在我们的示例中为 70)Sinoinfo_PicSinoinfo_Pic

IB转接卡

确保所有 ConnectX-6 适配器端口的固件链接类型用于 控制器/裸机/结构管理 节点,并且它们连接到 IB 结构并设置为 InfiniBand,如下所示。

  1. 为您的适配器的 ib0 接口获取 MST 设备。使用以下命令识别 MST 设备:

    # mst start
    Starting MST (Mellanox Software Tools) driver set
    Loading MST PCI module - Success
    [warn] mst_pciconf is already loaded, skipping
    Create devices
    Unloading MST PCI module (unused) - Success
    # mst status -v
    MST modules:
    ------------
      MST PCI module is not loaded
      MST PCI configuration module loaded
    PCI devices:
    ------------
    DEVICE_TYPE            MST                          PCI      RDMA            NET                      NUMA
    ConnectX6(rev:0)        /dev/mst/mt4123_pciconf0.1    b1:00.1  mlx5_1          net-ib1                  2   
    ConnectX6(rev:0)        /dev/mst/mt4123_pciconf0      b1:00.0  mlx5_0          net-ib0                  2
  2. 查询固件参数:

    使用“mst start; mst status -v”来识别 Mellanox 设备
    # mlxconfig -d /dev/mst/mt4123_pciconf0 q | grep "LINK_TYPE_P1"     
    LINK_TYPE_P1                        IB(1)

如果您需要更改任何参数,请参阅使用 mlxconfig指南

结构管理节点安装

在本文中,单个 Fabric Management 节点与多个应用程序容器一起部署。 是否建议在生产中使用高可用性进行部署 - 请参阅 UFM/ NEO 用户手册了解更多详细信息。

UFM 用户手册可在My Mellanox 门户中找到有关更多详细信息,请联系 NVIDIA-Mellanox 支持。

Sinoinfo_Pic

结构管理节点操作系统

  1. 在 Fabric Mgmt 节点上安装操作系统。(在这个解决方案中,我们使用了 CentOS 7.x 操作系统)。

  2. 安装并启用 Docker。

    # curl -fsSL https://get.docker.com/ | sh
    # systemctl start docker
    # systemctl enable docker
    # docker system prune
  3. 使用 “ibstat”命令确保Fabric管理节点已连接到IB Fabric,并且链路已开启且速率为200。

  4. 确保 Fabric 管理节点连接到 OpenStack 供应网络,并分配 Overcloud 节点范围之外的 IP 地址。
    在我们的示例中,我们已将 IP 192.168.24.225 分配给该节点。

UFM 应用程序容器

此处提供有关 UFM 容器的其他信息


  1. 创建一个本地目录来存储共享的 UFM 配置。

    #mkdir -p /home/UFM/
  2. 确保可以访问 Internet 并从存储库中提取 NEO 应用程序映像。

    # docker pull mellanox/ufm
  3. 使用映射的本地目录启动 UFM 容器,并验证它已启动。

    # docker run -dit --name=ufm --network=host --restart unless-stopped --volume /home/UFM/ufm_config_files/:/opt/ufm/shared_config_files/ --volume /dev/log:/dev/log --volume /sys/fs/cgroup:/sys/fs/cgroup:ro --volume /lib/modules:/lib/modules:ro --privileged mellanox/ufm /usr/sbin/init
    # docker ps -a
    CONTAINER ID        IMAGE                COMMAND                  CREATED            STATUS                        PORTS              NAMES
    5d20a6447d51        mellanox/ufm          "/usr/sbin/init"        4 seconds ago      Up 3 seconds                                      ufm
  4. 将容器中的配置文件复制到本地共享配置目录中。

    # docker cp ufm:/opt/ufm/ufm_config_files/ /home/UFM/
  5. 将您的 UFM 许可证复制到容器中。

    联系 NVIDIA-Mellanox 支持以获得 UFM 评估许可证

    # docker cp ufm.lic ufm:/opt/ufm/files/licenses/
  6. 在容器上启动交互式 bash shell。

    # docker exec -it -u root ufm bash
  7. 在容器内编辑以下配置文件。

    /opt/ufm/shared_config_files/conf/gv.cfg展开来源
  8. 重启UFM服务并退出容器。

    #/etc/init.d/ufmd restart
    #exit

NEO 应用容器

有关 NEO 容器的其他信息可在此处获得


  1. 确保可以访问 Internet 并从存储库中提取 NEO 应用程序映像。

    # docker pull mellanox/neo
  2. 启动 NEO 容器并验证它已启动。

    # docker run -dit --name 'neo' --restart unless-stopped --network host -v /dev/log:/dev/log -v $(pwd)/neo-data:/neo-data --privileged mellanox/neo:latest /usr/sbin/init
    # docker ps -a
    CONTAINER ID        IMAGE                COMMAND                  CREATED            STATUS                        PORTS              NAMES
    2f76866050a8        mellanox/neo:latest  "/bin/sh -c /usr/sbi…"  4 seconds ago      Up 4 seconds                                      neo
  3. 在容器上启动交互式 bash shell。

    # docker exec -it -u root neo bash
    [root@fabric-mgmt-node1 neo-docker]#
  4. 编辑以下配置文件以允许 NEO 与运行在同一主机上的 UFM 应用程序进行通信。

    /opt/neo/controller/conf/controller.cfg展开来源
    /opt/neo/files/providers/ib/conf/netservice.cfg展开来源
  5. 重启NEO服务并退出容器。

    [root@fabric-mgmt-node1 neo-docker]# cd /opt/neo
    [root@fabric-mgmt-node1 neo-docker]# ./neoservice start
    [root@fabric-mgmt-node1 neo-docker]# exit

应用程序 Web 用户界面

  1. 使用以下 URL 从 Provisioning 网络上的客户端连接到 UFM WebUI。

    默认登录凭据:admin/123456

  2. 使用以下 URL 从 Provisioning 网络上的客户端连接到 NEO WebUI。

    默认登录凭据:admin/123456

OpenStack Undercloud 节点准备和安装

在下面的解决方案中,我们使用 使用 TripleO 的 RDO OpenStack 部署

  1. 遵循此处描述的 Undercloud 安装过程 直到“准备配置文件”部分。在我们的案例中使用了以下组件

    • CentOS 8 操作系统,100GB 根分区

    • “Ussuri”OpenStack 发布 TripleIO 存储库

      $ sudo -E tripleo-repos -b ussuri current
    • undercloud 配置文件 undercloud.conf  ”。

      undercloud.conf展开来源
  2. 在 Undercloud 节点上创建以下目录和 Dockerfile,用于构建具有 IB 支持的自定义 Neutron 组件。

    dhcp 代理展开来源
    l3-agent展开来源
  3. 创建如下容器镜像准备配置文件“undercloud.conf”中引用的“containers-prepare-parameter.yaml”放在/home/stack/目录

    容器准备参数.yaml展开来源
  4. 以堆栈用户身份完成 Undercloud安装。

    # sudo chown stack -R /home/stack
    # su - stack
    $ openstack undercloud install
  5. 基于 CentOS 8 和 Ussuri 发布组件构建 Overcloud 镜像。此处描述完整过程

    $ su - stack
    $ mkdir /home/stack/images
    $ cd /home/stack/images
    $ export OS_YAML="/usr/share/openstack-tripleo-common/image-yaml/overcloud-images-centos8.yaml"
    $ export DIB_YUM_REPO_CONF="/etc/yum.repos.d/delorean* /etc/yum.repos.d/tripleo*"
    $ export STABLE_RELEASE="ussuri"
    $ openstack overcloud image build
  6. 自定义 Overcloud 映像以包含 NVIDIA MLNX_OFED 网络驱动程序:

    # sudo su
    # yum install libguestfs-tools
    # export LIBGUESTFS_BACKEND=direct
    # cd /home/stack/images/
    # virt-copy-in -a overcloud-full.qcow2 MLNX_OFED_LINUX-5.0-2.1.8.0-rhel8.1-x86_64.tgz /tmp
    # virt-customize -v  -a overcloud-full.qcow2 --run-command 'yum install pciutils tcl tcsh pkgconf-pkg-config gcc-gfortran make tk -y'
    # virt-customize -v  -a overcloud-full.qcow2 --run-command 'cd /tmp && tar -xf MLNX_OFED_LINUX-5.0-2.1.8.0-rhel8.1-x86_64.tgz && rm -rf /tmp/MLNX_OFED_LINUX-5.0-2.1.8.0-rhel8.1-x86_64.tgz'
    # virt-customize -v  -a overcloud-full.qcow2 --run-command '/tmp/MLNX_OFED_LINUX-5.0-2.1.8.0-rhel8.1-x86_64/mlnxofedinstall --force'
    # virt-customize -v  -a overcloud-full.qcow2 --run-command ' /etc/init.d/openibd restart'
    # virt-customize -a overcloud-full.qcow2 --selinux-relabel
  7. 以堆栈用户身份将 Overcloud 图像上传到图像存储中。

    # su - stack
    $ source ~/stackrc
    $ cd /home/stack/images/
    $ openstack overcloud image upload
  8. 使用节点 IPMI 信息准备 overcloud 裸机节点清单文件 “instackenv.json”在我们的例子中,清单包括 3 个控制器节点。确保使用 IPMI 服务器地址和凭据更新文件。

    instackenv.json展开来源


  9. 导入 overcloud 裸机节点清单并等待所有节点都列在“可管理”状态。

    $ openstack overcloud node import /home/stack/instackenv.json
    $ openstack baremetal node list
    +--------------------------------------+--------------+---------------+-------------+--------------------+-------------+
    | UUID                                | Name        | Instance UUID | Power State | Provisioning State | Maintenance |
    +--------------------------------------+--------------+---------------+-------------+--------------------+-------------+
    | 61916fc7-8fc1-419c-97f5-ab021e5b0614 | controller-1 | None          | power off  | manageable        | False      |
    | 85b907a3-fd0a-41f4-ad56-d117bcc5e88c | controller-2 | None          | power off  | manageable        | False      |
    | 7df4e999-09f8-43b5-8117-499ad1fa535e | controller-3 | None          | power off  | manageable        | False      |
    +--------------------------------------+--------------+---------------+-------------+--------------------+-------------+

OpenStack Overcloud 自省和 IB 基础设施 配置

控制密钥配置

  1. 登录 UFM WebUI。

  2. 在 Undercloud 节点上,启动 Overcloud 节点自省过程。

    $ openstack overcloud node introspect --all-manageable
    $ openstack overcloud node configure --all-manageable --instance-boot-option local --root-device largest
    $ openstack overcloud node provide --all-manageable
    $ openstack baremetal node list

    笔记

    • 在自省阶段,Overcloud IB 设备将出现在 UFM Web UI 中。 使用发现设置设备的时间完成控制 PKey 的创建,如下一步所述。如果自省在您能够完成 PKey 配置之前完成并且 IB 设备不再出现在 UFM 中,请重复自省以完成 PKey 配置步骤。

    • 本节中描述的“裸机”节点是指将作为 Overcloud 节点部署的节点,而不是稍后创建的租户裸机实例。

  3. 在发现设置设备时,在 UFM UI 中创建内部 API、存储、Storage_Mgmt 网络的控制 PKey(ID 在上面的 IPoIB 网络配置表中进行了描述)。无需为 OcProvisioning 网络提前创建 PKey。

    该过程包括以下步骤:

    1. 验证已发现所有设置设备。

      Sinoinfo_Pic

    2. 创建带有十六进制 ID 的 PKey。Sinoinfo_Pic


    3. 添加 Overcloud 节点(控制器节点)GUID 作为控制 PKey 中的成员。


      Sinoinfo_Pic

    4. 对除 OcProvisioning PKey 之外的每个 Control PKey 重复这些步骤。

      Sinoinfo_Pic


笔记

只有在定义了所有控制 PKey 之后,才能继续执行下面的 Overcloud 部署步骤。

OpenStack Overcloud 部署

  1. 作为 Undercloud 上的堆栈用户,将 overcloud裸机节点配置文件映射到每个节点的相关角色:

    $ openstack baremetal node set --property capabilities='profile:control,boot_option:local' controller-1
    $ openstack baremetal node set --property capabilities='profile:control,boot_option:local' controller-2
    $ openstack baremetal node set --property capabilities='profile:control,boot_option:local' controller-3
    $ openstack overcloud profiles list
    $ openstack overcloud profiles list
    +--------------------------------------+--------------+-----------------+-----------------+-------------------+
    | Node UUID                            | Node Name    | Provision State | Current Profile | Possible Profiles |
    +--------------------------------------+--------------+-----------------+-----------------+-------------------+
    | cf2bb45a-187d-4ec5-99e0-30ad4c818904 | controller-1 | available      | control        |                  |
    | ed4dff82-97df-48b3-b862-f3fa3359973d | controller-2 | available      | control        |                  |
    | d5576da2-8f02-41b2-8998-c26805883bab | controller-3 | available      | control        |                  |
    +--------------------------------------+--------------+-----------------+-----------------+-------------------+
  2. 准备好以下云部署配置文件,放在 /home/stack/templates/目录下。完整文件附在本文后,可以在此处下载

    • 控制器.yaml

    • network_data_ib_bm.yaml

    • roles_data_ib_bm.yaml

    • 节点信息-ib-bm.yaml

    • 中子-ml2-mlnx-sdn-bm.yaml

      此配置文件包含托管 NEO 的 Fabric 管理节点的连接详细信息。

    • 网络环境-ib-bm.yaml

    • ib-env-bm.yaml

    1. 在此配置文件中,“数据中心”物理网络映射到 Open vSwitch 驱动程序(以太网结构),而“ibnet”物理网络映射到 IPoIB 驱动程序(InfiniBand 结构)。

    2. 为了将 Mellanox SDN 控制仅限于 InfiniBand 物理网络,请在部署云后在 Controller 上的 ml2_conf.ini 文件中的 [sdn] 部分下明确指定 InfiniBand 物理网络名称(例如“physical_networks=ibnet”) , 并重启 neutron_api 服务容器和 NEO 应用程序。

  3. 发出 deploy 命令以使用准备好的配置文件启动 Overcloud 部署。

    部署命令
    $ openstack overcloud deploy --templates /usr/share/openstack-tripleo-heat-templates \
    -n /home/stack/templates/network_data_ib_bm.yaml \
    -r /home/stack/templates/roles_data_ib_bm.yaml \
    --validation-warnings-fatal \
    -e /home/stack/templates/node-info-ib-bm.yaml \
    -e /home/stack/containers-prepare-parameter.yaml \
    -e /usr/share/openstack-tripleo-heat-templates/environments/podman.yaml \
    -e /usr/share/openstack-tripleo-heat-templates/environments/network-isolation.yaml \
    -e /usr/share/openstack-tripleo-heat-templates/environments/services/neutron-ovs.yaml \
    -e /usr/share/openstack-tripleo-heat-templates/environments/services/ironic-overcloud.yaml \
    -e /home/stack/templates/neutron-ml2-mlnx-sdn-bm.yaml \
    -e /home/stack/templates/network-environment-ib-bm.yaml \
    -e /home/stack/templates/ib-env-bm.yaml \
    -e /usr/share/openstack-tripleo-heat-templates/environments/disable-telemetry.yaml

OpenStack 裸机云镜像创建

笔记

我们强烈建议为云镜像使用 CentOS 7 发行版,因为它在 OpenStack 环境中通过 IB 结构的 DHCP/PXE 启动测试成功

使用 NVIDIA MLNX_OFED 网络驱动程序部署裸机映像

Bare Metal 配置需要“部署镜像”,Bare Metal Ironic 服务使用这些镜像来准备 Bare Metal 服务器以进行来宾操作系统镜像部署。

构建自定义 ironic-deploy-mofed.kernel ironic -deploy-mofed.initramfs 使用 NVIDIA MLNX_OFED 网络驱动程序部署映像 ,使用磁盘映像生成器 (DIB) 工具,如下文所述: 操作方法:创建 OpenStack 云带有 NVIDIA GPU 和 Mellanox OFED 组件的图像。

带有 GPUDirect 堆栈的裸机客户机操作系统映像

使用 disk-image-builder (DIB) 工具构建自定义CentOS 7客户操作系统云镜像,如下文所述: 操作方法:使用 NVIDIA GPU 和 Mellanox OFED 组件创建 OpenStack 云镜像。

使用以下元素构建带有 GPUDirect 就绪软件堆栈的 Bare Metal 访客 qcow2 映像:

  • “mofed”元素:用于 NVIDIA MLNX_OFED 网络驱动程序安装 - 请参阅下面的说明

  • “cloud-init-config”元素:用于使用基于密码的 SSH 访问创建用户 - 请参阅下面的说明

  • “cuda”元素:用于 CUDA 驱动程序和 NV_PEER_MEMORY 安装 - 请参阅下面的说明

  • “gpudirect-tools”元素:用于安装 GPUDirect 测试工具 - 请参阅下面的说明

  • “singularity”元素:对于 Singularity Container Runtime 安装 - 请参阅下面的说明

NVIDIA Mellanox OFED 安装元件

笔记

该元素要求:

  • 构建主机上的 MLNX_OFED ISO 文件

“mofed”元素用于构建安装了 NVIDIA 网络驱动程序集的访客映像,也称为 MLNX_OFED。

  1. 从 NVIDIA 网络 Linux 驱动程序站点下载相关的 MLNX_OFED ISO 文件 由于本文使用的是 CentOS 7.8,因此我们将下载 RHEL 7.8 变体,例如:


  2. 下载 mofed 元素文件 mofed.zip附件包括以下文件:

    README.rst : 元素描述和目标

    element-deps : 元素依赖,在我们的例子中不依赖其他元素

    package-installs.yaml:MLNX_OFED 安装所需的软件包列表

    pkg-map:包列表到 RedHat OS 分发包的映射

    extra-data.d/70-copy-ofed-file:用于在构建过程中将 MLNX_OFED ISO 复制到 DIB 环境的脚本,需要 DIB_OFED_FILE 环境变量来指向 MLNX_OFED ISO 文件在构建主机操作系统中的位置。

    install.d/70-ofed-install:用于在构建过程中在 DIB 环境中安装 MLNX_OFED 的脚本,支持来宾映像内核版本。

  3. 将文件放在 /home/diskimage-builder/elements/mofed 目录下,并确保脚本具有可执行权限:

    # chmod 755 /home/diskimage-builder/elements/mofed/extra-data.d/70-copy-ofed-file
    # chmod 755 /home/diskimage-builder/elements/mofed/install.d/70-ofed-install
  4. 使用 构建主机上的MLNX_OFED ISO 文件位置设置环境变量

    # export DIB_MOFED_FILE="/tmp/MLNX_OFED_LINUX-5.0-2.1.8.0-rhel7.8-x86_64.iso"

Cloud-init 配置元素

笔记

Cloud-init 是一种跨平台的云实例初始化方法。有关 cloud-init 的更多信息,请参阅 Cloud-init 文档

“cloud-init-config”元素用于构建带有自定义 cloud-init 参数的来宾映像,以在实例初始化期间使用。在我们的例子中,我们将使用它来确保在实例初始化期间使用所需的远程访问方法创建系统用户。

由于 Cloud-init 已经包含在 DIB 生成的 CentOS 7 基础镜像中,因此不需要任何依赖项或软件包安装,只需修改 cloud-init 默认配置文件。

  1. 下载 cloud-init-config 元素文件cloud-init-config.zip附件包括以下文件:

    README.rst : 元素描述和目标

    post-install.d/50-cloud-init-config:用于修改 cloud-init 默认配置的脚本,以允许创建名为“stack”的管理员用户,该用户具有对使用此访客映像创建的实例的基于密码的 SSH 访问权限。

    笔记

    创建对实例具有基于密码的 SSH 访问权限的用户存在潜在的安全风险,仅为方便起见而提供。在生产环境中,强烈建议使用 SSH 密钥进行用户身份验证

  2. 使用以下命令为所需密码生成新的“salted”哈希,并填充 50-cloud-init-config 文件中的“passwd”值以包含新密码哈希。

    笔记

    # perl -e 'print crypt("","\$6\$\$") . "\n"'
    • 请记住在编辑文件时转义特殊字符

    • 我们的示例元素文件包含密码密钥的哈希值:“stack”

  3. 将文件放在 /home/diskimage-builder/elements/cloud-init-config 目录下,并确保脚本具有可执行权限:

    # chmod 755 /home/diskimage-builder/elements/cloud-init-config/post-install.d/50-cloud-init-config

CUDA 驱动程序和 NV_PEER_MEMORY 安装元素

  1. 按照 此处的说明使用 DIB 安装构建主机

    笔记

    该元素要求:

    • 该目标来宾内核版本与构建主机内核版本相匹配,如果它们不相同,则会失败。使用最新的 CentOS 7 (7.8) 作为构建主机操作系统,并在发出构建命令之前将内核升级到最新版本。

    • 构建主机上的 NVIDIA GPU 设备,没有它就会失败

    • 安装在构建主机上的 CUDA 存储库

    • 安装在目标图像上的 NVIDIA MLNX_OFED 网络驱动程序 - 确保始终将此元素与“mofed”元素一起使用

  2. 下载 cuda 元素文件 ( cuda.zip )附件包括以下文件:

    README.rst : 元素描述和目标

    element-deps : 元素依赖

    package-installs.yaml:CUDA 安装所需的软件包列表

    pkg-map:包列表到 RedHat OS 分发包的映射

    post-install.d/05-cuda-install:用于下载 CUDA 运行安装程序文件和安装 CUDA 驱动程序和 NV_PEER_MEMORY 模块的脚本,用于访客映像内核版本。GPUDirect 操作需要 NV_PEER_MEMORY。

  3. 将文件放在 /home/diskimage-builder/elements/cuda 目录下,并确保脚本具有可执行权限:

    # chmod 755 /home/diskimage-builder/elements/cuda/post-install.d/05-cuda-install
  4. 在构建主机上安装 CUDA 存储库:

    # yum install -y yum-utils
    repo saved to /etc/yum.repos.d/cuda-rhel7.repo
  5. 使用 构建主机上的 CUDA 存储库位置和用于下载 CUDA 运行文件安装程序的 URL设置环境变量

    # export DIB_YUM_REPO_CONF="/etc/yum.repos.d/cuda-rhel7.repo"

GPUDirect 工具安装元素

笔记

该元素要求:

  • 该目标来宾内核版本与构建主机内核版本相匹配,如果它们不相同,则会失败。使用最新的 CentOS 7 (7.8) 作为构建主机操作系统,并在发出构建命令之前将内核升级到最新版本。

  • 安装在目标图像上的 CUDA 驱动程序 - 确保始终将此元素与“cuda”元素一起使用

  • DIB_CUDA_PATH 环境变量如下所示

  1. 下载 gpudirect-tools 元素文件 ( gpudirect-tools.zip )。 附件包括以下文件:

    README.rst : 元素描述和目标

    element-deps : 元素依赖

    package-installs.yaml:GPUDirect 工具安装所需的软件包列表

    pkg-map:包列表到 RedHat OS 分发包的映射

    post-install.d/06-gdrtools-install:用于安装 perftest、OpenMPI 和 Quda 的脚本,支持 CUDA/GPUDirect。

  2. 将文件放在 /home/diskimage-builder/elements/ gpudirect-tools 目录下,并确保脚本具有可执行权限:

    # chmod 755 /home/diskimage-builder/elements/gpudirect-tools/post-install.d/06-gdrtools-install
  3. 使用目标构建映像上的 CUDA 文件位置设置环境变量:

    # export DIB_CUDA_PATH=/usr/local/cuda-11.1

Singularity 容器运行时安装元素

笔记

该元素要求:

  • 该目标来宾内核版本与构建主机内核版本相匹配,如果它们不相同,则会失败。使用最新的 CentOS 7 (7.8) 作为构建主机操作系统,并在发出构建命令之前将内核升级到最新版本。

  • DIB_GO_URL 和 DIB_SING_URL 环境变量如下所示

  1. 下载奇点元素文件(singularity.zip )。 附件包括以下文件:

    README.rst : 元素描述和目标

    element-deps : 元素依赖

    package-installs.yaml:Singularity 安装所需的软件包列表

    pkg-map:包列表到 RedHat OS 分发包的映射

    post-install.d/07-singularity-install:用于安装 GO 和 Singularity 运行时的脚本

  2. 将文件放在 /home/diskimage-builder/elements/ singularity 目录下,并确保脚本具有可执行权限:

    # chmod 755 /home/diskimage-builder/elements/singularity/post-install.d/07-singularity-install
  3. 使用需要的 GO/Singularity 版本的下载 URL 设置环境变量:

来宾操作系统映像构建 

  1. 设置 DIB 预构建环境变量

    # export ELEMENTS_PATH=/home/diskimage-builder/elements
    # export DIB_MOFED_FILE="/tmp/MLNX_OFED_LINUX-5.0-2.1.8.0-rhel7.8-x86_64.iso"
    # export DIB_YUM_REPO_CONF="/etc/yum.repos.d/cuda-rhel7.repo"
    # export DIB_MODPROBE_BLACKLIST=”nouveau”
    # export DIB_CLOUD_INIT_DATASOURCES="OpenStack"
    # export DIB_DHCP_TIMEOUT=300
    # export DIB_CUDA_PATH=/usr/local/cuda-11.1
  2. 使用相关元素运行构建命令:

    #  disk-image-create vm dhcp-all-interfaces cloud-init-datasources cloud-init-config dracut-regenerate growroot epel centos7 mofed cuda gpudirect-tools singularity -o /home/diskimage-builder/centos7-bm-hpc

    成功完成构建过程后,将在 /home/diskimage-builder/ 目录中生成 centos7-bm-hpc.qcow2 映像文件。


裸机租户实例配置

  1. 将上一节准备好的 Bare Metal deploy 和 guest 镜像复制到 Undercloud 节点并上传到镜像存储,供 Bare Metal Ironic 服务使用:

    $ source overcloudrc
    $ openstack image create oc-bm-deploy-kernel --public --disk-format aki --container-format aki ironic-deploy-mofed.kernel
    $ openstack image create oc-bm-deploy-ram --public --disk-format ari --container-format ari --file ironic-deploy-mofed.initramfs
    $ openstack image create centos7-bm-guest --public --disk-format qcow2 --container-format bare --file centos7-bm-hpc.qcow2
  2. 创建一个供应网络 子网,用于Controller Ironic 服务部署Bare Metal 租户 服务器:

    笔记

    $ openstack network create provisioning --provider-physical-network ibnet --provider-network-type vlan --provider-segment 70 --share
    $ openstack subnet create --network provisioning --subnet-range 172.70.0.0/24 --gateway 172.70.0.1  --allocation-pool start=172.70.0.60,end=172.70.0.99 provisioning-subnet
    • 确保 IP 地址池没有与部署配置文件 network_data.yaml 中配置的 Oc_provisioning 池冲突

    • 在云部署配置文件和裸机服务器 PXE 配置中使用与 OcProvisioning 网络 vlan 相同的 VLAN ID(在本例中为 70)

    • 将网络映射到“ibnet”物理网络(InfiniBand 结构)

  3. 创建配置网络后,Fabric Mgmt 节点会创建匹配的映射 PKey ID (0x8046),并将控制器节点 GUID 作为成员添加到 PKey。登录到 UFM WebUI 并将Fabric  Mgmt 节点 GUID 添加到此配置网络 PKey - 裸机 PXE 部署阶段需要此步骤。

    Sinoinfo_Pic

    Sinoinfo_Pic

  4. 创建租户网络和子网。

    $ openstack network create ib_tenant_net --provider-physical-network ibnet --provider-network-type vlan --provider-segment 101 --share
    $ openstack subnet create ib_subnet --dhcp --network ib_tenant_net --subnet-range 11.11.11.0/24 --dns-nameserver 8.8.8.8
    • 在网络创建期间指定的 vlan ID 稍后将转换为唯一的 IB PKey(在本例中为 VLAN ID 101 → PKey ID 0x8065),并将由 Fabric Mgmt 在结构上配置。节点

    • 将网络映射到“ibnet”物理网络(InfiniBand 结构)

  5. 使用自定义资源为 Bare Metal 实例创建风格:

    笔记

    $ openstack flavor create --ram 1024 --disk 20 --vcpus 1 baremetal
    $ openstack flavor set baremetal --property resources:CUSTOM_BAREMETAL=1
    $ openstack flavor set baremetal --property resources:VCPU=0
    $ openstack flavor set baremetal --property resources:MEMORY_MB=0
    $ openstack flavor set baremetal --property resources:DISK_GB=0
    • 请注意 CUSTOM_BAREMETAL 资源,因为其名称与后续步骤相关

    • 作为使用设置为“0”的物理资源证明 以下,以避免调度基于标准管理程序 裸机实例的属性

  6. 收集连接到 IB 结构的裸机服务器 IB 适配器端口的 GUID。有几种方法可以获取 IB 适配器 GUID,通过查看适配器标签或在配置为 PXE 引导时引导服务器并检查其控制台屏幕: Sinoinfo_Pic

  7. 准备一个名为 overcloud -nodes-ib-bm.yaml的裸机节点清单文件,其中包含裸机租户服务器的详细信息

    笔记

    overcloud-nodes-ib-bm.yaml
    nodes:
      - name: node-1
        driver: ipmi
        network_interface: neutron
        driver_info:
          ipmi_address: "172.16.1.10"
          ipmi_username: "rcon"
          ipmi_password: "******"
        resource_class: baremetal
        properties:
          cpu_arch: x86_64
          local_gb: 400
          memory_mb: '262144'
          cpus: 36
        ports:
          - address: "1c:34:da:4d:76:8e"
            pxe_enabled: true
            extra:
              client-id: "ff:00:00:00:00:00:02:00:00:02:c9:00:1c:34:da:03:00:4d:76:8e"
            physical_network: "ibnet"
      - name: node-2
        driver: ipmi
        network_interface: neutron
        driver_info:
          ipmi_address: "172.16.1.20"
          ipmi_username: "rcon"
          ipmi_password: "******"
        resource_class: baremetal
        properties:
          cpu_arch: x86_64
          local_gb: 400
          memory_mb: '262144'
          cpus: 36
        ports:
          - address: "1c:34:da:4d:72:ae"
            pxe_enabled: true
            extra:
              client-id: "ff:00:00:00:00:00:02:00:00:02:c9:00:1c:34:da:03:00:4d:72:ae"
            physical_network: "ibnet"
    • 包括在前面步骤中为每个服务器收集的 IB 适配器 GUID 作为“client-id”参数,前缀为:ff:00:00:00:00:00:02:00:00:02:c9:00:

    • 更新每台服务器的 ipmi 凭据

    • 使用名为“baremetal”的资源类,它对应于前面步骤中使用的 CUSTOM_BAREMETAL 风味资源

    • 使用映射到 IB 结构的物理网络“ibnet”

  8. 导入清单文件并验证列出的节点:

    $ openstack baremetal create overcloud-nodes-ib-bm.yaml
    $ openstack baremetal node list
  9. 找到您之前上传到镜像存储的 Ironic 自定义部署镜像,并将其设置为要在裸机部署期间使用的清单节点的内核/ramdisk 镜像

    $ DEPLOY_KERNEL=$(openstack image show oc-bm-deploy-kernel -f value -c id)
    $ DEPLOY_RAMDISK=$(openstack image show oc-bm-deploy-ram -f value -c id)
    $ openstack baremetal node set node-1 --driver-info deploy_kernel=$DEPLOY_KERNEL --driver-info deploy_ramdisk=$DEPLOY_RAMDISK
    $ openstack baremetal node set node-2 --driver-info deploy_kernel=$DEPLOY_KERNEL --driver-info deploy_ramdisk=$DEPLOY_RAMDISK
  10. 清理节点并为裸机租户实例创建做好准备

    笔记

    在此阶段,裸机服务器将使用 ramdisk 映像启动,并且它们的 HD 将被擦除,为来宾操作系统部署阶段做准备。清理阶段可能需要一段时间,您可以在服务器控制台屏幕上按照该过程进行操作。

    $ openstack baremetal node manage node-1 --wait
    $ openstack baremetal node manage node-2 --wait
    $ openstack baremetal node provide node-1
    $ openstack baremetal node provide node-2
  11. 验证节点对于 Bare Metal 来宾映像部署“可用”,并使用您上传到映像存储的自定义来宾映像生成 Bare Metal 租户实例

    笔记

    在此阶段,裸机服务器将启动两次,一次使用 ramdisk 映像,第二次使用 HD 来宾操作系统映像。您可以在服务器控制台屏幕上按照该过程进行操作。

    $ openstack baremetal node list
    +--------------------------------------+--------+--------------------------------------+-------------+--------------------+-------------+
    | UUID                                | Name  | Instance UUID                        | Power State | Provisioning State | Maintenance |
    +--------------------------------------+--------+--------------------------------------+-------------+--------------------+-------------+
    | e5991e0d-78e5-463b-9bf1-e1eb6db2a174 | node-1 | 8891dfec-b7a9-4ddf-82a4-a66f5b05fe9a | power off  | available          | False      |
    | 7344efce-d1d1-4736-916d-5c7c30a30f68 | node-2 | 42cc7461-397a-47e4-a849-7c3076cf6eac | power off  | available          | False      |
    +--------------------------------------+--------+--------------------------------------+-------------+--------------------+-------------+
    $openstack server create --image centos7-bm-guest --flavor baremetal --network ib_tenant_net  bm_guest1
    $openstack server create --image centos7-bm-guest --flavor baremetal --network ib_tenant_net  bm_guest2

确认

健全性和 连通性

  1. 验证两个 Bare Metal 租户实例都已启动且处于活动状态:

    $ openstack baremetal node list
    +--------------------------------------+--------+--------------------------------------+-------------+--------------------+-------------+
    | UUID                                | Name  | Instance UUID                        | Power State | Provisioning State | Maintenance |
    +--------------------------------------+--------+--------------------------------------+-------------+--------------------+-------------+
    | e5991e0d-78e5-463b-9bf1-e1eb6db2a174 | node-1 | 8891dfec-b7a9-4ddf-82a4-a66f5b05fe9a | power on    | active            | False      |
    | 7344efce-d1d1-4736-916d-5c7c30a30f68 | node-2 | 42cc7461-397a-47e4-a849-7c3076cf6eac | power on    | active            | False      |
    +--------------------------------------+--------+--------------------------------------+-------------+--------------------+-------------+
    $ openstack server list
    +--------------------------------------+----------------+--------+----------------------------+------------------+--------+
    | ID                                  | Name          | Status | Networks                  | Image            | Flavor |
    +--------------------------------------+----------------+--------+----------------------------+------------------+--------+
    | 8891dfec-b7a9-4ddf-82a4-a66f5b05fe9a | bm_guest1      | ACTIVE | ib_tenant_net=11.11.11.192 | centos7-bm-guest |        |
    | 42cc7461-397a-47e4-a849-7c3076cf6eac | bm_guest2      | ACTIVE | ib_tenant_net=11.11.11.80  | centos7-bm-guest |        |
    +--------------------------------------+----------------+--------+----------------------------+------------------+--------+
  2. 登录 UFM WebUI 并验证是否已根据创建的租户网络自动配置租户 PKey,并且相关 GUID 已添加为成员。

    如下所示,VLAN ID 101 被映射到 PKey ID 0x8065。

    控制器节点和裸机租户服务器的 GUID 作为成员添加到 PKey。

    Sinoinfo_Pic


  3. 连接到租户 Bare Metal 租户实例之一,验证 IB 接口上的 PKey 配置,并检查通过 IB 结构与另一个 Bare Metal 租户实例的连接:

    控制器节点上的 DHCP 服务器命名空间可用于使用我们在使用 cloud-init-config 元素构建访客映像时使用的“堆栈”用户名和密码获得对裸机服务器的 SSH 访问

    [root@overcloud-controller-0 heat-admin]# ip netns exec qdhcp-053250c8-814c-426b-8f4e-2267a7f71929 ssh stack@11.11.11.192
    stack@11.11.11.192's password:
    Last login: Mon Nov  2 19:33:36 2020
    [stack@bm_guest1 ~]$ cat /sys/class/infiniband/mlx5_0/ports/1/pkeys/* | grep -v 0000
    0x8065
    0xffff
    [stack@bm_guest1 ~]$ ping 11.11.11.80
    PING 11.11.11.80 (11.11.11.80) 56(84) bytes of data.
    64 bytes from 11.11.11.80: icmp_seq=1 ttl=64 time=0.358 ms
    64 bytes from 11.11.11.80: icmp_seq=2 ttl=64 time=0.161 ms
    64 bytes from 11.11.11.80: icmp_seq=3 ttl=64 time=0.167 ms
    ^C
    --- 11.11.11.80 ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 1999ms
    rtt min/avg/max/mdev = 0.161/0.228/0.358/0.093 ms
    [stack@bm_guest1 ~]$
  4. 验证我们用于构建访客映像的自定义 DIB 元素(例如 MLNX_OFED 和 CUDA)已安装并加载:

    [stack@bm_guest1 ~]$ sudo su
    [root@bm_guest1 stack]#
    [root@bm_guest1 stack]# ofed_info -s
    MLNX_OFED_LINUX-5.0-2.1.8.0:
    [root@bm_guest1 stack]# cat /proc/driver/nvidia/version
    NVRM version: NVIDIA UNIX x86_64 Kernel Module  455.23.05  Fri Sep 18 19:37:12 UTC 2020
    GCC version:  gcc version 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
    [root@bm_guest1 stack]# export PATH=/usr/local/cuda-11.1/bin${PATH:+:${PATH}}
    [root@bm_guest1 stack]# nvcc -V
    nvcc: NVIDIA (R) Cuda compiler driver
    Copyright (c) 2005-2020 NVIDIA Corporation
    Built on Tue_Sep_15_19:10:02_PDT_2020
    Cuda compilation tools, release 11.1, V11.1.74
    Build cuda_11.1.TC455_06.29069683_0
    [root@bm_guest1 stack]# lsmod | grep "mlx\|nvidia"
    nvidia_uvm            970683  0
    mlx5_fpga_tools        14392  0
    mlx4_ib              220791  0
    mlx4_en              142468  0
    mlx4_core            361489  2 mlx4_en,mlx4_ib
    nvidia_drm            48711  0
    nvidia_modeset      1208661  1 nvidia_drm
    drm_kms_helper        186531  1 nvidia_drm
    drm                  456166  4 ttm,drm_kms_helper,nvidia_drm
    mlx5_ib              398012  0
    ib_uverbs            134486  3 mlx5_ib,ib_ucm,rdma_ucm
    ib_core              379728  11 rdma_cm,ib_cm,iw_cm,nv_peer_mem,mlx4_ib,mlx5_ib,ib_ucm,ib_umad,ib_uverbs,rdma_ucm,ib_ipoib
    mlx5_core            1186008  2 mlx5_ib,mlx5_fpga_tools
    mdev                  20672  2 vfio_mdev,mlx5_core
    mlx_compat            47141  17 mdev,rdma_cm,vfio_mdev,ib_cm,iw_cm,mlx4_en,mlx4_ib,mlx5_ib,mlx5_fpga_tools,ib_ucm,ib_core,ib_umad,ib_uverbs,mlx4_core,mlx5_core,rdma_ucm,ib_ipoib
    mlxfw                  18227  1 mlx5_core
    devlink                60067  4 mlx4_en,mlx4_ib,mlx4_core,mlx5_core
    nvidia              27605367  3 nv_peer_mem,nvidia_modeset,nvidia_uvm
    ptp                    23551  3 tg3,mlx4_en,mlx5_core

使用 vRouter 对裸机实例进行公共访问


Sinoinfo_Pic


  1. 创建一个带有通往公共网络的网关的外部提供商网络。

    $openstack network create public --provider-physical-network datacentre --provider-network-type flat --external
    $openstack subnet create public_subnet --no-dhcp --network public --subnet-range 10.7.208.0/24 --allocation-pool start=10.7.208.22,end=10.7.208.26 --gateway 10.7.208.1
  2. 创建一个 vRouter 并将外部和之前创建的 IPoIB 租户网络附加到它。

    $openstack router create public_router
    $openstack router set public_router --external-gateway public
    $openstack router add subnet public_router ib_subnet
  3. 连接到 Bare Metal 租户实例之一并检查 Internet 连接:

    [stack@bm_guest1 ~]$ ping google.com
    PING google.com (216.58.207.78) 56(84) bytes of data.
    64 bytes from fra16s25-in-f14.1e100.net (216.58.207.78): icmp_seq=1 ttl=114 time=57.9 ms
    64 bytes from fra16s25-in-f14.1e100.net (216.58.207.78): icmp_seq=2 ttl=114 time=57.8 ms
    64 bytes from fra16s25-in-f14.1e100.net (216.58.207.78): icmp_seq=3 ttl=114 time=57.6 ms
    ^C
    --- google.com ping statistics ---
    3 packets transmitted, 3 received, 0% packet loss, time 2007ms
    rtt min/avg/max/mdev = 57.689/57.845/57.966/0.228 ms

基础设施 带宽 验证

GPUDirect RDMA

Sinoinfo_Pic

支持 GPUDirect 的带宽测试拓扑

Sinoinfo_Pic

IB_WRITE_BW 测试超过 200 Gbps InfiniBand 结构

  1. 登录到两个Bare Metal 实例并加载 NV_PEER_MEMORY 模块:

    [root@bm_guest1 stack]# /etc/init.d/nv_peer_mem start
    starting... OK
    [root@bm_guest1 stack]# /etc/init.d/nv_peer_mem status
    nv_peer_mem module is loaded.
  2. 确定在测试期间要使用的最佳 GPU 设备 - 在这种情况下,它将是 GPU6 或 GPU7,它们与我们的 mlx5_0 IB 适配器位于同一 PCIe 桥上并共享相同的 NUMA 节点:

    [root@bm_guest1 stack]# nvidia-smi topo -m
          GPU0    GPU1    GPU2    GPU3    GPU4    GPU5    GPU6    GPU7    mlx5_0  mlx5_1  CPU Affinity    NUMA Affinity
    GPU0    X      NV1    NV1    NV2    NV2    SYS    SYS    SYS    SYS    SYS    0-8,36-44      0
    GPU1    NV1      X      NV2    NV1    SYS    NV2    SYS    SYS    SYS    SYS    0-8,36-44      0
    GPU2    NV1    NV2      X      NV2    SYS    SYS    NV1    SYS    SYS    SYS    0-8,36-44      0
    GPU3    NV2    NV1    NV2      X      SYS    SYS    SYS    NV1    SYS    SYS    0-8,36-44      0
    GPU4    NV2    SYS    SYS    SYS      X      NV1    NV1    NV2    NODE    NODE    18-26,54-62    2
    GPU5    SYS    NV2    SYS    SYS    NV1      X      NV2    NV1    NODE    NODE    18-26,54-62    2
    GPU6    SYS    SYS    NV1    SYS    NV1    NV2      X      NV2    PIX    PIX    18-26,54-62    2
    GPU7    SYS    SYS    SYS    NV1    NV2    NV1    NV2      X      PIX    PIX    18-26,54-62    2
    mlx5_0  SYS    SYS    SYS    SYS    NODE    NODE    PIX    PIX      X      PIX
    mlx5_1  SYS    SYS    SYS    SYS    NODE    NODE    PIX    PIX    PIX      X
    Legend:
    X    = Self
    SYS  = Connection traversing PCIe as well as the SMP interconnect between NUMA nodes (e.g., QPI/UPI)
    NODE = Connection traversing PCIe as well as the interconnect between PCIe Host Bridges within a NUMA node
    PHB  = Connection traversing PCIe as well as a PCIe Host Bridge (typically the CPU)
    PXB  = Connection traversing multiple PCIe bridges (without traversing the PCIe Host Bridge)
    PIX  = Connection traversing at most a single PCIe bridge
    NV#  = Connection traversing a bonded set of # NVLinks
  3. 在使用相关 GPU 设备的实例之一上启动 GPUDirect ib_write_bw 服务器:

    笔记

    [root@bm_guest1 stack]# ib_write_bw -R -a --report_gbits --use_cuda=6
    ************************************
    * Waiting for client to connect... *
    ************************************
    • 如果作为 gpudirect-tools DIB 元素的一部分安装在来宾映像上的工具之一,则启用 GPU 的 ib_write_bw

    • 通过省略“use_cuda”标志,可以在没有 GPUDirect 的情况下运行基于 RDMA 的测试

  4. 使用相关的 GPU 设备在第二个实例上启动 GPUDirect ib_write_bw 客户端并指定远程实例的 IP:

    [root@bm_guest2 stack]# ib_write_bw -R -a --report_gbits --use_cuda=6 11.11.11.192
    initializing CUDA
    Listing all CUDA devices in system:
    CUDA device 0: PCIe address is 15:00
    CUDA device 1: PCIe address is 16:00
    CUDA device 2: PCIe address is 3A:00
    CUDA device 3: PCIe address is 3B:00
    CUDA device 4: PCIe address is 89:00
    CUDA device 5: PCIe address is 8A:00
    CUDA device 6: PCIe address is B2:00
    CUDA device 7: PCIe address is B3:00
    Picking device No. 6
    [pid = 3864, dev = 6] device name = [Tesla V100-SXM2-16GB]
    creating CUDA Ctx
    making it the current CUDA Ctx
    cuMemAlloc() of a 16777216 bytes GPU buffer
    allocated GPU buffer address at 00007f8904000000 pointer=0x7f8904000000
    ---------------------------------------------------------------------------------------
                      RDMA_Write BW Test
    Dual-port      : OFF          Device        : mlx5_0
    Number of qps  : 1            Transport type : IB
    Connection type : RC          Using SRQ      : OFF
    PCIe relax order: ON
    ibv_wr* API    : ON
    TX depth        : 128
    CQ Moderation  : 100
    Mtu            : 4096[B]
    Link type      : IB
    Max inline data : 0[B]
    rdma_cm QPs    : ON
    Data ex. method : rdma_cm
    ---------------------------------------------------------------------------------------
    local address: LID 0x46 QPN 0x010c PSN 0x29832
    remote address: LID 0x47 QPN 0x010c PSN 0x505fb5
    ---------------------------------------------------------------------------------------
    #bytes    #iterations    BW peak[Gb/sec]    BW average[Gb/sec]  MsgRate[Mpps]
    2          5000            0.12              0.11              6.942623
    4          5000            0.24              0.23              7.260094
    8          5000            0.47              0.45              6.986384
    16        5000            0.95              0.92              7.218217
    32        5000            1.91              1.86              7.271254
    64        5000            3.82              3.72              7.261836
    128        5000            7.62              7.44              7.262234
    256        5000            14.79              14.15              6.911487
    512        5000            30.47              29.48              7.198188
    1024      5000            60.27              58.47              7.137759
    2048      5000            89.73              87.14              5.318323
    4096      5000            106.08            105.77            3.227850
    8192      5000            112.28            112.26            1.712997
    16384      5000            113.72            111.63            0.851641
    32768      5000            114.49            114.35            0.436199
    65536      5000            114.27            114.01            0.217466
    131072    5000            114.65            114.16            0.108874
    262144    5000            114.66            114.16            0.054437
    524288    5000            114.06            114.01            0.027182
    1048576    5000            114.65            114.09            0.013601
    2097152    5000            114.11            114.08            0.006800
    4194304    5000            114.26            114.10            0.003400
    8388608    5000            113.94            113.76            0.001695
    ---------------------------------------------------------------------------------------
    deallocating RX GPU buffer 00007f8904000000
    destroying current CUDA Ctx

    在具有 GPUDirect 支持的 200Gb/s InfiniBand 结构上展示了 114Gbps 带宽结果。限制因素是用于测试的服务器 (PCIe gen3.0) 中的 PCIe 主板接口。

附录

应用基准测试:HPL-NVIDIA

NVIDIA 的 HPL基准测试提供软件包,在配备 NVIDIA GPU 的分布式内存计算机上,基于 用于构建 Top500的 netlib HPL 基准测试使用 Tensor Cores 以双精度(64 位)算法求解(随机)密集线性系统 列表。

我们在本文中准备和部署的 Bare Metal Guest OS 已准备好运行此基准测试,只需在单个节点或分布式系统上加载和运行 HPL-NVIDIA Singularity Container。

笔记

  • 在下面的示例中,我们使用 mpirun 来执行测试,也可以使用工作负载管理器(例如 slurm)来运行它。Bare Metal 主机镜像上的 OpenMPI 版本应该 与容器上的版本兼容

  • 执行的测试配置经过定制以适合我们使用的服务器,这些服务器托管 2 个 Intel x86 CPU 插槽和 8 个 NVIDIA V100/16GB GPU

  • 测试调优是基本的, 包括深入的优化过程

HPL-NVIDIA 测试拓扑

Sinoinfo_Pic

两个 裸机服务器上:

  1. 在 BIOS 中禁用超线程

  2. 登录到 Bare Metal 实例并验证 /etc/hosts 文件包含两个节点

    [root@bm_guest1 stack]# cat /etc/hosts
    127.0.0.1  localhost localhost.localdomain localhost4 localhost4.localdomain4
    ::1        localhost localhost.localdomain localhost6 localhost6.localdomain6
    11.11.11.192 bm_guest1
    11.11.11.80 bm_guest2
  3. 在实例之间设置无密码 SSH 通信并验证它:

    [root@bm_guest1 stack]# # ssh-keygen
    Generating public/private rsa key pair.
    Enter file in which to save the key (/root/.ssh/id_rsa):
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /root/.ssh/id_rsa.
    Your public key has been saved in /root/.ssh/id_rsa.pub.
    The key fingerprint is:
    SHA256:yv/T7FGjvVk0usIA3x/eHgfKETxH1jHD8JhDbmCeJ/I
    The key's randomart image is:
    +---[RSA 2048]----+
    |          o o==.|
    |          o.=o+.+|
    |        . ++B.. |
    |      .  o ++.  |
    |        S .E. +..|
    |    . . o o B.+.|
    |      o  ooB.+.o|
    |      .  .oo+.=o|
    |        ...oo.+. |
    +----[SHA256]-----+
    [root@bm_guest1 stack]# ssh-copy-id bm_guest2
    [root@bm_guest1 stack]# ssh bm_guest2
  4. 下载 HPL-NVIDIA 奇点容器:

    笔记

    拉取镜像需要NGC账号,使用“docker login”命令登录nvcr.io仓库

    [root@bm_guest1 stack]# mkdir /home/stack/nv_hpl
    [root@bm_guest1 stack]# cd /home/stack/nv_hpl
    [root@bm_guest1 stack]# singularity build hpc-benchmarks:20.10-hpl.sif docker://nvcr.io/nvidia/hpc-benchmarks:20.10-hpl
  5. 在同一目录下创建服务器参数配置文件:

    笔记

    [root@bm_guest1 nv_hpl]# cat server_config.sh
    CPU_AFFINITY="0:0:0:0:1:1:1:1"
    CPU_CORES_PER_RANK=4
    GPU_AFFINITY="0:1:2:3:4:5:6:7"
    UCX_AFFINITY="mlx5_0:mlx5_0:mlx5_0:mlx5_0:mlx5_0:mlx5_0:mlx5_0:mlx5_0"
    • 在这个例子中,我们每个 mpi rank 使用 4 个内核,4 个 rank 将使用 CPU 插槽 0,4 个将使用插槽 1。

    • 每个等级将使用一个专用 GPU 设备,所有等级将使用映射到我们测试中使用的 ib0 单个 IB 适配器的 mlx5_0 UCX 设备

    • 此配置与我们案例中使用的服务器硬件规格和拓扑相关,应针对其他所有硬件架构和测试拓扑进行相应调整

  6. 导出容器运行命令,该命令将本地 HPL 目录映射到容器中的 my-dat-files 目录:

    [root@bm_guest1 nv_hpl]# #export SING_RUN="singularity run --nv -B$(pwd):/my-dat-files hpc-benchmarks:20.10-hpl.sif"

单节点 HPL-NVIDIA 基准测试

  1. 在同一个目录下为匹配测试拓扑的单节点测试创建HPL dat文件

    [root@bm_guest1 nv_hpl]# cat HPL-1N.dat
    HPLinpack benchmark input file
    Innovative Computing Laboratory, University of Tennessee
    HPL.out      output file name (if any)
    6            device out (6=stdout,7=stderr,file)
    1            # of problems sizes (N)
    125952      Ns
    1            # of NBs
    128          NBs
    0            PMAP process mapping (0=Row-,1=Column-major)
    1            # of process grids (P x Q)
    4            Ps
    2            Qs
    16.0        threshold
    1            # of panel fact
    0 1 2        PFACTs (0=left, 1=Crout, 2=Right)
    1            # of recursive stopping criterium
    2 8          NBMINs (>= 1)
    1            # of panels in recursion
    2            NDIVs
    1            # of recursive panel fact.
    0 1 2        RFACTs (0=left, 1=Crout, 2=Right)
    1            # of broadcast
    3 2          BCASTs (0=1rg,1=1rM,2=2rg,3=2rM,4=Lng,5=LnM)
    1            # of lookahead depth
    1 0          DEPTHs (>=0)
    1            SWAP (0=bin-exch,1=long,2=mix)
    192          swapping threshold
    1            L1 in (0=transposed,1=no-transposed) form
    0            U  in (0=transposed,1=no-transposed) form
    0            Equilibration (0=no,1=yes)
    8            memory alignment in double (> 0)
  2. 使用相关的服务器配置和 dat 文件运行基准作业

    [root@bm_guest1 nv_hpl]# mpirun --allow-run-as-root --bind-to none -np 8 ${SING_RUN} hpl.sh --config /my-dat-files/server_config.sh --dat /my-dat-files/HPL-1N.dat
    Prog= 95.14%  N_left= 45952  Time= 35.17    Time_left= 1.80 iGF= 17653.15  GF= 36031.62    iGF_per= 2206.64        GF_per= 4503.95
    Prog= 95.91%  N_left= 43392  Time= 35.78    Time_left= 1.53 iGF= 16815.65  GF= 35705.22    iGF_per= 2101.96        GF_per= 4463.15
    Prog= 96.59%  N_left= 40832  Time= 36.36    Time_left= 1.28 iGF= 15731.31  GF= 35388.05    iGF_per= 1966.41        GF_per= 4423.51
    Prog= 97.17%  N_left= 38400  Time= 36.87    Time_left= 1.08 iGF= 14909.82  GF= 35103.60    iGF_per= 1863.73        GF_per= 4387.95
    Prog= 99.15%  N_left= 25728  Time= 39.10    Time_left= 0.34 iGF= 11861.95  GF= 33780.78    iGF_per= 1482.74        GF_per= 4222.60
    Prog= 99.89%  N_left= 13184  Time= 40.52    Time_left= 0.05 iGF=  6925.20  GF= 32840.30    iGF_per= 865.65        GF_per= 4105.04
    Prog= 100.00%  N_left= 512    Time= 41.13    Time_left= 0.00 iGF=  2500.08  GF= 32389.52    iGF_per= 312.51        GF_per= 4048.69
    2020-11-08 16:11:15.838
    ================================================================================
    T/V                N    NB    P    Q              Time                Gflops
    --------------------------------------------------------------------------------
    WR03L2L2      125952  128    4    2              41.59              3.203e+04
    --------------------------------------------------------------------------------
    ||Ax-b||_oo/(eps*(||A||_oo*||x||_oo+||b||_oo)*N)=        0.0038751 ...... PASSED
    ================================================================================
    Finished      1 tests with the following results:
                1 tests completed and passed residual checks,
                0 tests completed and failed residual checks,
                0 tests skipped because of illegal input values.
    --------------------------------------------------------------------------------
    End of Tests.
    ================================================================================

    32 TeraFlops HPL 基准测试结果展示了我们上面在单个裸机节点上使用的测试拓扑和配置

超过 200Gbps InfiniBand 结构的多节点 HPL-NVIDIA 基准测试

  1. 在同一目录中为与测试拓扑匹配的 2 节点测试创建HPL dat 文件

    [root@bm_guest1 nv_hpl]# cat HPL-2N.dat
    HPLinpack benchmark input file
    Innovative Computing Laboratory, University of Tennessee
    HPL.out      output file name (if any)
    6            device out (6=stdout,7=stderr,file)
    1            # of problems sizes (N)
    175104      Ns
    1            # of NBs
    256          NBs
    0            PMAP process mapping (0=Row-,1=Column-major)
    1            # of process grids (P x Q)
    4            Ps
    4            Qs
    16.0        threshold
    1            # of panel fact
    0 1 2        PFACTs (0=left, 1=Crout, 2=Right)
    1            # of recursive stopping criterium
    2 8          NBMINs (>= 1)
    1            # of panels in recursion
    2            NDIVs
    1            # of recursive panel fact.
    0 1 2        RFACTs (0=left, 1=Crout, 2=Right)
    1            # of broadcast
    3 2          BCASTs (0=1rg,1=1rM,2=2rg,3=2rM,4=Lng,5=LnM)
    1            # of lookahead depth
    1 0          DEPTHs (>=0)
    1            SWAP (0=bin-exch,1=long,2=mix)
    192          swapping threshold
    1            L1 in (0=transposed,1=no-transposed) form
    0            U  in (0=transposed,1=no-transposed) form
    0            Equilibration (0=no,1=yes)
    8            memory alignment in double (> 0)
  2. 使用相关的服务器配置和 dat 文件运行基准作业,指定节点主机名:

    [root@bm_guest1 nv_hpl]# mpirun --allow-run-as-root --oversubscribe --bind-to none -np 16 -host bm_guest1,bm_guest2  ${SING_RUN} hpl.sh --config /my-dat-files/server_config.sh --dat /my-dat-files/HPL-2N.dat
    Prog= 92.38%  N_left= 74240  Time= 44.33    Time_left= 3.66 iGF= 43598.37  GF= 74595.23    iGF_per= 2724.90        GF_per= 4662.20
    Prog= 93.36%  N_left= 70912  Time= 45.13    Time_left= 3.21 iGF= 43690.43  GF= 74045.61    iGF_per= 2730.65        GF_per= 4627.85
    Prog= 94.32%  N_left= 67328  Time= 46.01    Time_left= 2.77 iGF= 38839.99  GF= 73370.80    iGF_per= 2427.50        GF_per= 4585.68
    Prog= 95.18%  N_left= 63744  Time= 46.81    Time_left= 2.37 iGF= 38734.31  GF= 72782.49    iGF_per= 2420.89        GF_per= 4548.91
    Prog= 95.94%  N_left= 60160  Time= 47.60    Time_left= 2.01 iGF= 34457.45  GF= 72139.53    iGF_per= 2153.59        GF_per= 4508.72
    Prog= 96.58%  N_left= 56832  Time= 48.27    Time_left= 1.71 iGF= 33989.27  GF= 71609.84    iGF_per= 2124.33        GF_per= 4475.61
    Prog= 97.19%  N_left= 53248  Time= 48.94    Time_left= 1.42 iGF= 32423.82  GF= 71073.46    iGF_per= 2026.49        GF_per= 4442.09
    Prog= 99.14%  N_left= 35840  Time= 51.69    Time_left= 0.45 iGF= 25436.77  GF= 68645.41    iGF_per= 1589.80        GF_per= 4290.34
    Prog= 99.89%  N_left= 18176  Time= 53.55    Time_left= 0.06 iGF= 14401.71  GF= 66768.22    iGF_per= 900.11        GF_per= 4173.01
    Prog= 100.00%  N_left= 768    Time= 54.43    Time_left= 0.00 iGF=  4536.34  GF= 65759.34    iGF_per= 283.52        GF_per= 4109.96
    2020-11-08 14:38:53.703
    ================================================================================
    T/V                N    NB    P    Q              Time                Gflops
    --------------------------------------------------------------------------------
    WR03L2L2      175104  256    4    4              54.87              6.523e+04
    --------------------------------------------------------------------------------
    ||Ax-b||_oo/(eps*(||A||_oo*||x||_oo+||b||_oo)*N)=        0.0030685 ...... PASSED
    ================================================================================

    2 个裸机节点上的 HPL 基准测试展示了 我们上面使用的测试拓扑和配置的 65 TeraFlops线性缩放结果




微信公众号