本文大量参考了博客园-吴建明的多篇文章内容,也可以自己去看:zzk.cnblogs.com/s/blogpost?...
如上图所示,第四次革命就是以AI为代表的,这种趋势就是风口。
算力、数据、算法共同构成了计算资源的三要素,而ADS领域正是三要素集大成者。AI算法在ADS领域的行业应用,其当前演进方向主要体现在 :
1)能够在统一空间支持多模传感器感知融合与多任务共享;
2)预测与规划联合建模,离线与在线学习相结合,能够自学习处理不确定性下的安全与可解释问题,通过持续学习解决新场景问题。
1. NPU介绍
NPU(Neural network Processing Unit), 即神经网络处理器。顾名思义,是想用电路模拟人类的神经元和突触结构。
NPU是神经网络处理器,在电路层模拟人类神经元和突触,并且用深度学习指令集直接处理大规模的神经元和突触,一条指令完成一组神经元的处理。相比于CPU和GPU的冯诺伊曼结构,NPU通过突触权重实现存储和计算一体化,从而提高运行效率。但NPU也有自身的缺陷,比如不支持对大量样本的训练。
1.1 算力介绍
什么是算力?
算力不是一个计算机的专业术语,感觉更多的是汇报用的,现在大家都在用。简单说就是计算能力,"算力是设备根据内部每秒可处理的信息数据量"。算力实现的核心是CPU、GPU等各类计算芯片,并由计算机、服务器、高性能计算集群和各类智能终端等承载,海量数据处理和各种数字化应用都离不开算力的加工和计算。
以AI为例,CPU、GPU、DSP等都可以运行,但是还是有专用的AI芯片,为什么呢?也跟算力有关。
- CPU(central processing unit)是通用处理器,可以处理一切事物,就像一把瑞士军刀,哪方面都能做但都不是专业高效的。
- GPU(Graphics Processing Unit)是专门用来处理图形图像相关的处理器,与CPU相比GPU处理的数据类型单一,因为运算与AI相似以及容易组成大的集群,所以进行AI运算时在性能、功耗等很多方面远远优于CPU,经常被拿来处理AI运算。
- DSP(digital signal processor),是专门用来处理数字信号的,DSP与GPU情况相似,也会被拿来做AI运算,比如高通的手机SoC。
AI芯片在时延、性能、功耗、能效比等方面全面的超过上面提到的各种处理器。以知名的谷歌的TPU为例,如下图所示,TPU的主要计算资源为:
- Matrix Multiply Unit:矩阵乘单元
- Accumulators:存储矩阵乘加输出的中间结果
- Activation:激活单元
- Unified Buffer:统一缓存
谷歌的专用机器学习芯片TPU处理速度要比GPU和CPU快15-30倍(和TPU对比的是英特尔Haswell CPU以及Nvidia Tesla K80 GPU),而在能效上,TPU更是提升了30到80倍,这并不意外,因为TPU运行的CNN运算主要就是矩阵乘,专用芯片好处就是这样。
在手机、汽车、安防等终端领域,都是执行模型的推理,现有的推理芯片有很多,比如特斯拉FSD、寒武纪NPU、地平线BPU、OPPO的马里亚纳、荣耀使用的AI-ISP等。与训练阶段不同,在推理的时候,精度要求并不高,以知名的对象监测算法YOLO(You Only Look Once)为例,FP32的精度与INT8的精度相差甚小,但是因为模型更小,神经网络模型的推理速度却大幅加快。这在终端上很重要,比如在汽车的自动驾驶上,如果推理计算的数据慢了会造成巨大的影响。
预计,到2025年之前超过50%的新车销售将提供L2/L3自动驾驶功能,到2030年这一数字将增加到90%。到2030年,汽车芯片整体市场规模将达到1150亿美元,占整个芯片市场的11%。
阻碍自动驾驶普及的原因有很多,除了在所有复杂的真实环境中仍然没有足够的来自车队的测试和验证数据外,个人认为计算能力是限制L4以上自动驾驶的主要因素。典型的L4自动驾驶系统会有4-6个雷达,1-6个激光雷达,6-12个摄像头和8-16个超声波。传感器将产生共计3Gbit/s (~1.4TB/h)到40gbit /s (~19 TB/h)之间的数据。
例如,Waymo的自动驾驶汽车有8个摄像头、6个雷达和6个激光雷达。为了处理这些数据,对于L4自动驾驶来说,计算能力要求可能在1000TOPS以上,而L5可能是L4的10倍,达到10000TOPS。不过,目前主流的解决方案也只有100TOPS-250TOPS左右。
1.2 AI视觉芯片
AI视觉感知芯片需要具备两大功能:一是看得清,二是看得懂,其中AI-ISP负责的就是看得清,AI-NPU负责看得懂。目前,使用NPU加速的AI视觉芯片已被广泛地应用于大数据、智能驾驶和图像处理领域。
从部署的角度来看,目前模型的训练大都是在大算力的Server上跑出来的,而部署是在算力有限的端侧设备上,只有将模型或算法的计算量降到端侧能跑起来的程度,才能在应用侧的推理更好的落地。
训练和推理的关系?
- 打个比方,你现在想要训练一个能区分苹果还是橘子的模型,你需要搜索一些苹果和橘子的图片,这些图片放在一起称为训练数据集(training dataset),训练数据集是有标签的,苹果图片的标签就是苹果,橘子亦然。一个初始神经网络通过不断的优化自身参数,来让自己变得准确,可能开始10张苹果的照片,只有5张被网络认为是苹果,另外5张认错了,这个时候通过优化参数,让另外5张错的也变成对的。这整个过程就称之为训练(Traning)。
- 你训练好了一个模型,在训练数据集中表现良好,但是我们的期望是它可以对以前没看过的图片进行识别。你重新拍一张图片扔进网络让网络做判断,这种图片就叫做现场数据(live data),如果现场数据的区分准确率非常高,那么证明你的网络训练的是非常好的。我们把训练好的模型拿出来遛一遛的过程,称为推理(Inference)。
1.3 NPU实现痛点
主要就是内存和功耗两个痛点:
- 内存:当通过堆MAC单元来拉高算力指标的同时,数据带宽一定要跟上,否则数据供应能力不足,就会带来MAC单元不断等待数据的现象,处理性能就会下降。
- 功耗:当通过堆MAC单元来拉高算力指标时,MAC单元本身的耗电总量会提升,同时还需要高带宽的支撑,在服务器侧可以使用比较贵的HBM,如此一来DDR所需的功耗势必会拉升上去,而在端侧,出于成本的考量,还没有特别好的DDR方案。
为了解决阻碍AI落地的内存墙和功耗墙这两个共性问题,业界常用的方法有两种,一种是存算一体 ,但会受到工艺节点瓶颈的限制,距离量产还有一定的距离;另外一种是减少数据搬运。爱芯元智就是通过混合精度技术减少了数据搬运,从而在一定程度上减小了内存墙和功耗墙的阻碍,提高了整个NPU的效率。
AI算法在自动驾驶ADS领域的行业应用:
- 多模态和多任务:能够在统一空间支持多模传感器感知融合与多任务共享,在提升有限算力的计算效率的同时,确保算法模型在信息提取中对极端恶劣场景(雨雪雾、低照度、高度遮挡、传感器部分失效、主动或被动场景攻击等)的泛化感知能力,降低对标注数据和高清地图的过度依赖;
- 预测和规划联合建模:离线与在线学习相结合,监督与自监督学习相结合,从而能够处理不确定性下的安全行驶与有效决策,提供认知决策行为的可解释问题,通过持续学习解决新场景问题。
多模态多任务对算力的要求直线提升,特别是大模型,上面是AI计算对算力的需求。
对应于ADS传感器负载多样化和融合感知决策算法多样化的演进趋势,ADS的算力需求和芯片加速能力以(十倍速/每几年)的持续高增长态势呈现。一般ADS的存算混合需求,可以通过"硬件预埋,算法迭代,算力均衡" ,来提供一个向前兼容的解决方案,以通用大算力NPU设计来解决算法未来的不确定性,具体体现在:
- 底层架构的演进:从存算分离到近内存计算,最终走向内存计算;
- 数据通道与模型:高速数据接口+数据压缩+模型压缩+低精度逼近计算+稀疏计算加速;
- 并行的顶层架构:模型-硬件联合设计,以及硬设计可配置+硬件调度+软运行可编程调度引擎。
1.4 NPU硬件架构演进
NPU硬件架构的演进,其总体特性可以归结如下:
软件定义架构: 当前行业云化和数字化推动软件架构从单体应用架构 - 垂直应用架构 - 分布式架构 -SOA 架构 - 微服务架构的演变。对于大算力NPU的硬件架构而言,其演进也不言而喻,同样需要解决高并发、大吞吐等问题,针对算法的多样性需求,同样需要通过软件定义架构,来实现底层微架构硬件的可配置、可调度、可弹性扩展特性,以及顶层架构的微任务与多并行调度,提升底层PE与数据通道的效率均衡,减少数据流的无效搬移与无效计算,提升能耗比和算力效率。
弹性负载均衡: 对NPU微架构中的存储与计算PE而言,可配置意味着可以通过片上的控制逻辑来动态配置细颗粒度的PE阵列,通过Array+Vector异构组合的SHAV弹性架构,来适应算法中多形态的算子尺寸和数据流变化需求。对NPU顶层架构而言,微任务与多并行调度意味着,多核的SHAV计算模块,可以通过高带宽的分布式数据总线来搭建实现多核的弹性扩展。
联合优化设计: 对NPU中模型-硬件联合设计而言,具体的实现策略体现在:
1)降低计算资源需求的策略,例如3x3卷积Conv可以通过面向通道的Conv3x3 +Conv1x1来实现,Conv5x5以上可以通过Conv3x3 +Conv1x1组合来实现;
2)逼近计算策略,可以通过低比特数据优化表征HFP8/INT8/INT4/IN4+Quantization-aware后训练来实现;
3)压缩与稀疏计算策略,可以通过模型裁剪与优化,参数统计从偏置分布向零分布调整,以及类似参数扰动+列打包的RL压缩编码来实现;
4)模型-硬件联合搜索,可以认为NPU预定义的硬件架构是模板,网络模型ASIC-NAS在有限硬件计算空间内进行DNN的模型搜索和模型小型化,寻求计算单元的最佳组合模型来提升相同计算复杂度下的等效算力效率。
2. NPU技术介绍
2.1 并行计算
对比CPU十百级的并行处理单元和GPU上万级的并行处理单元,NPU会有百万级的并行计算单元,可以采用Spatial加速器架构来实现,即Spatial PE(Processing Element处理单元)空间单元阵列通过NoC,数据总线,或跨PE的互联来实现矩阵乘运算(全卷积计算或全连接FC计算)、数据流高速交互、以及运算数据共享。
脉动Systolic加速器架构也是Spatial加速器的一类实现方式,其主要计算是通过1D或2D计算单元对数据流进行定向固定流动处理最终输出累加计算结果,对DNN输出对接卷积层或池化层的不同需求,可以动态调整硬件计算逻辑和数据通道,但存在的问题难以支撑压缩模型的稀疏计算加速处理。
NPU的第二类计算单元是Vector矢量加速器架构,面向矢量的Element-wise Sum、Conv1x1卷积、Batch Normalization、激活函数处理等运算操作,其计算可以通过可配置的矢量核来实现,业界常用的设计是标量+矢量+阵列加速器的组合应用来应对ADS多类传感器的不同前处理需求和多样化算法模型流水线并行处理的存算混合需求。
NPU SoC也可以采用多核架构技术,即提供千百级的加速器物理核来组件封装和Chiplet片上互联提供更高程度的平行度,尤其是适合大算力下高并行数据负载,这需要底层硬件调度与上层软件调度相结合,提供一个分布式硬件计算资源的细颗粒度运行态调用。
NPU另外一个在演进中的内存处理器PIM架构,即通过将计算靠近存储的方式来降低数据搬移能耗和提升内存带宽。可以分成近内存计算与内存计算两种类型。近内存计算将计算引擎靠近传统的DRAM或者SRAM cell,保持设计特性。
2.2 稀疏矩阵处理
ADS-NPU低效率计算问题,从微架构设计领域,可以涉及到:
- 稀疏数据(稀疏DNN网络,或者稀疏输入输出数据)导致PE对大量零值数据的无效计算问题;
- PE之间由于软件硬件调度算法的效率低,PE之间互相依赖导致的延迟问题;
- 数据通道与计算通道峰值能力不匹配导致的数据等待问题。
上述问题2和问题3可以从顶层架构和存算微架构设计上来有效解决。问题1可以对稀疏数据进行压缩处理来有效提升微架构计算单元PE的效率。如下图,稀疏数据图编码案例:
稀疏数据图编码的案例,可以有效提升数据存储空间和对数据通道的冲击,计算单元依据非零数据NZVL分布图进行有效甄别计算,以添加简单的逻辑单元为代价就可以将一个72PE的计算效率提升到95%,数据带宽降低40%。如下图,稀疏计算微架构案例:
2.3 SoC角度
从硬件的角度来看,ADS SoC通常是异构架构。除了NPU,还有cpu、DSP、GPU等图像信号处理器。
所有的任务和子任务都需要在异构中映射到不同的核上。
基于以上对于ADS系统的描述,因此在ADS SoC中设计NPU需要考虑以下几点:
首先,在ADS系统中有一组不同的DNNs,如Resnet, FPN, Transformer,需要并行或级联运行在NPU中以处理ADS系统中不同任务的多模态数据;这些不同任务的深度神经网络可以进行分层的特征共享/融合。NPU不仅仅针对一个特定的深度神经网络中优化硬件的利用率和功耗效率,更要考虑到每个深度神经网络和任务的运行时间比例和哪些DNNs之间需要层间的特征共享/融合,以获得整体最优的利用率和功耗效率。
因此,需要设计一种可重构硬件架构,能够在运行时高效地为不同的dnn和任务配置。并实现硬件感知的神经网络搜索(NAS),不仅可以在一个DNN上搜索特定的任务,还可以进行多通道和多任务架构的搜索。更重要的是,这不是在NAS中分别优化每个单独的任务。对于ADS系统,其目标是优化最终的驱动/控制,而感知、定位等中间任务则协同服务于最终目标,因此需要实现多网络协同优化达到整体最优结果。
其次,ADS系统的决策依赖于多种输入下多个深度神经网络和任务的输出综合全面地做出决策,这些深度神经网络的输入是来自不同传感器的多模态信号,质量会受到外部环境或场景的影响,其输出有效性也会相应地打折扣。因此每单个的神经网络模型推理精度是可以适当调整的。因此,在ADS的DNNs推理中需要可调整的混合多精度,即可以针对同时在运行的不同模型实现不同精度下的推理,甚至同一模型下不同层间的精度也可以不同。
第三,ADS系统强调实时和快速响应。当接收到传感器输入,考虑依赖于这些输入产生的控制输出,那么对传感器数据的处理必须按时完成。因此,需要保证网络的实时性-这对安全性和性能都至关重要,特别是在汽车高速行驶的情况下。
这是ADS DNN推断与主流通用ML非常不同的一个重要例子。而任务的DNN推断的延迟不仅取决于NPU核心内部计算能力和数据流的并行性,还取决于通过SoC系统总线对外部存储的访问。因此,需要在NPU和SoC层面设计QoS机制,能够提供基本的权限管理并避免关键任务处于饥饿状态。
最后,超级可靠性的要求也使得面向ADS的NPU不同于一般的NPU。ADS SoC芯片整体需要通过AEC Q100车用芯片可靠性标准。
3. 实现举例
3.1 华为达芬奇AI架构
华为采用外挂的方式最早将寒武纪的NPU用于Mate10,一年之后,华为将寒武纪NPU的IP集成到了980上,又一年之后,华为抛弃了寒武纪在990上采用了自研的达芬奇NPU。
对于手机来说功耗很重要,使用了NPU可以提供大算力并且降低功耗,这也是终端能上AI功能的基础。
2019年,麒麟990系列实现AI人像实时分割能力,能精准分割人物和背景,并将背景实时替换,相比其他手机实现的换背景功能,麒麟990系列还能精准识别每一个个体,并将其移除画面,为更多视频类的AI应用提供新的玩法和可能。
AI隔空操控可以实现不触屏的滑动、截屏交互动作,有了AI隔空操控,过年也能一边包饺子一边刷抖音,寒冬也能带着手套隔空滑动浏览网页,这个功能可以说是非常实用了。
麒麟9000作为华为新一代5nm 5G SoC,在影像系统领域实现了跨越式升级,业界首次实现了ISP+NPU融合架构,将超强的细节还原、降噪能力带入视频领域,使暗光环境下拍摄的视频更加清晰、细节更加淋漓尽致。
不同于以往的标量、矢量运算模式,华为达芬奇架构以高性能3D Cube计算引擎为基础,针对矩阵运算进行加速,大幅提高单位面积下的AI算力,充分激发端侧AI的运算潜能。以两个NN的矩阵AB 乘法为例:如果是N个1D 的MAC,需要N^2(即N的2次方)的cycle数;如果是1个N^2的2D MAC阵列,需要N个Cycle;如果是1个N维3D的Cube,只需要1个Cycle。
达芬奇架构作为华为自研架构,在应用适应性方面与华为的理念一脉相承,基于灵活可扩展的特性,达芬奇架构能够满足端侧、边缘侧及云端的应用场景,可用于小到几十毫瓦,大到几百瓦的训练场景,横跨全场景提供最优算力,麒麟990所使用到的只是端侧AI最基本的一部分。
3.2 百度昆仑
首先,肯定是要仔细分析AI算子的计算特点以及访存特点。同时,也发现在AI领域,尤其是推理领域,定点化是一个非常关键的技术,这可以使得核心计算单元从浮点转向定点,由此实现能耗效率的飞跃。
早在2013、2014年,就开始做这种定点化的工作,直到2016年GPU才在Pascal架构上首次引用了定点支持,可见在这一方面是非常领先的。
2015年,推出第二代基于20nm的FPGA板卡,当时这代产品相对于同时代的GPU有2倍以上的性能优势。
经过多年积累,2017年逐个突破了各种各样的AI领域场景------从语音到推荐类、图像类、自动驾驶类的场景,逐渐做到了AI领域内全场景的支持。
也是基于这一点,2017年,整体的FPGA部署超过了一万两千片,是当时国内最大的FPGA集群。2017年,架构已经基本达到在AI领域内通用的水平,可以说这个架构整体的成熟度已经比较高了。
然而,FPGA平台也出现了一些不足之处。作为一个商业产品,制造出来时的规格是确定的,然而想要有更大的空间、更大的自由度,让架构更好地发挥能力。由于在FPGA上已经做了足够多的迭代,所以当时做好准备跳过FPGA完全自主地定义芯片的spec。也就是从那时候,转向了自研芯片。
2018年,昆仑芯项目正式启动。2019年,一次性流片成功,昆仑芯1代AI加速芯片,以及对应的AI加速卡产品也出来了。经过加速卡的调试以及相关软硬件产品和生态的完善,2021年第一代产品取得了非常好的成果,量产超过两万片,也是国内量产落地最大的、规模最大的AI芯片。
从开发者或者说应用上来看,大家更多关心的是多种场景,以及对应的模型。但是在架构设计者眼里,更多关心的是模型背后的算子。在这么多年的迭代过程中,把这些算子分为两大类。
第一类,出现频率非常高的,比如说像全连接、卷积、bn、ln这些,很多的神经网络中都会有,而且不仅是某一类的神经网络,比如语音、图像,都有这种全连接层和激活。这种算子出现频率非常高、计算量大,可能抓取十多个算子,总耗时就能达到某个模型的90%以上,计算量和耗时占比都非常高。一句话来讲,这类算子的数量相对没有那么多,但性能至关重要。对于这部分算子,希望用相对专用定制的加速器的电路形式去实现,来提升整个架构的实现效率,同时还要有一定的可编程性。比如虽然做的是卷积,但是卷积有非常多的规模参数,比如图像的长宽高所需要的参数是非常多的,这就需要参数能够做到全部、全面、灵活的支持,所以说架构本身要有一定的可编程性。虽然可以用这种专用定制电路去提升能耗、效率或者性能,但是仍然要保留一定的可编程性。
第二类算子的特点相对来说不太好把握,数量很多。芯片不仅支持推理还需要支持训练,这里面的算子就非常复杂,而且计算类型很丰富,很难总结出这部分算子的规律、特点。同时在不断变化,每一年都会发现新的算子变种、变形,已有算子很难把这些东西cover掉,或者说很难保证未来几年之内都是这一些东西。同时甚至还有一些算子,干脆就是用户自己发明的,这些自己定制、创造出来的东西很难在芯片设计时把握清楚。
对于这部分算子,处理的思路也是不断迭代的。一开始思考放在CPU上,直接用CPU跟芯片协同解决这个问题。然而,一旦用CPU计算,一方面性能肯定会很差,因为算力不足,同时,会引入很多CPU跟AI芯片之间的通信开销,非常影响整体端到端性能的上限。
接下来想到运用定制电路模块化的思路,比如说搞一个电路库,每个算子有不同的电路实现,对不同的模型可以用不同的电路去组合、完成。这种思路其实在之前做FPGA的时候可能勉强可以,毕竟FPGA有可编程性。
但真的要做高性能自研芯片,这个思路显然是不现实的------不可能所有算子库的对应电路全都放在芯片上,这样的面积根本没法收敛。最终,决定做一个自研的通用处理器,用通用处理器的思路去解决这部分算法。
多个XPU Cluster单元和XPU SDNN单元,这两部分分别对应计算加速单元、通用处理器单元。称SDNN为软件定义的神经网络引擎,这部分是计算加速单元,主要处理比较高频的、计算量大的张量跟向量运算,能灵活实现卷积、矩阵计算,还有激活等操作。Cluster是通用计算核,内部是有一些标量跟向量计算,向量主要是SIMD指令集,同时每个Cluster的内部有很多XPU Core。Cluster具有很高的通用性和可编程性。整体来讲,架构本身的灵活度就可以使对这种XPU Cluster的编程做到非常细粒度。
除了这两大核心的计算IP之外,还有一些其他的SoC上的部件,包括Shared Memory。可以提供一个软件完全显示管理的大容量的Memory,能够大幅提升带宽。还有片间互联,以及跟主机连接的PCIe的接口。同时还引入了Video Codec,这实际上是视频编解码以及图像预处理的功能。这可以使在一些图像的端到端的领域,有全场景的、端到端的计算支持。
同时,还有安全模块,可以提供通信通道和安全服务,实现从主机到昆仑芯芯片整体的安全机制的保护,保证所有的模型数据不被攻击者窃取。
3.3 安谋科技
国内头部芯片IP设计与服务供应商安谋科技推出其自研人工智能(AI)产品线的最新AI处理器产品------"周易"X2 NPU,将支持的算力提至最高320TOPS,针对车载、电脑、手机等特定场景做了性能优化,并正式发布NPU软件开源计划。
"周易"X2 NPU基于第三代"周易"架构,支持多核Cluster,子系统最高算力可达320TOPS。
"周易"X2 NPU针对高级驾驶辅助系统(ADAS)、智能座舱、平板电脑、台式机、手机等应用场景做了大量的性能优化,可大幅提升手机拍照、录像中的高分辨率图像处理能力,以及车载中常用的Transformer等应用的性能,同时采用i-Tiling技术大幅减少带宽需求,进一步提升计算效率。
参考:www.cnblogs.com/wujianming-...
3.4 特斯拉
尽管芯片上的大多数逻辑都使用经过行业验证的IP块来降低风险并加快开发周期,但Tesla FSD芯片上的神经网络加速器(NPU)是由Tesla硬件团队完全定制设计的。它们也是FSD芯片上最大的组件,也是最重要的逻辑部分。
每个FSD芯片内部有两个相同的NPU --在物理上彼此相邻集成。当被问及拥有两个NPU实例而不是一个更大的单元的原因时,特斯拉指出,每个NPU的大小都是物理设计(时序,面积,布线)的最佳选择。
指令集(ISA)
NPU是具有乱序内存子系统的有序计算机。总体设计有点像是一种状态机。指令集比较简单,只有8条指令:DMA Read,DMA Write,Convolution,Deconvolution,Inner-product,Scale,Eltwidth,Stop。NPU只是运行这些命令,直到碰到停止命令为止。还有一个额外的参数slots ,可以更改指令的属性(例如,卷积运算的不同变体)。有一个标志slots ,用于数据依赖性处理。还有另一个扩展slots 。该slots 存储了整个微程序命令序列,每当有一些复杂的后处理时,这些序列就会发送到SIMD单元。因为这,指令从32字节一直到非常长的256字节不等。
初始操作
NPU的程序最初驻留在内存中。它们被带入NPU,并存储在命令队列中。NPU本身是一个非常花哨的状态机,旨在显著减少控制开销。来自命令队列的命令连同需要从中获取数据的一组地址一起解码为原始操作-包括权重和数据。例如,如果传感器是新拍摄的图像传感器照片,则输入缓冲区地址将指向该位置。一切都存储在NPU内部的超大缓存中,不需要与DRAM交换数据。
高速缓存的容量为32 MB,有一个完善的bank仲裁程序,与一些编译器提示一起,用于减少bank冲突。每个周期中,最多可以将256个字节的数据读取到数据缓冲区中,并且最多可以将128个字节的权重读取到权重缓冲区中。根据步幅,NPU可能在操作开始之前将多条线路带入数据缓冲区,以实现更好的数据重用。每个NPU的组合读取带宽为384B/周期,其本地缓存的峰值读取带宽为786GB/s。特斯拉表示,这使他们能够非常接近维持其MAC所需的理论峰值带宽,通常利用率至少为80%,而很多时候则要达到更高的利用率。
MAC 阵列
CNN的主要操作当然是卷积,占特斯拉软件在NPU上执行的所有操作的98.1%,而反卷积又占1.6%。在优化MAC上花费了大量的精力。
MAC阵列中的数据重用很重要,否则,即使每秒1 TB的带宽也无法满足要求。在某些设计中,为了提高性能,可以一次处理多个图像。但是,由于出于安全原因,延迟是其设计的关键属性,因此它们必须尽快处理单个图像。特斯拉在这里做了许多其他优化。NPU通过合并输出通道中X和Y维度上的输出像素,在多个输出通道上并行运行。这样一来,他们可以并行处理工作,并同时处理96个像素。换句话说,当它们作用于通道中的所有像素时,所有输入权重将被共享。此外,它们还交换输出通道和输入通道循环(请参见下图的代码段)。这使它们能够依次处理所有输出通道,共享所有输入激活,而无需进一步的数据移动。这是带宽需求的另一个很好的降低。
通过上述优化,可以简化MAC阵列操作。每个阵列包括9,216个MAC,并排列在96 x 96的独立单周期MAC反馈环路的单元中(请注意,这不是脉动阵列,单元间没有数据移位)。为了简化其设计并降低功耗,它们的MAC由8x8位整数乘法和32位整数加法组成。特斯拉自己的模型在发送给客户时都经过了预先量化,因此芯片只将所有数据和权重存储为8位整数。
在每个周期中,将在整个MAC阵列中广播输入数据的底行和权重的最右列。每个单元独立执行适当的乘法累加运算。在下一个循环中,将输入数据向下推一行,而将权重网格向右推一行。在整个数组中广播输入数据的最底行和权重的最右列,重复此过程。单元继续独立执行其操作。全点积卷积结束时,MAC阵列一次向下移动一行96个元素,这也是SIMD单元的吞吐量。
NPU本身实际上可以在2 GHz以上的频率上运行,尽管特斯拉根据2 GHz时钟引用了所有数字,所以大概是生产时钟。在2 GHz的频率下,每个NPU可获得36.86 teraOPS(Int8)的最高计算性能。NPU的总功耗为7.5 W,约占FSD功耗预算的21%。这使它们的性能功率效率约为4.9 TOPs / W,这是我们迄今为止在出货芯片中看到的最高功率效率之一--与英特尔最近宣布的NNP-I(Spring Hill)推理加速器配合使用。尽管特斯拉NPU在实际中的通用性有点疑问。请注意,每个芯片上有两个NPU,它们消耗的总功率预算略超过40%。
参考:
4. ADS自动驾驶相关问题
4.1 ADS-NPU几种技术路线
NPU芯片架构设计中一个最主要的挑战是低计算效率问题,除了内存墙、功耗墙原因之外,还有一个最主要原因是ADS算法从Compute-bound(Convolution)向Memory-bound(Matrix Multiply + Data Move)演进,而现有架构多只针对3x3卷积进行优化,现有硬件计算架构难以全方位优化覆盖。
对应于ADS传感器负载多样化和融合感知决策算法多样化的演进趋势,ADS的算力需求和芯片加速能力以(十倍速/每几年)的持续高增长态势呈现。对ADS新的存算混合需求,业界有几种主要应对措施:
- 以Tesla FSD芯片为主:
- 以新工艺和增加海量MAC阵列数量和SRAM容量来提供高达400TOPS的算力
- 以nVidia为主:
- 如下图所示,通过适量增加计算单元,添加新的张量核心和新的Transformer引擎来解决Memory-bound类算法的低效率问题
- 以初创和手机芯片公司为主:
- 在近内存或者内存计算基础上,采用融合架构,将高速数据接口+数据压缩+模型压缩+低精度逼近计算+稀疏计算加速相结合
- 结合模型-硬件联合设计,通过添加硬设计可配置+硬件调度+软运行可编程调度引擎来提升架构的整体算法计算效率
典型的CNN(Compute-bound)和Transformer(Memory-bound)的网络架构详细对比如下图所示,以Swin Transformer做图像分类的案例,可以看到其中Matrix Multiply占70%计算时间,由于数据复用远低于CNN中最常见的卷积(占CNN任务推理总耗时多数在90%-95%以上)计算,Data Move也需要~29%的耗时。对NPU 硬件计算架构而言, CNN主要的计算算子包括:卷积,池化,激活函数(ReLU等), Batch Normalization,以及全连接Fully-Connected(FC),主要计算是卷积算子,计算耗时占比可以到95%左右或更高,CNN中卷积的复用率要比Transformer高15倍左右。Transformer主要的计算算子包括:卷积Conv1x1 (即FC),Multi-Head Self-Attention(MSA),激活函数(GeLU等), 和Layer Normalization,其中Multi-Layer Perception (MLP)层由FC+GeLU+FC组合而成,Transformer主要计算是FC算子,计算占比可以到90%以上,所用滤波器的数量比CNN的卷积层多6倍左右。应用到ADS的Transformer的不同类别,包括ViT,Swin等众多系列,架构上主要区别是Self-Attention架构的变化,以及Channel数量和CONV尺寸的不同。ADS中众多手工设计的算法架构可以将CNN、Transformer、GNN和RNN等DNN网络的部分子模块重新组合来进行有效的特征提取特征融合和特征重建,同时结合贝叶斯统计和强化学习RL等理论以满足ADS多模感知与融合推理决策需求,所以DNN网络形态目前还没有走向统一,仍呈现多样化态势,模型-硬件的联合设计以及网络架构自动搜索NAS设计方法会加剧这种趋势的发散,这些都是下一代NPU计算先进架构设计所面临的全新挑战。
图 典型CNN网络结构、算法模块与常用算子 (Said, 2020)
4.2 ADS-NPU微计算架构的设计挑战
当前NPU计算架构主要是Spatial加速器架构,即Spatial PE空间单元阵列通过NoC,数据总线,或跨PE的互联来实现数据流交互。粗颗粒度的可配置架构CGRA是Spatial加速器的一种形态,即可配置的PE Array通过纳秒或微秒级别可配置的Interconnect来对接,可以支持配置驱动或者数据流驱动运行。脉动Systolic加速器架构也是Spatial加速器的一类实现方式,其主要计算是通过1D或2D计算单元对数据流进行定向固定流动处理最终输出累加计算结果。当前脉动阵列依旧是主流架构之一,常用的单元尺寸为32x32,可以通过添加额外的逻辑单元来支撑压缩模型与压缩数据的稀疏计算加速处理以及低比特的逼近计算模式。
从上所述,NPU计算架构的性能(throughput/Watt, throughput/area)取决于针对DNN网络模型负载与计算阵列的颗粒度匹配度,能否支持动态配置,以及互联interconnect拓扑与模型如何切片tiling相关,目的是确保计算单元的使用效率与数据通道的调度效率。颗粒度可配置是一个选择,同时可以将阵列Array+矢量Vector+标量Scalar计算单元组合来构成异构单元和弹性扩展。另外一个可行的思路是采用不同配置尺寸的脉动阵列multi-Pod混合,来解决不同DNN的负载需求(CONV, FC, Attention)中DNN网络层与阵列维度不匹配问题, 提升并行计算效率。PE计算阵列或者NPU核的互联,包括直连与分布式,需要解决计算单元与片上片间内存的通道竞争与延迟问题。比较有趣的是脉动阵列的multi-Pod组合中,CNN比较适合66x32阵列尺寸,Transformer比较适合20x128尺寸,总体上比32x32尺寸性能会有1.5x以上提升。互联的设计方案中,Crossbar interconnect可以有比较好的二分带宽,但随着挂靠的计算core数量增加,硬件成本成加速度上升趋势,对比而言H-tree interconnect硬件成本也非常高。2D Mesh interconnect比较常用,硬件成本低但难以支撑大的使用模块或者计算core数量。对比Ring interconnect而言,Butterfly interconnect可以做一个比较好的均衡,这里Network-on-Chip (NOC)还会有其它设计选择,本文在这里不打算做深度分析。
ADS算法的典型系统分层架构一般包括传感层,感知层,定位层,决策层和控制层。DNN在这类认知任务和视觉任务上取得了巨大的进展。DNN网络主要包括CNN、Transformer、GAN、GNN和RNN等几类。本文在这里主要讨论一下CNN卷积核和Transformer完整核心功能模块的硬件设计挑战与加速实现。
Multiply-and-Accumulation (MAC)设计
DNN的最核心最底层的计算操作是MAC,即网络参数与量化输入的点积Dot-Product运算,以及累加输出,所以减少点积(即内积)或者累加器数量,可以提升数据复用率,自然可以有效提升能耗比,图 5就是这样一个典型的基于加法树的内积引擎案例。这类实现在脉动阵列架构上是基本可行的。
图 5 基于加法树的内积引擎案例 (Jang 2021)
全连接FC设计
如图 6所示,偏Memory-bound的FC层常用在RNN和Max Probability Perception MLP (Transformer)模型系列里,数据搬移多,滤波器参数在不同神经元的复用率低于CNN中的卷积层CONV。对Swin Transformer网络架构而言,其中FC参数占比会超过83%,FLOPs计算超过97%。只针对CONV优化的计算架构应用到FC,计算效率自然会严重降低。
图 6 FC计算对比 案例
FC层的计算主要是动态输入的矢量与参数矩阵的点积。线性量化也就是逼近计算技术,可以压缩模型参数降低计算复杂度。从图 7可以看出一个比较有趣的现象,包括Transformer在内,平均有80%以上的输入在与64个不重复的模型参数进行点积,而且其中约44个参数值在常用8比特量化后不会超过256。这种稀疏特性,与DNN模型检测以及稀疏计算架构非常相似。这意味着在设计中可以考虑用索引来进行参数表征和实现点积运算。如图 8所示。基于索引的实现机制可以进一步压缩模型减少内存带宽使用,可以将点积乘减少33%,参数存储减少20%。这类优化实现在脉动阵列架构上是基本可行的,也可以考虑做为单独的Vector计算单元来设计,与Array计算单元进行异构组合实现。
图 7 FC层模型量化后 不重复的参数的累计分布 (Riera, 2021)
图 8 CREW 计算复用和有效参数存取的FC设计案例 (Riera, 2021)
Convolution设计
如图 6所示,对Transformer网络而言,CONV和Multi-Head Self-Attention (MHSA)层的计算占时不多,都属于矩阵-矩阵的乘计算,而FC层属于矩阵-矢量的乘计算。通常NPU微计算架构将计算单元PE设计成1D或者2D Array,针对CONV 3x3进行优化,对其它卷积尺寸采用可配置设计模式,数据流的设计会相对简单,只是计算效率会低。这里值得一提的是,在Transformer (ViT)的网络架构里,首先采用了CNN来做特征提取,而且ViT采用了CONV4x4,现有NPU硬件计算效率会继续有低于66%的相对下降比例。如图 9所示是一个针对ViT CONV4x4 PE块的设计案例。如图 10所示是一个针对ViT 的NPU顶层架构的设计案例。ViT模型不同层中x7的尺寸比例设置,另外不同层的通道数都是x96的比例,PE4x7的阵列尺寸设置可以和模型对应进行有效匹配来计算卷积,其中每行4个MAC单元,NPU顶层案例采用了12个PE块。在每个PE单元里,每个权值系数从顶到底广播到所有乘法器,每个MAC可以从输入SRAM收到不同的输入来支撑FC层计算,PE乘法器的结果在水平方向累加,可以存到本地缓存便于后续累计。如图 10所示,顶层架构中将PE输出结果在累加器中累加,随后在加法器中求和,其结果会通过Layer Normalizatio进行归一化或Softmax进行计算处理,最终结果输出到片外内存里。对于MHSA的计算 ,
Q(Query)矩阵可以认为是PE单元块的参数输入,K(Key)矩阵可以认为是PE单元块的数据输入,由于矩阵尺寸小与网络其它层类型,8个PE单元模块可以搞定。对于Q矩阵映射,Q矩阵的4个列分配到一个PE单元然后按照行-行模式处理,每行7个时钟时间。K转置矩阵映射,可以安排到7行x 8个PE块进行计算,12个PE块中只用了8 个,硬件利用效率相对只有66%,但MHSA总的FLOPs占比不超过模型的3%,这种效率影响估计不会超过1%。
图 9 CONV4x4 PE块的设计案例 (Wang, 2022)
图 10 NPU顶层架构的设计案例 (Wang, 2022)
Integer-Only逼近计算设计
如上文所述,Transformer在ADS算法应用中的作用越来越有优势,几乎涵盖感知融合决策控制的每个流程,但Memory-bound的存算需求对设计有更大的挑战,本文的技术讨论和设计思路也是聚焦这个方面。如图 11所示的基于整数的量化逼近计算策略案例,可以通过Integer-only整数操作与bit-shifting位移处理来取代浮点数除法做逼近计算。ViT中的线性运算包括MatMul和Dense(即上述所说的FC)中的MAC,可以采用Integer-only流水线操作+Dyadic Arithmatic二分算术方法。ViT中的非线性运算包括上文所所述的Softmax,GELU, LayerNorm,也可以通过一个轻量级的Integer-only算术方法来进行快速逼近计算,即ShiftMax和ShiftGELU,来提升NPU微架构的整体性能。基于整数的量化逼近计算策略案例,在TVM上的仿真设计,声称可以有将近4倍推理速度提升,而且图 11所示的INT8量化策略,可以取得与FP相当或更高的性能,参数的INT4表征也可以是NPU设计的一个可行的发力点。
图 11 ViT基于整数 的计算图(Li, 2022)
ShiftMax和ShiftGELU硬件逼近计算
如图 11所示,GELU是Transformer中所用的非线性激活函数,可以通过Sigmoid函数进行逼近(Li, 2022)
对应于Integer-only的逼近计算方法,可以首先通过Integer Shifting操作𝐼𝑝 = 𝐼𝑥+ (𝐼𝑥>> 1) + (𝐼𝑥>> 3) + (𝐼𝑥>> 4),将GELU里的非线性函数操作转化成如下的Softmax函数
而Softmax函数是不能直接采用二分算术方法的
但Integer-only Softmax可以通过简化逼近来设计硬件逻辑(Li, 2022),首先,对数据分布和动态范围进行平滑操作确保不溢出
最后,ShiftMax和ShiftGELU都可以通过下面的简化逻辑进行硬件逼近计算设计(Li, 2022)
Layer Normalization硬件逼近计算
Transformer中采用的Layer Normalization (LayNorm),需要动态均值和方差统计特性来计算标准偏差,可以采用一种轻量级的整数递归方法(Li, 2022)来实现
为 **止,一般10次左右递归就可以收敛(Life, 2022),上述公式的除法可以同样采用比特移位和累加器来实现,对硬件的简洁设计也非常有利。
初始值I0设为 ,递归到 为止
4.3 存算一体芯片对Transformer等模型的支持
Transformer是一种用于自然语言处理任务的神经网络模型,它具有大量的参数和复杂的计算操作。在传统的计算机系统中,存储和计算是分离的,需要将数据从存储单元(如内存)加载到计算单元(如CPU)进行计算。这种数据的传输和计算的分离会导致较高的延迟和能耗。而存算一体芯片通过将存储和计算功能集成在同一片芯片上,可以实现数据的本地计算,减少了数据传输的开销,从而提高了计算效率。
存算一体芯片支持Transformer等不同模型的关键在于其集成的存储和计算单元。存算一体芯片通常采用非易失性存储器(Non-volatile memory, NVM)作为存储单元,如相变存储器(Phase Change Memory, PCM),磁阻随机存储器(Magnetic Random Access Memory, MRAM)等。这些存储器具有快速的读写速度和较高的密度,可以满足Transformer等模型对大规模参数的需求。
然而,由于其大规模的参数量和计算需求,Transformer模型对硬件资源的要求较高,这就需要存算一体芯片具备一定的特性来支持。下面将介绍存算一体芯片如何支持Transformer等不同模型的关键特性:
1、强大的计算能力:Transformer模型具有大量的参数和复杂的计算图结构,需要大量的浮点计算能力。存算一体芯片需要具备高性能的计算单元,如专用的向量处理器(Vector Processing Unit)和矩阵乘法加速器(Matrix Multiplication Accelerator),来支持矩阵运算等关键操作。
2、高带宽的存储系统:Transformer模型需要频繁地读取和写入参数和中间结果,因此存算一体芯片需要具备高带宽的存储系统,如高速缓存和片上存储器(On-chip Memory),以减少数据传输延迟和提高数据访问效率。
3、灵活的内存管理:Transformer模型的参数通常较大,可能超过存算一体芯片的存储容量。因此,存算一体芯片需要具备灵活的内存管理机制,支持在芯片内和外部存储器之间进行数据交换和迁移,以满足模型参数的存储需求。
4、高效的并行计算:Transformer模型的计算是高度并行的,可以同时处理多个输入样本或多个位置的计算。存算一体芯片需要具备并行计算的能力,如多核心处理器和硬件线程调度器,以实现高效的计算并发性和加速模型训练和推断过程。
5、低功耗和高能效:存算一体芯片通常用于移动设备和嵌入式系统,对功耗和能效有较高的要求。为了支持Transformer等大型模型,存算一体芯片需要采用低功耗的设计和优化算法,以提高能效并延长设备的续航时间。
除了存储单元,存算一体芯片还集成了计算单元。计算单元通常采用基于异构计算的架构,包括传统的CPU、GPU,以及专用的加速器,如Tensor Processing Unit(TPU),Field Programmable Gate Array(FPGA)等。这些计算单元可以支持不同的计算操作,如矩阵乘法、卷积等,满足Transformer等模型对计算能力的需求。
存算一体芯片还可以通过定制化的硬件架构和指令集来进一步优化Transformer等模型的计算性能。例如,可以将Transformer中的一些常用操作进行硬件化,减少计算的延迟,提高计算效率。同时,还可以设计专门的指令集,支持Transformer等模型的计算需求,提供更高级别的抽象,简化编程和优化过程。
总之,存算一体芯片通过集成存储和计算功能,提供高效的存储和计算能力,支持Transformer等不同模型的计算需求。通过定制化的硬件架构和指令集,可以进一步优化计算性能,提高计算效率。存算一体芯片的发展将推动人工智能和自然语言处理等领域的技术进步。
参考:
- www.cnblogs.com/wujianming-...
- blog.csdn.net/weixin_4313...
- www.cnblogs.com/wujianming-...
- www.cnblogs.com/wujianming-...
- www.cnblogs.com/wujianming-...
- www.ic37.com/news/2024-1...
后记:
本文写的有点杂乱,可能是调研摘抄的内容比较多,概念多,没有落到实地,后续会尽量具体的写。整体上各家的NPU由于应用场景和技术底子的不同,但是都往AI大算力上靠,所以实现的差异也比较多。另外这属于软件硬化的东西,大家都知道软件很灵活,所以在目前按IP造芯片的背景下,一般没多少开发工作,但是NPU属于高度定制化,有很多的工作需要做,也诞生了很多的岗位。国内搞的早的几家,里面的人才都成了香饽饽,被挖到各种行业里面去继续发光发热。