GROMACS公司 是一个用于生物分子系统的模拟软件包,是世界上使用频率最高的科学软件应用之一,也是理解重要生物过程的关键工具,包括当前新冠肺炎大流行的潜在生物过程。
在 上一个帖子 ,我们展示了与核心开发团队合作进行的最新优化,这些优化使GROMACS能够在现代多GPU服务器上比以前更快地运行。 这些优化包括将计算和通信都卸载到GPU,后者对于那些可以有效地并行使用多个GPU进行单个模拟的相对较大的情况特别有用。 有关最新异构软件引擎的并行化和内部工作的更多信息,请参阅 GROMACS中分子动力学模拟的异构并行化和加速 .
另一个越来越常见的工作流涉及运行许多独立的GROMACS仿真,其中每个仿真可以相对较小。 NVIDIA GPU的规模和功能不断增加,但通常情况下,相对较小的仿真系统的孤立单弹道仿真无法充分利用每个GPU上的所有可用计算资源。
但多轨道工作流程可能涉及数万到数千个松散耦合的分子动力学模拟。 在这种工作负载中,最常见的目标不是最小化单个仿真的时间到解决方案,而是最大化整个集成的吞吐量。
每个GPU并行运行多个模拟可以显著提高整体吞吐量,正如前面在 GROMACS中分子动力学模拟的异构并行化和加速 (图11)。 NVIDIA多进程服务器(MPS)和多实例GPU(MIG)功能旨在促进此类工作流程,使每个GPU能够同时用于多个任务,从而进一步提高效率。
在本文中,我们演示了为GROMACS每个GPU运行多个仿真的好处。 我们展示了如何利用MPS,包括与MIG的结合,在每个GPU上并行运行多个模拟,从而使吞吐量提高1.8倍。
硬件
对于本文后面给出的结果,我们运行了一个 DGX A100型 该服务器是NVIDIA内部Selene超级计算机的一部分,具有八个A100-SXM4-80GB GPU和两个AMD EPYC 7742(罗马)64核CPU插槽。
GROMACS测试用例
为了生成下一节中给出的结果,我们使用24K原子RNAse立方和96K原子ADH-dodec测试用例,这两个用例都使用PME进行远程静电测试。 有关更多信息和输入文件,请参阅 GROMACS中分子动力学模拟的非均匀并行化和加速的补充信息 .
我们使用GROMACS版本2021.2(CUDA版本11.2,驱动程序版本470.57.02)。 对于单个独立实例(在单个 A100-SXM4-80GB通用处理器 )使用后面描述的相同GROMACS选项,我们实现了 1083纳秒/天 对于RNAse和 378纳秒/天 用于ADH。
这个 -更新gpu
选项对这里的性能至关重要。 这将触发“GPU驻留步骤”,其中 每个时间步的更新和约束部分被卸载到GPU 以及默认的“GPU强制卸载”行为。 如果没有这一点,在这种硬件上,每种情况下的性能都会降低大约2倍。 这对可用CPU和GPU功能的平衡很敏感,因此我们建议您在不同硬件上运行时使用此选项。
对于本文中描述的实验,我们使用独立启动的同一仿真系统的多个实例。 这是真实集合模拟的代理,当然,成员模拟和不规则通信之间可能存在细微差异,但仍有以类似方式重叠的范围。
主生产计划
随着GPU的大小和功能不断增加,单个应用程序的执行可能无法充分利用每个GPU的所有可用资源。 NVIDIA多进程服务(MPS) 是一种使从多个CPU进程提交的计算内核能够在同一个GPU上同时执行的工具。 这种重叠有可能实现更彻底的资源使用和更好的总体吞吐量。
如本文后面所述,使用MPS还可以通过更有效地重叠硬件资源利用率和更好地利用基于CPU的并行性,使应用程序在多个GPU之间实现强大的扩展。
2017年,NVIDIA Volta架构与NVIDIA-Volta MPS一起发布,增强了功能,包括每个GPU最多增加48个MPS客户端:这在所有后续的V100、Quadro和GeForce GPU上都受支持。
米格
与MPS一样, NVIDIA多实例GPU(MIG) 有助于共享每个GPU,但需要严格划分资源。 它是跨多个不同用户共享GPU的理想选择,因为每个MIG实例都有一组有保证的资源,并且是完全隔离的。
MIG可在选定的NVIDIA Ampere Architecture GPU上使用,包括A100,每个GPU最多支持七个MIG实例。 MIG可以与MPS结合使用,其中多个MPS客户端可以在每个MIG实例上同时运行,每个物理GPU最多可运行48个MPS客户机。
虽然可以跨多个MIG实例运行单个应用程序实例,例如使用MPI,但MIG并不打算为此用例提供任何性能改进。 MIG的主要目的是促进每个GPU上的多个不同应用程序实例。 有关更多信息,请参阅 使用多实例GPU充分利用NVIDIA A100 GPU .
图1。 使用RNAse Cubic(左)和ADH Dodec(右)测试用例的每个GPU的模拟次数缩放DGX A100服务器上的总吞吐量。 显示了使用MPS(开放三角形)、MIG与MPS(闭合三角形)和无(开放圆)的结果。
图1显示了每个GPU的模拟次数对在8-GPU DGX A100服务器上同时运行的所有模拟的总综合吞吐量(以纳秒/天为单位,越高越好)的影响,用于RNAse(左)和ADH(右)。 每种情况下最左边的结果(每个GPU一个模拟)仅比相应的孤立单一模拟结果(前面给出)乘以8(DGX A100服务器上的GPU数)低几个百分点。 这表明您可以在服务器上有效地运行多个模拟,而不会产生明显的干扰。
你可以看到,通过增加每个GPU的模拟次数,可以获得实质性的改进,对于相对较小的RNAse情况,可以提高到1.8倍,对于较大的ADH情况,可以增加到1.3倍。
对于每个测试用例,我们包含了不带MIG和带MIG的结果,每个GPU最多使用七个MIG分区。 在这种情况下,MPS用于每个GPU运行多个进程,每个物理GPU最多运行48个MPS客户端,其中MIG情况下的最大客户端总数为42个:七个MIG分区中的每个分区有六个MPS客户机。 作为参考,我们还包括了没有MPS或MIG的默认结果,对于这些结果,我们认为每个GPU运行多个模拟没有任何好处。
对于每个测试用例,最左侧的MIG+MPS结果为每个GPU七个模拟:每个MIG客户端一个模拟(即,不带MPS)。 我们发现这些“pure-MIG”性能结果与相应的“pure-MPS”结果相比没有优势。 对于RNAse,Pure-MIG与Pure-MPS相似,对于ADH,Pure/MPS更低。 然而,将MIG与MPS相结合可获得最佳RNAse总体结果,比最佳纯MPS结果高出约7%。 它的性能与ADH的pure-MPS相当,但略低于后者。
对于RNAse,性能最好的配置是每个MIG四个MPS客户端,即每个GPU总共28个仿真。 对于ADH,最好的配置是每个GPU使用pure-MPS进行16次模拟,不使用MIG。
当MIG处于活动状态时,它强制将每个模拟隔离到GPU硬件的特定分区,这可能是有利的,具体取决于测试用例关键路径的特定数据访问模式。 另一方面,如果没有MIG,每个模拟都可以以更动态的方式跨GPU访问资源,这也很有利。
正如我们前面讨论的那样,MIG的好处取决于测试用例。 令人欣慰的是,无论是否使用MIG,MPS都是有效的,尤其是在某些用例中,出于其他原因,MIG是可取的,例如用户之间共享GPU。
GROMACS是异构的,在将计算卸载到GPU方面具有灵活性,在GPU中可以并发使用CPU。 我们的运行使用了力计算的默认选项,将非键合和PME力计算映射到GPU,同时使用CPU进行键合力计算。 这种配置通常会导致资源的良好重叠使用。
我们尝试将结合力计算卸载到GPU(使用-bonded-GPU选项),性能相似,但在所有情况下都稍低。 如前所述,我们使用了GPU驻留步骤。 我们尝试将更新和约束映射到CPU,在那里我们还观察到了每个GPU运行多个模拟的好处。
对于较大的ADH情况,可实现的吞吐量显著低于将更新和约束卸载到GPU时的吞吐量。 然而,对于较小的RNAse情况,虽然在每个GPU运行单个(或几个)模拟时吞吐量较低,但在每个GPU运行八个或更多模拟时,无论这部分是卸载的,我们都看到了类似的吞吐量。 行为可能因测试用例和硬件而异,因此最好尝试所有可用的运行时组合。
我们还在不同的硬件上重复了RNA酶的MPS实验:NVIDIA A40型 和 V100-SXM2版本 GPU,我们还发现每个GPU运行多个模拟以提供吞吐量改进,尽管比A100小。 这并不奇怪,因为这些GPU的规格相对较低。 A40为1.5X,V100-SXM2为1.4X,吞吐量的改善明显低于A100的1.8X,但仍然值得。
这些结果表明,通过使用MPS在每个GPU上运行多个进程,并将MIG与MPS相结合,可以大幅提高吞吐量。 最佳配置(包括GROMACS中的计算卸载选项)取决于具体情况,我们再次建议进行实验。 以下各节描述了如何编排这些模拟。
运行配置详细信息
在本节中,我们将提供用于生成结果的脚本,并描述其中包含的命令,作为您自己工作流的参考或起点。
纯MPS运行
以下脚本使用MPS向8-GPU DGX A100服务器启动多个仿真。
1 #!/ 垃圾桶/垃圾桶 2#演示程序脚本,用于在DGX-A100上使用MPS在每个GPU上运行多个模拟 3 # 4号艾伦·格雷,英伟达 5 6#GROMACS二进制文件的位置 7 GMX=/lustre/fsw/devtech/hpc-devtech/alang/gromacs-binaries/v2021.2_tmpi_cuda11.2/bin/GMX 8#输入文件的位置 9输入=/lustre/fsw/devtech/hpc-devtech/alang/Gromacs_INPUT/rnase.tpr 10 11 NGPU=8#服务器中的GPU数量 12 NCORE=128#服务器中的CPU内核数 13 14 NSIMPERGPU=16#每个GPU要运行的模拟数(带MPS) 15 16#每个模拟的线程数 17 NTHREAD=$(($NCORE/($NGPU*$NSIMPERGPU)) 18如果[$NTHREAD-eq 0] 然后是19 20 NTHREAD=1 21英尺 22导出OMP_NUM_THREADS=$NTHREAD 23 24#启动MPS守护程序 25 nvidia-cuda-mps控制-d 26 27#服务器中GPU数量的循环 28代表((i=0;i<$NGPU;i++)); 29道 30#设置特定于使用中具有最佳亲和力的GPU的CPU NUMA(特定于DGX-A100) 31箱$i英寸 32 0)NUMA=3;; 33 1)NUMA=2;; 342)NUMA=1;; 35 3)NUMA=0;; 36 4)NUMA=7;; 37 5)NUMA=6;; 38 6)NUMA=5;; 397)NUMA=4;; 40电子安全气囊 41 42#每个GPU的模拟次数循环 43代表((j=0;j<$NSIMPERGPU;j++)); 44做 45#为此模拟创建一个唯一标识符,用作工作目录 46 id=gpu$ {i} (_S) ${j} 47 rm-射频$id 48 mkdir-p$id 49 cd$id 50 51 ln-s$INPUT拓扑.tpr 52 53#在所需资源的后台启动GROMACS 54 echo“在NUMA区域$NUMA上使用$NTHREAD CPU线程在GPU$i上启动模拟$j” 55 CUDA_VISIBLE_DEVICES=$i numactl--cpunodebind=$NUMA$GMX mdrun\ 56-更新gpu-nsteps 10000000-maxh 0.2-resethway-nstlist 100\ 57>mdrun.log 2>&1& 58 cd。。 59已完成 完成60次 61 echo“等待模拟完成…” 62等待
第7行和第9行 分别指定GROMACS二进制文件和测试用例输入文件的位置。 第11-12行 指定服务器的固定硬件详细信息,该服务器具有8个GPU和128个CPU内核。 第14行 指定了每个GPU的模拟次数,可以改变模拟次数以评估性能,正如生成上述结果所做的那样。 第17-21行 计算出应该为每个模拟分配多少CPU线程。 第25行 启动MPS守护进程,使从单独模拟启动的内核能够在同一个GPU上同时执行。 第28-40行 在服务器中的GPU上循环,并为每个特定GPU分配一组适当的CPU内核(“NUMA区域”)。 此映射特定于DGX A100拓扑,该拓扑有两个AMD CPU,每个CPU有四个NUMA区域。 我们安排特定的编号以获得最佳亲和力。 有关更多信息,请参阅 DGX A100用户指南 . 第43-49行 循环每个GPU的模拟数,并创建模拟的唯一工作目录。 第51行 在这个唯一的工作目录中创建到输入文件的链接。 55-57号线 使用 CUDA_VISIBLE_DEVICES公司
环境变量和使用numactl实用程序的所需CPU NUMA区域。 可以使用<code>apt-install numactl</code>提前安装该实用程序。
这个 -更新
gpu选项与默认的gpu强制卸载行为相结合,对性能至关重要(请参阅前面的内容) -nsteps 10000000-最大0.2-重置
组合的结果是将每个模拟运行12分钟(0.2小时),其中内部计时器在中途重置,以消除任何初始化开销。 这个 -nstlist 100标准
指定GROMACS应每隔100步重新生成内部邻居列表,其中这是一个影响性能但不影响正确性的可调参数。)
结合MIG和MPS运行
以下脚本是前一个脚本的版本,扩展为支持每个GPU的多个MIG实例,其中可以使用MPS对每个MIG实例启动多个仿真。
1 #!/ 垃圾桶/垃圾桶 2#演示脚本,用于在DGX-A100上使用MIG+MPS在每个GPU上运行多个模拟 3 # 4号艾伦·格雷,英伟达 5 6#GROMACS二进制文件的位置 7 GMX=/lustre/fsw/devtech/hpc-devtech/alang/gromacs-binaries/v2021.2_tmpi_cuda11.2/bin/GMX 8#输入文件的位置 9输入=/lustre/fsw/devtech/hpc-devtech/alang/Gromacs_INPUT/adhd.tpr 10 11 NGPU=8#服务器中的GPU数量 12 NCORE=128#服务器中的CPU内核数 13 14 NMIGPERGPU=7#每个GPU的MIG数量 15 NSIMPERMIG=3#每个MIG运行的模拟次数(带MPS) 16 17#每次模拟的线程数 18 NTHREAD=$(($NCORE/($NGPU*$NMIGPERGPU*$NSIMPERMIG)) 19如果[$NTHREAD-eq 0] 20那么 21 NTHREAD=1 22英尺 23导出OMP_NUM_THREADS=$NTHREAD 24 服务器中GPU数量的25#循环 26代表((i=0;i<$NGPU;i++)); 27做 28#设置特定于使用中具有最佳亲和力的GPU的CPU NUMA(特定于DGX-A100) 29箱$i 30 0)NUMA=3;; 31 1)NUMA=2;; 32 2)NUMA=1;; 33 3)NUMA=0;; 34 4)NUMA=7;; 35 5)NUMA=6;; 36 6)NUMA=5;; 37 7)NUMA=4;; 38欧洲统计局 39 40#发现此GPU上存在的MIG列表 41 MIGS=`nvidia-smi-L|grep-A$(($NMIGPERGPU+1))“GPU$i”|grep MIG|awk'{print$6}'|sed's/)//g'` 42米加莱=($MIGS) 43 44#每个GPU的MIG数循环 45表示((j=0;j<$NMIGPERGPU;j++)); 46做 47 48米吉德=${米加莱[j]} 49#启动MIG独有的MPS守护程序 50导出CUDA_MPS_PIPE_DIRECTORY=/tmp/$MIGID 51 mkdir-p$CUDA_MPS_PIPE_DIRECTORY 52 CUDA_VISIBLE_DEVICES=$MIGID nvidia-CUDA-mps-control-d 53 54#每个MIG的模拟次数循环 55代表((k=0;k<$NSIMPERMIG;k++)); 56做 57 58#为此模拟创建一个唯一标识符,用作工作目录 59识别码=gpu$ {i} 最大(_M) $ {j} 最小值(_S) {k}美元 60 rm-射频$id 61 mkdir-p$id 62 cd$id 63 64 ln-s$INPUT拓扑.tpr 65 66#在所需资源的后台启动GROMACS 67 echo“在NUMA区域$NUMA上使用$NTHREAD CPU线程在MIG$j、GPU$i上启动模拟$k” 68 CUDA_VISIBLE_DEVICES=$MIGID numactl--cpunodebind=$NUMA$GMX mdrun\ 69-更新gpu-nsteps 10000000-maxh 0.2-resethway-nstlist 100\ 70>mdrun.log 2>&1& 71光盘。。 完成72次 73已完成 74已完成 75 echo“等待模拟完成…” 76等待
与pure-MPS脚本的主要区别以粗体突出显示:
第14行 指定每个GPU的MIG实例数,设置为最大值7。 使用以下命令在八个GPU中的每个GPU上预先创建实例:
用于0 1 2 3 4 5 6 7中的gpu 做 nvidia-smig-i$gpu--创建gpu-instance\ 1克10gb、1克10gb、1克.10gb、1g 10gb,1g 10gb、1g.10gb、1g.10gb\ --默认计算机实例 完成
第15行 指定每个MIG实例要运行的模拟数。 第18行 调整CPU核心分配计算,以正确考虑每个GPU的模拟总数。 第41-42行 (位于循环(物理)GPU中)列出与该GPU关联的MIG的唯一ID,并创建包含这七个ID的可索引数组。 第45行 将新的中间级别添加到循环嵌套中,对应于每个GPU的多个MIG。 第48-52行 每个MIG启动一个单独的MPS守护程序,这是MIG和MPS组合的要求。 第55行 循环每个MIG的模拟次数。 它继续像以前一样启动每个模拟,只是现在每个模拟都被限制为使用唯一MIG ID的特定MIG实例。
多流程的其他优势
到目前为止,我们已经向您展示了每个GPU运行多个进程如何为GROMACS提供实质性好处,并且我们提供了具体的示例来演示。 类似的技术可以在更广泛的用例和场景中提供好处,包括GROMACS和其他应用程序。 我们将在本节中简要讨论其中的几个问题。
GROMACS多仿真框架
在本文中,我们使用shell脚本中的循环并行启动了多个模拟。 内置GROMACS 多仿真框架 提供了另一种机制,其中通过 -多对
选择 mdrun软件 。以类似的方式,最大化吞吐量的好处也可以应用于此机制。
为了评估这一点,我们不是直接用MPI启动GROMACS,而是通过一个包装器脚本启动,该脚本可以设置环境变量和 努马特尔
适用于每个MPI等级的选项。 例如,可以使用环境变量发现排名 OMPI_COMM_WORLD_LOCAL_RANK公司
用于OpenMPI。 另一种方法是以类似的方式使用MPI启动器的绑定功能。
我们的实验表明,MPS的行为与前面描述的类似。 然而,相比之下,我们没有看到MPS和MIG相结合的任何额外好处,这需要进一步调查。
多仿真框架还支持集成内仿真与 -复式
mdrun选项 或 AWH多步行机 方法在一个模拟中应用多个独立的偏置电位。 对于这些工作流,性能行为取决于用例的具体细节,因此我们建议进行实验。 有关 -复式
选项,请参见 副本交换模拟简介 .
多GPU强缩放的MPS
本文探讨了MPS(和MIG)的优点,以提高并行运行的许多独立仿真的吞吐量。 另一个常见的目标是通过并行使用多个GPU来最小化单个模拟的求解时间。
通常,单独的CPU任务(如MPI任务)用于控制每个GPU并执行未卸载到GPU的任何计算工作负载。 在某些情况下,每个GPU运行多个CPU任务是有益的,因为这可以为重叠的CPU计算、GPU计算和通信提供额外的机会。 每个GPU运行多个进程也有助于重新平衡并行运行中固有的负载失衡。 有关更多信息,请参阅本节后面讨论的GROMACS示例。
此方法还可以增加CPU上基于任务的并行程度,并提高应用程序中任何CPU驻留并行工作负载的性能。 在MPS活动的情况下,与多个任务相关联的多个内核可以在每个GPU上并行执行。 最好通过实验来发现它是否对特定情况有益,并找到最佳配置。
GROMACS示例
下面是GROMACS的一个具体示例。 在 上一个帖子 ,我们关注的是这样一种情况,即每个GROMACS仿真都并行运行在四个GPU上,以最小化求解时间。 我们展示了这四个GPU如何有效地平衡三个PP任务和一个PME任务。
然而,如果您尝试将该配置调整为两个GPU,最自然的方法是分配一个PP GPU和一个PME GPU。 这并没有带来良好的性能,因为PP GPU有更多的工作。
最好将四个GPU配置映射到两个GPU,激活MPS以启用内核重叠。 其中一个GPU重叠两个PP任务,而另一个重叠两个MP和一个PME。 这将大大改善负载平衡和更快的解决方案时间。 在 GROMACS中分子动力学模拟的异构并行化和加速 本文中,该技术用于生成图12的双GPU强缩放结果。 同样,我们建议对任何特定情况进行实验。
I/O与计算重叠
这篇文章展示了每个GPU运行多个进程如何通过重叠带来好处。 这些好处不仅限于计算和通信。 这种解决方案也适用于那些在I/O上花费大量时间的情况。在这些情况下,一个实例的I/O组件可以与另一个实例中的计算组件重叠,以提高总体吞吐量。 MPS使内核能够与其他计算内核、通信或文件I/O并发执行。
如果您有问题或建议,请在下面发表评论。