在 Azure 中的 Linux RDMA 群集上使用 Microsoft HPC Pack 运行 STAR-CCM+

重要

经典 VM 将于 2023 年 3 月 1 日停用。

如果使用 ASM 中的 IaaS 资源,请在 2023 年 3 月 1 日完成迁移。 我们建议你尽快进行切换,以利用 Azure 资源管理器中的许多增强功能。

有关详细信息,请参阅 将 IaaS 资源在 2023 年 3 月 1 日前迁移到 Azure 资源管理器

本文介绍如何在 Azure 上部署Microsoft HPC Pack 群集,并在多个与 InfiniBand 互连的 Linux 计算节点上运行 CD-adapco STAR-CCM+ 作业。

注释

Azure 具有用于创建和处理资源的两个不同的部署模型:资源管理器部署模型和经典部署模型。 这篇文章介绍如何使用这两种模型,但 Microsoft 建议大多数最新部署使用 Resource Manager 模型。

Microsoft HPC Pack 提供了在 Microsoft azure 虚拟机群集上运行各种大规模 HPC 和并行应用程序(包括 MPI 应用程序)的功能。 HPC Pack 还支持在部署在 HPC Pack 群集中的 Linux 计算节点 VM 上运行 Linux HPC 应用程序。 有关将 Linux 计算节点与 HPC Pack 配合使用的简介,请参阅 Azure HPC Pack 群集中的 Linux 计算节点入门

配置 HPC Pack 群集

下载中心 下载 HPC Pack IaaS 部署脚本,并将其提取到本地。

Azure PowerShell 是先决条件。 如果未在本地计算机上配置 PowerShell,请阅读 有关如何安装和配置 Azure PowerShell 的文章。

撰写本文时,来自 Azure 市场的 Linux 映像(包含适用于 Azure 的 InfiniBand 驱动程序)适用于 SLES 12、CentOS 6.5 和 CentOS 7.1。 本文基于 SLES 12 的使用。 若要检索市场中支持 HPC 的所有 Linux 映像的名称,可以运行以下 PowerShell 命令:

    get-azurevmimage | ?{$_.ImageName.Contains("hpc") -and $_.OS -eq "Linux" }

输出列出了这些映像可用的位置,以及稍后在部署模板中使用的映像名称(ImageName)。

在部署群集之前,必须生成 HPC Pack 部署模板文件。 由于我们面向小型群集,头节点将是域控制器并托管本地 SQL 数据库。

以下模板将部署此类头节点、创建名为 MyCluster.xml的 XML 文件,并将 SubscriptionIdStorageAccountLocationVMNameServiceName 的值替换为你的值。

<?xml version="1.0" encoding="utf-8" ?>
<IaaSClusterConfig>
  <Subscription>
    <SubscriptionId>99999999-9999-9999-9999-999999999999</SubscriptionId>
    <StorageAccount>mystorageaccount</StorageAccount>
  </Subscription>
  <Location>North Europe</Location>
  <VNet>
    <VNetName>hpcvnetne</VNetName>
    <SubnetName>subnet-hpc</SubnetName>
  </VNet>
  <Domain>
    <DCOption>HeadNodeAsDC</DCOption>
    <DomainFQDN>hpc.local</DomainFQDN>
  </Domain>
  <Database>
    <DBOption>LocalDB</DBOption>
  </Database>
  <HeadNode>
    <VMName>myhpchn</VMName>
    <ServiceName>myhpchn</ServiceName>
    <VMSize>Standard_D4</VMSize>
  </HeadNode>
  <LinuxComputeNodes>
    <VMNamePattern>lnxcn-%0001%</VMNamePattern>
    <ServiceNamePattern>mylnxcn%01%</ServiceNamePattern>
    <MaxNodeCountPerService>20</MaxNodeCountPerService>
    <StorageAccountNamePattern>mylnxstorage%01%</StorageAccountNamePattern>
    <VMSize>A9</VMSize>
    <NodeCount>0</NodeCount>
    <ImageName>b4590d9e3ed742e4a1d46e5424aa335e__suse-sles-12-hpc-v20150708</ImageName>
  </LinuxComputeNodes>
</IaaSClusterConfig>

在提升的命令提示符中运行 PowerShell 命令以开始创建主节点:

    .\New-HPCIaaSCluster.ps1 -ConfigFile MyCluster.xml

20 到 30 分钟后,头节点应准备就绪。 可以通过单击虚拟机的 “连接” 图标从 Azure 门户连接到它。

你最终可能需要修复 DNS 转发器。 为此,请启动 DNS 管理器。

  1. 右键单击 DNS 管理器中的服务器名称,选择“ 属性”,然后单击“ 转发器 ”选项卡。
  2. 单击 “编辑” 按钮以删除任何转发器,然后单击“ 确定”。
  3. 请确保选中“如果没有转发器可用则使用根提示”复选框,然后单击“确定”。

设置 Linux 计算节点

使用用于创建头节点的相同部署模板部署 Linux 计算节点。

将文件 MyCluster.xml 从本地计算机复制到头节点,并用您想要部署的节点数(=20)更新 NodeCount 标记。 请注意,在 Azure 配额中有足够的可用核心,因为每个 A9 实例都将在订阅中使用 16 个核心。 如果要在同一预算中使用更多 VM,可以使用 A8 实例(8 个核心),而不是 A9。

在头节点上,复制 HPC Pack IaaS 部署脚本。

在提升的命令提示符下运行以下 Azure PowerShell 命令:

  1. 运行 Add-AzureAccount 以连接到 Azure 订阅。

  2. 如果有多个订阅,请运行 Get-AzureSubscription 列出它们。

  3. 通过运行 Select-AzureSubscription -SubscriptionName xxxx -Default 命令设置默认订阅。

  4. 运行 。\New-HPCIaaSCluster.ps1 -ConfigFile MyCluster.xml 开始部署 Linux 计算节点。

    头节点部署正在进行

打开 HPC Pack 群集管理器工具。 几分钟后,Linux 计算节点将定期显示在群集计算节点列表中。 使用经典部署模式,按顺序创建 IaaS VM。 因此,如果节点数很重要,部署所有节点可能需要大量的时间。

HPC Pack 群集管理器中的 Linux 节点

在群集中启动并运行所有节点后,还需要进行其他基础结构设置。

为 Windows 和 Linux 节点设置 Azure 文件共享

可以使用 Azure 文件服务来存储脚本、应用程序包和数据文件。 Azure 文件以持久性存储的形式提供 Azure Blob 存储之上的 CIFS 功能。 请注意,这不是最可缩放的解决方案,但它是最简单且不需要专用 VM 的解决方案。

按照 Windows 上的 Azure 文件存储入门文章中的说明创建 Azure 文件共享。

将存储帐户的名称保留为 saname,文件共享名称保留为 sharename,存储帐户密钥保留为 sakey

在头节点上装载 Azure 文件共享

打开提升的命令提示符并运行以下命令,将凭据存储在本地计算机保管库中:

    cmdkey /add:<saname>.file.core.windows.net /user:<saname> /pass:<sakey>

然后,若要装载 Azure 文件共享,请运行:

    net use Z: \\<saname>.file.core.windows.net\<sharename> /persistent:yes

在 Linux 计算节点上装载 Azure 文件共享

HPC Pack 附带的一个有用工具是 clusrun 工具。 可以使用此命令行工具在一组计算节点上同时运行相同的命令。 在本例中,它用于挂载 Azure 文件共享,并在重启后保持其可用性。 在头节点的具有管理员权限的命令提示符中,运行以下命令。

若要创建装载目录,请执行以下操作:

    clusrun /nodegroup:LinuxNodes mkdir -p /hpcdata

装载 Azure 文件共享:

    clusrun /nodegroup:LinuxNodes mount -t cifs //<saname>.file.core.windows.net/<sharename> /hpcdata -o vers=2.1,username=<saname>,password='<sakey>',dir_mode=0777,file_mode=0777

若要持久化挂载共享,请使用:

    clusrun /nodegroup:LinuxNodes "echo //<saname>.file.core.windows.net/<sharename> /hpcdata cifs vers=2.1,username=<saname>,password='<sakey>',dir_mode=0777,file_mode=0777 >> /etc/fstab"

安装 STAR-CCM+

Azure VM 实例 A8 和 A9 提供 InfiniBand 支持和 RDMA 功能。 这些功能的内核驱动程序在 Azure 市场中的 Windows Server 2012 R2、SUSE 12、CentOS 6.5 和 CentOS 7.1 映像中可用。 Microsoft MPI 和 Intel MPI(版本 5.x)是支持 Azure 中这些驱动程序的两个 MPI 库。

CD-adapco STAR-CCM+ 版本 11.x 及更高版本与 Intel MPI 版本 5.x 捆绑在一起,因此包含对 Azure 的 InfiniBand 支持。

CD-adapco 门户获取 Linux64 STAR-CCM+ 包。 在本例中,我们使用了混合精度的版本 11.02.010。

在头节点上,在 /hpcdata Azure 文件共享中创建名为 setupstarccm.sh 的 shell 脚本,其中包含以下内容。 此脚本将在每个计算节点上运行,在本地设置 STAR-CCM+ 。

示例 setupstarcm.sh 脚本

    #!/bin/bash
    # setupstarcm.sh to set up STAR-CCM+ locally

    # Create the CD-adapco main directory
    mkdir -p /opt/CD-adapco

    # Copy the STAR-CCM package from the file share to the local directory
    cp /hpcdata/StarCCM/STAR-CCM+11.02.010_01_linux-x86_64.tar.gz /opt/CD-adapco/

    # Extract the package
    tar -xzf /opt/CD-adapco/STAR-CCM+11.02.010_01_linux-x86_64.tar.gz -C /opt/CD-adapco/

    # Start a silent installation of STAR-CCM without the FLEXlm component
    /opt/CD-adapco/starccm+_11.02.010/STAR-CCM+11.02.010_01_linux-x86_64-2.5_gnu4.8.bin -i silent -DCOMPUTE_NODE=true -DNODOC=true -DINSTALLFLEX=false

    # Update memory limits
    echo "*               hard    memlock         unlimited" >> /etc/security/limits.conf
    echo "*               soft    memlock         unlimited" >> /etc/security/limits.conf

现在,若要在所有 Linux 计算节点上设置 STAR-CCM+,请打开提升的命令提示符并运行以下命令:

    clusrun /nodegroup:LinuxNodes bash /hpcdata/setupstarccm.sh

运行命令时,可以使用群集管理器的热度映射来监视 CPU 使用率。 几分钟后,应正确设置所有节点。

运行 STAR-CCM+ 作业

HPC Pack 用于其作业计划程序功能,以便运行 STAR-CCM+ 作业。 为此,我们需要支持几个用于启动作业并运行 STAR-CCM+ 的脚本。 为了简单起见,输入数据首先保留在 Azure 文件共享上。

以下 PowerShell 脚本用于对 STAR-CCM+ 作业进行排队。 它采用三个参数:

  • 模型名称
  • 要使用的节点数
  • 每个节点上要使用的核心数量

由于 STAR-CCM+ 可以填充内存带宽,因此通常最好为每个计算节点使用更少的核心并添加新节点。 每个节点的内核的确切数量将取决于处理器系列和互连速度。

节点是专门为作业分配的,不能与其他作业共享。 作业不是直接作为 MPI 作业启动的。 runstarccm.sh shell 脚本将启动 MPI 启动器。

输入模型和 runstarccm.sh 脚本存储在以前装载的 /hpcdata 共享中。

日志文件以作业 ID 命名,并存储在 /hpcdata 共享中,以及 STAR-CCM+ 输出文件。

示例 SubmitStarccmJob.ps1 脚本

    Add-PSSnapin Microsoft.HPC -ErrorAction silentlycontinue
    $scheduler="headnodename"
    $modelName=$args[0]
    $nbCoresPerNode=$args[2]
    $nbNodes=$args[1]

    #---------------------------------------------------------------------------------------------------------
    # Create a new job; this will give us the job ID that's used to identify the name of the uploaded package in Azure
    #
    $job = New-HpcJob -Name "$modelName $nbNodes $nbCoresPerNode" -Scheduler $scheduler -NumNodes $nbNodes -NodeGroups "LinuxNodes" -FailOnTaskFailure $true -Exclusive $true
    $jobId = [String]$job.Id

    #---------------------------------------------------------------------------------------------------------
    # Submit the job     
    $workdir =  "/hpcdata"
    $execName = "$nbCoresPerNode runner.java $modelName.sim"

    $job | Add-HpcTask -Scheduler $scheduler -Name "Compute" -stdout "$jobId.log" -stderr "$jobId.err" -Rerunnable $false -NumNodes $nbNodes -Command "runstarccm.sh $execName" -WorkDir "$workdir"


    Submit-HpcJob -Job $job -Scheduler $scheduler

runner.java 替换为首选的 STAR-CCM+ Java 模型启动器和日志记录代码。

示例 runstarccm.sh 脚本

    #!/bin/bash
    echo "start"
    # The path of this script
    SCRIPT_PATH="$( dirname "${BASH_SOURCE[0]}" )"
    echo ${SCRIPT_PATH}
    # Set the mpirun runtime environment
    export CDLMD_LICENSE_FILE=1999@flex.cd-adapco.com

    # mpirun command
    STARCCM=/opt/CD-adapco/STAR-CCM+11.02.010/star/bin/starccm+

    # Get node information from ENVs
    NODESCORES=(${CCP_NODES_CORES})
    COUNT=${#NODESCORES[@]}
    NBCORESPERNODE=$1

    # Create the hostfile file
    NODELIST_PATH=${SCRIPT_PATH}/hostfile_$$
    echo ${NODELIST_PATH}

    # Get every node name and write into the hostfile file
    I=1
    NBNODES=0
    while [ ${I} -lt ${COUNT} ]
    do
        echo "${NODESCORES[${I}]}" >> ${NODELIST_PATH}
        let "I=${I}+2"
        let "NBNODES=${NBNODES}+1"
    done
    let "NBCORES=${NBNODES}*${NBCORESPERNODE}"

    # Run STAR-CCM with the hostfile argument
    #  
    ${STARCCM} -np ${NBCORES} -machinefile ${NODELIST_PATH} \
        -power -podkey "<yourkey>" -rsh ssh \
        -mpi intel -fabric UDAPL -cpubind bandwidth,v \
        -mppflags "-ppn $NBCORESPERNODE -genv I_MPI_DAPL_PROVIDER=ofa-v2-ib0 -genv I_MPI_DAPL_UD=0 -genv I_MPI_DYNAMIC_CONNECTION=0" \
        -batch $2 $3
    RTNSTS=$?
    rm -f ${NODELIST_PATH}

    exit ${RTNSTS}

在我们的测试中,我们使用了 Power-On-Demand 许可证令牌。 对于该令牌,必须将 $CDLMD_LICENSE_FILE 环境变量 1999@flex.cd-adapco.com 设置为命令行的 -podkey 选项中的密钥。

初始化后,脚本会从 HPC Pack 设置的 $CCP_NODES_CORES 环境变量中提取节点列表,以生成 MPI 启动器使用的主机文件。 此 hostfile 将包含用于作业的计算节点名称列表,每行一个名称。

$CCP_NODES_CORES 的格式遵循以下模式:

<Number of nodes> <Name of node1> <Cores of node1> <Name of node2> <Cores of node2>...`

地点:

  • <Number of nodes> 是分配给此作业的节点数。
  • <Name of node_n_...> 是分配给此作业的每个节点的名称。
  • <Cores of node_n_...> 是分配给此作业的节点上的核心数。

核心数($NBCORES)也根据节点数($NBNODES)和每个节点的核心数(作为参数 $NBCORESPERNODE提供)计算。

对于 MPI 选项,与 Azure 上的 Intel MPI 一起使用的选项包括:

  • -mpi intel 指定 Intel MPI。
  • -fabric UDAPL 使用 Azure InfiniBand 谓词。
  • -cpubind bandwidth,v 使用 STAR-CCM+ 优化 MPI 的带宽。
  • -mppflags "-ppn $NBCORESPERNODE -genv I_MPI_DAPL_PROVIDER=ofa-v2-ib0 -genv I_MPI_DAPL_UD=0 -genv I_MPI_DYNAMIC_CONNECTION=0" 使 Intel MPI 能够与 Azure InfiniBand 配合使用,并设置每个节点所需的核心数。
  • -batch 在无用户界面的情况下以批处理模式启动 STAR-CCM+。

最后,若要启动作业,请确保节点已启动并运行并在群集管理器中处于联机状态。 然后从 PowerShell 命令提示符处运行以下命令:

    .\ SubmitStarccmJob.ps1 <model> <nbNodes> <nbCoresPerNode>

停止节点

稍后,完成测试后,可以使用以下 HPC Pack PowerShell 命令停止和启动节点:

    Stop-HPCIaaSNode.ps1 -Name <prefix>-00*
    Start-HPCIaaSNode.ps1 -Name <prefix>-00*

后续步骤

尝试运行其他 Linux 工作负载。 有关示例,请参阅: