特斯拉是本人盈利倍数第二高的股市投资,财务数据和产品路线都比较熟悉,但是具体的技术却了解不多,因为保密以及DNA等原因,特斯拉公开的paper和技术细节资料都挺少的。有个朋友跳到特斯拉,印象最深的倒是她对加班之猛丝毫不输国内996的各种吐槽...... 吐槽归吐槽,几年了也没见她跑路,可见再大的困难,也没有什么是有理想加持的Money克服不了的。
言归正传,特斯拉AI部门老大Andrej Karpathy 在PyTorch Devcon 19 上做了一个技术演讲,包括AutoPilot 和Smart Summon等,本文是对这个演讲的详细剖析,可以一窥这个全球市值最高的汽车科技公司的内部AI技术栈。也可以看到学术界和工业界的gap有多大,比如课程上1个YOLO搞定的事情,实际工作中需要7个以上YOLO,而且是同时,还是在边缘端,如何实现呢?
作者:Jeremy Cohen 编译:McGL
当我们观察计算机视觉世界时,可以看到现实与网络课程之间的真实差距。
例如,你可能在一个在线课程中学习了如何运行 YOLO 网络,但是一个真实世界的案例可能要求在分布式 GPU 和混合网络架构中使用7个 YOLO 网络。什么鬼?我们在 Coursera 上可没学过这些东西!所以今天,我决定剖析一段来自特斯拉人工智能主管 Andrej Karpathy 的视频,并向你们解释特斯拉软件目前的情况。我将在本文的最后分享视频的链接。我希望你能意识到,没有什么是你不能理解的,至少从高层概念的角度看是这样。
我们将深入研究:
- 任务——特斯拉在做什么?
- 传感器——Autopilot使用了什么传感器?
- 神经网络——特斯拉如何构建其神经网络?
- 训练——网络训练是如何进行的?
- 全技术栈回顾——他们整套系统的概述。
特别是,我们需要解决特斯拉的一个大问题: 大约50个任务必须同时在设备上运行,只用一台计算机,不能占用太多的空间。
FSD计算机
那么让我们开始吧!
1. 任务
据伊隆 · 马斯克(Elon Musk)称,从2020年7月初开始,特斯拉已经接近完全自动驾驶汽车,也被称为Level 5级自动驾驶。不管是真是假,有一件事正变得越来越清晰: 特斯拉准备在其他任何人之前达到完全自动驾驶。一旦他们做到了,其他人很可能会很快跟进。
特斯拉达到Level 5级自动驾驶相当于运动员罗杰 · 班尼斯特(Roger Bannister)第一次在4分钟内跑完1英里。这个任务完全不可能实现,直到罗杰 · 班尼斯特做到了,然后大家都突然跟着做到了。
特斯拉汽车是做什么的?任何自动驾驶汽车(包括特斯拉)的主要功能,是保持在正确的车道上,以及遵循正确的轨迹改变车道。显然,像障碍物检测这样的任务是技术栈中很大的一部分。其他特性,如让汽车在停车场找到司机的智能召唤(Smart Summon)。这些额外的任务,和主车道及轨迹功能,都朝着长期目标前进: 全自动驾驶能力。
特斯拉需要处理所有这些任务
特斯拉的任务在今天是众所周知的。从车道检测,自动驾驶汽车最重要的特征,到行人跟踪,他们必须覆盖一切,并预测每一个场景。为此,他们使用了传感器。
2. 传感器
特斯拉使用了8个摄像头。这样他们可以覆盖周围所有区域的车辆,没有盲点。
8个摄像头看到的画面
这8个摄像头和其他的雷达融合在一起,这样他们就可以有效地定位和识别障碍物。雷达是非常好的互补传感器,因为它们可以直接估计速度。
这些摄像头图像是如何处理的? 使用神经网络。
3. 神经网络
在车辆、车道线、路缘、人行横道以及所有其他特定的环境变量之间,特斯拉有很多工作要做。事实上,他们必须同时运行至少50个神经网络才能使其工作。这在标准电脑上是不可能的。
特斯拉使用一种特殊的结构称为HydraNets,主干是共享的。
类似于迁移学习,你有一个共同的块和为特定的相关任务训练的具体的块,HydraNets 的主干用所有的目标来训练,头用于训练具体的任务。这提高了推理和训练速度。
特斯拉的神经网络
神经网络使用 PyTorch 进行训练,这是一个你熟悉的深度学习框架。
- 每个尺寸(1280,960,3)的图像都通过这个特定的神经网络。
- 主干是一个修改过的ResNet 50 ——具体的修改是使用“空洞卷积“。
- 这些头基于语义分割—— FPN/DeepLab/UNet 架构。然而,它似乎不是“最终任务” ,因为2D 像素和3D 之间的转换很容易出错。
特斯拉还使用了鸟瞰图
有时候,神经网络的结果必须用三维来解释。鸟瞰图可以帮助估计距离,并提供一个更好和更真实的世界理解。
使用鸟瞰图的特斯拉Smart summon
有些任务在多个摄像头上运行。例如,深度估计是我们通常在双目摄像头上做的事情。拥有两个摄像头有助于更好地估计距离。特斯拉使用神经网络进行深度回归来做这件事。
两个摄像头的深度估计
使用这种立体视觉和传感器融合,特斯拉不需要激光雷达。他们可以根据这两个摄像头进行距离估计。唯一的窍门是摄像头使用不同的镜头: 在右边,更远的距离显得更近。
特斯拉也有循环任务,如道路布局估计。这个想法是类似的: 多个神经网络分开运行,另一个神经网络建立连接。
可选地,这个神经网络可以是循环的,因此它涉及到时间。
?特斯拉的主要问题是,它使用8个摄像头,16个时间步长(循环架构) ,batch size为32
这意味着每向前传递一次,就有4096张图像被处理。我不知道你怎么想,反正我的 MacBook Pro 不支持这个。事实上,1个甚至2个 GPU 都不能做到这一点!为了解决这个问题,特斯拉在 HydraNet 架构上下了大赌注。每个摄像头都是通过一个单一的神经网络处理的。然后将所有的信息组合成中间神经网络。令人惊奇的是,每一个任务只需要这个庞大网络的一小部分。例如,目标检测只需要前置摄像头,前面的主干和第二个摄像头。当然不是所有的任务都按同样的方式处理。
特斯拉应用的8个主神经网络
4. 训练
网络训练用的是 PyTorch。需要多个任务,并且要花费大量的时间来训练所有48个神经网络头。事实上,训练需要GPU 70,000小时才能完成,差不多是8年。特斯拉正在改变训练模式,从“轮询”(round robin)到“工人池”(pool of workers)。idea是: 下面左边—— 一个漫长而不可能的选择。中间和右边,是他们使用的替代品。
我没有很多细节可以分享,但是从本质上说,这些工人池并行的任务使网络更快。
5. 完整的栈回顾
我希望你现在对它的工作方式有了一个清晰的认识。这并不是不可能理解的,但是和我们可能习惯的东西绝对是不同的。为什么?因为它涉及到非常复杂的现实世界问题。
在一个完美的世界里,你不需要 HydraNet 结构——你只需要在每个图像和每个任务中使用一个神经网络...... 但是这是不可能做到的。
除此之外,特斯拉必须不断改进其软件。
他们必须收集和利用用户的数据。毕竟,他们有成千上万的车辆在行驶,如果不好好利用他们的数据来改进模型就太愚蠢的。每个数据都被收集、标记并用于训练; 类似于所谓的主动学习(active learning)过程。
下面是完整的循环。
特斯拉全栈
让我们从下到上来定义栈。
- 数据——特斯拉从这些车辆中收集数据,并由一个团队给数据打上标签。
- GPU 集群—— Tesla 使用多个 GPU (称为集群)来训练和运行它们的神经网络。
- DOJO ー Tesla 使用一种他们称之为 DOJO 的东西来训练整个架构的一部分来完成特定的任务。这和他们在推理中所做的非常相似。
- Distributed Training ーー特斯拉使用 PyTorch 进行分布式训练。
- 评估——特斯拉用损失函数评估网络训练。
- 云计算推断——云计算处理允许特斯拉同时改进其车队。
- 推理@FSD ——特斯拉制造了自己的计算机,拥有自己的神经处理单元(NPU)和用于推理的GPU。
- 影子模式——特斯拉从车辆中收集结果和数据,并将它们与预测进行比较,以帮助改进标注: 这是一个闭环系统!
⏩ 这是原视频,包含了我刚刚写下的所有内容描述,和我给你们看过的图片。
你可能会觉得我刚才详细介绍的一切信息量过大。它比大多数课程教授的要高级得多,这也是正常的。然而,这就是今天公司的运作方式。很少有公司能够直接使用预先创建的卷积层而不做任何修改。下面是我们刚才讨论的所有内容的总结:
- 特斯拉同时运行50项任务,这些任务都必须在一台名为 FSD (完全自动驾驶)的非常小的计算机上运行。
- 为了做到这一点,他们使用了一个 HydraNet 架构,这个架构允许他们在每个任务中使用相同的网络,只是使用不同的头。所有的头都与图像分割有关。
- 特斯拉使用8个融合在一起的相机,并不是每个相机都用于一个任务。
- 训练是使用 PyTorch 和一个工人池架构完成的(有些任务是同时训练的)。
- 实现了一个完整的循环: 司机收集数据,特斯拉标记真实世界的数据,并在其上训练他们的系统。
特斯拉的目标是成为第一家实现完全自动驾驶的公司。今天,他们是全世界市值最高的汽车公司,他们不打算停在那里。他们正面临着许多有趣的挑战,这些挑战是我们在舒适的家中学习人工智能和深度学习时不习惯面对的。
原文:https://heartbeat.fritz.ai/computer-vision-at-tesla-cd5e88074376