地平线罗恒博士如何打造一颗好的自动驾驶A
2023/3/19 来源:不详北京治白癜风医院 https://mjbk.familydoctor.com.cn/bjbdfyy/
1月20日,地平线在智东西公开课开设的「地平线AI芯片技术专场」顺利完结。在本次专场中,地平线BPU算法负责人罗恒博士就《如何打造一颗好的自动驾驶AI芯片》这一主题进行了直播讲解。
罗恒博士围绕AI计算需求增长带来领域专有架构芯片、自动驾驶软件算法方案、从自动驾驶软件算法方案看对AI芯片的要求、一些设计自动驾驶AI芯片的实践四部分进行了深入解读。
本次专场分为主讲和QA两个环节,以下是主讲环节的全程实录:
大家好,很高兴和大家一起探讨地平线在自动驾驶芯片设计方面的一些想法。我是罗恒,年博士毕业于上海交通大学,博士期间一直在做深度学习方面的研究,后随图灵奖得主YoshuaBengio进行博士后研究;年加入地平线,做BPU算法、工具链相关的产品研发工作,先后推动了中国首款边缘AI芯片、首款车规级芯片的诞生。车规级芯片在年获得了“第十届吴文俊人工智能专项奖”芯片项目一等奖。
首先,想和大家讲下JeffDean在年的一张图。这张图解释了AI为什么是可能的。AI有两种算法:一种是传统算法,如上图的紫线部分,随着数据量、模型复杂度的增加,准确度和精度很快达到了饱和,同时传统算法主要依赖于人工设计;另一种算法是机器学习或基于神经网络的算法,这类算法当数据量少、模型小时,可能不如人工设计的算法精度高,但随着数据和计算的增加,它的精度会持续上涨。目前,大多数的AI任务并没有达到饱和,只要数据量越多、模型越大,性能就可能持续提升。
上图纵轴的精度表示一个模型的精度,如果模型能代表一个软件的功能,则可以持续提升软件的功能。例如抖音,它的数据非常容易获取,只需浏览它时就会捕获到数据,而当你不去刷它,则会一直播放当前的内容。这是它在强迫你给一个反馈,然后利用这些反馈在云端进行大量计算来估计你的喜好,而估计你的喜好就是模型的结果,即软件功能本身。当越来越多用户使用抖音时,云端获取计算变得非常容易,就可以持续提升模型的精度,也在持续提升软件功能。
在抖音或其他互联网应用中,由于问题是被充分定义的,所以它们实际上是一个相对简单的任务。但自动驾驶不同,虽然自动驾驶也会用到各种各样的模型,但这些模型无法直接对应到最终的功能。即使能持续提高模型的精度,但能否持续提高自动驾驶的功能仍是一个问题。例如特斯拉,它以端到端的方式不断发展,就是希望能用一个模型,代表软件的功能,然后利用数据与计算持续优化自动驾驶的功能。
自动驾驶是AI计算中的一种,这些年AI计算的需求增长非常快,带来了大量的领域专有架构芯片,它们与以往CPU有明显的区别。但这些AI计算芯片也面临着巨大的挑战,表现在自动驾驶的软件算法方案并没有收敛,即使是在同一家公司,软件算法方案也在持续的迭代、变化。从这些软件算法中也可以看出对AI芯片的需求,而算法本身也在高速演进,然后结合以上这些来看下我们是如何思考、设计自动驾驶AI芯片的。因此,本次讲解内容主要分为以下4个部分:
1.AI计算需求增长带来领域专有架构芯片
2.自动驾驶软件算法方案
3.从自动驾驶软件算法方案看对AI芯片的要求
4.一些设计自动驾驶AI芯片的实践
1
AI计算需求增长带来领域专有架构芯片
上图中的右部分横轴表示时代,年AlexNet第一次赢得了ImageNet比赛,并开启了一轮AI热潮的序幕。纵轴表示训练这些模型所需的时间,可以看到呈现出数量级的增长,7年之间对算力的需求增加了6个数量级。但同期的左边图,表示通用计算,即CPU,它的增长速度则在迅速放缓,在摩尔定律发挥作用时,最快每一年半计算性能提升一倍。但现在,已经从每6年翻一倍,增加到每20年翻一倍,所以CPU注定无法提供AI算力。
当计算需求远远超出摩尔定律和以往人类提升算力、增加计算的速度时,该如何呢?我们发现机器学习和神经网络绝大多数是线性代数的加速运算,而它们相较于一个通用的编程语言,加速的可能性和并行性空间非常大。举一个矩阵乘的例子,如果用Python运行矩阵乘的速度为1,当利用一个更具机器学习特性的C语言去编写,速度提升了47倍;如果再把一些循环并行起来,能提升到多倍;如果对存储做一些优化,提升到多倍,最后在硬件上对向量的计算增加一些加速指令,则可以提升到6万多倍。从1到6万多倍的提升,就来自于对特定问题的深刻理解。
有了巨大的需求,也有了相应的解决方案,整个行业都开始高歌猛进,朝着AI专用加速器的方向发展。代表性的产品是年谷歌在自有数据中心使用的高度定制化AI推理芯片TPU。年,计算需求已经从最早的云端到了自动驾驶领域,特别是特斯拉已经开始使用自有高度定制化的AI推理芯片FSD。同时,年全世界已经约有家组织推出或正在研发AI推理芯片,这个数字到现在可能变得更大。
由于如何设计与如何评估这些芯片是紧密联系在一起的,所以正确的设计/评估这些芯片可以从以下三方面考虑:
首先,AI模型在不同的任务、场景中,性能评估目标是不同的;
其次,芯片是一个物理的实现,它对成本和功耗限制不同,由于目前只有少量的AI任务实现收敛,算法本身也在持续迭代;
最后,AI算法本身并不是跑得越快越好,不同的算法还存在准确率的问题,要同时考虑到快和准。
把上面三点放在一起充分考虑,能够对设计和评估这些芯片有越来越深刻的认识,就可以在设计中做出取舍。
地平线于年6月成立,是中国第一家AI芯片创业公司。地平线的定位是在边缘做AI芯片,企业定位不同的背后是需求不同。像英伟达、华为、谷歌,它们的整体架构设计,主要面向数据中心,而数据中心往往处理海量数据,需要高吞吐率和限定时间的响应;并且在云端,AI任务种类繁多,基本上各类任务在云端都可以找到;但在云端,任务本身是限定在虚拟世界,是一个封闭的、定义单纯的任务,所以模型加速就是最核心的负载。
相较于数据中心,自动驾驶的需求会非常不同,这些不同的需求也导致了设计上取舍的不同。比如对自动驾驶而言,无论采用什么样的技术路线,有一个事实是无法回避的:处理的数据是流数据,即数据源源不断的通过各种传感器到达车上,这时必须对数据进行马上处理,而且延迟越低越好。延迟越低就越能根据周围的情况作出反应,及时刹车并控制车量,来保证安全。
从设计上来看,我们的芯片和特斯拉FSD,都是面向Batchsize=1去优化的。而GPU以及其他一些以云为核心业务的公司,设计的AI芯片往往需要比较大的数据量,数据积累比较多,才能把芯片利用率发挥的更好。
2
自动驾驶软件算法方案
对自动驾驶而言,尽管现在有各种各样的传感器,但从计算的角度来看,核心是计算视觉,主要有两个原因:第一个原因是整个物理世界是一个语义的世界,自动驾驶汽车需要识别出前面的交通标志牌、车道线,以及障碍物是普通障碍物,还是随时会动的障碍物,这都是语义的问题,不可能通过视觉以外的其他方案得到解决;第二个原因是视觉能够带来最大量的数据,其他传感器每秒获得数据量比摄像头获得的数据相差了许多数量级。同时,由于软件算法在持续重构中,往往需要不同的方案设计,因此需要不同的加速方式,所以要充分考虑AI加速与CPU、GPU、DSP的协调。在车上,成本、散热和云端也有完全不同的限制,由于车和人的生命安全相关,所以对它的可靠性要求也高。
下面从需求侧来看自动驾驶软件算法的挑战。首先是技术路线,在纯视觉方案中,主要以特斯拉为主。他们认为视觉能够提供了最大的冗余,而激光雷达或其他传感器提供的数据量很少,所以容易出现问题,但视觉数据量非常大,模型的健壮性非常好。在多类传感器融合的方案中,像国内的华为、小鹏等。除此之外,像Mobileye,它希望能有两套感知系统来做冗余,当两套感知系统之间的相关性非常低时,就能极大提高整个系统的安全性。
从行业上来看,即使是一家公司,软件算法方案也在持续变化,典型的例子是特斯拉。刚开始特斯拉使用Mobileye的方案来解决自动驾驶问题,之后开始自研算法转向使用NVIDIAGPU,进一步发现NVIDIAGPU无论在功耗、算力、成本上都无法满足需求,之后自研了FSD芯片,并于年投入使用。
无论是放弃Mobileye,还是转向NVIDIA,或是自研FSD芯片,每一次硬件的大幅改变,也会带来软件算法的大幅改变。去年特斯拉放弃了Radar,等于完全使用神经网络模型估计物体距离、加速度,这又是一次对软件算法的改变。再到去年的AIDay,多个摄像头的视频直接输入到模型里,然后通过模型最终输出时,已经是时空一致的结果。最近马斯克接受采访时表示,特斯拉已经完成了从视觉到向量空间的完整映射。
通过上面可以看出,当设计一个自动驾驶AI芯片时,首先要对未来算法软件发展方向做积极估计,同时也要尊重客户对不同方案的尝试,所以需要在这些趋势中找大方向,找主要矛盾。
3
从自动驾驶软件算法方案看对AI芯片的要求
回到算法本身,算法也在迅速变化,而且算法的很多变化可能会对芯片设计带来一些致命的影响。像WaveNet,它的技术核心是把文本转换成人一样的语音技术,年由谷歌发明。刚出现时,这个算法对计算量的需求非常大,无法实时完成计算,也无法实时与人进行交互。当WaveNet算法做出了一些优化,计算效率提升了0倍,这时GPU可以20倍实时运行,谷歌马上就把它产品化,并放在谷歌助手中。但这个算法只能在云端用,无法在端侧的AIoT场景使用。
这时谷歌公司想根据当时的WaveNet算法开发一个加速芯片,但年算法又一次演进,有数百倍的性能提升,这使得手机CPU能够运行WaveNet。而一个芯片的研发周期很长,芯片的研发一直到年才完成,后续也没有听到这个芯片的量产情况。这是一个极端的例子,所以想提醒的是算法在持续变化,我们需要对未来做判断。
我们最关心的是视觉,视觉中最重要的是卷积神经网络。卷积神经网络从上世纪90年代诞生到现在,总体发展不像WaveNet那么快。人们看到的是一张图,而机器看到的是一个矩阵,矩阵里面的像素点表示像素强度、多个Channel、RGB等。卷积的运算是把输入图像转化为一张可以被机器理解的图,在整个卷积神经网络运算的过程中,分辨率在不断下降,Channel数在不断增多,本质上是不断的看图像更大范围,然后把更大范围用一个点来表示,即把图像高度抽象化,并从不同层面解释这张图。
目前,卷积神经网络对于AI、自动驾驶是一个最重要的模型。特斯拉公开表示,它的模型中卷积的计算量占比达到了98%。卷积的计算过程是利用卷积核中的一组参数,这组参数会扫过图像中的每一个像素点,然后把输入值和参数值点对点相乘,之后累加相乘得到最后的结果。尽管它是一个很简单的计算,但由于卷积本身有各种变形,网络结构在深度、宽度等各方面也做变形,卷积层之间也有不同的连接方式,以及使用各种各样的激活函数,因此可以产生了各种各样的卷积神经网络。
如上图右边所示,每个圈代表一个卷积神经网络,横轴表示卷积神经网络需要多少计算量,纵轴表示精度,圈表示模型参数量。因此可以看到这些模型的表现完全不同,比如最右面的两个大圈,它们的精度可能刚过70%,但它们所需的计算量和其他网络有很大差别,也就是当硬件对所有网络加速完全一致时,得到同样的精度,使用右边模型需要10倍的时间。
而这一时期整个学术界纷纷转向ImageNet,算法精度也随之不断提高。除了右边两个绿圈比较特殊之外,通常随着计算量的增加,精度也在不断上升。而到实际工作中也会面临这样的问题:需要在速度和精度之间找一个折中,这个时期怎么用一个更大的网络得到更好的精度,可以考虑一些专家设计的网络扩展方法。
对于神经网络来说,给它更多的数据和计算,准确性就会迅速提升。从年AlexNet第一次参加ImageNet开始,到年比赛最后一界,卷积神经网络的精度已经非常高。这时开始寻找在同样的精度下,如何去减少计算,提升模型的效率,出现了一系列有代表性的模型:SqueezeNet、MobileNet、ShuffleNet。这时也出现了卷积神经网络产生以来最重要的一次变化:DepthwiseConvolution。另外一个变化是需要在模型的计算量和精度上找折中的方式,这时可以开始在小范围内开始寻找,并使用一些自动化的搜索。
年,随着EfficientNet的出现,我们认为卷积神经网络结构的演进暂时进入一个平缓发展的阶段。为什么?因为在卷积发展的二十几年中,出现了DepthwiseConvolution,而传统算法都是人工设计的模型结构,再到机器设计的模型结构,这也是一个大的变化。这两个大的变化被很好的结合在EfficientNet中,由此我们认为卷积出现新变化的可能性比较少。这个观点在年EfficientNet发表时,我们就已经是看到了,到目前为止,这个观点依旧可靠。
接下来是Transformer,Transformer实际上是一个非常特别的神经网络,卷积神经网络通过一层一层的卷积,并经过很深的层数后,在featuremap上的一个点,可以看见原图一个更大的区域。以识别建筑物为例,如果想识别出建筑物,不仅仅需要看到有窗户,可能还需要看到房顶、天空、地面之间的关系,它们之间是一个长距离的相关性。当天空、草地、窗户等同时符合一定的空间规律时,才能定义这是一个建筑物或庄园。
Transformer来自于自然语言处理,机制是从输入一开始就计算任意两点之间的相关性,即每一层计算都可以直接计算很长距离之间的两两相性,这个能力是CNN不具备的,而它对于理解图像很关键。因此,Transformer在实际应用中也表现了巨大的潜力,但仍存在一个问题:Transformer在视觉任务中很难定义基本单元是什么。基本单元可以很大,也可以很小,像高分辨率语义分割中,基本单元可以是像素级别,而在做一些物体识别时,基本单元可以是车、行人等大的物体。
Transformer在计算任意两点之间的相关性时,会产生非常大的计算量。如果不计算点和点之间的相关性,而是限制计算patch和patch之间的相关性,如果patch设置太大,一些精细的相关性会被忽略,如果patch设置太小,计算量又太大。Transformer等类似工作采取的方式是限制计算相关性的范围,即限制Self-Attention的范围,无需与全图计算相关性,只需与一些局部进行计算。好处是计算效率得到了保障,坏处则是Transformer相对于CNN最大的特别性受到了限制,而这个限制一定程度上受限于GPU,因为在很远距离两两计算的计算架构上,GPU不太友好。
总之,Transformer相对于卷积神经网络有全新的特性,但这个全新的特性并没有很好的发挥出来,所以短期之内还是以卷积神经网络为主,Transformer则提供一些特殊的作用。比如特斯拉,它需要把多路摄像头的视频最终融合到一起,得到一个完整的向量空间表示,而对于不同摄像头数据输入到模型之后的特征融合,使用Transformer是一种非常好的方法。
那过去设计的芯片是否无法使用呢?Transformer本质上大部分计算依然是矩阵乘,所以现有的AI芯片都可以对它进行加速。而真正挑战则是各种localattention的方式,这对于灵活的数据存取有挑战。
上面介绍了许多外部的需求,当真正有了芯片之后,该如何评估芯片的性能?如何设计它?这通常是一个峰值算力的问题。但仅凭峰值算力还无法真正体现芯片性能。像上图,两个AI加速器的峰值算力相差几倍,但在不同模型中实际运行时,结果有时差不多,有时差距很大。所以,一个大算力芯片不一定跑得很快,而一个小算力芯片不一定跑得很慢。它们受加速器架构、DDR带宽、编译器优化策略、模型架构、输入大小与对齐情况等各方面的影响。
当计算这么多的模型时,如果知道哪个模型最重要,这个问题会变得比较简单。对自动驾驶而言,什么样的视觉任务最重要呢?自动驾驶的核心是识别周围有哪些物体、它们是什么、它们的属性是什么、与车辆的距离如何,也需要识别一些小物体,即识别远处的物体,所以核心负载是一个高分辨率的物体检测问题。同时,数据是流数据,即数据需要马上要处理,所以它也是一个Batchsize=1的高分辨率物体检测。
选用在COCO数据集上运行各种各样的算法,无论是在我们的芯片上,还是在GPU上,EffcientNet在同样精度下都能达到最快的速度。尽管GPU对EffcientNet的支持并不友好,但是EffcientNet使用的计算量仍比ResNet少七、八倍。
上图是评估的结果,横轴表示帧率,纵轴表示精度。橙色的线表示在Xavier上运行的结果,可以看到在相对精度比较高时,Xavier能够提供的帧率非常低,但在实际应用中,精度还需要更高,另外需要处理多路的摄像头,而多路摄像头的分辨率往往比COCO还高,这也是为什么Xavier无法很好的支持自动驾驶方案,也是为什么特斯拉要自研芯片。
黄色线是我们估计出来的Orin结果,这里的估计方法一方面结合NVIDIA对Orin算力的公开信息,以及对Orin相对Xavier能力提升的描述;另外一方面根据NVIDIARTX,因为NVIDIARTX与Orin都使用安培架构,我们会从中对利用率做一些调整。从总体评估结果来看,我们的AI芯片相对于Orin提升是非常明显的。如果把不同精度下的帧率平均,大约是Orin的两倍;功耗上看,我们的芯片只有20瓦,Orin的功耗是65瓦;从能效上来看,我们有6倍多的提升。
4
一些设计自动驾驶AI芯片的实践
那怎么设计AI芯片呢?地平线是一家算法基因的公司,与别家企业做AI芯片的最大不同是我们认为算法是动态的、不断变化的,我们随时都在预估未来的趋势,同时我们又是一家芯片公司,并不仅仅看算法本身,更看重算法对计算架构的影响,这也使得在DepthwiseConvolution刚推出时,能够迅速的