智能驾驶是一个复杂的系统,单单计算AI算力意义不大,并且AI算力数字有非常多的操作空间。汽车领域的算力通常是整数8位精度下的算力,这种算力也只是针对传统CNN当中计算量最大的卷积运算,这种算力的取得不需要任何技术门槛,简单堆砌MAC(乘积累加)阵列即可获得。不计成本的话,任何厂家都可以取得数千TOPS的算力,但每个厂家有自己的市场定位,有成本考量,自然就有了算力高低。
图片来源:Synopsys
上图是Synopsys推出的一款IP,最高支持8个NPU,达到3500TOPS的算力,单个NPU也可达到440TOPS的算力,并且这个算力是不参杂任何水分的,完全靠MAC数量获得。
衡量算力最客观的数据应该是MAC数量,用MAC数量和运行频率可以计算出算力值,这没有任何弄虚作假的空间,比如谷歌TPU V1有65000个MAC,频率为700MhHz,算力即为65000*700M*2=91TOPS(每个指令包含两次计算);特斯拉初代FSD每个NN包含2*9216个MAC,频率为2GHz,算力就是2*9216*2*2*2000=73.7TOPS。
智能驾驶领域早已不是传统CNN的领域,Transformer相对CNN可谓有着翻天覆地的变化。芯片从设计到正式量产需经过一个漫长的过程,可能是2-4年。因此现在市面上流行的嵌入式智能芯片基本上是源自于2年甚至更长时间之前的设计,而那时候设计的嵌入式智能芯片很大概率未考虑Transformer的情况,因为当时可能大部分市面上流行的还是以CNN为主的模型,很难部署Transformer。
对AI模型来说,可分为浮点和整数两大类,其中整数通常用于推理,浮点用于训练。根据IEEE二进制浮点数算术标准(IEEE 754)的定义,浮点又可分为双精度即FP64,单精度即FP32,半精度即FP16,浮点计数是利用浮动小数点的方式使用不同长度的二进制来表示一个数字,与之对应的是定点数。同样的长度下浮点数能表达的数字范围相比定点数更大,但浮点数并不能精确表达所有实数,而只能采用更加接近的不同精度来表达。单精度的浮点数中采用4个字节也就是32位二进制来表达一个数字,双精度浮点数采用8个字节也就是64bits来表达,当然半精度浮点数也就是采用16bits了。因为采用不同位数的浮点数的表达精度不一样,所以造成的计算误差也不同,对于需要处理的数字范围大且需要精确计算的科学计算来说,就要求采用双精度浮点数;而对于常见的多媒体和图形处理计算,32位的单精度浮点计算已经足够了;对于要求精度更低的机器学习等一些应用来说,半精度16位浮点数就可以甚至8位浮点数就已经够用了。
对AI芯片来说,不同的精度,浮点或整数需要各自独立的计算单元。要支持浮点运算需要特殊的寄存器和单独的浮点数据加载指令,通用型CPU需要单独添加浮点运算处理器即FPU来完成浮点运算。早期车载领域主要是CNN模型,为简化运算,基本上都是只能做整数运算,不能也不需要做浮点运算,但Transformer不同,它的归一化层和Softmax一般是半精度浮点数据格式即FP16,当然工具链软件可以做一个转换,但这样效率会下降很多甚至直接数据溢出报错,远不如原生态支持的好。
浮点运算不同的精度也需要设计不同的寄存器,CPU里的FPU可以同时支持不同精度的浮点运算,但在GPU里针对单精度和双精度就需要各自独立的计算单元,不过半精度就不需要独立的计算单元。例如英伟达的RTX3090单精度性能(FP32)达到35.7TFLOPS,远超A100的19.5TFLOPS,FP16性能达到285TFLOPS,也接近A100的312TFLOPS。但3090价格远低于A100 GPU,这是因为A100定位于全面通用型AI加速,A100需要考虑双精度运算,因为有限元的稀疏矩阵求解器,还有复杂表面流场的计算离不开双精度,而同样算力双精度耗费晶体管数量是单精度的4-8倍,换句话说同样算力,双精度运算消耗的成本是单精度的4-8倍。而RTX3090是图形领域的,主要是FP32数据格式,完全不考虑科学运算的FP64,成本自然降低很多。
FP32可以兼容INT8,但FP32的成本相对INT8要高至少4倍,因此英伟达单独搞出来张量计算单元即tensor core来应对INT8,只留少量的FP32,向下兼容没问题,但不能向上兼容。
图片来源:英伟达
以英伟达Orin为例,包含2048个CUDA核心,这是针对FP32的,FP32精度下算力为5.2TOPS,INT8格式下算力为167TOPS,还包含64个张量核心,这是针对所谓DLA的,原生态INT8格式,算力为87TOPS,合计为275TOPS。如果英伟达放弃FP32,全改为张量核心,那么算力上1000TOPS易如反掌,但英伟达还是考虑Orin尽可能地覆盖更大的市场,毕竟汽车市场太小了,所以添加了CUDA核心。
再以华为为例,华为每个计算核心里有三种运算资源,分别是标量、矢量和张量,张量基本可等同于AI运算。
图片来源:华为
其中张量计算即图中的3D CUBE,每个CUBE包含4096个FP16 MACs,8192个INT8 MACs,一个MAC是包含两个Ops,因此如果运行频率是1GHz,那FP16算力就是1G*2*4096=8TOPS。INT8算力就是16TOPS。FP16也可以在INT8下运算,此时算力翻倍,合计就是32TOPS算力。
AI芯片严格来讲,AI加速器和GPU都是针对并行计算设计的,在CNN时代非常合适,但在后CNN时代,出现了很多串行计算,对AI加速器非常不友好,对CPU和DSP非常友好。例如NMS。Transformer就是如此,它不仅需要串行计算算力,还需要足够的存储带宽支持,单纯的AI算力数值在Transformer面前毫无意义。实际不仅Transformer,很多CNN的变种也是如此,如目前主流的YOLOV4、YOLOV5、RESNET50。
我们把AI算子分为串行型和并行型,其中串行型通常都是逐点元素型element-wise,它有两个特点,一是通常是串行运算,二是有大量的存储数据动作,非常消耗存储带宽。它们对算力需求很低,但存储要求很高,最适合此类运算的是DSP,因为DSP是哈佛架构,数据和指令总线分开,效率高。但DSP编译器非常难搞,只能用在汽车这种封闭体系内。其次是CPU,通用性很强,针对并行计算的GPU和AI芯片不适合此类逐点运算,遇到此类计算,通常都是退回到CPU中运算,这也是为何英伟达和微软都要费尽心机自研CPU的主要原因。
微软刚刚发布的自研CPU:Cobalt 100,采用128核心ARM NeoverseN2架构。
Transformer的计算过程
上图是Transformer的计算过程,在此计算过程中,矩阵乘法是典型的计算密集型算子,也叫GEMM,通用矩阵乘法。存储密集型算子分两种,一种是矢量或张量的神经激活,多非线性运算,也叫GEMV,也就是通用矩阵矢量乘法。另一种是上面说的逐点元素型element-wise。
图片来源:Samsung
上图是三星对GPT大模型workload分析,在运算操作数量上,GEMV所占的比例高达86.53%,在大模型运算延迟分析上,82.27%的延迟都来自GEMV,GEMM所占只有2.12%,非线性运算也就是神经元激活部分占的比例也远高于GEMM。
图片来源:Samsung
上图是三星对GPU利用率的分析,可以看出在GEMV算子时,GPU的利用率很低,一般不超过20%,换句话说80%的时间GPU都是在等待存储数据的搬运。还有如矩阵反转,严格地说没有任何运算,只是存储行列对调,完全是存储器和CPU在忙活。解决办法很简单且只有一个,就是用HBM高宽带内存,缺点很明显,很贵,完全无法用在汽车领域。
除了Transformer外,还有一些新技术,典型的有NMS和Depthwise,后者在移动领域如手机上非常常见,如MobileNets架构。NMS则在车载领域流行,是Non-Maximum Suppression的缩写,即非极大值抑制。其思想是搜索局部最大值,抑制非极大值。NMS算法在不同应用中的具体实现不太一样,但思想相同。NMS在计算机视觉任务中得到了广泛的应用,例如边缘检测、人脸检测、目标检测(DPM,YOLO,SSD,Faster R-CNN)等。NMS对传统的卷积加速或者说AI专用芯片就很不友好。
非极大值抑制的流程如下:根据置信度得分进行排序,选择置信度最高的比边界框添加到最终输出列表中,将其从边界框列表中删除,计算所有边界框的面积,计算置信度最高的边界框与其它候选框的IoU。删除IoU大于阈值的边界框,重复上述过程,直至边界框列表为空。排序部分是典型的串行计算,AI芯片完全无法加速。实际类似NMS的计算不少,这类计算用DSP加速是最合适的。
Synopsys提出一种新方法,就是给NPU增加一个矢量DSP来处理此类计算。Depthwise也适合用DSP处理,手机上流行的Mobilenets是Depthwise典型代表,对NPU来说不合适,这也是高通手机AI特别强的地方,高通一直是坚持用DSP的,当然DSP不适合做并行计算。
AWS两代Inferentia对比
上图是亚马逊两代Inferentia的对比,二代Inferentia是在2023年4月发布的,针对Transformer做了优化,每个NeuronCore-v2都是一个独立的异构计算单元,具有四个主要引擎:张量(Tensor)、向量(Vector)、标量(Scalar)和GPSIMD引擎。张量引擎针对矩阵运算(基本可等同于卷积运算甚至传统AI运算)进行了优化。标量引擎针对ReLU(整流线性单元)函数等元素运算进行了优化。向量引擎针对非元素向量操作进行了优化,包括批量归一化或池化。GPSIMD类似于DSP,不过主要做控制流运算符。
Transformer时代,传统的AI芯片难以生存,某种意义上讲,传统的AI芯片不存在了,因为Transformer需要标量(CPU)、向量(矢量,GPU)、张量、逐点矢量(DSP)运算资源,把这么多资源整合在一起,显然不能叫AI芯片了。
免责说明:本文观点和数据仅供参考,和实际情况可能存在偏差。本文不构成投资建议,文中所有观点、数据仅代表笔者立场,不具有任何指导、投资和决策意见。