如何:使用Infiniband的Azure OpenMPI-Linux

如何:使用Infiniband的Azure OpenMPI-Linux,azure,openmpi,infiniband,rdma,Azure,Openmpi,Infiniband,Rdma,我刚开始使用Microsoft Azure进行科学计算,在设置时遇到了一些问题 我有一个跳转框设置,作为我要使用的软件的许可证服务器,还有一个存储所有软件的公共驱动器。 还设置了6个计算节点(16个核心/节点),我可以从跳转框“ssh”到计算节点而不会出现问题。跳转框和计算节点使用CentOS和OpenMPI 1.10.3 我已经创建了一个脚本,该脚本存储在已安装的跳转盒驱动器上,我通过“clusRun.sh”在每个计算节点上运行,该脚本设置了我运行的软件和OpenMPI的所有特定环境变量。 希

我刚开始使用Microsoft Azure进行科学计算,在设置时遇到了一些问题

我有一个跳转框设置,作为我要使用的软件的许可证服务器,还有一个存储所有软件的公共驱动器。 还设置了6个计算节点(16个核心/节点),我可以从跳转框“ssh”到计算节点而不会出现问题。跳转框和计算节点使用CentOS和OpenMPI 1.10.3

我已经创建了一个脚本,该脚本存储在已安装的跳转盒驱动器上,我通过“clusRun.sh”在每个计算节点上运行,该脚本设置了我运行的软件和OpenMPI的所有特定环境变量。 希望这一切听起来都不错

过去,我在Linux集群上经常使用这个软件,没有任何问题。作业使用类似的命令提交,例如:

mpirun-np XXX-hostfile XXX{path to software}

其中XXX是处理器数量和主机文件路径

我在跳转框上运行这个命令,并且hostfile有一个每个计算节点的名称列表,每个计算节点名称在hostfile中的次数与我想要在节点上的核心数相同。希望这有意义!跳转框节点上运行的作业中没有进程,它仅用于启动作业

当我尝试以这种方式运行作业时,我会收到一些错误,大多数错误似乎与Infiniband有关。以下是关键错误的简短列表:

"The /dev/hfi1_0 device failed to appear after 15.0 seconds: Connection timed out"

"The OpenFabrics (openib) BTL failed to initialize while trying to create an internal queue"

"OMPI source: btl_openib.c:324
 Function: ibv_create_srq()
 Error: Function not implemented (errno=38)
 Device: mlx4_0"
“至少有一对MPI进程无法相互联系以进行MPI通信。这意味着没有打开的MPI设备表明它可以用于这些进程之间的通信”

是否有任何特定于OpenMPI的环境变量需要设置以定义任何Infiniband设置?我已经定义了通常的MPI_BIN、LD_LIBRARY_PATH、PATH等。我知道IntelMPI需要额外的变量

Infiniband应该作为A9 HPC配置的一部分,但是我不确定它是否需要任何特定设置。当我运行'ifconfig-a'时,没有特定于Infiniband的条目(我希望看到ib0、ib1等)。我只有eth0,eth1和lo

我期待有人能提供任何建议

亲切的问候

如第页(从已删除/隐藏中分叉)所述 “关于A8、A9、A10和A11计算密集型实例”-“从Linux A8和A9虚拟机访问”

目前,Azure Linux RDMA仅在“英特尔MPI库5”中受支持

因此,使用OpenMPI 1.10.3的CentOS可能无法使用Azure的虚拟RDMA,因为OpenMPI 1.10.3不是“英特尔MPI库5”

在官方文档中,Azure也将Intel MPI列为启用RDMA(使用SLES 12 SP1 HPC VM): “设置Linux RDMA群集以运行MPI应用程序”-2017-3-14

定制虚拟机

在SLES 12 SP1 HPC虚拟机中,我们建议您不要应用内核更新,这可能会导致Linux RDMA驱动程序出现问题。 英特尔MPI:通过运行以下命令,在SLES 12 SP1 HPC虚拟机上完成英特尔MPI的安装:

 sudo rpm -v -i --nodeps /opt/intelMPI/intel_mpi_packages/*.rpm
如果要基于Azure Marketplace中基于CentOS的HPC映像之一而不是针对HPC的SLES 12设置群集,请遵循上一节中的常规步骤。在调配和配置VM时,请注意以下差异: Intel MPI已安装在从基于CentOS的HPC映像配置的VM上

因此,Azure虚拟RDMA(Infiniband)有专有的内核驱动程序,从Azure预安装到SLES 12虚拟机映像中,从Azure预安装到CentOS虚拟机映像中,也有专有的用户空间驱动程序(因为Infiniband通常在英特尔MPI中使用内核旁路并从用户空间与硬件对话进行数据移动操作)

尝试使用预装的“英特尔MPI”重新编译应用程序,并使用“英特尔MPI”的mpirun/mpiexec启动应用程序。指令仍然在同一条线上:

配置Intel MPI以在Azure Linux RDMA上运行MPI应用程序,您可以 需要配置特定于英特尔MPI的某些环境变量。 下面是一个Bash脚本示例,用于配置运行所需的变量 申请书。根据需要将路径更改为
mpivars.sh
英特尔MPI的安装

#!/bin/bash -x

# For a SLES 12 SP1 HPC cluster

source /opt/intel/impi/5.0.3.048/bin64/mpivars.sh

# For a CentOS-based HPC cluster

# source /opt/intel/impi/5.1.3.181/bin64/mpivars.sh

export I_MPI_FABRICS=shm:dapl

# THIS IS A MANDATORY ENVIRONMENT VARIABLE AND MUST BE SET BEFORE RUNNING ANY JOB
# Setting the variable to shm:dapl gives best performance for some applications
# If your application doesn’t take advantage of shared memory and MPI together, then set only dapl

export I_MPI_DAPL_PROVIDER=ofa-v2-ib0

# THIS IS A MANDATORY ENVIRONMENT VARIABLE AND MUST BE SET BEFORE RUNNING ANY JOB

export I_MPI_DYNAMIC_CONNECTION=0

# THIS IS A MANDATORY ENVIRONMENT VARIABLE AND MUST BE SET BEFORE RUNNING ANY JOB

# Command line to run the job

mpirun -n <number-of-cores> -ppn <core-per-node> -hostfile <hostfilename>  /path <path to the application exe> <arguments specific to the application>

#end
#/bin/bash-x
#对于SLES 12 SP1 HPC群集
source/opt/intel/impi/5.0.3.048/bin64/mpivars.sh
#对于基于CentOS的HPC群集
#source/opt/intel/impi/5.1.3.181/bin64/mpivars.sh
导出I_MPI_织物=shm:dapl
#这是一个必需的环境变量,必须在运行任何作业之前设置
#将变量设置为shm:dapl可以为某些应用程序提供最佳性能
#如果应用程序没有同时利用共享内存和MPI,那么只设置dapl
导出I_MPI_DAPL_提供程序=ofa-v2-ib0
#这是一个必需的环境变量,必须在运行任何作业之前设置
导出I\u MPI\u动态\u连接=0
#这是一个必需的环境变量,必须在运行任何作业之前设置
#运行作业的命令行
mpirun-n-ppn-hostfile/path
#结束

infiniband使用不同的通信层(动词),并且未在ifconfig中注册(只有infiniband上的ip=IPoIB将在ifconfig中创建条目)。有较旧的设置infiniband的手册:。您的具体实例是什么以及使用了哪种卡(请检查lspci/dmesg/lsmod以了解mlx和hfi卡/模块)?Azure for Infiniband是否支持您的CentOS(内核和libs)和OpenMPI?(存在虚拟化RDMA,并非每个驱动程序都支持它)。虚拟化InfiniBand似乎不支持共享接收队列对。如果添加以下
mpirun
选项,会发生什么情况<代码>--mca btl_openib_接收队列P,128256192128:P,204810241008,64:P,1228810241008,64:P,655361024108,64这应该将所有共享接收队列对转换为私有队列对。错误是否继续发生?