Graphcore基于BSP模型(Bulk Synchronous Parallel,批量同步并行模型)实现的IPU(Intelligence Processing Unit,智能处理单元),是当前热门的AI处理器之一。IPU在并行规则方面,相比GPU要更灵活一些(每个thread可以是不同的处理),而其片内SRAM内存要大的多,并且其内存Hierarchy要简单一些,这样能够确保更加简洁高效的存储访问。
本文是Citadel对IPU系统的测试白皮书第一章节选。感兴趣的同学可以下载参考链接的白皮书,仔细阅读。
参考链接:
Dissecting the Graphcore IPU Architecture via Microbenchmarking
摘要
本报告关注智能处理单元(IPU)的架构和性能,IPU是Graphcore最近推出的一种新颖的大规模并行平台,针对人工智能/机器学习(AI/ML)工作负载。
我们使用微基准程序来分析IPU的性能。我们研究了IPU的存储组织和性能。我们研究了在不同负载下,在点对点传输和集合操作的频谱中,片上和片外互连提供的延迟和带宽。我们评估了IPU在矩阵乘法、卷积和AI/ML原语上的计算能力。我们讨论了实际表现,并与它的理论极限进行了比较。
我们的研究结果揭示了IPU的架构设计如何影响其性能。此外,他们还提供了简单的心智模型,以计算和通信步骤为基础,预测应用程序在IPU上的性能。
我们的工作聚焦在基于微基准的,对于这个全新的架构的,大规模并行体系结构的测试,这份报告是这项工作的自然扩展。
1 架构
在本章中,我们将向读者介绍IPU的体系结构及其编程范式的基础知识。
1.1 设计理念
IPU架构及其计算范式是专门为处理机器智能工作负载而全新设计的。IPU体现了某些设计选择,从根本上背离了常规的架构,如CPU和GPU,可能不太为读者所熟悉。本节和下面的部分将讨论这些选择以及它们如何影响应用程序和应用程序开发者。
任何基于IPU的系统的核心都是IPU处理器,我们在图1.1中提供了一个简化的框图。它的设计目标是跨相对大量的并行线程有效地执行细粒度操作。这意味着IPU,不同于其他大规模并行架构(例如GPU),能够很好地适应细粒度的、不规则的计算,这些计算表现为不规则的数据访问。IPU提供了真正的MIMD(多指令,多数据)并行性,并将分布式本地内存作为其设备上唯一的内存形式。
每个IPU包含1216个称为Tile的处理单元;一个Tile由一个计算核和256KB的本地内存组成。不考虑寄存器文件,除了每个Tile本地的分布式内存,IPU不提供任何其他内存。
除了Tile外,IPU处理器还包含了一个交换机构,一种允许Tile之间高带宽、低延迟通信的片上互连。
每个IPU还包含10个IPU链路接口;IPU链路是Graphcore专有的互连,可以在IPU处理器之间实现低延迟、高吞吐量的通信。因为IPU链路使得远程Tile之间的传输对于程序员来说就像本地Tile之间的传输一样简单,这是IPU范式可伸缩性的关键。最后,IPU包含两条PCIe链路,用于与基于CPU的主机通信。
图1.1 IPU处理器的简化框图,处理器具有1216个Tile(每个Tile包含一个COre和它的本地内存),交换结构(一个片内互连),IPU链路接口用于连接到其他IPU,PCIe接口用于与主机连接。
1.2 细粒度的并行性
IPU对细粒度并行性的强调意味着IPU可以有效地运行具有不规则和稀疏数据访问模式和控制流的应用程序。与SIMD/SIMT体系结构不同,IPU不需要占用大量连续向量数据的线程来实现高效率。相反,IPU可以在较小的数据块上以高度并行的MIMD方式运行单独的处理线程。每个线程可以有完全不同的代码和执行流,而不会导致性能损失。
在架构上,IPU与通常用于执行ML/AI工作负载的平台(即CPU和GPU)有很大的不同。我们将通过比较CPU和GPU,以及GPU的基本设计方法来讨论这些差异。
CPU
CPU倾向于提供复杂的Core,但是相对来说,核的数量要少一些。CPU核心具有复杂的延迟优化技术,如分支预测、分支推测和乱序执行。这些优化使得CPU在单线程性能和控制主导的代码方面表现出色,这是以牺牲能源效率和每个硅区域的总运算吞吐量为代价的。
即使大多数现代CPU提供向量化(SIMD、单指令、多数据)功能扩展,它们也无法在聚合浮点运算或在大型、常规、基于阵列的工作负载上的能源效率(每瓦特的性能)方面与GPU相提并论。
为了优化内存延迟,CPU通常使用多级内存层次结构,包含多个级别的缓存,以及复杂的预取预测器。
GPU
相比之下,GPU在每个设备上具有更小的Core,但却有更多的数量(例如,数千个)。GPU Core在架构上比CPU Core简单,通常不提供分支推测、复杂的分支预测、乱序执行或硬件预取。
GPU将这些Core排列成集群,集群以同步的方式运行;集群中的所有Core在任何时间点执行相同的指令。线程被编组为warp;warp再组织成集群。warp中的线程将对独立数据执行相同的操作。这个执行模型被称为SIMT:单指令、多线程。
尽管GPU已经发展了具有缓存和暂存存储器的深度内存层次结构,它们优化内存延迟的基本方法仍然是线程对Core的过度订阅和线程间轻量切换的能力。在这种方法中,当一组线程正在等待来自主内存的操作数时,硬件可以挂起它们,并切换到另一个已经从内存接收其操作数并准备继续的线程。编程模型显式地鼓励开发人员暴露足够的线程并行性,以便始终有一部分线程准备执行,而其余线程等待操作数。
GPU只有在负载/存储操作达到峰值时才访问主存——每个warp内的操作涉及内存的连续区域;据说,这一通道被合并了。非合并内存访问只能达到理论峰值内存带宽的一小部分。为了获得最佳性能,开发人员必须实例化共享同一个程序的大线程块,尝试以协调的、合并的方式使用输入数据(并产生输出),并少量使用控制流。由于SIMT模型,当线程在控制流中出现分歧时,GPU会付出非常大的性能代价。
由于其组织性,GPU擅长于规则的、密集的、数值的、数据流主导的工作负载,这自然会导致合并访问和一致的控制流。在这些工作负载中,GPU也比CPU更节能,因为它们将更多的硅用于算术单元,而不是缓存和面向延迟的特性。此外,GPU可以在单个Core外重构指令译码;这是因为集群的Core操作相同的指令。
IPU
IPU提供Core的数量足够多(每个处理器1216个Core),并且Core的复杂程度适中,以能够执行完全不同的程序。IPU减少内存延迟的方法是彻底的——它完全废除了共享内存。IPU只提供小型的分布式内存,这些内存是本地的,与每个核心紧密耦合。每个Tile包含256KB内存,每个设备总计304MB。
IPU内存是暂存,而不是缓存。它们被实现为SRAM,因此比DRAM提供更高的带宽(45TB/s,聚合)和更低的延迟(6个时钟周期)。它们的性能与CPU的L2缓存相当,优于GPU共享内存(或L1缓存)。第1.4节详细我们会对内存详细讨论。
当控制流发散或内存访问地址发散时,IPU Core不会有任何代价。事实上,IPU Core不会因为不相交指令流以及离散的内存访问而付出任何代价。Core以独立于访问模式的固定成本从各自的本地内存中访问数据。这使得在执行具有不规则或随机数据访问模式的应用程序和/或控制流主导的应用程序时,IPU比GPU更高效,只要工作集能在IPU内存放的下。
与CPU和GPU类似,IPU通过将线程超分配给Core来实现更高的效率。具体来说,每个IPU块支持6个线程的运行。其功能类似于CPU上常见的SMT技术(同时多线程,或Intel的超线程)。每个IPU块维护6个常驻执行上下文,并将它们复用到共享资源上,从而隐藏了指令延迟(依赖关系、内存访问和分支延迟),减少了相应的流水线延迟,并增加了总吞吐量。每个Tile根据一个静态的循环调度在线程之间轮转。因此,整个IPU支持 6×1216 = 7296个线程。为了最大化利用率,鼓励软件开发人员实例化如此多的线程。
在IPU上,不规则工作负载的效率并不是以牺牲常规的、基于数字的、数组或矩阵的工作负载为代价的,这些工作负载在GPU上运行良好。在下一节中,我们将展示当操作数匹配内存时,在以单板为单位的比较中,IPU的性能优于GPU。
1.3 算法的吞吐量
IPU提供了令人印象深刻的运算吞吐量,单精度可达31.1 TFlops/s,每片芯片的混合精度可达124.5 TFlops/s,在理论极限比较中超过了当前的GPU。
在单板卡比较中,IPU相对于GPU的理论优势大概增长了两倍,在能源效率比较中也是如此。
如此水平的吞吐量是通过在每个IPU Tile中使用称为累加矩阵产品(Accumulating Matrix Product, AMP)单元的特殊流水线实现的。AMP单元用于加速矩阵乘法和卷积运算。一个AMP单元在单个时钟周期可以完成64个混合精度或16个单精度浮点运算。
对于混合精度,我们表示乘法具有半精度(FP16),它们的乘积累积到单精度结果(FP32)的运算。
然而,实际的算法性能,无论是在IPU上还是在GPU上,都很大程度上取决于手头特定的数值工作负载的特性,可能与理论极限有很大的不同。在一系列有意义的真实工作负载上评估IPU的算术性能远远超出了微基准测试报告的范围。然而,我们对Poplar的线性代数库(poplin)提供的矩阵乘法性能进行了基准测试,并将其与理论极限以及与NVidia V100 GPU相关的各自性能数字进行了比较。
我们测试的实际性能显示,与NVIDIA的V100 GPU(单芯片比较)相比,IPU在单个精度上优势明显。在混合精度方面,双方各有优劣,需要进行更细致的讨论。我们将这一讨论连同实验设置细节和定量结果放在第5.1节,这一节完全用于矩阵乘法工作负载。
1.4 内存架构
在IPU的细粒度处理哲学中,本地内存的作用是最基础的。事实上,选择位于Core附近的分布式SRAM可以使线程有效地访问数据,即使访问模式是不规则的、稀疏的和不连贯的。
每个Tile包含256 KB,整个处理器上总共有304个MB。每个Tile拥有一个独立的、连续的21位地址空间,6个硬件上下文共享,其中本地执行的代码和本地处理的数据必须匹配。整个IPU内存的名义总带宽为45 TB/s,延迟为6个时钟周期。
虽然IPU的总容量低于GPU上典型的DRAM内存(例如,32GB),但IPU内存在速度上弥补了它们在容量上的不足;它们在NVIDIA Turing T4 GPU上的延迟比L1缓存和共享内存都短,在Intel Skylake / Kaby Lake / Coffee Lake CPU上的延迟与L2缓存相当。在GPU和CPU上具有相同延迟的IPU内存和SRAM内存之间的数量比较见表1.1。
就容量而言,聚合的IPU内存比CPU和GPU上具有等效延迟的内存层要大,比它们高出一到两个数量级(参见表1.1中“单片容量”列)。IPU内存的总大小消除了对类似于GPU和CPU上的缓存层次结构的需求。
我们在第三章中专门研究了IPU的本地内存的性能,我们通过微基准测试程序来测量。
表1.1 在当前主流GPU和CPU上,IPU内存和类似的基于SRAM的内存层次之间的大小和延迟比较。IPU的本地内存比图灵GPU上最快的内存仍具有更低的延迟,与英特尔当前主流CPU的L2缓存相当。然而,IPU的本地内存要比单片的内存大得多。
IPU的内存组织要求软件设计者将他们的工作集适当地划分到各个Tile的内存中,并使Tile在需要非本地操作数时相互交换数据。这个编程模型,连同Graphcore的Poplar语言和相关的编译器,允许对这些数据传输进行自动编排。开发者描述操作数的流,但不需要担心显式的变量放置和传输调度。只使用一次的瞬态数据应该通过主机的PCI传输到设备中。
Graphcore的优化机器学习和线性代数库采用了我们描述的数据划分方法。对性能敏感的软件开发者也被鼓励遵循它。
每个IPU的累加内存为304 MB(每板608 MB),对于当前主流AI/ML应用程序中使用的许多模型来说,完全足够驻留在芯片内。完全适合芯片的模型受益于本地内存提供的高带宽和低延迟。大尺寸的模型可以跨IPU处理器和IPU板进行切分,这得益于下一节中描述的架构和编程范式特性。
1.5 互联架构
IPU互连使IPU系统上的Tile紧密地工作在一起,并彼此有效地交换数据。它也真正使一个拥有多个IPU的系统成为一个一致性的机器。
有多个IPU的系统可以暴露单个IPU设备,也可以暴露多IPU设备。多IPU是一个虚拟的IPU设备,它由多个物理IPU组成,提供它们所有的内存和计算资源,就像它们属于一个设备一样。将多个物理IPU联合成一个虚拟的单个设备的能力,正是允许用户训练和推断比单个IPU容量大的模型的能力,同时还可以利用累加计算能力。软件设计人员可以将他们的应用程序扩展到多个IPU,而不需要额外的开发工作,因为相同的API可以以物理IPU或多IPU为目标。片上交换和IPU链接之间的紧密合作是允许多IPU存在的关键因素,并将其参与者的累加内存容量和计算资源交给开发人员使用。
为了研究IPU的片内和片外互连性能,我们采用了经典研究的术语、方法和兴趣集中于并行系统和高性能网络的特征。
在芯片上,互连的总吞吐量达到了7.7 TB/s(实际)。我们测量了负载下的吞吐量,所有Tile将数据并发地传输到随机选择的目的地,并使用一个代表全部对全部交换的基准程序(章节4.1.6)。在每一个Tile的基础上,1216个Tile可以同时使用6.3 GB/s的带宽来将数据传输到芯片上的任意目的地。片上平铺交换的延迟是165纳秒或更低,并且在负载超过该值时不会降低。
在多处理器系统中,交换链路和IPU链路共同工作,以支持对用户透明的Tile到Tile通信,而不管两个端点在系统中的位置;它是简单的多IPU编程,因为它是一个单一的,物理的IPU。
每个单板通过IPU链路与对端单板相连,通过PCIe接口与主机系统相连。每块板上的2个IPU通过3条链路相连,标称双向带宽为64GB/s,其中2条预留给板内传输。我们的基准实现了108GB/s的实际带宽。
在IPU-link网络中连接单板是构建更大的基于IPU的系统的关键。虽然我们的研究仅限于具有8个主板的单主机配置,但可以构建更大的系统,包括无主机系统。他们超出了本报告的范围。虽然不同的网络拓扑是可能的,但我们的实验评估侧重于Graphcore提供给我们的测试系统中采用的具体配置;我们在第二章中详细描述了它。
然后,我们用第四章的全部篇幅来研究芯片内和跨芯片的IPU互连性能。
总而言之,我们提出两项通用的意见:
- 性能:虚拟IPU的综合算法资源线性伸缩,整体互连性能伸缩较好。例如,通信延迟随着系统直径的降低而优雅地降低,我们的基准测试结果在章节4.1.1和4.1.3中显示;
- 可编程性:多IPU编程模型对开发者是透明的。底层硬件使抽象变得高效,实际上,将应用程序扩展到大型IPU系统不需要额外的开发工作。相比之下,CUDA应用程序确实需要额外的开发工作和复杂性来跨多个GPU并行化,甚至需要更多的并行化跨主机。对于CPU并行应用程序也是如此,特别是跨主机的应用程序。
1.6 批量同步并行模型
作为IPU编程范式基础的一个重要设计因素是批量同步并行(Bulk Synchronous Parallel, BSP)模型。BSP是IPU用来组织计算和交换操作的方法。
BSP模型提出于20世纪80年代,它是并行计算的抽象,便于表示并行算法,并对它们在并行计算机上执行时所获得的性能进行推理。
BSP模型以多个顺序的“超步”组织计算;“超步”由本地计算阶段、通信阶段和栅栏同步组成:
- 在本地计算阶段,每个进程执行的计算只在本地内存上运行。在此阶段没有进程之间的通信发生;
- 在通信阶段,处理交换数据;每个进程可以向每个期望的目标对等方发送消息(所有对所有的个性化交换)。这个阶段没有计算;
- 一个栅栏同步阶段随之而来;没有进程继续下一个“超步”,直到所有进程都到达了栅栏。这个阶段既不进行计算,也不进行通信,除非是栅栏本身严格要求的。
进程不仅可以使用通信阶段发送中间计算结果,还可以请求以及(在以后的通信阶段)接收从远程内存发送来的数据。这种机制允许每个进程使用任何其他的本地内存作为远程内存,并最终将整个聚合系统内存作为一个更大的存储访问。
在BSP模型中可以描述任意复杂度的并行算法,不受通用性的限制。
IPU是一个真正的BSP机器。它完全体现了对每个BSP超步骤的三个阶段的硬件支持、实施和优化。它的编程模型允许编程人员根据本地数据(且仅在本地数据)的图顶点来指定进程。
在计算开始之前,在与前一个“超步”相关的通信步骤中,运行时系统将输入操作数带到每个进程中。
编程模型和硬件共同实现了阶段之间的分离:
- IPU Core只能直接访问本地内存;这种组织自然地加强了计算阶段的局部限制;
- 片上交换为通信阶段的任意节点之间的交换提供硬件支持和加速;
- 还有栅栏同步。
在Poplar SDK支持的IPU范式中,程序员将计算描述为顶点,将数据描述为张量,将数据交换描述为静态边,而不必担心在本地内存中静态数据的分配、输入/输出传输缓冲区的分配或传输调度。所有这些任务都是由Poplar编译器执行的。编译器专门使用BSP范式组织机器智能模型的处理。
由于IPU使用其交换链路和IPU链路实现BSP模型,互连性能是决定BSP通信和同步阶段性能的主要因素,并最终影响整个应用程序性能。我们将在第四章通过基准程序研究IPU间以及IPU内的传输性能。实际上,这些基准程序被编译为BSP通信和栅栏同步阶段,并作为阶段执行。
作者:Chaobo
来源:https://mp.weixin.qq.com/s/7Q7qXlidLQSm0WGoIIoeQg
作者微信公众号
相关文章推荐
更多软硬件技术干货请关注软硬件融合专栏。