自动驾驶和机器人对数据的处理都要求很强的实时性,因此需要强大的计算能力。而有很多与计算机视觉、深度学习相关的功能,数据量极大,如果采用纯CPU的系统架构,运行时间会很长,达不到期望的处理速度和实时性要求。本文将结合我们在机器人算法加速上的实践经验和对自动驾驶运算平台的了解进行分享。
作者:王文辉【天津最早从事AI算法及创新工作的骨干之一、目前为AI 算法FPGA加速工程师】
一、机器人算法加速实践
机器人的核心控制单板属于嵌入式设备,要求功耗低、面积小,用传统的CPU+GPU的方案无法满足要求。因此我们采用了FPGA SOC+HLS的方案,对计算机视觉和深度学习相关的算法进行加速。不仅利用了FPGA的高并发性能,也利用了HLS的高效开发效率,具体包含下述四个方面:
1.高度集成的SOC方案
为了解决单板的体积和功耗问题,选择xilinx的SOC芯片作为处理主芯片,该芯片包含一片高性能FPGA,相比传统的CPU+FPGA方案,SOC方案有如下优点:
i.功耗
如果采用传统的CPU(4W)+FPGA(15W)分体式解决方案,整体功耗接近20W。SOC方案按照FPGA资源利用率为80%来计算,典型功耗在10W左右,远低于CPU+FPGA的方案,这对很多采用电池供电的嵌入式设备来说,待机时间大大延长了。
ii.BOM面积
高集成的方案大大节省了单板的PCB面积,进而缩小了整机的体积。
2.HLS快速开发
CPU需要很强的通用性来处理各种不同的数据类型,同时又要逻辑判断又会引入大量的分支跳转和中断的处理,这些都使得CPU的内部结构异常复杂,所以,用CPU进行流程控制和调度时很高效,但如果程序中需要进行大量的复杂计算,CPU则显得力不从心。
现在的深度学习和机器视觉领域,恰恰是包含大量的数学运算,因此需要采用其它拥有大量计算单元的器件进行硬件加速处理,常用的有DSP、GPU和FPGA,主流的架构是主控制流程在CPU上运行,DSP、GPU和FPGA做数据运算。
由于FPGA内部有大量的DSP和可编程模块,因此是效率最高的选择,但它的开发语言(Verilog和VHDL)相对底层,且和DSP、GPU、CPU代码无法兼容,所以开发群体相对小众,编程效率较低,开发周期长。如下图:
鉴于此,HLS开发方式应运而生,HLS即高层次描述(High Level Synthesis),之后综合成可用的网表文件的技术。这里的“高”指采用C/C++进行编程,而不是传统的Verilog和VHDL语言。Vivado工具将C程序转换成Verilog代码后,进行综合、优化、布局布线等操作。开发流程图如下:
应用了HLS开发方式后,开发周期大大缩短,如下图:
3.高效的验证环境
在FPGA开发过程中,仿真验证阶段占用了70%左右的时间,其中包括了反复编写和优化激励、结果验证的过程。使用HLS开发后,这部分工作量会大大缩短,加快开发进度。
Vivado开发包括一个Co-Sim的过程,整个过程包括如下几个步骤,最终完成RTL代码的仿真。
Co-Sim根据C语言的testbench建立一个RTL代码和C语言的testbench之间的通信方式,来传输仿真激励数据。
Co-Sim根据C语言的testbench来生成仿真激励。
Co-Sim启动仿真,将激励灌入并行处理后的RTL代码,并且验证输出是否正确。
整个验证过程,Co-Sim工具将开发人员从繁杂的编写RTL激励和结果验证中解放出来,只需将精力放在如何在C语言层面编写激励即可,因此大大提高了开发效率。
4.HLS的优化
整个开发过程中,如何写出适合HLS高效综合的C语言代码,贯穿整个HLS开发主线,也是难点所在。主要的优化方式有如下几点,供大家参考:
i. 吞吐量优化
数据吞吐量定义为单位时间内模块处理数据的数量,是衡量加速算法的一个重要指标,FPGA内改进数据吞吐量的方法有Pipeline和Dataflow两种。
下图A是没有进行Pipeline处理的代码,只有当RD、CMP和WR整个处理过程完成后,才会进行下一组数据的处理,即处理一组数据需要3个时钟周期。图B是进行Pipeline优化后的代码,每个时钟周期都有数据输入并被处理,所以吞吐量是图A的3倍。
Dataflow是另外一种在函数之间进行并行优化的方式。下图是没有进行Dataflow并行计算优化的模块,函数间依次处理一组数据,所有处理流程结束后,input接口才会允许进行下一组数据。
采用Dataflow方式后如下图,会在函数间增加Channel,这是一个用于缓存中间数据的buffer,当一级function处理完数据后将其存入缓存,function可以继续处理下一组数据,而不用等待所有流程处理完毕后再继续工作。
Pipeline和Dataflow都是增加并行处理的有效手段。
ii. Latency优化
Latency是处理一组数据的时间,这是体现算法实时性的重要指标。HLS可以通过设置编译选项来设置一个函数的Latency,优化函数处理时间。另外,还可以通过合并loop来优化Latency,因为每个C语言的loop都会被综合成一个或多个状态机,而多个状态机级联的时候一定会增加额外的处理延迟。我们可以使用merge指令来合并多个状态机,优化整体处理Latency。
iii. 面积优化
在FPGA上实现一个算法,除了速度和吞吐量,算法占用的资源也是重要的考量指标。一个占用资源过多的算法是不可行的,或者说是代价昂贵的,可以通过优化数据的bit位宽来优化占用的资源。
在C语言中通常我们只会使用char/int/float等固定长度的数据类型,而在FPGA中,由于高度可编程,我们可以随意定义自己想要使用的数据类型的宽度,例如我们可以根据需要,使用12/11/10bit位宽的整型数据,这样大大减少了资源使用数量。
当C语言中有很多小的Array时会消耗大量FPGA中的RAM资源,HLS支持RAM合并的功能,即将很多小的Array合并放入一个RAM块中,减少RAM消耗的数量。
二、效益和收益
HLS是一个桥接硬件和软件开发领域的工具,给FPGA开发提供了很多好处,主要有:
由于可以在更高抽象语言的基础上进行开发,极大的提高了硬件开发人员的生产力。
降低了FPGA开发门槛,使软件开发人员可以快速的介入FPGA开发。
以下面四个算法加速为例,从开发速度和工作量上来看HLS带来的收益。
1.开发时间大大缩短
开发时间是体现效率、快速推出版本的一个重要指标,通过使用HLS开发方式,会使整个团队在视觉图像处理算法和CNN上很大提升。
下表是两种开发方式下的人力对比,其中RTL开发方式没有实际做,是根据算法的复杂度进行预估的。从对比来看,HLS开发效率至少是RTL的3倍。
2. 代码行数减少
代码行数是体现工作量,尤其是后期维护工作量的一个重要指标。HLS后期维护的是C语言代码,无论从代码量还是可读性来说,都远远优于Verilog。
下表是两种开发方式下的代码行数对比,其中RTL方式没有实际编码,但是从以前的开发经验和算法复杂度来看,每个算法至少是50000行以上的代码规模,与HLS方式相比相差了不止一个数量级。
HLS开发方式下,代码的维护变得相当简单,且对于初学者来说,理解整个算法的流程框架也更容易,但比较难的点是理解编译选项的含义和开发方式。
在算法实现上,HLS是一个高效的工具,但由于C语言还是要变成可综合的Verilog,所以C语言的写法还是要遵循特定的可综合的规则。
三、自动驾驶运算平台
自动驾驶所需的运算能力体现在车端和云端两个方面:
1.车端
车端运算平台一般放在汽车后备箱,主要负责通过传感器数据感知周围的环境,用高精度地图实时定位,并按照算法模型做出驾驶决策。
2.云端
云端则需要一台数据处理能力超强的数据中心,所有与云端连接的车辆都会将自己的行驶数据上传到这里。云端利用这些数据,通过深度/增强学习训练决策和感知的算法模型。经过训练优化的算法模型在经过稳定性验证后将会被重新更新到各个车辆终端中,这是未来自动驾驶所使用的自我优化体系。
车端对于安全性和实时性要求很高,需要对周围环境迅速做出决策;云端数据量庞大,所有这些都对运算能力提出了很高的要求。
目前车端和云端运算平台采用较多的处理器是GPU,GPU有数量众多的计算单元,可以并行运行同时处理很多相对简单但具有大量数据的任务。
2016年NVIDIA推出的专门针对自动驾驶的 Drive PX2平台在车端应用比较广泛,Drive PX2中使用了两个Tegra Parker,以及多个Pascal架构的GPU,每秒能够执行24万亿次操作。Drive PX2配合云端数据中心的NVIDIA Tesla GPU,可在更短的时间内创建和更新适用于自动驾驶汽车的精细地图,过去要花几周时间才能完成的过程现在几乎可以实时完成。
下图为NVIDIA的端到端完整自动驾驶计算平台:
Drive PX2已经搭载在 Tesla 的量产车型 Model S 以及 Model X 上,大部分已公布的使用 NVIDIA 方案的测试车基本上都搭载的 Drive PX2,如奥迪、沃尔沃和 ZF 等。
百度的自动驾驶Apollo车端为了实现高性能稳定的计算,采用的是工业级PC作为运算单元,配置6th-Gen Intel Core i7/i5 LGA1151 CPU 和NVIDIA GeForce GTX1050* GPU。
虽然GPU的应用比较广泛,但它在深度学习方面也存在着一些局限性,如下:
由于FPGA的计算构架可以全定制,功耗低,其并行处理资源可扩展性和灵活性较好,所以它在很大程度上克服了GPU的弱点。现在FPGA被越来越多的公司关注,其可编程特性可以满足专有计算构架的需求,微软、Intel等公司都在大量部署基于FPGA的系统。
FPGA在ADAS(高级驾驶辅助系统)方面的出货量也在迅速增加,去年的出货量应该不会低于3Mu。
【地平线】
2017年初,地平线公司发布了基于FPGA-BPU的ADAS系统,预计其成本和功耗都将比现有GPU低一个数量级。从xilinx工程师那了解到,地平线采用的FPGA芯片,和前面介绍的机器人算法加速实践选择的是同一款,据说该系统已被比亚迪自动驾驶汽车采用。
【宝马&Intel】
去年,宝马集团携手Intel共同研发全自动驾驶解决方案,全新发布的Intel GO无人驾驶解决方案提供世界级处理器和FPGA技术,以最高效的方式平衡了性能和功耗,同时满足汽车行业对散热和安全性的苛刻要求。
车端:
Intel GO为关键功能提供了可拓展的开发和计算平台,包括传感器聚合、驾驶策略、环境建模、路径规划和决策。
云端:
Intel GO提供广泛的技术,包括处理器、FPGA、固态硬盘和Nervana人工智能平台等,为无人驾驶行业所需的机器学习和深度学习提供了强大的训练和模拟基础设施。
当然FPGA做深度学习或其它算法加速也有一些问题,比如产品本身迭代比较慢,成本较高等。
四、结语
回顾过去自动驾驶所使用的计算平台,可以看到由最开始使用CPU,到后来的GPU,到现在GPU和FPGA的组合使用。机器人领域对处理器的选择也基本是这个路线,相信未来算法和芯片会协同进化,更好的支撑人工智能各领域的发展。
责任编辑:王维