特斯拉 Autopilot 如何单挑全世界?

特斯拉是一家很开放的车企。
所谓开放,指的是马斯克年初那一句「特斯拉愿意开放并共享自己的所有专利」,还有在GitHub上公开了自家车机操作系统的底层代码,以及在全球最大的软件BUG讨论社区Bugcrowd里面发下英雄帖,广邀全球黑客黑自家系统。

近日,特斯拉再一次将自家Autopilot的秘密向世界公开。特斯拉AI部门高级主管AndrejKarpathy近日出席了一个有关深度学习的会议——PyTorchDeveloperConference2019,并且进行了一段时长11分钟的演讲,主题就是 Autopilot如何在计算机视觉深度学习中应用PyTorch。

众所周知,特斯拉坚决不支持汽车界普遍力撑的激光雷达方案,而是坚持走纯视觉识别路线,AndrejKarpathy这次演讲,等于用一种硬核的方式,再一次向世界宣战。
我们将这次演讲的精华部分摘录下来,并以尽量简练的语言解释,于是就有了今天的文章。
什么是PyTorch?
要讨论AndrejKarpathy在这个视频里面说了什么,我们先来搞清楚一个概念——PyTorch。
PyTorch的「祖先」叫做Torch(意思为火炬),Torch是一个基于BSDLicense的开源机器学习框架,最早的Torch版本于2002年发布,主要应用于图像和视频类的深度学习,目前谷歌、Facebook、Twitter都应用了Torch的分支版本。

电动星球注:BSDLicense最早在1988年由加州大学伯克利分校起草,是目前给予使用者最高自由的开源协议,使用者基本上可以「为所欲为」地修改源代码,并且将代码打包成专有软件。
至于PyTorch,则是Torch使用Python语言编写的版本。
Torch的底层是由C语言和Lua语言编写的,C语言作为底层,而Lua语言作为深度学习库,两种语言都非常优秀,实际上目前仍然有很多大型企业采用Torch进行深度学习,比如上文提到的几家。
2017年1月,PyTorch正式在GitHub上发布,号称拥有更高的编译和运行效率,而实际上它也做到了——靠的就是Python语言。
一句话总结一下1989年出生的Python:常被戏称为「胶水语言」,因为Python能够基于其他语言的各种模块结合到一起。根据权威数据挖掘网站KDnuggets的调查,Python已经成为最受AI从业者欢迎的语言。

基于Python语言的PyTorch框架,也同样获得了众多企业和研究者的青睐。单说自动驾驶方面,除了特斯拉,Uber也和斯坦福大学基于PyTorch研发出开源概率编程语言Pyro。除此以外,Facebook、英伟达、美国艾伦人工智能研究所也都走在了PyTorch应用的前头。

特斯拉如何利用PyTorch?
AndrejKarpathy在演讲的开场这样说:「由于我们没有采用激光雷达,也没有采用高精度地图,所以Autopilot的一切功能,都依赖于来自车身四周8个摄像头提供原始图像之后,再进行的计算机视觉运算。」
他随后给出了一张流程图,里面是Autopilot工作的所有流程,有趣的是,AndrejKarpathy将这一套流程称为「OperationVacation(操作假期)」,他说「因为现阶段我的团队已经可以在椅子上葛优瘫,然后数据就会从特斯拉的车子上传过来,在神经网络模型上自己不断循环运行」:

特斯拉AI部门令人艳羡的「假期」里面,「PyTorchDistributedTraining」占了单独的一个部分——但凭什么呢?
先上结论:特斯拉利用PyTorch框架效率更高的特点,不断将Autopilot软件的并行学习性能进一步提升。

以上图为例,在以上的典型场景内,Autopilot需要同时处理10个不同类别的任务——而道路场景是极其复杂的,也就是说,Autopilot时刻面临着数十个任务并行处理的挑战。AndrejKarpathy的原话是「almost100tasks(几乎同时处理100个任务)」。

为了有效处理将近100个并行任务,特斯拉采用了「类ResNet-50」的骨干网络。那什么是ResNet-50?
随着深度学习研究的不断发展,深度学习神经网络也在不断加深,而随着网络深度的上升,训练准确度也会随之下降,ResNet就是因此而生,它的中文名叫做深度残差网络。ResNet有多个不同版本,包括ResNet30/50/101等,主要区分度在于Layer卷积层和Block区块数量上,这里就不展开了(毕竟是个汽车公众号…)。
然而,即使采用了更高效的网络,AndrejKarpathy依然表示「我们无法让每一个任务都享有单独的神经网络运算,因为同时处理的任务数实在太多,我们只能把一些运算分摊到共享骨干网络上」。
AndrejKarpathy将分摊到共享骨干网络上的任务称作「HydraNets(Hydra意为九头蛇)」,中二之余又不失准确。比如说下图高速公路上行驶时的物体识别:

还有SmartSummon模式下道路边缘的识别与确定:

AndrejKarpathy将这种类型的计算称为「在图像中进行预测,以空间和时间为维度将这些图像有选择性地部分删除,同时通过图像拼接和变换,以此让车辆明白现在所处的位置」:
另一个依赖PyTorch提升运行效率的,叫做RecurrentTasks。

RecurrentTasks是来自于RNN的运算任务,中文名有两个,有的翻译成循环神经网络,更主流的译法是递归神经网络,因为RNN有两个算法变体——一种是时间递归神经网络(recurrentneuralnetwork),另一种是结构递归神经网络(recursiveneuralnetwork),两者的缩写都是RNN。
RNN听起来虽然很阳春白雪,但它已经在实际应用中为我们默默服务了很久——机器翻译、语音识别、生物研究中的DNA序列分析,都应用了RNN运算。而在自动驾驶中,RNN通常被应用在前方道路预测中。

AndrejKarpathy举了以上的场景做例子,解释RecurrentTasks提升效率之后,对RoadLayoutPrediction(道路层预测)的重要性:
「我们给每台摄像头都配备了相应的HydraNets,但很多时候你需要同时采集多个摄像头的数据,然后再进行运算。比如说在过一个三岔路口的时候,我们有三个摄像头同时为这个场景的深度学习运算输入图像数据。此时的神经网络预测就不再只是单纯的图像识别,而是基于总-分结构的复合运算。」
谈到这个场景的时候,AndrejKarpathy顺便以此为例子,对HydraNets给出了进一步的解释:

「我们为所有的计算任务准备了8个HydraNets,当然所有HydraNets的运算任务都可以进一步进入RNN做递归运算。然后我们可以按照这样的总-分结构做输出。也就是说,Autopilot软件里面有一个大型的单一计算网络,然后每一个任务都可以分采样这个计算网络(接收到的图像)的一小部分,然后训练那一小部分的神经网络。」
「比如说,我们可以单独训练摄像头的障碍物探测功能,或者是色彩深度网络,又或者是道路布局网络。所有单一任务都分采样了图像数据的一小部分,然后单独训练那一部分(的神经网络)」。
接下来,AndrejKarpathy用了一张图展示了Autopilot软件需要处理的图像数据量:

乍眼一看,这张图里面只有两个数字是可以望文生义的:代表原因的8个摄像头和代表结果的4096幅图像。而其中的过程则相当复杂。
Timesteps和Batchsize需要一起讲,没有写中文是因为现在的深度学习界依然没有给它们一个比较信达雅的官方翻译。其中Batchsize代表了在深度学习网络中单一批次的数据数量,比如我们往一个RNN里面输入100条数据,分成10个Batch,那Batchsize就是10。
至于Timesteps则是预测最终值需要的最大「步数」,比如说Autopilot软件的Timesteps是16,也就是说每次会生成x0-x15,一共16组数据,最终预测结果——每次,指的就是图中每一个「Forwardpass」。
目前深度学习最热门的硬件是GPU,AndrejKarpathy则用了一张图来描述Autopilot神经网络对于GPU运算的要求有多高:

在图中显示的70000GPUHours,表示Autopilot深度计算网络如果用单一GPU运算需要用到7万小时——AndrejKarpathy的原话是「如果你用一组8个GPU去训练Autopilot的深度运算网络,你得花一年」——当然他没说用作对比的是什么GPU。
最后,AndrejKarpathy例牌吹了一波自家的FSD芯片,特斯拉的11分钟炫技至此全部结束——但这一次的PPT和4月份发布时有所不同,硬件3.0的工作功耗不再用250W/英里这样的单位定义,而是换算过来更低的「Sub100W(低于100W)」——至于是不是特斯拉式神优化,我们只能等FSD芯片大规模装机之后才能知道了。

结语
今天AndrejKarpathy的演讲,虽然不太准确,但我们可以尝试用一句话概括——特斯拉很希望把你的车变成一个人。
今年4月份FSD芯片发布的时候,AndrejKarpathy说过一句话,宣布了特斯拉与激光雷达彻底绝缘:「你会开车是因为你的眼睛看到了路况,而不是你的眼睛发射出激光」。今天,AndrejKarpathy也说了「我们不用高精度地图」。
于是,一辆逐步走向自动驾驶的特斯拉,在行为模式上会变得越来越像人——用眼睛收集图像数据,然后用大脑判断自身所处环境,指挥四肢做出行动。
特斯拉的逻辑似乎更接近人类本能,但却是汽车界实打实的少数派。传统汽车界,包括造车新势力,都对激光雷达和高精度地图抱有更高的信心。
