Furiosa为何放弃矩阵乘法?张量收缩、TCP架构与新一代AI芯片设计全面解析

Furiosa没有制造一块“更快的GPU”,而是试图让AI芯片直接理解神经网络本身,而不是理解矩阵乘法。

过去十几年,几乎所有AI加速器都建立在同一个假设之上:矩阵乘法(Matrix Multiplication,MatMul)才是人工智能计算最核心的基础操作。因此,无论是NVIDIA GPU的Tensor Core、Google TPU的Systolic Array,还是AMD的MFMA,底层硬件真正擅长执行的都是固定尺寸的二维矩阵乘法。

FuriosaAI则提出了完全不同的思路。它认为,矩阵乘法只是更一般数学操作——张量收缩(Tensor Contraction)——的一种特殊情况。如果硬件能够直接执行张量收缩,而不是先把所有计算转换成矩阵乘法,那么许多原本复杂的数据变换和额外计算步骤都可以直接消失。

这种变化看似只是数学表达方式的不同,实际上意味着整个AI芯片架构、编译器设计以及编程模型都必须重新设计。



CUDA时代的AI计算,本质上都是矩阵乘法

今天开发者使用PyTorch编写模型时,代码往往只是几行简单的Linear层、Attention或者MatMul。但真正运行到GPU时,这些操作都会被拆解成大量CUDA Kernel。

每一个Kernel负责完成一个局部任务,例如一次矩阵乘法、一次Softmax或者一次数据转置。GPU再按照Kernel的顺序不断启动、执行、结束,然后把结果写回显存,再继续执行下一个Kernel。

因此,一个Transformer模型实际上不是一次连续执行,而是被切割成成千上万个独立的小计算任务。这种模式也决定了CUDA程序员需要关心线程(Thread)、线程块(Block)、网格(Grid)、共享内存(Shared Memory)以及Kernel启动等大量底层细节。

过去十几年,整个AI软件生态几乎都建立在这种Kernel驱动的执行方式之上。



Furiosa认为矩阵乘法只是张量收缩的一种特例

张量(Tensor)可以理解为高维数组,而矩阵只是二维张量。矩阵乘法实际上只是张量收缩的一种最简单形式,它只在某一个维度上进行求和计算。

真正更加通用的计算方式叫做Tensor Contraction,也就是任意维度之间的收缩计算。PyTorch中的torch.einsum()就是最典型的表示方式。

例如Transformer里的多头注意力计算,可以直接表示为:

text
hqd, hkd -> hqk

这里的h表示Attention Head,q表示Query,k表示Key,d表示Embedding维度。

对于GPU来说,它并不能直接执行这种表达式。编译器必须首先把高维Tensor重新排列,转换成GPU擅长处理的Batch Matrix Multiplication,再经过reshape、transpose等一系列数据布局变换,最后才能调用Tensor Core完成计算。

也就是说,GPU真正执行的已经不是开发者最初写下来的数学表达,而是经过大量转换之后得到的另一种计算形式。

Furiosa希望省掉整个转换过程,让硬件直接理解einsum表达式本身。



TCP把Einsum直接变成硬件指令

Furiosa提出了一种新的计算核心,称为Tensor Contraction Processor(TCP)。

这里的TCP与网络协议没有任何关系,它代表的是一种能够直接执行Tensor Contraction的新型计算单元。

它最重要的一点在于,底层指令集(ISA)已经不再是简单的矩阵乘法,而是一种称为Low-level Einsum的计算原语。

一条Low-level Einsum指令不仅描述需要收缩哪些维度,同时还明确规定Tensor如何存放、循环如何展开、数据如何调度以及计算资源如何分配。

换句话说,在GPU上需要多个Kernel才能完成的一系列计算,在TCP上可能只需要一条指令即可完成。

这意味着,过去大量Kernel启动、同步以及数据转换所产生的额外开销,都有机会被彻底消除。



编译器开始接管整个模型,而不是单个Kernel

CUDA程序最大的特点,是程序员需要不断思考每一个Kernel应该如何设计。

线程数量是多少?Block大小应该如何设置?共享内存怎样分配?不同Kernel之间如何同步?这些都需要程序员或者框架不断优化。

Furiosa则放弃了这种思路。

开发者依然可以使用PyTorch或者ONNX描述模型,但随后整个模型计算图都会交给编译器统一处理。

编译器不会分别优化每一个Operator,而是把整个Transformer看成一个完整系统,一次性完成图优化、Operator Fusion、Tensor布局规划、循环顺序安排、DMA数据搬运以及内存分配。

最终生成的不是一个个独立Kernel,而是一份覆盖整个模型的执行计划(Execution Plan)。

因此,模型真正执行时,不再是一连串Kernel不断启动,而更像一次完整、连续的数据流执行过程。



RNGD并不是传统意义上的Systolic Array

Google TPU最著名的硬件就是128×128 Systolic Array,每个计算单元按照固定方向不断传递数据,形成规则的数据流水线。

Furiosa采用的RNGD(Renegade)则完全不同。

整个芯片包含8个Processing Element,每个Processing Element内部又包含64个Slice。

每一个Slice同时拥有三个可以并行工作的计算模块,包括负责Tensor Contraction的Contraction Engine、负责普通向量计算的Vector Engine,以及专门完成数据布局转换的Transpose Engine。

由于三种计算单元能够同时运行,因此计算过程中的数据重排不需要等待主计算结束,大量数据转换都可以与计算同步完成。



Slice能够根据模型动态重新组合

相比固定阵列,Furiosa还有一个更加独特的设计。

传统GPU里的SM数量固定,TPU里的Systolic Array结构同样固定。而Furiosa允许64个Slice根据当前算子的特点不断重新划分。

例如,大型FFN层可以让64个Slice全部组成一个大型计算单元,而到了多头Attention阶段,又可以快速拆分成16组、每组4个Slice,同时分别计算不同Head。

模型进入下一层之后,这种分组方式又可以重新改变。

也就是说,硬件资源不再是一成不变,而是随着模型结构不断重构。这种灵活性是传统固定阵列很难实现的。



内存系统才是真正决定能效的关键

很多人认为AI芯片最大的瓶颈来自计算能力,但越来越多研究表明,真正昂贵的其实是数据移动。

Furiosa因此几乎重新设计了整个内存体系。

它没有传统GPU依赖的大型硬件缓存,而是采用256MB完全由编译器管理的软件控制SRAM,片上带宽达到384TB/s,同时配备48GB HBM3,带宽约1.5TB/s。

由于SRAM完全由编译器控制,模型每一层产生的数据可以直接保留在片上内存,下一层立即继续使用,而无需频繁写回HBM。

GPU里的缓存是否命中、什么时候驱逐,都由硬件自动决定,程序员无法保证数据一定还留在缓存中。而Furiosa则把所有数据搬运都提前规划好,每一次DMA传输都可以与计算重叠执行。

这种设计实际上把缓存管理问题转变成了编译优化问题。



Furiosa重新定义了AI芯片的设计方向

过去整个AI硬件行业几乎都围绕矩阵乘法不断扩展:更大的Tensor Core、更大的Systolic Array、更高的HBM带宽。

Furiosa则直接改变了这一前提。它把基础计算原语从矩阵乘法提升为张量收缩,把CUDA式Kernel编程模式替换为全模型编译执行,同时把传统硬件缓存变成完全由编译器管理的软件SRAM。

这三项变化共同指向同一个目标:让芯片直接执行神经网络真正需要的计算,而不是不断把模型转换成硬件能够理解的矩阵乘法。

如果这一设计能够建立成熟的软件生态,它代表的不仅是一款新的AI芯片,更可能意味着AI计算从“围绕矩阵乘法设计硬件”迈向“围绕模型本身设计硬件”的一次范式转变。