之前的文章XXX,从软件层面介绍了AI要做的事情。那么计算机体系结构要解决的问题就是软硬协调,特别是软件硬化把AI的计算硬化为NPU/GPU等里面的算子去实现。
本章节首先从AI芯片分类到发展趋势进行介绍,然后对于AI技术的种类、优化方向及关键指标进行介绍,为软件硬化打下一个概念基础。本文主要参考《ZOMI酱:AI系统》:chenzomi12.github.io/02Hardware0…
1. AI芯片介绍
AI计算中可以用到的四种芯片类型:
- CPU:CPU 是冯诺依曼架构下的处理器,遵循“Fetch (取指)-Decode (译码)- Execute (执行)- Memory Access (访存)-Write Back (写回)”的处理流程。作为计算机的核心硬件单元,CPU 具有大量缓存和复杂的逻辑控制单元,非常擅长逻辑控制、串行的运算,不擅长复杂算法运算和处理并行重复的操作。CPU 能够支持所有的 AI 模型算法。
- GPU:图形处理器,最早应用于图像处理领域,与 CPU 相比,减少了大量数据预取和决策模块,增加了计算单元 ALU 的占比,从而在并行化计算效率上有较大优势。但 GPU 无法单独工作,必须由 CPU 进行控制调用才能工作,而且功耗比较高。随着技术的进步,以及越来越多 AI 算法通过 GPU 用来加速训练,GPU 的功能越来越强大,人们开始将 GPU 的能力扩展到一些计算密集的领域,这种扩展后设计的处理器称为 GPGPU(General-Purpose compution on Graphics Processing Unit)
- FPGA:其基本原理是在 FPGA 芯片内集成大量的基本门电路以及存储器,用户可以通过更新 FPGA 配置文件来定义这些门电路以及存储器之间的连线。与 CPU 和 GPU 相比,FPGA 同时拥有硬件流水线并行和数据并行处理能力,适用于以硬件流水线方式处理一条数据,且整数运算性能更高。FPGA 具有非常好的灵活性,可以针对不同的算法做不同的设计,对算法支持度很高,常用于深度学习算法中的推理阶段。不过 FPGA 需要直接与外部 DDR 数据交换数据,其性能不如 GPU 的内存接口高效,并且对开发人员的编程门槛相对较高。国外 FPGA 的有名厂商有 Xilinx(赛灵思)和 Altera(阿尔特拉)两家公司,国内有复旦微电子、紫光同创、安路科技等。
- ASIC:根据产品需求进行特定设计和制造的集成电路,能够在特定功能上进行强化,具有更高的处理速度和更低的功耗。但是研发周期长,成本高。比如神经网络计算芯片 NPU、Tensor 计算芯片 TPU 等都属于 ASIC 芯片。因为是针对特定领域定制,所以 ASIC 往往可以表现出比 GPU 和 CPU 更强的性能,ASIC 也是目前国内外许多 AI 芯片设计公司主要研究的方向,在预见的未来,市面上会越来越多 AI 领域专用 ASIC 芯片。
按照应用场景的角度,AI 芯片可以分为云端,边缘端两类。
- 云端的场景又分为训练应用和推理应用,像电商网站的用户推荐系统、搜索引擎、短视频网站的 AI 变脸等都是属于推理应用。
- 边缘的应用场景更加丰富,如智能手机、智能驾驶、智能安防等。通过 AI 芯片丰富的应用场景,可以看到人工智能技术对我们未来生活的影响程度。
整体上边缘计算基本上就是推理用的,而推理比训练需要的算力比较小,其实也可以一块芯片通用,例如推理使用一个,那训练就使用多个使用PCI-E等连接起来,就提高了算力。
推荐一篇2018年图灵奖的文章:“计算机架构的新黄金时代:特定领域的硬件/软件协同设计、增强的安全性、开放指令集和敏捷芯片开发”,涵盖了计算机架构的最新发展和未来方向。:cacm.acm.org/research/a-… ,这篇文章出来的时候,2022年底的TensorFlow还没有爆发,其在计算机架构未来机遇章节提到了很多AI相关:
领域特定架构。 一种更以硬件为中心的方法是设计针对特定问题领域量身定制的架构,并为该领域提供显著的性能(和效率)提升,因此得名“领域特定架构”(DSA)。DSA 是一类专为特定领域量身定制的处理器——可编程且通常图灵完备,但针对特定类型的应用量身定制。从这个意义上讲,它们不同于专用集成电路 (ASIC),后者通常用于单一功能,代码很少更改。DSA 通常被称为加速器,因为与在通用 CPU 上执行整个应用程序相比,它们可以加速部分应用程序。此外,DSA 可以获得更好的性能,因为它们更贴合应用程序的需求;DSA 的示例包括图形处理单元 (GPU)、用于深度学习的神经网络处理器以及用于软件定义网络 (SDN) 的处理器。DSA 能够实现更高的性能和更高的能效,主要有以下四个原因:
首先,也是最重要的一点,DSA 针对特定领域采用了更高效的并行形式。例如,单指令多数据并行 (SIMD) 比多指令多数据并行 (MIMD) 更高效,因为它只需获取一个指令流,并且处理单元同步运行。9尽管SIMD 不如 MIMD 灵活,但它与许多 DSA 非常匹配。DSA 还可以使用 VLIW 方法实现 ILP,而不是推测性乱序机制。如前所述,VLIW 处理器不太适合通用代码15,但对于有限的领域来说,VLIW 效率更高,因为其控制机制更简单。具体而言,大多数高端通用处理器都是乱序超标量处理器,需要复杂的控制逻辑来执行指令启动和指令完成。相比之下,VLIW 在编译时执行必要的分析和调度,这对于显式并行程序非常有效。
其次,DSA 可以更有效地利用内存层次结构。正如 Horowitz 所指出的,内存访问的成本比算术计算高得多。16例如,访问 32 KB 缓存中的块所需的能量成本大约比 32 位整数加法高 200 倍。这种巨大的差异使得优化内存访问对于实现高能效至关重要。通用处理器运行的代码中的内存访问通常表现出空间和时间局部性,但在编译时则不太可预测。因此,CPU 使用多级缓存来增加带宽并隐藏相对较慢的片外 DRAM 中的延迟。这些多级缓存通常消耗处理器大约一半的能量,但避免了几乎所有对片外 DRAM 的访问,因为这些访问需要的能量大约是最后一级缓存访问的 10 倍。
缓存有两个明显的缺点:
当数据集非常大时。 当数据集非常大且时间或空间局部性较低时,缓存根本无法正常工作;
当缓存运行良好时。 当缓存运行良好时,局部性非常高,这意味着,根据定义,大多数缓存在大多数时间处于空闲状态。
在内存访问模式定义明确且可在编译时发现的应用中(典型的 DSL 就是这样),程序员和编译器可以比动态分配的缓存更好地优化内存的使用。因此,DSA 通常使用由软件明确控制移动的内存层次结构,类似于矢量处理器的运行方式。对于合适的应用,用户控制的内存比缓存的能耗要低得多。
第三,DSA 在精度足够的情况下可以使用较低的精度。通用 CPU 通常支持 32 位和 64 位整数和浮点 (FP) 数据。对于机器学习和图形领域的许多应用来说,这种精度已经超出了实际需求。例如,在深度神经网络 (DNN) 中,推理通常使用 4 位、8 位或 16 位整数,从而同时提高数据和计算吞吐量。同样,对于 DNN 训练应用来说,FP 也很有用,但 32 位就足够了,16 位通常也能满足需求。
最后,DSA 受益于针对用领域特定语言 (DSL) 编写的程序,这些程序具有更多的并行性,改进了内存访问的结构和表示,并且更容易将应用程序有效地映射到领域特定处理器。
2. AI计算特点介绍
2.1 AI运算的类型
首先一个问题:AI计算都在做哪些运算?
下图是一个经典的图像分类的卷积神经网络结构,网络结构从左到右有多个网络模型层数组成,每一层都用来提取更高维的目标特征(这些中间层的输出称为特征图,特征图数据是可以通过可视化工具展示出来的,用来观察每一层的神经元都在做些什么工作),最后通过一个 softmax 激活函数达到分类输出映射。
接下来我们来了解一下神经网络中的主要计算范式:权重求和。下图是一个简单的神经网络结构,左边中间灰色的圈圈表示一个简单的神经元,每个神经元里有求和和激活两个操作,求和就是指乘加或者矩阵相乘,激活函数则是决定这些神经元是否对输出有用,Tanh、ReLU、Sigmoid 和 Linear 都是常见的激活函数。神经网络中 90%的计算量都是在做乘加(multiply and accumulate, MAC)的操作,也称为权重求和。
结合上面介绍的经典 AI 模型结构特点,AI 芯片设计可以引出如下对于 AI 计算模式的思考:
- 需要支持神经网络模型的计算逻辑。比如不同神经元之间权重共享逻辑的支持,以及除了卷积/全连接这种计算密集型算子,还需要支持激活如 softmax, layernorm 等 Vector 类型访存密集型的算子。
- 能够支持高维的张量存储与计算。比如在卷积运算中,每一层都有大量的输入和输出通道,并且对于某些特定场景如遥感领域,Feature Map 的形状都非常大,在有限的芯片面积里最大化计算访存比,高效的内存管理设计非常重要。
- 需要有灵活的软件配置接口,支持更多的神经网络模型结构。针对不同领域,如计算机视觉、语音、自然语言处理,AI 模型具有不同形式的设计,但是作为 AI 芯片,需要尽可能全的支持所有应用领域的模型,并且支持未来可能出现的新模型结构,这样在一个漫长的芯片设计到流片的周期中,才能降低研发成本,获得市场的认可。
所以AI芯片还是ASIC:根据产品需求进行特定设计和制造的集成电路,能够在特定功能上进行强化,具有更高的处理速度和更低的功耗。
2.2 AI芯片的关键指标
芯片制程,内存大小,核心数,带宽,算力等,这些指标体现了 AI 产品的核心竞争力。 一些基本概念介绍如下:
- OPS,Operations Per Second, 每秒操作数。1 TOPS 代表处理器每秒进行一万亿次(1012)计算。
- OPS/W:每瓦特运算性能。TOPS/W 评价处理器在 1W 功耗下运算能力的性能指标。
- MACs:Multiply-Accumulate Operations,乘加累计操作。1 MACs 包含一个乘法操作与一个加法操作,通常 1MACs=2FLOPs。
- FLOPs:Floating Point Operations, 浮点运算次数,用来衡量模型计算复杂度,常用作神经网络模型速度的间接衡量标准。
- MAC:Memory Access Cost,内存占用量,用来衡量模型在运行时的内存占用情况
- 精度:指的是模型在处理任务时输出结果与实际情况之间的接近程度。
- 吞吐量:指芯片在单位时间内能处理的数据量。更多的并行可以提高吞吐量
- 时延:AI 芯片的时延是指从输入数据传入芯片开始,到输出结果产生的时间间隔。对于需要快速响应的应用场景,如自动驾驶、智能监控等,较低的推理时延是至关重要的。
- 功耗:AI 芯片的能耗指的是在执行 AI 任务时芯片所消耗的能量。高性能的 AI 芯片通常会消耗更多的能量,而低功耗的设计则可以减少能源消耗并延长电池寿命,这对于移动设备和物联网设备等场景尤为重要。
价格是市场选择 AI 产品时的重要考量指标,主要包括下面两部分:
-
硬件自身价格:这是指 AI 芯片本身的制造成本,包括芯片设计、制造、封装、测试等环节的费用。硬件自身价格直接影响到芯片的成本效益比,对于消费市场和大规模部署的场景尤为重要。较低的硬件价格可以降低设备制造成本,提高产品的竞争力。
-
系统集成上下游全栈等成本:除了硬件本身的成本外,还需要考虑与 AI 芯片相关的系统集成和全栈生态系统的成本。这包括软件开发、算法优化、系统集成、测试验证、软件支持等方面的成本。在实际应用中,AI 芯片往往需要与其他硬件设备、软件系统以及云端服务进行集成,这些集成成本也需要被考虑进来。
易用性 Flexibility: 一个好的 AI 芯片产品应该提供完善的软硬件支持、丰富的文档和教程、灵活的编程语言和框架支持,以及便捷的硬件接口和集成支持,从而满足开发者在不同应用场景下的需求,提高开发效率和用户体验。AI 芯片的易用性的具体理解为:
- 文档和教程:良好的文档和教程能够帮助用户更好地了解 AI 芯片的特性、功能和使用方法,降低学习成本,提高开发效率。
- 软件支持和开发工具:一个易于使用的 AI 芯片应该提供完善的软件开发工具链,包括丰富的 API、SDK、开发环境等,使开发者可以快速上手并进行应用程序的开发和调试。
- 硬件接口和集成支持:AI 芯片应该提供标准化的接口和通信协议,便于与其他硬件设备和系统进行集成,从而实现更广泛的应用场景。
- 性能优化和调试工具:AI 芯片应该提供丰富的性能分析和调试工具,帮助开发者对应用程序进行性能优化和故障排查,提高系统的稳定性和可靠性。
2.3 AI芯片关键设计点
AI 芯片设计的关键点围绕着如何提高吞吐量和降低时延,以及低时延和 Batch Size 之间权衡。具体的实现策略主要表现在 MACs 和 PE 两个方向。
MACs就是乘加计算的优化:
- 减少不必要的MACs运算,例如裁剪模型等
- 对稀疏矩阵进行硬件级别的MACs计算优化,降低运算时间
- 增大频率
PE就是处理单元(Processing Element),优化:
- 增加PE数量,这样就可以更好的并行运算
- 增加PE利用率,有好的调度器让某一时刻尽量多的PE参与到运算中来。一般PE都在等数据,并行计算有时有依赖关系,这些都需要一个好的数据流调度来进行。
3. AI芯片相关优化
3.1 AI运算的优化
模型量化是指通过减少神经模型权重表示或者激活所需的比特数来将高精度模型转换为低精度模型。网络剪枝则是研究模型权重中的冗余,尝试在不影响或者少影响模型推理精度的条件下删除/修剪冗余和非关键的权重。量化压缩 vs 网络剪枝的示意如上图所示。
将高比特模型进行低比特量化具有如下几个好处。
- 降低内存:低比特量化将模型的权重和激活值转换为较低位宽度的整数或定点数,从而大幅减少了模型的存储需求,使得模型可以更轻松地部署在资源受限的设备上。
- 降低成本:低比特量化降低了神经网络中乘法和加法操作的精度要求,从而减少了计算量,加速了推理过程,提高了模型的效率和速度。
- 降低能耗:低比特量化减少了模型的计算需求,因此可以降低模型在移动设备和嵌入式系统上的能耗,延长设备的电池寿命。
- 提升速度:虽然低比特量化会引入一定程度的信息丢失,但在合理选择量化参数的情况下,可以最大程度地保持模型的性能和准确度,同时获得存储和计算上的优势。
- 丰富模型的部署场景:低比特量化压缩了模型参数,可以使得模型更容易在移动设备、边缘设备和嵌入式系统等资源受限的环境中部署和运行,为各种应用场景提供更大的灵活性和可行性。
定义时候神经网络使用的数据存储格式挺重要,主要有上面FP32, TF32, FP16, BF16 这四种类型。
据剪枝的时机和方式,可以将模型剪枝分为以下几种类型:
- 静态剪枝:在训练结束后对模型进行剪枝,这种方法的优点是简单易行,但无法充分利用训练过程中的信息。
- 动态剪枝:在训练过程中进行剪枝,根据训练过程中的数据和误差信息动态地调整网络结构。这种方法的优点是能够在训练过程中自适应地优化模型结构,但实现起来较为复杂。
- 知识蒸馏剪枝:通过将大模型的“知识”蒸馏到小模型中,实现小模型的剪枝。这种方法需要额外的训练步骤,但可以获得较好的压缩效果。
对神经网络模型的剪枝可以描述为如下三个步骤:
- 训练 Training:训练过参数化模型,得到最佳网络性能,以此为基准;
- 剪枝 Pruning:根据算法对模型剪枝,调整网络结构中通道或层数,得到剪枝后的网络结构;
- 微调 Finetune:在原数据集上进行微调,用于重新弥补因为剪枝后的稀疏模型丢失的精度性能。
结合上面 AI 模型的量化和剪枝算法的研究进展,AI 芯片设计可以引出如下对于 AI 计算模式的思考:
- 提供不同的 bit 位数的计算单元。为了提升芯片性能并适应低比特量化研究的需求,我们可以考虑在芯片设计中集成多种不同位宽的计算单元和存储格式。例如,可以探索实现 fp8、int8、int4 等不同精度的计算单元,以适应不同精度要求的应用场景。
- 提供不同的 bit 位数存储格式。在数据存储方面,在 M-bits(如 FP32)和 E-bits(如 TF32)格式之间做出明智的权衡,以及在 FP16 与 BF16 等不同精度的存储格式之间做出选择,以平衡存储效率和计算精度。
- 利用硬件提供专门针对稀疏结构计算的优化逻辑。为了优化稀疏结构的计算,在硬件层面提供专门的优化逻辑,这将有助于提高稀疏数据的处理效率。同时,支持多种稀疏算法逻辑,并对硬件的计算取数模块进行设计上的优化,将进一步增强对稀疏数据的处理能力(如 NVIDA A100 对稀疏结构支持)。
- 硬件提供专门针对量化压缩算法的硬件电路。通过增加数据压缩模块的设计,我们可以有效地减少内存带宽的压力,从而提升整体的系统性能。这些措施将共同促进芯片在处理低比特量化任务时的效率和性能。
3.2 轻量化模型
随着神经网络应用的普及,越来越多的模型需要在特定的硬件平台部署,如移动端和嵌入式设备,这些平台普遍存在内存资源少,处理器性能不高,功耗受限等特点,所以慢慢演变出了一种轻量化的网络模型设计方向,即在保持模型精度基础上进一步减少模型参数量和计算量的网络模型结构。
网络模型的轻量级衡量指标有两个,一个是网络参数量、另一个是浮点运算数(Floating-point Operations, FLOPs),也就是计算量。
减少参数的一些方法:
- 使用小的卷积核
- 减少通道数量
- 减少卷积核个数
3.3 并行计算
根据模型在设备之间的通信程度,数据并行技术可以分为 DP, DDP, FSDP 三种。
- Data parallelism, DP 数据并行
数据并行是最简单的一种分布式并行技术,具体实施是将大规模数据集分割成多个小批量,每个批量被发送到不同的计算设备(如 NPU)上并行处理。每个计算设备拥有完整的模型副本,并单独计算梯度,然后通过 all_reduce 通信机制在计算设备上更新模型参数,以保持模型的一致性。
- Distribution Data Parallel, DDP 分布式数据并行
DDP 是一种分布式训练方法,它允许模型在多个计算节点上进行并行训练,每个节点都有自己的本地模型副本和本地数据。DDP 通常用于大规模的数据并行任务,其中模型参数在所有节点之间同步,但每个节点独立处理不同的数据批次。
在 DDP 中,每个节点上的模型副本执行前向和后向传播计算,并计算梯度。然后,这些梯度在不同的节点之间进行通信和平均,以便所有节点都可以使用全局梯度来更新其本地模型参数。这种方法的优点是可以扩展到大量的节点,并且可以显著减少每个节点的内存需求,因为每个节点只需要存储整个模型的一个副本。
DDP 通常与 AI 框架(如 PyTorch)一起使用,这些框架提供了对 DDP 的内置支持。例如,在 PyTorch 中,torch.nn.parallel.DistributedDataParallel
模块提供了 DDP 实现,它可以自动处理模型和梯度的同步,以及分布式训练的通信。
- Fully Sharded Data Parallel, FSDP 全分片数据并行
Fully Sharded Data Parallelism (FSDP) 技术是 DP 和 DDP 技术的结合版本,可以实现更高效的模型训练和更好的横向扩展性。这种技术的核心思想是将神经网络的权重参数以及梯度信息进行分片(shard),并将这些分片分配到不同的设备或者计算节点上进行并行处理。FSDP 分享所有的模型参数,梯度,和优化状态。所以在计算的相应节点需要进行参数、梯度和优化状态数据的同步通信操作。
如上图是 FSDP 并行技术的示意图,可以看到不同的计算节点多了一些虚线链接的通信操作。
- 张量并行
将模型的张量操作分解成多个子张量操作,并且在不同的设备上并行执行这些操作。这样做的好处是可以将大模型的计算负载分布到多个设备上,从而提高模型的计算效率和训练速度。在张量并行中,需要考虑如何划分模型的不同层,并且设计合适的通信机制来在不同设备之间交换数据和同步参数。通常会使用诸如 All-reduce 等通信原语来实现梯度的聚合和参数的同步。
如下图是一个矩阵乘算子的张量并行示意。X 作为激活输入,A 作为算子权重,将 A 按列切分。每个计算节点保留一份完整的 A 和部分 A,最后通过 All Gather 通信将两个计算节点的数据进行同步拼接为一份完整的 Y 输出,供下一层使用。
- 流水并行
将模型的不同层划分成多个阶段,并且每个阶段在不同的设备上并行执行。每个设备负责计算模型的一部分,并将计算结果传递给下一个设备,形成一个计算流水线。在流水并行中,需要设计合适的数据流和通信机制来在不同设备之间传递数据和同步计算结果。通常会使用缓冲区和流水线控制器来管理数据流,并确保计算的正确性和一致性。
如下图是一个流水线并行示意过程。假设一个模型有 Forward,Backward 两个阶段,有 0-3 共 4 层网络设计,分布在 4 个计算设备处理,右图展示了在时间维度下,不同层不同阶段的执行顺序示意。为了减少每个设备等待的时间(即中间空白的区域,称为 Bubble),一个简单的优化设计就是增加 data parallelism,让每层数据切分为若干个 batch,来提高流水线并行设备利用率。
3.4 矩阵乘法优化
AI 模型中往往包含大量的矩阵乘运算,该算子的计算过程表现为较高的内存搬移和计算密度需求,所以矩阵乘的效率是 AI 芯片设计是性能评估的主要参考依据。
芯片里的内存空间往往是有限的(成本高),表现为越靠近计算单元,带宽越快,内存越小。为了平衡计算和内存加载的时间,让算力利用率最大化,AI 芯片往往会进行由远到近,多级内存层级的设计方式,达到数据复用和空间换时间的效果。根据这样的设计,矩阵乘实际的数据加载和计算过程将进行分块 Tiling 处理。
矩阵乘作为 AI 模型中的重要性能算子,CPU 和 GPU 的平台上都有专门对其进行优化实现的库函数。比如 CPU 的 OpenBLAS, Intel MKL 等,GPU 的 cuBLAS, cuDNN 等。实现的方法主要有 Loop 循环优化 (Loop Tiling)和多级缓存 (Memory Hierarchy)。
矩阵乘作为计算机科学领域的一个重要基础操作,有许多优化算法可以提高其效率。下面我们对常见的矩阵乘法优化算法做一个整体的归类总结。
- 基本的循环优化:通过调整循环顺序、内存布局等手段,减少缓存未命中(cache miss)和数据依赖,提高缓存利用率,从而加速矩阵乘法运算。
- 分块矩阵乘法(Blocked Matrix Multiplication) :将大矩阵划分成小块,通过对小块矩阵进行乘法运算,降低了算法的时间复杂度,并能够更好地利用缓存。
- SIMD 指令优化:利用单指令多数据(SIMD)指令集,如 SSE(Streaming SIMD Extensions)和 AVX(Advanced Vector Extensions),实现并行计算,同时处理多个数据,提高计算效率。
- SIMT 多线程并行化:利用多线程技术,将矩阵乘法任务分配给多个线程并行执行,充分利用多核处理器的计算能力。
- 算法改进:如 Fast Fourier Transform 算法,Strassen 算法、Coppersmith-Winograd 算法等,通过矩阵分解和重新组合,降低了算法的时间复杂度,提高了计算效率。
这些优化算法通常根据硬件平台、数据规模和计算需求选择不同的策略,以提高矩阵乘法运算的效率。在具体的 AI 芯片或其它专用芯片里面,对矩阵乘的优化实现主要就是减少指令开销,可以表现为两个方面:
- 让每个指令执行更多的 MACs 计算。比如 CPU 上的 SIMD/Vector 指令,GPU 上的 SIMT/Tensor 指令,NPU 上 SIMD/Tensor,Vector 指令的设计。
- 在不增加内存带宽的前提下,单时钟周期内执行更多的 MACs。比如英伟达的 Tensor Core 中支持低比特计算的设计,对每个 cycle 执行 512bit 数据的带宽前提下,可以执行 64 个 8bit 的 MACs,大于执行 16 个 32bit 的 MACs。