作者简介:刘少山,PerceptIn公司联合创始人。加州大学欧文分校计算机博士,研究方向包括智能感知计算、系统软件、体系结构与异构计算(FPGA、GPU)。现在PerceptIn主要专注于增强现实、虚拟现实、机器人的核心SLAM技术及其在智能硬件上的实现与优化。创立PerceptIn之前在百度美国研发中心工作。
十年前,微软创始人比尔 · 盖茨在其文章《A Robot in Every Home》里提出他对未来的憧憬:机器人将会像个人电脑一样进入每个家庭,为人类服务。随着人工智能以及智能硬件在过去几年的飞速发展,到了2016年的今天,笔者坚信各项技术已臻成熟,智能机器人很快进入商业化时代,盖茨的愿景也极有可能在5到10年内实现。
要想机器人有智能,必先赋予其感知能力。感知计算,特别是视觉以及深度学习,通常计算量比较大,对性能要求高。但是机器人受电池容量限制,可分配给计算的能源比较低。除此之外,由于感知算法不断发展,我们还需要不断更新机器人的感知处理器。与其它处理器相比,FPGA具有低能耗、高性能以及可编程等特性,十分适合感知计算。本文首先解析FPGA的特性,然后介绍FPGA对感知算法的加速以及节能,最后谈一谈机器人操作系统对FPGA的支持。
FPGA:高性能、低能耗、可编程
与其它计算载体如CPU与GPU相比,FPGA具有高性能、低能耗以及可硬件编程的特点。图1介绍了FPGA的硬件架构,每个FPGA主要由三个部分组成:输入输出逻辑,主要用于FPGA与外部其他部件,比如传感器的通信;计算逻辑部件,主要用于建造计算模块;以及可编程连接网络,主要用于连接不同的计算逻辑部件去组成一个计算器。在编程时,我们可以把计算逻辑映射到硬件上,通过调整网络连接把不同的逻辑部件连通在一起去完成一个计算任务。比如要完成一个图像特征提取的任务,我们会连接FPGA的输入逻辑与照相机的输出逻辑,让图片可以进入FPGA。然后,连接FPGA的输入逻辑与多个计算逻辑部件,让这些计算逻辑部件并行提取每个图片区域的特征点。最后,我们可以连接计算逻辑部件与FPGA的输出逻辑,把特征点汇总后输出。由此可见,FPGA通常把算法的数据流以及执行指令写死在硬件逻辑中,从而避免了CPU的Instruction Fetch与Instruction Decode 工作。
图1 FPGA硬件架构
高性能
虽然FPGA的频率一般比CPU低,但是可以用FPGA实现并行度很大的硬件计算器。比如一般CPU每次只能处理4到8个指令,在FPGA上使用数据并行的方法可以每次处理256个或者更多的指令,让FPGA可以处理比CPU多很多的数据量。另外,如上所述,在FPGA中一般不需要Instruction Fetch与Instruction Decode, 减少了这些流水线工序后也节省了不少计算时间。
为了让读者对FPGA加速有更好的了解,我们总结了微软研究院2010年对BLAS算法的FPGA加速研究。BLAS是矩阵运算的底层库,被广泛运用到高性能计算、机器学习等领域。在这个研究中,微软的研究人员分析了CPU、GPU以及FPGA对BLAS的加速以及能耗。图2对比了FPGA以及CPU、GPU执行GaxPy算法每次迭代的时间,相对于CPU,GPU与FPGA都达到了60%的加速。图中显示的是小矩阵运算,随着矩阵的增大,GPU与FPGA相对与CPU的加速比会越来越明显。
图2 GaxPy 算法性能对比 (单位:微秒)
低能耗
FPGA相对于CPU与GPU有明显的能耗优势,主要有两个原因。首先,在FPGA中没有Instruction Fetch与Instruction Decode,在Intel的CPU里面,由于使用的是CISC架构,仅仅Decoder就占整个芯片能耗的50%;在GPU里面,Fetch与Decode也消耗了10%~20%的能源。其次,FPGA的主频比CPU与GPU低很多,通常CPU与GPU都在1GHz到3GHz之间,而FPGA的主频一般在500MHz以下。如此大的频率差使得FPGA消耗的能源远低于CPU与GPU。
图3对比了FPGA以及CPU、GPU执行GaxPy算法每次迭代的能源消耗。可以发现CPU与GPU的能耗是相仿的,而FPGA的能耗只是CPU与GPU的8%左右。由此可见,FPGA计算比CPU快60%,而能耗只是CPU的1/12,有相当大的优势,特别在能源受限的情况下,使用FPGA会使电池寿命延长不少。
图3 GaxPy 算法能耗对比(单位:毫焦)
可硬件编程
由于FPGA是可硬件编程的,相对于ASIC而言,使用FPGA可以对硬件逻辑进行迭代更新。但是FPGA也会被诟病,因为把算法写到FPGA硬件并不是一个容易的过程,相比在CPU与GPU上编程技术门槛高许多,开发周期也会长很多。
图4 传统FPGA开发流程与C-to-FPGA开发流程
图4显示了传统FPGA开发流程与C-to-FPGA开发流程的对比。在传统的FPGA开发流程中,我们需要把C/C++写成的算法逐行翻译成基于Verilog的硬件语言,然后再编译Verilog,把逻辑写入硬件。随着近几年FPGA技术的发展,从C直接编译到FPGA的技术已经逐渐成熟,并已在百度广泛被使用。在C-to-FPGA开发流程中,我们可以在C/C++的代码中加Pragma, 指出哪个计算Kernel应该被加速,然后C-to-FPGA引擎会自动把代码编译成硬件。在我们的经验中,使用传统开发流程,完成一个项目大约需要半年时间,而使用了C-to-FPGA开发流程后,一个项目大约两周便可完成,效率提升了10倍以上。
感知计算在FPGA上的加速
接下来主要介绍机器人感知计算在FPGA上的加速,特别是特征提取与位置追踪的计算(可以认为是机器人的眼睛),以及深度学习计算(可以认为是机器人的大脑)。当机器人有了眼睛以及大脑后,就可以在空间中移动并定位自己,在移动过程中识别所见到的物体。
特征提取与位置追踪
特征提取与位置追踪的主要算法包括SIFT、SURF和SLAM。SIFT是一种检测局部特征的算法,通过求一幅图中的特征点及其有关规模和方向的描述得到特征并进行图像特征点匹配。SIFT特征匹配算法可以处理两幅图像之间发生平移、旋转、仿射变换情况下的匹配问题,具有很强的匹配能力。SIFT算法有三大工序:1. 提取关键点;2. 对关键点附加详细的信息(局部特征)也就是所谓的描述器;3. 通过两方特征点(附带上特征向量的关键点)的两两比较找出相互匹配的若干对特征点,也就建立了景物间的对应关系。SURF算法是对SIFT算法的一种改进,主要是通过积分图像Haar求导提高SIFT算法的执行效率。SLAM即同时定位与地图重建,目的就是在机器人运动的同时建立途经的地图,并同时敲定机器人在地图中的位置。使用该技术后,机器人可以在不借助外部信号(WIFI、Beacon、GPS)的情况下进行定位,在室内定位场景中特别有用。定位的方法主要是利用卡曼滤波器对不同的传感器信息(图片、陀螺仪)进行融合,从而推断机器人当前的位置。
为了让读者了解FPGA对特征提取与位置追踪的加速以及节能,下面我们关注加州大学洛杉矶分校的一个关于在FPGA上加速特征提取与SLAM算法的研究。图5展示了FPGA相对CPU在执行SIFT feature-matching、SURF feature-matching以及SLAM算法的加速比。使用FPGA后,SIFT与SURF的feature-matching分别取得了30倍与9倍的加速,而SLAM的算法也取得了15倍的加速比。假设照片以30FPS的速度进入计算器,那么感知与定位的算法需要在33毫秒内完成对一张图片的处理,也就是说在33毫秒内做完一次特征提取与SLAM计算,这对CPU会造成很大的压力。用了FPGA以后,整个处理流程提速了10倍以上,让高帧率的数据处理变得可能。
图5 感知算法性能对比 (单位:加速比)
图6展示了FPGA相对CPU在执行SIFT、SURF以及SLAM算法的节能比。使用FPGA后,SIFT与SURF分别取得了1.5倍与1.9倍的节能比,而SLAM的算法取得了14倍的节能比。根据我们的经验,如果机器人将手机电池用于一个多核的Mobile CPU去跑这一套感知算法,电池将会在40分钟左右耗光。但是如果使用FPGA进行计算,手机电池就足以支撑6小时以上,即可以达到10倍左右的总体节能 (因为SLAM的计算量比特征提取高很多)。
图6 感知算法能耗对比 (单位:节能比)
根据数据总结一下,如果使用FPGA进行视觉感知定位的运算,不仅可以提高感知帧率,让感知更加精准,还可以节能,让计算持续多个小时。当感知算法确定,而且对芯片的需求达到一定的量后,我们还可以把FPGA芯片设计成ASIC,进一步的提高性能以及降低能耗。
深度学习
深度神经网络是一种具备至少一个隐层的神经网络。与浅层神经网络类似,深度神经网络也能够为复杂非线性系统提供建模,但多出的层次为模型提供了更高的抽象层次,因而提高了模型的能力。在过去几年,卷积深度神经网络(CNN)在计算机视觉领域以及自动语音识别领域取得了很大的进步。在视觉方面,Google、Microsoft与Facebook不断在ImageNet比赛上刷新识别率纪录。在语音识别方面,百度的DeepSpeech 2系统相比之前的系统在词汇识别率上有显著提高,把词汇识别错误率降到了7%左右。
为了让读者了解FPGA对深度学习的加速以及节能,我们下面关注北京大学与加州大学的一个关于FPGA加速CNN算法的合作研究。图7展示了FPGA与CPU在执行CNN时的耗时对比。在运行一次迭代时,使用CPU耗时375毫秒,而使用FPGA只耗时21毫秒,取得了18倍左右的加速比。假设如果这个CNN运算是有实时要求,比如需要跟上相机帧率(33毫秒/帧),那么CPU就不可以达到计算要求,但是通过FPGA加速后,CNN计算就可以跟上相机帧率,对每一帧进行分析。
图7 CNN性能对比 (单位:毫秒)
图8展示了FPGA与CPU在执行CNN时的耗能对比。在执行一次CNN运算,使用CPU耗能36焦,而使用FPGA只耗能10焦,取得了3.5倍左右的节能比。与SLAM计算相似,通过用FPGA加速与节能,让深度学习实时计算更容易在移动端运行。
图8 CNN能耗对比 (单位:焦)
FPGA与ROS机器人操作系统的结合
上文介绍了FPGA对感知算法的加速以及节能,可以看出FPGA在感知计算上相对CPU与GPU有巨大优势。本节介绍FPGA在当今机器人行业被使用的状况,特别是FPGA在ROS机器人操作系统中被使用的情况。
机器人操作系统(ROS),是专为机器人软件开发所设计出来的一套操作系统架构。它提供类似于操作系统的服务,包括硬件抽象描述、底层驱动程序管理、共用功能的执行、程序间消息传递、程序发行包管理,它也提供一些工具和库用于获取、建立、编写和执行多机融合的程序。ROS的首要设计目标是在机器人研发领域提高代码复用率。ROS是一种分布式处理框架(又名Nodes)。这使可执行文件能被单独设计,并且在运行时松散耦合。这些过程可以封装到数据包(Packages)和堆栈(Stacks)中,以便于共享和分发。ROS还支持代码库的联合系统,使得协作亦能被分发。ROS目前被广泛应用到多种机器人中,逐渐变成机器人的标准操作系统。在2015年的DARPA Robotics Challenge比赛中,有过半数的参赛机器人使用了ROS。
随着FPGA技术的发展,越来越多的机器人使用上了FPGA,在ROS社区中也有越来越多的声音要求ROS兼容FPGA。一个例子是美国Sandia国家实验室的机器人手臂Sandia Hand。如图9所示,Sandia Hand使用FPGA预处理照相机以及机器人手掌返回的信息,然后把预处理的结果传递ROS的其它计算Node。
图9 ROS在Sandia Hand中对FPGA的支持
为了使ROS与FPGA之间可以连接,Sandia Hand使用了Rosbridge机制。 Rosbridge通过JSON API来连接ROS与非ROS的程序。比如一个ROS的程序可以通过JSON API连接一个非ROS的网络前端。在Sandia Hand的设计中,一个ROS Node通过JSON API连接到FPGA计算器,FPGA传递数据以及发起计算指令,然后从FPGA取回计算结果。
Rosbridge为ROS与FPGA的联通提供了一种沟通机制,但是在这种机制中,ROS Node并不能运行在FPGA上,而且通过JSON API的连接机制也带来了一定的性能损耗。为了让FPGA与ROS更好的耦合,最近日本的研究人员提出了ROS-Compliant FPGA的设计,让ROS Node可以直接运行在FPGA上。如图10所示,在这个设计中,FPGA了实现一个输入的接口,这个接口可以直接订阅ROS的topic,使数据可以无缝连接流入FPGA计算单元中。另外,FPGA上也实现了一个输出接口, 让FPGA上的ROS Node可以直接发表数据,让订阅这个topic的其他ROS Node可以直接使用FPGA产出的数据。在这个设计中,开发者只要把自己开发的FPGA计算器插入到ROS-compliant的FPGA框架中,便可以无缝连接其他ROS Node。
图10 FPGA成为ROS的一部分
最近跟ROS的运营机构Open Source Robotics Foundation沟通中发现,越来越多的机器人开发者使用FPGA作为传感器的计算单元以及控制器,对FPGA融入ROS的需求越来越多。相信ROS很快将会拿出一个与FPGA紧密耦合的解决方案。
展望未来
FPGA具有低能耗、高性能以及可编程等特性,十分适合感知计算。特别是在能源受限的情况下,FPGA相对于CPU与GPU有明显的性能与能耗优势。除此之外,由于感知算法不断发展,我们需要不断更新机器人的感知处理器。相比ASIC,FPGA又具有硬件可升级可迭代的优势。由于这些原因,笔者坚信FPGA在机器人时代将会是最重要的芯片之一。由于FPGA的低能耗特性,FPGA很适合用于传感器的数据预处理工作。可以预见,FPGA与传感器的紧密结合将会很快普及。而后随着视觉、语音、深度学习的算法在FPGA上的不断优化,FPGA将逐渐取代GPU与CPU成为机器人上的主要芯片。
欢迎加入本站公开兴趣群
软件开发技术群
兴趣范围包括:Java,C/C++,Python,PHP,Ruby,shell等各种语言开发经验交流,各种框架使用,外包项目机会,学习、培训、跳槽等交流
QQ群:26931708
Hadoop源代码研究群
兴趣范围包括:Hadoop源代码解读,改进,优化,分布式系统场景定制,与Hadoop有关的各种开源项目,总之就是玩转Hadoop
QQ群:288410967