查看原文
其他

直播回顾丨百度ACU软硬件结合优化的实践经验分享

张扬 Apollo开发者社区 2022-07-29


百度ACU(Apollo Computing Unit)是Apollo面向量产的自动驾驶车载计算单元,根据不同需求场景的计算能力要求,分为多个系列产品。ACU-Advanced是行业首创的自主泊车产品Apollo Valet Parking专用车载计算平台,目前已量产下线用于客户的量产车型中。





ACU-Advanced软硬一体的解决方案:


  • 能够支持5路摄像头,12路超声波雷达,预留毫米波雷达和激光雷达接口;

  • 基于Xilinx ZU5(FPGA)设计,适配百度PaddlePaddle深度学习框架;

  • 全面部署AUTOSAR,全车规基础软件开发;

  • 严谨的软硬件安全合规设计,全面满足AVP场景需求(ASIL-B);

  • 100%全车规元器件,抗冲击震动,耐电磁干扰,全面胜任车载环境;

  • -40℃~85℃超宽工作温度,自然风冷无需风扇或水冷;

  • 设计流程,供应链和生产管控基于IATF16949质量管理体系。



为了让客户、合作伙伴以及开发者能够更加深入了解百度ACU(Apollo Computing Unit),本次公开课邀请了百度ACU核心技术团队的工程师,为大家准备了4期公开课直播。今天为大家送上第二期直播内容回顾,如果你错过了直播,那么这次的直播回顾你一定不能错过。阿波君给大家整理好了笔记,快来一起学习吧!


上期我们为大家整理了直播回顾丨百度ACU如何满足自动驾驶量产需求》,本期公开课由百度智能汽车事业部底层软件架构师——张扬为我们讲解《百度ACU软硬件结合优化的实践经验分享》



  ENJOY THE FOLLOWING  


Apollo计算单元主要讲的是计算,Apollo自动驾驶对算力的需求,由需求引导至为何选用AVP这款芯片,稍后会讲到技术架构方便大家理解,第四部分就是主题:在高效计算方面做了软硬件结合的实践,最后是总结。

 




自动驾驶的计算种类包括:神经网络、图像处理、3D重构与VSLAM和矩阵操作。自动驾驶的实现,依赖各种各样的算法。

 

算力与帧率不必然成正比,有以下几种因素:首先是Elementwise算子带宽受限,其次是深度卷积算子是否被优化,最后是是否所有算子被加速。极端情况下,占小于1%计算量的算子,计算时间超过50%,显著影响帧率。

 

简单来说,我们对硬件的需求是:算力强、带宽高、算子齐备、功耗低、符合车规。

 




用什么芯片能满足自动驾驶的计算,能适应不同计算需求呢?我们选用了一款SOC——Xilinx ZU5,里面包括了FPGA,首先是比较灵活,有利于算法迭代;其次提供足够的算力,保持行驶速度,不是像蜗牛那样缓慢前行;然后就是需要满足85℃环境下正常使用的严苛车规要求。另一点看中的就是基于FPGA的SOC的可靠性能,广泛应用于可靠性要求比较高的行业,比如说通信行业、军工行业、航空航天行业,也用于汽车行业。自动驾驶最担心的就是安全问题,我们致力于保证自动驾驶的安全。

 




从软件来看,首先开发加速算子,使芯片具有加速的能力;然后做一些驱动的程序来驱动,负责管理;最后基于PaddleLite做的深度学习模型编译及前向推测框架,另外是传统的CV算法。从硬件的角度来看,绿色的部分代表FPGA,首先有一个命令解析的模块,从ARM通过寄存器下发的命令解析出来,然后下发给相应的计算单元,比如说CNN、图像处理、SLAM等,因为深度学习和定位要并行,所以设计了两个同时访问内存的通道,可以保证实时高效的运算。ARM也是通过DDR控制器和内存进行通信。

 

主要的计算都是在深度学习,用的都是CNN卷积神经网络,而在此过程中,CPU上对Paddle模型进行解析、算子合并、模型编译、内存开辟、部分算子计算,通过驱动程序对FPGA寄存器下发命令并管理共享的DDR内存,对FPGA而言,需要解析命令、控制逻辑、数据搬运、量化单元、算子加速以及管理内存的模块DMA。软硬结合的最终目标是提高感知、定位、环境建模、规划控制的处理帧率,保证数值精度和准召率。技术手段第一是通过提高FPGA的算力,第二是提高FPGA对计算的覆盖度,第三是量化训练及计算仿真工具。

 




第一点是进行了8bit的量化训练,与众不同的是提供跟FPGA计算相匹配的量化训练工具,实践证明,8bit计算后准召率下降,同时为了保证算法能够使用,提供了FPGA计算仿真器,计算结果保证与bit对齐。


第二点是利用了PFGA这款DSP的特殊结构,这个计算单元可以同时计算一个27位✖27位的,那我们是8位✖8位的,就把一个乘数高8位,一个乘数低8位,这样乘出来的结果是第一个的乘积和第二个的乘积自然就是分开的。对于其他的我们都采用定点化计算,首先要保证与浮点计算相比匹配度高于98%,在这种前提下,计算步骤很多,我们充分理解每一个计算环节,采用定点化要保留多少位来进行计算,每个环节都采用变长计算,保证计算最高效。



第三点定义广义算子,当某些计算类型比较类似,就抽象成一个计算形式。这样就可以复用FPGA资源,凡是被加速的算子可以得到足够多的资源保证算力。



第四点是在计算中遇到的固定连接,如果不做特殊处理,算完一个后需要把结果读到内存,下一次计算的时候需要从内存里取出来再次加工,这种存入读取的方式费时、效率低,这时可以把这些当成一个计算来进行处理,像之前说的SDK对算子进行融合,减少带宽占用。


还有一种就是对于参数很大的卷积,要经过算子分裂,分裂成小卷积后再计算,能有效地降低FPGA片上存储资源的占用。

 

对于图像采集,采用R核图像驱动,共享内存实现0拷贝,显著降低了CPU占用和内存宽带,提高了图像帧率的稳定性。

 

自动泊车有两种业务,一种是基于高精地图的PAVP,一个是基于学习建图的HAVP,FPGA加速算子,随着应用场景PAVP/HAVP切换,使得每个场景都达到最高帧率。

 



自动驾驶的计算需求对承接计算加速来说具有不确定性,在迭代的过程中,有些算子远没有预期的效果,并非是只解决深度学习就能解决的问题,所以选择了使用FPGA来做,选用ZU5芯片,这个开发是比较困难的。



拓展:底层软件包括了模块构成——盖亚层,用来屏蔽硬件的差距,也就是说现在用的ZU5芯片,将来可能会用TDS,希望在硬件迁移的过程中,上层应用软件不发生改变,可以直接迁移。硬件迁移的过程被盖亚层所屏蔽掉。


今天涉及到模块有定制算子、硬件模式管理、传感器同步/预处理、DL/DV加速,还有硬件仿真器,用于X86等环境。


以上就是我们讲解的百度ACU软硬件结合优化的实践经验,更多系列主题讲解,请持续关注Apollo开发者社区。




点击文章左下角『阅读原文』

可观看直播回放







您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存