Warning: sprintf(): Too few arguments in C:\wwwroot\www.xizhenhl.com\wp-content\themes\covernews\lib\breadcrumb-trail\inc\breadcrumbs.php on line 254

写给技术人的深度学习芯片加速器指南:从GPU 到TPU 再到FPGA

本文来自微信公众号: 歪睿老哥 ,作者:歪睿老哥,原文标题:《写给技术人的深度学习芯片加速器指南:从 GPU 到 TPU 再到 FPGA》

故事是这样的。

前两天在AI芯片群里看到一个问题,有人问:大模型推理到底卡在哪里。

问题描述挺详细的,说推理阶段,尤其是token by token生成的时候,延迟高得离谱。

评论区有一群人在吵,有人说”上更大内存”,有人说”换更硬的芯片”,有人说”优化算法”。

吵了半天,没一个说对。

后来我花了一周时间,把一篇60页的综述论文啃了一遍。论文标题叫《Hardware Acceleration for Neural Networks:A Comprehensive Survey》,作者是一群做硬件加速的研究人员,内容涵盖了ANN、CNN、RNN到Transformer的完整硬件加速方案。

看完之后,我发现那帮人最大的问题不是不够专业,而是根本没搞清楚一个最基本的东西。

大模型推理慢,不是缺算力。

是内存带宽不够,是数据搬运太慢,是架构设计没跟上算法的演进。

这篇文章,我想把这个综述的核心内容,用人话讲清楚。

一、为什么需要专用加速器

先从一个简单的问题开始。

如果CPU能跑深度学习,为什么还需要GPU、TPU、NPU这些专用芯片?

答案是:因为矩阵运算的本质,是高度并行的。

一个典型的深度学习模型,每次前向传播都要做大量矩阵乘法。一个7B参数的模型,每次推理涉及至少几十次矩阵乘法操作。每次矩阵乘法的维度可能是4096×4096,甚至更大。

如果这些操作串行执行,算一次可能需要几分钟。但如果并行执行,用专门设计的硬件,可以把计算密度和吞吐量提升几十倍、几百倍。

这就是专用加速器的核心价值。

但问题来了:不同的神经网络架构,计算模式完全不同。

全连接层的矩阵乘法,是稠密的、规则的计算,适合通用矩阵乘法引擎。

卷积层的计算,有空间局部性,同一个卷积核要滑动应用到输入特征的多个位置,适合流水线和空间并行。

循环神经网络的计算,有严格的时序依赖,每一步的计算结果会影响下一步,难以并行。

Transformer的计算,注意力机制的复杂度是二次方的,自回归生成的延迟又受限于KV cache的读写带宽。

所以,没有一种加速器能通吃所有模型。每种架构,都有最适合的硬件设计。

下面我逐个讲。

二、ANN加速器:全连接层的基石

计算模式

ANN的核心操作是矩阵乘法(GEMM),也就是General Matrix-Matrix Multiplication。

一个全连接层的计算可以表示为:

output=W@input+bias

其中W是权重矩阵,input是输入向量,bias是偏置。

这个计算的特点是高度规则、计算密集。每个输入神经元都要和权重矩阵的每一行做点积,每个点积都是一系列乘加操作的累加。

所以ANN加速器的核心设计目标是:最大化矩阵乘法的吞吐量,同时最小化内存访问。

GPU上的ANN加速

GPU加速ANN的方式,核心思路是让数据复用最大化。

具体来说,有几个关键技术:

Tiling(分块)

权重矩阵和激活值太大了,一次性加载到GPU显存再算,带宽根本吃不消。所以要把数据分成小块(tiles),每次只加载需要的数据到寄存器或shared memory,反复利用。

比如一个4096×4096的矩阵乘法,如果分块成64×64的tiles,每次只加载64×64的权重和64×64的激活值,就能在芯片内反复利用这些数据,大幅减少DRAM访问。

Fusion(算子融合)

传统做法是矩阵乘法算完,结果写到全局显存,然后下一个激活函数再从全局显存读出来算。这样每个中间结果都要经过一次显存读写。

融合的做法是把激活函数、归一化等操作直接嵌入到矩阵乘法的epilogue里,结果存在寄存器里,根本不写入显存。

这一刀切下去,显存带宽压力直接减半。

混合精度训练

训练阶段用FP16或BF16做计算,但累加用更高精度(FP32),这样吞吐量翻倍的同时,数值稳定性也不会崩。

推理阶段更猛,INT8量化能把权重和激活值压缩到1/4的精度,吞吐量直接提升4倍。前提是精度损失在可接受范围内。

TPU/NPU上的ANN加速

TPU和NPU的设计理念,和GPU不太一样。

GPU的核心是灵活。它有CUDA核心、tensor core、各种内存层级,能跑各种模型,什么都能算。

NPU的核心是效率。它的硬件是为特定计算模式量身定制的,比如systolic array(脉动阵列),专门为矩阵乘法设计。

脉动阵列的工作原理有点复杂,简单说就是数据像流水线一样在阵列中流动,每个处理单元同时接收输入数据,执行乘加操作,然后把部分结果传递给下一个单元。这种设计能实现计算和数据流的完美匹配,几乎没有多余的内存访问。

NPU的关键挑战在于编译器和调度。因为硬件是固定的,所以必须在编译期就把计算图切分成适合硬件执行的tile,安排好数据在SRAM中的复用,才能让阵列保持100%忙碌。

ASIC上的ANN加速

ASIC是专用集成电路,硬件完全定制。

对于ANN来说,ASIC的设计思路是去掉所有不必要的灵活性。

GPU有指令集、有调度器、有复杂的控制逻辑,这些都是为了灵活而存在的。但ANN的计算模式太固定了,大部分时间都在跑矩阵乘法,其他操作占比很小。

所以ASIC可以硬连线一些固定的矩阵引擎,去掉调度开销,去掉指令_fetch_,甚至去掉浮点单元,直接用定点数做计算。

这种设计能实现比GPU高几十倍的能效比,代价是灵活性几乎为零。

FPGA上的ANN加速

FPGA的优势在于可重构。

对于ANN来说,FPGA的设计思路是空间流水线。

把矩阵乘法映射到硬件上,设计一个固定数据流,每个周期推进部分和的计算,避免中间结果写入DRAM。

关键是确定性延迟。只要输入维度固定,FPGA的延迟就是固定的,这对实时推理场景很重要。

三、CNN加速器:利用空间局部性

计算模式

CNN的核心操作是卷积。

卷积和矩阵乘法的不同在于空间局部性。同一个卷积核要滑动应用到输入特征的多个位置,相邻输出的输入窗口有大量重叠。

这意味着权重可以被反复利用,而且输入数据也有很好的空间局部性。

硬件加速器的设计目标就是把这种局部性挖掘到极致。

GPU上的CNN加速

GPU加速CNN的核心技术是Winograd变换和Im2Col优化。

Im2Col是把输入特征图展开成矩阵,把卷积操作转化为矩阵乘法。然后GPU可以用高度优化的GEMM内核来执行。

Winograd变换是另一种思路,通过数学变换减少乘法操作的次数。一个3×3的卷积,传统做法需要9次乘法和8次加法。Winograd只需要4次乘法。

但代价是增加了加法运算和数据转换的开销。所以实际效果要看数据量和硬件架构。

ASIC上的CNN加速

CNN的ASIC设计,经典案例是Eyeriss。

Eyeriss的核心理念是行驻留映射(row-stationary mapping)。

具体做法是让输入特征的一个”行”在计算过程中驻留在本地缓冲区,权重和输出部分和则在阵列中流动。这样能最大化数据复用,最小化DRAM访问。

关键设计是层次化的缓冲和片上互连,确保数据在正确的时间出现在正确的位置,以维持数据流。

四、RNN加速器:时序依赖的挑战

计算模式

RNN和ANN、CNN最大的不同在于时序依赖。

RNN的隐藏状态在每一步都会更新,并且影响下一步的计算。这意味着RNN难以并行化,每一步都必须等上一步的结果。

这导致RNN的加速方向不是追求吞吐量,而是降低单步延迟。

关键技术

Gate Fusion(门融合)

LSTM和GRU有多个门(遗忘门、输入门、输出门等),每个门都是一个矩阵乘法加激活函数。传统的做法是每个门独立执行,中间结果写入显存再读回来。

融合的做法是把所有门操作融合成一个内核,中间结果存在寄存器或shared memory里,避免显存往返。

On-chip State Buffering(片上状态缓冲)

RNN的隐藏状态每一步都要读写,如果每次都要访问DRAM,带宽会成为瓶颈。

好的设计是把隐藏状态和权重缓存在SRAM里,每一步只需要在内部传递,不需要访问外部内存。

实际瓶颈

RNN的实际瓶颈往往不是MAC吞吐量,而是软件栈的调度效率。

每次kernel launch的开销、不同timestep之间的同步开销,都比计算本身更耗时。

所以RNN加速的核心是减少内核数量、减少内存访问、保持循环紧密。

五、Transformer和LLM加速器:当前最复杂的挑战

为什么Transformer最难加速

Transformer的计算模式是三者中最复杂的。

它包含密集矩阵乘法(QKV投影、MLP块)和带宽密集型注意力机制,而且推理阶段有自回归生成的额外开销。

具体来说,LLM推理分为两个阶段:

Prefill(预填充):一次性处理整个prompt,计算密集,适合批量处理。

Decode(解码):每次只生成一个token,需要读取/写入KV cache,计算量小但内存访问量大。

Decode阶段是瓶颈。每个token的生成,需要读取整个KV cache,执行一个小矩阵乘法。对于7B模型,KV cache可能有几GB的数据,每次生成一个token都要读这么多数据。

这就是为什么大模型推理的瓶颈不是算力,而是内存带宽。

GPU上的LLM加速

GPU加速LLM的核心技术:

IO-aware Attention(IO感知注意力)

传统注意力机制要把整个注意力矩阵计算出来,然后做softmax。IO-aware的做法是分块计算,避免一次性把整个矩阵加载到内存。

KV Cache管理和分页

KV cache的增长会导致显存耗尽,影响并发。分页技术可以把KV cache分散存储,像操作系统的虚拟内存一样管理。

Speculative Decoding(推测解码)

用小模型预测几个token,然后大模型只验证这些预测。这样每次大模型推理可以生成多个token,减少端到端延迟。

ASIC/FPGA和专用推理加速器

专用LLM推理加速器的设计思路是优化token级延迟和能效。

核心挑战是在MAC吞吐量和内存带宽之间做平衡。

如果只优化MAC,不做内存带宽优化,那么decode阶段就会因为KV cache读取而stall。

如果只优化内存,不做MAC优化,那么prefill阶段就不会充分利用硬件。

所以好的设计是全局系统效率优化:内存provisioning、cache管理、控制开销最小化,缺一不可。

六、总结:架构演进的核心逻辑

看完这个综述,我最大的感受是:硬件加速器的发展,本质上是算法演进的结果。

ANN时代,计算模式简单,矩阵乘法是核心,加速器设计围绕GEMM展开。

CNN时代,引入了空间局部性,加速器设计开始利用数据复用和空间并行。

RNN时代,时序依赖成为瓶颈,加速器设计转向降低延迟和内存访问。

Transformer时代,注意力机制和自回归生成带来了全新的挑战,加速器设计必须同时优化计算密度、内存带宽、cache管理和调度策略。

算法变了,硬件必须跟着变。变慢了,就被淘汰。

所以,未来的加速器设计,一定会更加定制化、更加系统化。不再是通用芯片的简单优化,而是算法、硬件、软件栈的全局协同设计。

以上,既然看到这里了,如果觉得不错,随手点个赞、在看、转发三连吧,如果想第一时间收到推送,也可以给我个星标⭐~

谢谢你看我的文章,我们,下次再见。

附:论文引用

本文内容基于以下论文:

Hardware Acceleration for Neural Networks:A Comprehensive Survey

主要技术点涵盖:

-ANN加速:Tiling、Fusion、Mixed Precision

-CNN加速:Winograd、Im2Col、Systolic Array

-RNN加速:Gate Fusion、On-chip State Buffering

-Transformer加速:IO-aware Attention、KV Cache Management、Speculative Decoding

-硬件平台:GPU、TPU/NPU、ASIC、FPGA

#写给技术人的深度学习芯片加速器指南从GPU #到TPU #再到FPGA

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注