重要
经典 VM 将于 2023 年 3 月 1 日停用。
如果使用 ASM 中的 IaaS 资源,请在 2023 年 3 月 1 日完成迁移。 我们建议你尽快进行切换,以利用 Azure 资源管理器中的许多增强功能。
有关详细信息,请参阅在 2023 年 3 月 1 日之前将 IaaS 资源迁移到 Azure 资源管理器。
本文介绍在 Azure 虚拟机上运行 Linux 高性能计算(HPC)工作负荷的一种方法。 在这里,你将使用 Linux 计算节点在 Azure 上设置 Microsoft HPC Pack 群集,并运行 NAMD 模拟来计算和可视化大型生物分子系统的结构。
注释
Azure 具有用于创建和处理资源的两个不同的部署模型:资源管理器部署模型和经典部署模型。 这篇文章介绍如何使用这两种模型,但 Microsoft 建议大多数最新部署使用 Resource Manager 模型。
- NAMD (为 nanoscale 分子动力学设计的程序) 是一个并行分子动力学包,旨在进行高性能模拟,处理包含多达数百万个原子的大型生物分子系统。 这些系统的示例包括病毒、细胞结构和大蛋白质。 NAMD 可扩展到数百个核心,用于典型模拟,最大模拟的内核数超过 500,000 个。
- Microsoft HPC Pack 提供了在本地计算机或 Azure 虚拟机群集中运行大规模 HPC 和并行应用程序的功能。 HPC Pack 最初开发为 Windows HPC 工作负载的解决方案,现在支持在 HPC Pack 群集中部署的 Linux 计算节点 VM 上运行 Linux HPC 应用程序。 有关更多信息,请参阅 Azure 的 HPC Pack 群集中的 Linux 计算节点入门 。
先决条件
- 具有 Linux 计算节点的 HPC Pack 群集 - 使用 Azure 资源管理器模板 或 Azure PowerShell 脚本在 Azure 上部署具有 Linux 计算节点的 HPC Pack 群集。 有关任一选项的先决条件和步骤,请参阅 Azure HPC Pack 群集中的 Linux 计算节点入门 。 如果选择 PowerShell 脚本部署选项,请参阅本文末尾的示例文件中的示例配置文件。 此文件配置一个基于 Azure 的 HPC Pack 群集,该群集由 Windows Server 2012 R2 头节点和四个大型 CentOS 6.6 计算节点组成。 根据需要为环境自定义此文件。
- NAMD 软件和教程文件 - 从 NAMD 站点下载适用于 Linux 的 NAMD 软件(需要注册)。 本文基于 NAMD 版本 2.10,并使用 Linux-x86_64(带以太网的 64 位 Intel/AMD) 存档。 另请下载 NAMD 教程文件。 下载是.tar文件,你需要一个 Windows 工具来提取群集头节点上的文件。 若要提取文件,请按照本文后面的说明进行作。
- VMD (可选) - 若要查看 NAMD 作业的结果,请在所选的计算机上下载并安装分子可视化程序 VMD 。 当前版本为 1.9.2。 请参阅 VMD 下载站点以开始使用。
建立计算节点之间的相互信任
在多个 Linux 节点上运行跨节点作业需要节点相互信任(通过 rsh 或 ssh)。 使用 Microsoft HPC Pack IaaS 部署脚本创建 HPC Pack 群集时,该脚本会自动为指定的管理员帐户设置永久互信。 对于在群集域中创建的非管理员用户,在分配作业时,必须在节点之间设置临时相互信任。 然后,在作业完成后销毁关系。 若要为每个用户执行此作,请向 HPC Pack 用来建立信任关系的群集提供 RSA 密钥对。 说明如下。
生成 RSA 密钥对
通过运行 Linux ssh-keygen 命令,可以轻松生成包含公钥和私钥的 RSA 密钥对。
- 登录到 Linux 计算机。 
- 运行下面的命令: - ssh-keygen -t rsa- 注释 - 按 Enter 以使用默认设置,直到命令完成。 不要在此处输入通行短语;当系统提示输入密码时,只需按 Enter。   
- 将目录更改为 ~/.ssh 目录。 私钥存储在 id_rsa 中,公钥存储在 id_rsa.pub 中。   
将密钥对添加到 HPC Pack 群集
- 使用在部署集群时提供的域凭据(例如 hpc\clusteradmin)通过远程桌面连接到头节点的虚拟机。 从头节点管理群集。 
- 使用标准 Windows Server 过程在群集的 Active Directory 域中创建域用户帐户。 例如,在头节点上使用 Active Directory 用户和计算机工具。 本文中的示例假定你在 hpclab 域(hpclab\hpcuser)中创建名为 hpcuser 的域用户。 
- 将域用户作为群集用户添加到 HPC Pack 群集。 有关说明,请参阅 添加或删除群集用户。 
- 创建名为 C:\cred.xml 的文件,并将 RSA 密钥数据复制到其中。 可以在本文末尾的示例文件中找到一个示例。 - <ExtendedData> <PrivateKey>Copy the contents of private key here</PrivateKey> <PublicKey>Copy the contents of public key here</PublicKey> </ExtendedData>
- 打开命令提示符并输入以下命令以设置 hpclab\hpcuser 帐户的凭据数据。 使用 extendeddata 参数传递您为关键数据创建的 C:\cred.xml 文件名称。 - hpccred setcreds /extendeddata:c:\cred.xml /user:hpclab\hpcuser /password:<UserPassword>- 此命令在未输出的情况下成功完成。 设置用户帐户的凭据后,需要运行作业,将 cred.xml 文件存储在安全位置,或删除该文件。 
- 如果在某个 Linux 节点上生成了 RSA 密钥对,请记得在使用完密钥后删除这些密钥。 如果 HPC Pack 发现存在 id_rsa 文件或 id_rsa.pub 文件,则不会设置相互信任。 
重要
不建议在共享群集上以群集管理员身份运行 Linux 作业,因为由管理员提交的作业在 Linux 节点上的根帐户下运行。 由非管理员用户提交的作业在与作业用户同名的本地 Linux 用户帐户下运行。 在这种情况下,HPC Pack 为此 Linux 用户在分配给作业的所有节点间建立了相互信任。 可以在运行作业之前手动在 Linux 节点上设置 Linux 用户,或者 HPC Pack 会在提交作业时自动创建用户。 如果 HPC Pack 创建用户,则 HPC Pack 会在作业完成后将其删除。 为了减少安全威胁,在节点上完成作业后,将删除密钥。
为 Linux 节点设置文件共享
现在设置 SMB 文件共享,并将共享文件夹装载到所有 Linux 节点上,以允许 Linux 节点使用通用路径访问 NAMD 文件。 以下是在头节点上装载共享文件夹的步骤。 对于当前不支持 Azure 文件服务的 CentOS 6.6 等分发版,建议使用共享。 如果 Linux 节点支持 Azure 文件共享,请参阅 如何将 Azure 文件存储与 Linux 配合使用。 有关 HPC Pack 的其他文件共享选项,请参阅 Azure 的 HPC Pack 群集中的 Linux 计算节点入门。
- 在头节点上创建一个文件夹,并通过设置读/写权限将其共享给每个人。 在此示例中,\\CentOS66HN\Namd 是文件夹的名称,其中 CentOS66HN 是头节点的主机名。 
- 在共享文件夹中创建名为 namd2 的子文件夹。 在 namd2 中,创建另一个名为 namdsample 的子文件夹。 
- 使用运行.tar存档的 Windows 版本的 tar 或其他 Windows 实用工具提取文件夹中的 NAMD 文件。 - 将 NAMD tar 存档解压缩到 \\CentOS66HN\Namd\namd2。
- 请在 \\CentOS66HN\Namd\namd2\namdsample 下解压教程文件。
 
- 打开 Windows PowerShell 窗口并运行以下命令,在 Linux 节点上装载共享文件夹。 - clusrun /nodegroup:LinuxNodes mkdir -p /namd2 clusrun /nodegroup:LinuxNodes mount -t cifs //CentOS66HN/Namd/namd2 /namd2 -o vers=2.1`,username=<username>`,password='<password>'`,dir_mode=0777`,file_mode=0777
第一个命令在 LinuxNodes 组的所有节点上创建名为 /namd2 的文件夹。 第二个命令将共享文件夹 //CentOS66HN/Namd/namd2 挂载到文件夹上,并将 dir_mode 和 file_mode 权限位设置为 777。 命令中的用户名和密码应该是头节点上用户的凭据。
注释
第二个命令中的“`”符号是 PowerShell 的转义字符。 “,”表示“,”(逗号字符)是命令的一部分。
创建 Bash 脚本以运行 NAMD 作业
NAMD 作业需要一个 nodelist 文件,以便 charmrun 确定在启动 NAMD 进程时使用的节点数量。 使用 Bash 脚本生成节点列表文件,并使用此节点列表文件运行 charmrun。 然后,可以在 HPC 群集管理器中提交调用此脚本的 NAMD 作业。
使用所选的文本编辑器,在 /namd2 文件夹中创建一个 Bash 脚本,其中包含 NAMD 程序文件并将其命名为 hpccharmrun.sh。有关概念的快速证明,请复制本文末尾提供的示例 hpccharmrun.sh 脚本,并转到 “提交 NAMD 作业”。
小窍门
将脚本另存为包含 Linux 行尾的文本文件(仅限 LF,而不是 CR LF)。 这可确保它在 Linux 节点上正常运行。
以下是有关此 bash 脚本的作用的详细信息。
- 定义一些变量。 - #!/bin/bash # The path of this script SCRIPT_PATH="$( dirname "${BASH_SOURCE[0]}" )" # Charmrun command CHARMRUN=${SCRIPT_PATH}/charmrun # Argument of ++nodelist NODELIST_OPT="++nodelist" # Argument of ++p NUMPROCESS="+p"
- 从环境变量中获取节点信息。 $NODESCORES存储来自 $CCP_NODES_CORES 的拆分字词列表。 $COUNT是$NODESCORES的大小。 - # Get node information from the environment variables NODESCORES=(${CCP_NODES_CORES}) COUNT=${#NODESCORES[@]}- $CCP_NODES_CORES 变量的格式如下所示: - <Number of nodes> <Name of node1> <Cores of node1> <Name of node2> <Cores of node2>…- 此变量列出分配给作业的每个节点上的节点总数、节点名称和核心数。 例如,如果作业需要 10 个核心才能运行,则 $CCP_NODES_CORES 的值类似于: - 3 CENTOS66LN-00 4 CENTOS66LN-01 4 CENTOS66LN-03 2
- 如果未设置 $CCP_NODES_CORES 变量,请直接启动charmrun。 (仅当直接在 Linux 节点上运行此脚本时,才会发生这种情况。 - if [ ${COUNT} -eq 0 ] then # CCP_NODES is_CORES is not found or is empty, so just run charmrun without nodelist arg. #echo ${CHARMRUN} $* ${CHARMRUN} $*
- 或者为 charmrun 创建节点列表文件。 - else # Create the nodelist file NODELIST_PATH=${SCRIPT_PATH}/nodelist_$$ # Write the head line echo "group main" > ${NODELIST_PATH} # Get every node name and number of cores and write into the nodelist file I=1 while [ ${I} -lt ${COUNT} ] do echo "host ${NODESCORES[${I}]} ++cpus ${NODESCORES[$(($I+1))]}" >> ${NODELIST_PATH} let "I=${I}+2" done
- 使用 charmrun 与 nodelist 文件,获取其返回状态,并在最后删除 nodelist 文件。 - ${CCP_NUMCPUS} 是由 HPC Pack 头节点设置的另一个环境变量。 它存储分配给此作业的总核心数。 我们使用它指定 charmrun 的进程数。 - # Run charmrun with nodelist arg #echo ${CHARMRUN} ${NUMPROCESS}${CCP_NUMCPUS} ${NODELIST_OPT} ${NODELIST_PATH} $* ${CHARMRUN} ${NUMPROCESS}${CCP_NUMCPUS} ${NODELIST_OPT} ${NODELIST_PATH} $* RTNSTS=$? rm -f ${NODELIST_PATH} fi
- 退出并返回 charmrun 的状态。 - exit ${RTNSTS}
下面是脚本生成的 nodelist 文件中的信息:
group main
host <Name of node1> ++cpus <Cores of node1>
host <Name of node2> ++cpus <Cores of node2>
…
例如:
group main
host CENTOS66LN-00 ++cpus 4
host CENTOS66LN-01 ++cpus 4
host CENTOS66LN-03 ++cpus 2
提交 NAMD 作业
现在,你已准备好在 HPC 群集管理器中提交 NAMD 作业。
- 连接到群集头节点并启动 HPC 群集管理器。 
- 在 资源管理中,确保 Linux 计算节点处于 联机 状态。 如果没有,请选择它们,然后单击“上线”。 
- 在 作业管理中,单击“ 新建作业”。 
- 输入 hpccharmrun 等作业的名称。   
- 在 “作业详细信息 ”页上的 “作业资源”下,选择资源类型作为 节点 ,并将 “最小值 ”设置为 3。 ,我们在三个 Linux 节点上运行作业,每个节点有四个核心。   
- 单击左侧导航中的 “编辑任务 ”,然后单击“ 添加 ”将任务添加到作业。 
- 在 “任务详细信息和 I/O 重定向 ”页上,设置以下值: - 命令行 - - /namd2/hpccharmrun.sh ++remote-shell ssh /namd2/namd2 /namd2/namdsample/1-2-sphere/ubq_ws_eq.conf > /namd2/namd2_hpccharmrun.log- 小窍门 - 上述命令行是一个不带换行符的命令。 它在命令行下被换行到几行来显示。 
- 工作目录 - /namd2 
- 最小值 - 3   - 注释 - 在此处设置工作目录,因为 charmrun 尝试导航到每个节点上的相同工作目录。 如果未设置工作目录,HPC Pack 将在一个 Linux 节点上创建的随机命名文件夹中启动该命令。 这会导致其他节点上出现以下错误: - /bin/bash: line 37: cd: /tmp/nodemanager_task_94_0.mFlQSN: No such file or directory.若要避免此问题,请指定所有节点都可以访问的文件夹路径作为工作目录。
 
- 单击“ 确定 ”,然后单击“ 提交 ”以运行此作业。 - 默认情况下,HPC Pack 会以您当前登录的用户帐户提交作业。 单击“ 提交”后,对话框可能会提示输入用户名和密码。   - 在某些情况下,HPC Pack 会记住之前输入的用户信息,并且不显示此对话框。 若要再次显示 HPC Pack,请在命令提示符处输入以下命令,然后提交作业。 - hpccred delcreds
- 作业需要几分钟才能完成。 
- 在 \\Namd\namd2\namd2_hpccharmrun.log 找到作业日志,以及 \\Namd\namd2\namdsample\1-2-sphere 中的输出文件。 
- (可选)启动 VMD 以查看作业结果。 可视化 NAMD 输出文件(在本例中,水球中的泛素蛋白分子)的步骤超出了本文的范围。 有关详细信息,请参阅 NAMD 教程 。   
示例文件
PowerShell 脚本用于群集部署的示例 XML 配置文件
<?xml version="1.0" encoding="utf-8" ?>
<IaaSClusterConfig>
  <Subscription>
    <SubscriptionName>Subscription-1</SubscriptionName>
    <StorageAccount>mystorageaccount</StorageAccount>
  </Subscription>
      <Location>West US</Location>  
  <VNet>
    <VNetName>MyVNet</VNetName>
    <SubnetName>Subnet-1</SubnetName>
  </VNet>
  <Domain>
    <DCOption>HeadNodeAsDC</DCOption>
    <DomainFQDN>hpclab.local</DomainFQDN>
  </Domain>
  <Database>
    <DBOption>LocalDB</DBOption>
  </Database>
  <HeadNode>
    <VMName>CentOS66HN</VMName>
    <ServiceName>MyHPCService</ServiceName>
    <VMSize>Large</VMSize>
    <EnableRESTAPI />
    <EnableWebPortal />
  </HeadNode>
  <LinuxComputeNodes>
    <VMNamePattern>CentOS66LN-%00%</VMNamePattern>
    <ServiceName>MyLnxCNService</ServiceName>
     <VMSize>Large</VMSize>
     <NodeCount>4</NodeCount>
    <ImageName>5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-66-20150325</ImageName>
  </LinuxComputeNodes>
</IaaSClusterConfig>    
示例 cred.xml 文件
<ExtendedData>
  <PrivateKey>-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAxJKBABhnOsE9eneGHvsjdoXKooHUxpTHI1JVunAJkVmFy8JC
qFt1pV98QCtKEHTC6kQ7tj1UT2N6nx1EY9BBHpZacnXmknpKdX4Nu0cNlSphLpru
lscKPR3XVzkTwEF00OMiNJVknq8qXJF1T3lYx3rW5EnItn6C3nQm3gQPXP0ckYCF
Jdtu/6SSgzV9kaapctLGPNp1Vjf9KeDQMrJXsQNHxnQcfiICp21NiUCiXosDqJrR
AfzePdl0XwsNngouy8t0fPlNSngZvsx+kPGh/AKakKIYS0cO9W3FmdYNW8Xehzkc
VzrtJhU8x21hXGfSC7V0ZeD7dMeTL3tQCVxCmwIDAQABAoIBAQCve8Jh3Wc6koxZ
qh43xicwhdwSGyliZisoozYZDC/ebDb/Ydq0BYIPMiDwADVMX5AqJuPPmwyLGtm6
9hu5p46aycrQ5+QA299g6DlF+PZtNbowKuvX+rRvPxagrTmupkCswjglDUEYUHPW
05wQaNoSqtzwS9Y85M/b24FfLeyxK0n8zjKFErJaHdhVxI6cxw7RdVlSmM9UHmah
wTkW8HkblbOArilAHi6SlRTNZG4gTGeDzPb7fYZo3hzJyLbcaNfJscUuqnAJ+6pT
iY6NNp1E8PQgjvHe21yv3DRoVRM4egqQvNZgUbYAMUgr30T1UoxnUXwk2vqJMfg2
Nzw0ESGRAoGBAPkfXjjGfc4HryqPkdx0kjXs0bXC3js2g4IXItK9YUFeZzf+476y
OTMQg/8DUbqd5rLv7PITIAqpGs39pkfnyohPjOe2zZzeoyaXurYIPV98hhH880uH
ZUhOxJYnlqHGxGT7p2PmmnAlmY4TSJrp12VnuiQVVVsXWOGPqHx4S4f9AoGBAMn/
vuea7hsCgwIE25MJJ55FYCJodLkioQy6aGP4NgB89Azzg527WsQ6H5xhgVMKHWyu
Q1snp+q8LyzD0i1veEvWb8EYifsMyTIPXOUTwZgzaTTCeJNHdc4gw1U22vd7OBYy
nZCU7Tn8Pe6eIMNztnVduiv+2QHuiNPgN7M73/x3AoGBAOL0IcmFgy0EsR8MBq0Z
ge4gnniBXCYDptEINNBaeVStJUnNKzwab6PGwwm6w2VI3thbXbi3lbRAlMve7fKK
B2ghWNPsJOtppKbPCek2Hnt0HUwb7qX7Zlj2cX/99uvRAjChVsDbYA0VJAxcIwQG
TxXx5pFi4g0HexCa6LrkeKMdAoGAcvRIACX7OwPC6nM5QgQDt95jRzGKu5EpdcTf
g4TNtplliblLPYhRrzokoyoaHteyxxak3ktDFCLj9eW6xoCZRQ9Tqd/9JhGwrfxw
MS19DtCzHoNNewM/135tqyD8m7pTwM4tPQqDtmwGErWKj7BaNZARUlhFxwOoemsv
R6DbZyECgYEAhjL2N3Pc+WW+8x2bbIBN3rJcMjBBIivB62AwgYZnA2D5wk5o0DKD
eesGSKS5l22ZMXJNShgzPKmv3HpH22CSVpO0sNZ6R+iG8a3oq4QkU61MT1CfGoMI
a8lxTKnZCsRXU1HexqZs+DSc+30tz50bNqLdido/l5B4EJnQP03ciO0=
-----END RSA PRIVATE KEY-----</PrivateKey>
  <PublicKey>ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDEkoEAGGc6wT16d4Ye+yN2hcqigdTGlMcjUlW6cAmRWYXLwkKoW3WlX3xAK0oQdMLqRDu2PVRPY3qfHURj0EEellpydeaSekp1fg27Rw2VKmEumu6Wxwo9HddXORPAQXTQ4yI0lWSerypckXVPeVjHetbkSci2foLedCbeBA9c/RyRgIUl227/pJKDNX2Rpqly0sY82nVWN/0p4NAyslexA0fGdBx+IgKnbU2JQKJeiwOomtEB/N492XRfCw2eCi7Ly3R8+U1KeBm+zH6Q8aH8ApqQohhLRw71bcWZ1g1bxd6HORxXOu0mFTzHbWFcZ9ILtXRl4Pt0x5Mve1AJXEKb username@servername;</PublicKey>
</ExtendedData>
示例 hpccharmrun.sh 脚本
#!/bin/bash
# The path of this script
SCRIPT_PATH="$( dirname "${BASH_SOURCE[0]}" )"
# Charmrun command
CHARMRUN=${SCRIPT_PATH}/charmrun
# Argument of ++nodelist
NODELIST_OPT="++nodelist"
# Argument of ++p
NUMPROCESS="+p"
# Get node information from ENVs
# CCP_NODES_CORES=3 CENTOS66LN-00 4 CENTOS66LN-01 4 CENTOS66LN-03 4
NODESCORES=(${CCP_NODES_CORES})
COUNT=${#NODESCORES[@]}
if [ ${COUNT} -eq 0 ]
then
    # If CCP_NODES_CORES is not found or is empty, just run the charmrun without nodelist arg.
    #echo ${CHARMRUN} $*
    ${CHARMRUN} $*
else
    # Create the nodelist file
    NODELIST_PATH=${SCRIPT_PATH}/nodelist_$$
    # Write the head line
    echo "group main" > ${NODELIST_PATH}
    # Get every node name & cores and write into the nodelist file
    I=1
    while [ ${I} -lt ${COUNT} ]
    do
        echo "host ${NODESCORES[${I}]} ++cpus ${NODESCORES[$(($I+1))]}" >> ${NODELIST_PATH}
        let "I=${I}+2"
    done
    # Run the charmrun with nodelist arg
    #echo ${CHARMRUN} ${NUMPROCESS}${CCP_NUMCPUS} ${NODELIST_OPT} ${NODELIST_PATH} $*
    ${CHARMRUN} ${NUMPROCESS}${CCP_NUMCPUS} ${NODELIST_OPT} ${NODELIST_PATH} $*
    RTNSTS=$?
    rm -f ${NODELIST_PATH}
fi
exit ${RTNSTS}