“如果你的仿真还没有受到硬件限制,说明你的仿真还没有入门。”
对于仿真工程师来讲,最痛苦事情莫过于等待求解器计算。实际工程中稍微上规模的案例计算时间短则几小时,长则几天甚至更长。在这个过程中如果出现问题,还要找到原因排除问题重新计算(比如内存不够,可能造成程序退出,也可能和硬盘交换内存性能下降,再比如常见的网格质量差计算不收敛)。工程师都希望用最快的机器进行计算。
这也从某种程度上说明了为什么主流的仿真工具就那么几个:仿真的首要问题是稳定和精度,而这种稳定性和高精度只能通过长期的用户迭代和技术积累实现。
本文从硬件,软件以及开发三个方面来介绍仿真和HPC高性能计算(High Performance Computing)的关系
高性能计算是当今科技领域中最引人瞩目的领域之一,它在解决复杂问题、优化系统性能和加速创新方面发挥着关键作用。而仿真作为高性能计算的重要应用领域之一,为各行各业带来了无限的可能性和机遇。
那么,什么是仿真?仿真是一种通过模拟实际系统或过程的行为和性能来预测和分析其运行方式的方法。它可以用于理解和解决各种复杂的现实问题,如工程设计、材料研发、流体力学、天气预报、金融风险分析等。仿真技术的发展为我们提供了深入研究和理解现实世界的机会,而高性能计算则成为实现大规模、高精度仿真的关键工具。
高性能计算的核心在于利用并行计算、分布式系统和高性能算法等技术,提供强大的计算能力和处理能力,以应对大规模数据和复杂计算任务。通过将仿真模型分解为小任务并同时进行计算,高性能计算能够加速仿真过程,提供更快速、精确的结果。这种能力不仅能够加快仿真结果的产出速度,还能够进行更复杂的模拟和分析,进一步深入研究问题本质。
高性能计算的入门并不需要你成为一名计算机专家,它是开放给各个领域的学生、研究者和专业人士的。通过学习高性能计算的基本概念、并行计算和分布式系统的原理,你将能够利用现有的高性能计算工具和软件,开始进行仿真实验和计算任务。你将能够探索不同领域的仿真应用,如工程仿真、材料模拟、流体动力学、天气预测等,从而解决实际问题并做出有意义的发现。
2020年一开始,COVID-19新冠状病毒肆虐全球,夺走无数人的生命。加速药物和疫苗研发成为全球研究人员当务之急。而开发新药物和疫苗,依赖于海量数据的筛选计算,涉及到分子动力学的大规模计算和评估,这些计算无法短时间内在PC机上完成,只能依赖高并发,高共享的集群式HPC高性能计算硬件。包括阿里云、腾讯云在内的国内厂商提供了开放式的云端硬件计算平台。
区别于一般的PC机器,仿真用HPC高性能计算硬件重点在于处理计算海量数据,因此并不单单追求单核计算性能,而是包括共享内存,CPU调度,资源分配,网络吞吐,硬盘读写性能,数据存储等综合考量。
以我国神威·太湖之光为例,该超级计算机由40个运算机柜和8个网络机柜组成。每个运算机柜比家用的双门冰箱略大,4块由32块运算插件组成的超节点分布其中。每个插件由4个运算节点板组成,一个运算节点板又含2块“申威26010”高性能处理器。一台机柜就有1024块处理器,整台“神威·太湖之光”共有40960块处理器。每个单个处理器有260个核心,主板为双节点设计,每个CPU固化的板载内存为32GBDDR3-2133。
目前的HPC高性能计算软件,主要是用来协调计算机硬件资源,包括CPU,内存,IO,集群等。以CPU为例,普通PC好的CPU只在几十核,资源调度以多进程,线程为主。服务器,集群则涉及到多台计算之间资源调度。而对于类似超算机器,核心可能有几百万,几千万,普通的资源调度算法本身可能也需要资源调度。
当一个有海量数据的任务交给HPC高性能计算处理时,会遇到如下问题:该任务有多少比例可以分解单独分别执行,可单独执行的任务时间是否均匀,单个任务放在单独机器上内存是否足够,磁盘读写性能是否能同步,网络带宽是否会成为瓶颈等等,当所有问题放在一起考虑的时候,HPC高性能计算就不可避免的成为一个系统工程。数据计算量越大,硬件越多,系统就越复杂。找到一个合适业务的HPC模式并不是容易的事,尤其是受限于硬件资源,很多HPC高性能计算更多的依赖经验或者少考虑效率。所有这些操作需要好的软件来控制。
MPI (Message passing interface),MPI是一个标准,用来定义数据交换标准
有限元计算中,稍大的模型自由度通常可以达到十万/百万。2004年,ANSYS求解出了自由度1亿的模型,2008年ANSYS 求解出了自由度为10亿的模型。千万单元自由度问题,任何一本有限元书籍上的实例代码,在普通PC机上都算不出来。针对大模型,传统的计算方法不再适用。
在AI大模型的研发中,CPU并行编程和GPU并行编程都扮演着非常重要的角色。以下是一些具体的例子:
数据预处理和加载:在AI大模型的训练前,往往需要对大量的数据进行预处理,如图像解码、缩放、裁剪、归一化等。这些任务通常在CPU上执行,并且可以通过多线程并行化来提高效率。此外,为了避免GPU在等待数据时闲置,可以使用多线程预加载数据,即在GPU处理当前批次的数据时,CPU已经开始准备下一批次的数据。
模型训练:训练AI大模型需要大量的计算资源,因此通常在GPU上执行。GPU拥有大量的并行计算单元,非常适合执行大规模的矩阵运算,如矩阵乘法、卷积等。在训练过程中,程序员需要编写GPU并行代码,以充分利用GPU的计算能力。
模型并行化:对于非常大的模型,单个GPU的内存可能无法容纳整个模型。在这种情况下,可以使用模型并行化技术,即将模型的不同部分放在不同的GPU上执行。这需要在GPU之间进行数据交换,因此需要编写并行代码来协调各个GPU的工作。
数据并行化:除了模型并行化,还可以使用数据并行化技术,即将同一批次的数据分成多份,分别在多个GPU上处理。这同样需要在GPU之间进行数据交换,因此需要编写并行代码来协调各个GPU的工作。
模型推理:在模型推理阶段,可以使用CPU和GPU结合的方式来提高效率。例如,可以在CPU上执行一些简单的预处理和后处理任务,如数据加载、解码、格式转换等,而将计算密集的模型推理任务交给GPU。
分布式训练:对于非常大的模型和数据集,可能需要使用分布式训练。在这种情况下,需要编写并行代码来协调多个机器上的CPU和GPU的工作,包括数据分发、模型更新等。
在以上的各个环节中,都需要充分考虑CPU和GPU的计算能力和通信开销,以合理分配任务和资源。
HPC可以加速计算,但不能解决所有算法带来的性能问题。以有限元方法为例,对于1亿自由度的问题,如果不使用稀疏矩阵而按照满秩矩阵传统方法求解,其算法复杂度和时间复杂度都是一亿的三次方,即使用”太湖之光”也要按小时来算,而且还没有考虑内存是否能装下所有数据。
HPC并不把单一的硬件性能作为评价指标,因此HPC的最大特点在于通过合理增加硬件数量,提升并行性。所以软件开发的目标就是:1.对于算法本身降低计算资源;2.尽可能将计算分解成独立的任务。
1.GPU开发
GPU 说简单就是利用显卡以加速计算,GPU是发展较快的一个方向。目前很多商业求解器都支持GPU加速,目前的做法是把逻辑性较强的业务放在CPU,而把纯运算部分放在GPU上,Navida公司提供了专门的GPU计算语言CUDA。主流的仿真软件诸如Marc,Nastran,Abaqus,ANSYS,LSDYNA,Fluent,StarCD,FEKO,Moldflow等等都支持GPU计算。
2. OpenMP
OpenMP是一个编译器指令和库函数的集合,主要是为共享式存储计算机上的并行程序设计使用。简单实用,可以快速上手。
3. OpenACC
OpenACC是一个可利用CPU/GPU 加速器编程标准 。OpenACC 类似于 OpenMP,通过简单的编译指令即可实现,但需要安装支持的编译器,目前貌似没有可用于商业开发的免费版本。
4. OpenCL
OpenCL是一种标准化,跨平台,基于C语言的并行计算API,简单讲OpenCL是一种可以实现跨平台,利用CPU/GPU的程序接口。
随着硬件成本的不断下降以及云技术的不断成熟,许多云厂商将商业仿真软件安装在云端HPC服务器上,按照资源使用时间收费;有些提供专业软件,可以在本地进行建模,提交任务到远程HPC机器;还有些直接提供web端工具,将建模,仿真,计算数据等所有资源云端化。所有这些可以帮助用户避免购买昂贵的硬件,大幅降低仿真成本。