Transformer模型基础与硬件加速概览

各位同学好,我是你们这门课的主讲。今天咱们聊聊Transformer的硬件加速,这是个很有意思的话题。我做了十几年芯片设计,从最早的CNN加速器一路做到Transformer专用芯片,踩过的坑不少,积累的经验也挺多。这一章,我们先打好基础。

Transformer架构核心组件

Transformer这个架构,说白了就是三个核心组件拼起来的:Self-Attention、FFN和LayerNorm。咱们一个一个看。

1. Self-Attention机制

Self-Attention是整个Transformer的灵魂。它让模型能捕捉序列中任意两个位置的关系。公式长这样:

Attention(Q, K, V) = softmax(Q × K^T / √d_k) × V

Q、K、V都是矩阵,维度是 [batch_size, seq_len, d_model]。计算过程分三步:

  • Q × K^T:计算相似度矩阵,复杂度 O(n²·d)
  • Softmax:按行归一化
  • × V:加权求和

我在项目中遇到过一个问题:当序列长度n=1024时,QK^T矩阵就有100万+个元素。这还只是一个头,多头注意力要乘上h个头。显存一下子就爆了。

核心瓶颈:Self-Attention的计算复杂度是O(n²),访存量也是O(n²)。n一变大,计算和访存都扛不住。

2. 前馈神经网络(FFN)

FFN就是两个全连接层加一个激活函数:

FFN(x) = max(0, x × W₁ + b₁) × W₂ + b₂

第一层把维度从d_model映射到4×d_model,第二层再映射回来。你想想看,参数量有多大?以BERT-base为例,d_model=768,FFN的参数量就是768×3072×2 ≈ 470万。这还只是一个Transformer层。

FFN的计算特点是:

  • 计算密集:矩阵乘法占大头
  • 访存密集:权重矩阵大,需要反复搬运
  • 激活函数:ReLU/GELU,计算量小但访存不规则

我的经验:FFN的权重矩阵通常占模型总参数量的2/3左右。加速FFN,说白了就是加速大矩阵乘法。

3. Layer Normalization

LayerNorm的作用是稳定训练。它对每个样本的所有特征做归一化:

LayerNorm(x) = γ × (x - μ) / √(σ² + ε) + β

计算量不大,但访存模式很讨厌——需要先算均值和方差,再算归一化。这意味着要两次遍历数据。我早期做硬件设计时,就因为这个吃了亏。

计算与访存特性分析

咱们用一张表来总结Transformer各组件的特性:

组件 计算类型 计算量 访存量 计算/访存比
Self-Attention 矩阵乘法+Softmax O(n²·d) O(n²)
FFN 矩阵乘法+激活 O(n·d²) O(d²)
LayerNorm 逐元素运算 O(n·d) O(n·d) 中等

为什么会这样?你看,Self-Attention的计算量随序列长度n平方增长,但访存量也是平方增长。FFN的计算量随d平方增长,但访存量也是平方增长。说白了,Transformer是个访存密集型模型。

注意:很多人以为Transformer是计算密集型的,其实不然。在推理场景下,访存往往是瓶颈。我见过不少团队花大价钱堆算力,结果性能提升不到20%,就是因为没解决访存问题。

硬件加速的必要性与挑战

为什么要做硬件加速?三个字:不够用

拿GPT-3来说,1750亿参数,一次推理需要350GB的显存。就算用A100(80GB),也得5张卡才能放下。而且推理延迟动辄几百毫秒,根本没法做实时应用。

硬件加速面临的主要挑战:

  • 访存墙:模型参数太大,带宽不够用
  • 计算墙:矩阵乘法算力需求大,但利用率低
  • 灵活性:Transformer结构在变,硬件得能适配
  • 能效比:功耗不能太高,否则部署成本受不了

我曾经参与过一个项目,目标是做一个边缘端的Transformer加速器。当时最大的挑战就是如何在10W功耗内跑BERT。我们试了各种方法:量化、剪枝、稀疏计算...最后发现,硬件架构必须从一开始就为Transformer定制,光靠算法优化是不够的。

专用加速器设计目标

设计一个Transformer专用加速器,目标很明确:

  1. 高吞吐:每秒处理的Token数要多
  2. 低延迟:单次推理要快,尤其是自回归生成场景
  3. 高能效:每瓦特能算多少Token
  4. 灵活性:能适配不同规模的Transformer模型

具体到架构设计,有几个关键点:

  • 计算阵列:用脉动阵列还是SIMD?我建议根据目标场景选。大模型用脉动阵列,小模型用SIMD更灵活。
  • 存储层次:片上SRAM要多大?怎么分片?我习惯把权重放在片外,激活值放片上。
  • 数据流:权重固定还是激活固定?这决定了访存模式。
  • 稀疏支持:能不能跳过零值计算?这能省不少功耗。

避坑指南:我曾经在设计加速器时,过于追求峰值算力,结果实际利用率不到30%。后来我明白了,平衡才是关键——计算、访存、控制三者要匹配。

知识体系总览

下面这张图展示了本章的核心逻辑:

Transformer硬件加速知识体系 Transformer模型基础 Self-Attention (O(n²)) | FFN (O(n·d²)) | LayerNorm (O(n·d)) 计算与访存特性分析 计算密集 vs 访存密集 | 计算/访存比 | 瓶颈识别 硬件加速的必要性与挑战 访存墙 | 计算墙 | 灵活性 | 能效比 专用加速器设计目标 高吞吐 | 低延迟 | 高能效 | 灵活性

这张图把本章的知识点串起来了。从模型基础出发,分析计算和访存特性,然后引出加速的必要性和挑战,最后落到设计目标上。后面的章节,我们会一步步深入每个环节。

好了,第一章就到这里。记住一句话:理解模型是设计加速器的前提。下一章,咱们聊聊如何用硬件实现Self-Attention,那才是真正有意思的地方。


公众号:蓝海资料掘金营,微信deep3321