AI高性能计算:应用场景、API 及应用

229 阅读25分钟

2.1 引言
高性能计算(HPC)指的是能够解决传统计算机无法胜任的复杂模拟、计算和数据分析任务的先进计算系统。HPC系统以其创纪录的处理速度、高性能网络和大规模内存而著称,使其能够高效执行并行处理任务。超级计算机作为先进的HPC计算机,凭借高速处理能力和强大算力,是构建高性能计算系统的核心。

过去十年间,HPC的主要用途从以模拟为主的科学研究,转变为既能支持模拟,也能处理机器学习(ML)任务。HPC系统的应用持续扩大,并逐步与基于物理的模拟和机器学习相结合,使研究人员能够更快地进行气候建模、药物开发、蛋白质折叠以及计算流体力学(CFD)等领域的预测和理解。

图形处理单元(GPU)技术的发展是推动HPC和机器学习技术加速的关键动力之一。GPU是一种通用微处理器,专门设计用于同时处理大量数据,非常适合各类高性能计算任务。当需要提升基于人工智能和机器学习算法的性能时,GPU的计算处理单元发挥着重要作用。

高性能GPU与软件解决方案的结合,使得HPC能够比传统计算系统更快速地执行复杂的模拟和计算任务。

image.png

2.1.1 各类高性能计算架构

高性能计算架构种类繁多,依据其面向的具体应用需求而异。以下是一些高端计算系统的典型示例。

2.1.1.1 集群计算

集群计算是将一组独立计算机作为独立节点,通过高速网络连接组成系统。该系统通过节点间的不同互连方式整体完成任务,将任务的各个部分分配给不同节点执行。
示例:Beowulf集群,作为典型集群计算架构的一个变体,正日益流行。

2.1.1.2 矢量处理

矢量处理是指同时对多个数据单元执行同一条指令。
示例:矢量计算机如Cray-1。现代CPU和GPU同样具备利用矢量处理单元的能力。

2.1.1.3 大规模并行处理

大规模并行处理(MPP)系统由大量处理器同时运行组成,通常每个处理器拥有独立内存。这些系统通过将复杂问题拆分成较小任务,分配给各处理器协同解决。
示例:IBM Blue Gene和Cray T3E是MPP架构的代表。

2.1.1.4 分布式内存多处理器

此设计中,每个处理器节点拥有专用本地内存,节点间通过网络通信。程序被拆分成任务,分配给不同节点并行执行。消息传递接口(MPI)是分布式计算系统中常用的通信标准。

2.1.1.5 对称多处理器

对称多处理(SMP)系统由多个处理器组成,共享统一的内存空间。所有处理器都能访问相同的数据,任务可在处理器间分配。SMP架构广泛应用于多核CPU及高端服务器和工作站。

2.1.1.6 网格计算

网格计算是将分布在不同物理位置的计算资源组织起来并进行分配,实现大规模并行处理。
示例:World Community Grid和European Grid Infrastructure (EGI)为网格计算架构的代表。

2.1.1.7 加速计算

加速计算通过采用基于硬件的专用加速器,提高计算系统整体效率,并将任务细分分配给不同计算单元。此类硬件架构包含如GPU和TPU等多种加速器。
常见组合为NVIDIA GPU配合CUDA,或AMD GPU配合OpenCL。

2.1.1.8 基于FPGA的计算

现场可编程门阵列(FPGA)可为特定任务定制硬件,实现灵活重构,兼顾灵活性和性能。配备FPGA加速器的超级计算机专门用于密码学、信号处理等特殊任务。

2.1.1.9 基于云的高性能计算

根据应用需求,云服务商提供基于云的高性能计算资源,用户无需拥有物理硬件即可灵活调整资源使用量。
示例:亚马逊EC2提供弹性云计算服务中的高性能计算实例。

2.1.1.10 量子计算

量子计算基于量子物理原理,使用量子比特(qubit)作为计算单元,设计用于以指数速度解决极其复杂的问题。
示例:IBM Quantum、Rigetti和D-Wave等企业致力于量子计算机架构的发展。

上述架构展现了实现高性能计算的多种路径,每种架构均针对特定计算需求和限制设计。架构选择取决于计算任务特点、可扩展性需求及资源可用性[1]。在所有架构中,超级计算机是重要的高性能架构类型之一,后续章节将进行讨论。

2.1.1.10.1 超级计算机的示意结构

超级计算机的示意结构如图2.2所示。

image.png

节点
超级计算机由大量独立的计算节点组成。
每个节点是一个独立单元,包含自己的处理器(CPU或GPU)、内存(RAM)和存储设备。

处理器(CPU/GPU)
超级计算机的核心是其强大的计算能力。超级计算机通常采用高性能处理器,形式多为多核CPU和/或GPU。
并行处理是其关键特性,多个处理器协同工作,同时解决计算问题的不同部分。

互连
超级计算机依赖高速网络或互连设备,促进节点间通信。
低延迟、高带宽的互连对于减少通信延迟和最大化并行处理效率至关重要。

内存层级
超级计算机的内存结构较为复杂,包含多个内存层级,如寄存器、缓存、RAM,有时还包括磁盘存储(如SSD或传统硬盘)。
数据检索能力比处理速度更为重要,内存层级设计旨在最大限度减少数据传输时间。

存储系统
超级计算机配备庞大的存储阵列以支持关系型操作。
通常采用高性能并行文件系统,以应对数据密集型任务(即生成和处理海量数据)。

冷却系统
超级计算机执行复杂任务,产生大量热量。
为防止处理器过热,常采用液冷或风冷系统,这些冷却系统专为先进计算机设计。

软件与编程环境

  • 超级计算机通常安装有专用软件,采用在多个节点上运行的并行处理模型,并支持节点自主安装软件。
  • 消息传递接口(MPI)和OpenMP是超级计算机并行计算中最常用的编程模型。

作业调度器

  • 超级计算机常配备作业调度器,负责协调不同用户和应用间的计算资源分配。
  • 该功能保证系统高效运行,同时兼顾多用户需求。

持续监控与管理协议
超级计算机管理流程包括指标监控、错误捕捉和系统资源保护。

专用加速器
在多核超级计算机架构中,每个核心利用单指令多数据(SIMD)技术实现应用并行化。
此外,部分多核超级计算机集成了专用加速器,如FPGA和人工智能加速器,用于提升特定应用性能。

随着技术创新的不断发展,超级计算机架构取得了显著进步。其目标是在研究、模拟及其他处理数据的程序中,针对复杂问题实现最大性能和效率。

日益强大的高性能计算硬件依赖并行软件来有效利用多核CPU、多核GPU、分布式节点及加速系统等计算资源。这推动了众多并行编程模型、API、语言和工具的出现。混合加速系统在高性能计算软件开发中面临一些挑战,需要明确指导。常用的并行编程API如下。

2.1.2 多种技术或API

图2.3展示了用于并行编程的各种应用编程接口。

2.1.2.1 OpenMP

OpenMP支持创建和执行多线程程序,充分利用节点内的多核和多个CPU。最新版本的OpenMP还支持将代码片段卸载至加速器,如GPU。

OpenMP通过两种结构,使将顺序应用扩展为并行应用变得相对简单:一是库函数,允许测量并发运行某段代码的线程数量及线程ID;二是指令,指定如何同步或并行执行代码片段或代码行。

其中,#pragma omp指令允许将循环迭代分配给线程并行处理,在特定区域生成并行运行的线程。

image.png

还有其他调度任务的方法,比如引导模式(guided mode),它减少了任务块的大小;此外还有静态(static)和动态(dynamic)模式,可设置特定大小的任务块。具体计算可以通过线程数量来推断,每个线程在该区域拥有唯一的ID。通过原子操作(atomic)和归约(reduction)子句、阻塞区(obstruction sections)以及临界区(critical sections)来保证同步。在最新版本的OpenMP中,任务会自动分配给空闲线程。

2.1.2.2 CUDA

统一计算设备架构(Compute Unified Device Architecture,CUDA)允许在NVIDIA GPU上同时构建和运行应用程序。从处理矩阵的核函数(kernel)到控制操作模块,每个程序都需要启动计算任务。主机端负责GPU与核函数的同步。为执行并行计算,会运行由多个块(block)组成的线程网格(thread grid),这些线程块高度并行分布。

与GPU一直使用全局内存读取不同,线程块内的读取可在共享内存中同步,速度更快,而全局内存读取较慢。寄存器和共享内存可作为缓存,在内存访问间临时存储数据。数据预取通过从全局内存到寄存器,再从寄存器到共享内存,实现对处理数据块的提前加载。

类似地,当不同CUDA流(streams)上的操作同时启动时,这些事务可能重叠,且核函数计算与GPU内存和主内存之间的通信可能相互干扰。线程块大小的选择会影响性能,因为它决定了每块可用的共享内存和寄存器数量,而单个流式多处理器(SM)对内存和寄存器的使用有上限,因此也影响驻留块数量和并行度。

现代CUDA工具包版本和具备强大计算能力的现代显卡引入了统一内存(Unified Memory),实现主机与GPU间的内存共享,以及动态并行(dynamic parallelism),即允许在一个核函数内部启动另一个核函数[2]。

2.1.2.3 OpenCL

OpenCL [3] 作为一个平台,简化了多线程应用程序的开发和执行,使其能够在异构平台上实现高性能计算,例如配备GPU、多核和众核CPU的服务器。最初,多功能的核函数(kernels)在一个或多个硬件设备中并行运行以完成指定任务。Python核函数可由多个工作项(work items)在多个工作组(work groups)中并行解释执行,其中某些工作组数量巨大。在计算过程中,内存对象用于存储和处理数据。类似于CUDA,OpenCL同样具有线程组和线程块(即工作项)的结构,这些结构作用于应用层面。与需大量硬件设备管理代码的CUDA编程模型相比,OpenCL现专注于涵盖从CPU到GPU的更广泛计算设备。OpenCL具备命令队列(类似CUDA流),其中包含数据拷贝或核函数启动等阶段。除了简单的命令队列,借助事件机制可生成无限数量的同步命令,这些事件由定义的指令触发。此外,同一工作组中的工作项共享局部内存(与CUDA编程模型中的共享内存相同),作为缓存以实现快速访问。数据结构可通过主机和设备共享动态内存传递。

OpenCL(3.3版本)是现代计算机平台上用于构建多线程程序的平台,这些程序利用多核及众核CPU和GPU等多种计算设备并行运行。核级并行计算意味着指令在一个或多个设备上操作数据,同时为这些计算设备定义特定逻辑。工作项在多个组内同时运行,若组数较多,则多组并发执行。在计算上下文中,内存对象用以保存数据。类似CUDA,OpenCL采用任务结构,工作组由线程块执行,线程由工作项组成。工作组内的任务可同步,且同步机制较CUDA更灵活。OpenCL扩展了CUDA的能力,但因此工程师需编写更多代码以管理硬件设备(GPU和CPU)。OpenCL同样利用命令队列处理指令,如核函数启动或数据复制。通过多队列命令和事件驱动的同步执行,实现高效的并行处理。此外,单个工作组内共享的局部内存类似CUDA的共享内存,充当缓存。借助虚拟内存共享技术,主机与设备间能共享复杂数据结构。

2.1.2.4 Pthreads

Pthreads为多线程程序的实现提供平台和框架,适用于拥有两个或多个核心的CPU[1]。主线程负责运行Pthreads并启动执行特定功能代码的并行线程,随后合并线程执行结果。Pthreads API的一个常见特征是同步相关函数,包括互斥锁(mutex)、条件变量(condition variable)和内存屏障(memory barrier)。当多个线程竞争访问互斥锁时,特定的互斥变量可实现互斥访问。同样,互斥锁和条件变量可将线程置于等待队列中,直到特定条件事件满足。等待状态由能够修改共享条件的线程触发。此机制支持生产者-消费者模式,避免忙等待。线程可进入睡眠状态,或排队等待条件变化,条件变化时其他线程唤醒它们。相较于OpenMP,Pthreads更强调线程级别的详细同步控制。

2.1.2.5 OpenACC

多核/多线程编程是OpenACC编程的核心。它为GPU多线程程序的创建和执行提供基础设施。在抽象层面,OpenACC与OpenMP类似[2],但主要聚焦于利用指令实现GPU并行化,指令指定需并行的代码段、数据管理、同步和库函数执行。#pragma acc parallel指令指定一个或多个任务组,每组含一个或多个线程同时运行。#pragma acc loop识别循环的顺序迭代,#pragma acc kernels支持指定区域内多个核函数的使用。数据管理可通过指令如#pragma acc data实现,包括内存分配、数据复制和设备空间执行等操作。

2.1.2.6 Java与Scala

JVM中的隐式语言包括Scala和Java。这些语言首先被转换成字节码,然后由解释器或后续编译器转成可执行代码,最终映射到具体硬件指令集。由于二者结构相同,通常采用类似的处理技术,支持程序的并行处理。它们为并发提供了两个抽象层次:一是更底层的并行,直接关联操作系统和硬件线程控制;二是用户不可见且自由的更高层次,由执行器类(executor classes)表示,用于规划和执行用户定义的任务。Java线程适用于对并发操作进行精细管理的场景。低级并发对象支持简单应用中的细粒度线程并行执行,而高级同步对象则支持更复杂应用的并行化,控制大规模计算任务的并行执行。此外,还提供专门的API支持线程间同步和内存数据交换。原子变量减少同步问题,使线程任务能并行执行而保证数据一致性;锁类允许对同步代码的并发访问而不阻塞。并发集合支持执行器类中的任务排队和调度,实现内存数据的并行访问。

2.1.3 消息传递处理

美国国家实验室、企业和学术界持续推进统一通信X(Unified Communication X,UCX)[4]软件栈开发,目标是构建一套API集合,支持多种中间件层,如不同MPI实现、PGAS语言、任务管理器和I/O工作负载。UCX中,较底层负责维护物理连接,由两个API组成:低级软件接口UC-T支持硬件指令传输,UC-S为常用工具集。外层协议集合UC-P供平台或应用调用,实现各种同步与通信功能。

在UCX参考实现条件下运行时,性能表现极为接近当时多用途硬件的最大带宽。值得注意的是,前述OpenSHMEM [5] PGAS平台在多数测试案例中,在Cray XK [6]上相较厂商实现取得优异表现。文献[7]对比了UCP和UCT在InfiniBand网络接口卡上的性能,但更强大的UC-U在某些场景下可能优于UC-T。

此外,为全面分析,需讨论UNIX套接字和管道机制[8]。这些流类似TCP/IP协议,运行于单台由UNIX操作系统管理的服务器或工作站。因本地执行,数据传输可靠且有序。管道支持本地进程间数据交换,通常连接标准输出和标准输入流。套接字则支持流和数据报消息,使用相同协议。

为处理跨多个集群节点、局域网乃至支持网格感知MPI版本的并行程序产生的大量数据,开发了消息传递接口(Message Passing Interface,MPI)[9]标准。MPI应用中,流水线(pipelining)是进程或线程间数据通信的基础方式。MPI标准有多个广泛使用的实现,如MPICH [10]和OpenMPI [11]。部分常用MPI通信原语包括:

  • 点对点调用与集体通信调用
  • 组织中称为组和拓扑的进程集合与布局
  • 数据类型,包括自定义数据结构
  • 组或进程间的通信上下文,包括进程间(intercommunication)和进程内(intracommunication)通信
  • 进程创建与控制机制
  • 内存窗口支持单向通信
  • 并发I/O支持并发程序的并发进程对文件的并行读写

2.1.4 挑战

然而,负载均衡是为混合并行系统提供API时面临的主要难题之一,因为系统本身倾向于自动形成负载均衡。但如今处理复杂问题往往需要多种API的组合(如MPI + OpenMP,或MPI + OpenMP + CUDA)[12, 13],并对不同并行层级进行适当调优。

很少有编程环境在关注性能的同时,也兼顾其他因素。针对同质或类似环境的API,如OpenMP和OpenCL,也在逐步融合。

以混合系统为主的复杂并行框架面临的问题是,既无法自动定义这些参数,也无法确定应用程序的结构,例如CPU上的多线程或GPU网格配置等。部分研究[14]已探索高层次的自动调优,但显然这只是起步阶段。

另一大挑战是学习曲线,涉及将专门针对现代HPC系统调优的并行编程环境和库迁移使用,而这些系统利用了前沿硬件。硬件发展的速度远远超过软件开发者学习和适应新硬件及其支持API的能力,图2.3对此亦有展示。典型例子包括最新版本的GPU和CUDA(CUDA是新一代C语言扩展,用于加速图形处理单元上的计算能力)。

2.1.5 应用案例

在科学和工程领域,高性能计算在以下高级应用中尤为流行:

  • 分子动力学模拟:分子动力学(MD)模拟是研究分子在原子层面行为的强大工具,但计算量巨大,需大量处理能力,此时高性能计算(HPC)发挥关键作用。
  • 模拟更大更复杂的系统:借助HPC,科学家可在不同复杂度层级上模拟多结构分子,例如从单个蛋白质、细胞部件到大块材料。
  • 实现更高分辨率和准确度:利用更细的时间步长和更真实的分子表示,HPC支持更高精度和更好变化表现的模拟。
  • 缩短模拟时间:通过集群多处理器,HPC能显著加速模拟,远超传统计算机,使得考虑更多参数和多种场景成为可能。
  • 药物发现与材料科学:HPC支持的MD模拟在精准药物发现中不可或缺,可进行虚拟配体对接筛选和药物与生物分子的相互作用建模,指导实验前的研究。同样在材料科学中,MD模拟用于设计具特定性能的新材料,通过原子层面的行为展示等方式实现。

2.2 计算流体力学
解决复杂模拟:高性能计算(HPC)支持解决包含湍流、多相流(如气液复杂界面)和复杂几何形状的流体流动环境。如今,普通计算机难以应对这类复杂问题。
提升精度与分辨率:借助HPC强大的处理能力,CFD模拟可采用更细的网格,对流体中的流动行为进行前所未有的精确刻画,从而获得更可靠的连接和高度准确的数据。
加快周转时间:通过将任务分配给HPC系统中的大量处理器,CFD模拟计算时间大幅缩短,实现更快速便捷的产品设计和运营。
优化设计探索:HPC允许几乎并行运行多种CFD模拟,使工程师能探索更广泛的设计方案,优化原型设计,如降低阻力、增强热传递或推进效率。
基于云的HPC可访问性:云计算无需内部资源控制,简化了对HPC资源的访问,使更多工程师和研究人员得以利用高性能计算。

2.3 计算化学

高性能计算在分子和计算化学领域越来越受研究界关注。量子计算能力超越传统计算机的模拟和计算能力,是其最大特点。
模拟更大更复杂系统:标准个人计算机在处理复杂分子(如蛋白质或全尺度生物材料)时常力不从心。借助HPC,化学家能研究更复杂体系,加深对其行为及相互作用的理解。
提高精度与分辨率:HPC支持更细微时间步长和复杂力场,能更精确描绘分子间复杂作用,预测更接近真实的结果。
加快探索与发现:多核HPC共享计算任务,提升模型运行速度,支持广泛分析和多实验并行,提高科学效率,应对知识爆发。
药物发现与材料设计:HPC驱动的分子动力学模拟(CSHFM)成为主流趋势,支持虚拟配体对接筛选和药物与生物分子相互作用建模。材料科学中,HPC用于设计具特定性能的新材料,通过原子级行为模拟实现精准设计。
量子化学计算:更精确模拟复杂电子结构和化学反应。
光谱学模拟:预测和解释分子实验光谱,提升分析能力。
化学动力学研究:深入建模反应速率和机制。

2.4 地震分析与成像

地震分析与成像领域,高性能计算是关键组成部分,尤其是对高效计算要求极高的任务。
先进地震成像技术:如全波形反演(FWI)和最小二乘迁移等现代成像方法计算密集,HPC提供强大算力,获得高保真地下结构图像。
海量地震数据处理:地震勘测产生大量数据,HPC技术支持高效处理,帮助地球科学家更好理解地下结构。
精准油藏表征:地震成像是油气勘探中重要工具,借助HPC可进行更全面分析,揭示油气藏环境细节,提升油藏认识。
复杂地球建模:成功模拟需包含岩石特性及波动扰动,HPC促进模型构建,提供更精确的地下反应模式洞察。
数据分析与机器学习:HPC极大加速数据分析与机器学习过程,特别是面对大规模数据和复杂算法时。
加快数据处理:传统单机在处理速度和分析速度上存在瓶颈,HPC集群整合多台计算机算力,显著提升数据处理能力。
训练复杂机器学习模型:深度学习模型层数众多,需大量数据训练,海量互联网与社交媒体数据助力提升AI用户数。HPC使数据科学家能高效训练复杂强大模型。
大规模模拟:HPC在天气预报、材料科学、药物发现等领域愈发重要,支持大规模复杂模拟,减少计算时间,解决数据集庞大导致的时间延误问题。
加速研发:HPC加速数据分析与模型训练,推动研发进程,无需传统依赖科学家逐步验证理论,促进更多假设测试和模型快速迭代,减少错误。

金融管理
高性能计算在金融管理领域带来变革,赋能金融机构,具体表现为:

风险管理提升
更快更准的风险计算:HPC支持复杂金融模型快速运算,实时准确评估投资组合风险,助力风险缓解及合规管理。
压力测试与情景分析:HPC软件如经济模拟器允许分析师模拟多种金融环境,评估机构承压能力,提前准备降低损失风险,维护财务稳定。

欺诈检测与防范
海量交易分析:HPC实时分析大量交易数据,揭示欺诈模式,降低企业成本,增强安全保障。
高级欺诈检测的机器学习:HPC支持复杂算法学习,适应不断变化的欺诈手法,应对潜在威胁。

算法交易与市场分析
低延迟高频交易:HPC支撑超高速处理,满足高频交易策略对瞬时事件的利用需求。
复杂市场建模与预测:HPC确保复杂金融模型构建与运行,深刻洞察市场运作,精准预测未来事件。

客户服务与产品开发优化
个性化金融产品:HPC分析海量客户数据,助力金融机构打造智能化、个性化产品与服务,提升客户满意度与忠诚度。
加快信用风险评估:HPC缩短信用审批时间,提高信用评估准确性。

2.5 气候建模

气候模型用于描述气候系统的数学表现,气候系统是大气、海洋和陆地表面的总和。如此复杂的虚拟环境尤其适合部署在具备高数据吞吐量和并行计算能力的GPU加速高性能计算(HPC)基础设施上。气候物理学家利用图形处理单元及其他数据并行处理方法,运行更加精细和深入的模型,从而加深对地球气候及人类活动影响的理解。这种应用有助于提升气候预测的准确性,进而为制定智能缓解和适应策略提供支持。气候模型本质上是模拟地球气候系统的计算程序,涉及求解复杂方程,考虑大气环流、洋流和温室效应等因素。HPC集群凭借其强大的大规模并行处理能力,使科学家能够以高分辨率运行这些复杂模拟。

分辨率是气候建模中的核心概念,用以捕捉细节。传统计算机架构受限于低分辨率,因而只能给出机制的整体概览。借助高分辨率HPC模拟,能够包含更多信息,如区域性气候变化和极端事件,从而实现更精准的气候预测。

气候建模产生大量数据,HPC高效处理和分析这些数据,揭示气候趋势、模式及系统内的相互关系。此外,通过HPC可视化技术,即使最复杂的气候科学信息也能以公众易于理解的方式呈现。

2.6 结论

当前存在多种不同的并行计算技术和API,各自根据适用性、架构和用户体验展现出优势。主要考虑因素包括对能效的需求和平台种类的不断增多。负载分配依然是亟待解决的问题,同时多目标优化及混合编程技能的缺乏也构成挑战。