马上就是AI Day 了,特斯拉的年度技术派对即将盛大开启。猜猜这次老马会带来哪些爱将上台,会有几个擎小柱机器人出场炫技?

温故而知新,这几天把去年翻译的AI Day整理了一下,重制了视频,记录了文字。这是前85分钟演讲部分,全文约2万2千。后续单独再发随后50分钟的问答部分。
源视频:Tesla / 翻译及字幕:瓦砾村夫
一 开场白 
Elon Musk
大家好!
抱歉耽搁了。感谢各位的到来,抱歉我遇到了一些技术问题,的确需要人工智能来解决问题。
我们今天要展示的是,特斯拉不仅仅是一家电动汽车公司,我们在硬件,推断,训练各方面都有深入的人工智能技术研发。可以说,我们是现实世界人工智能的领导者,我们的人工智能适用于现实世界。

对于那些观看过FSD测试版表现的人,我很欣赏特斯拉神经网络学习驾驶的速度。这是人工智能的一个特定应用,但我认为未来会有更多有意义的应用,我们会在稍后的演讲中讨论这个问题。
我们想鼓励任何有志于解决现实世界人工智能问题的人,无论是在硬件还是软件层面,请加入特斯拉,或者请考虑加入特斯拉。
接下来,从Andrej开始吧。
二 视觉模块 
Andrej Karpathy
很好。嗨,大家好,欢迎!
我的名字是Andrej,我是特斯拉autopilot视觉团队的负责人,我很激动能在这里为这个部分开场。
我将带你深入了解autopilot技术栈,并向你展示汽车自动驾驶表象之下的各个模块,我们将从视觉组件开始。

在视觉组件中,我们在设计一个神经网络,以处理原始信息,在我们的例子中,是车辆周围的八个摄像头。它们发送图像,我们需要把图像实时处理成我们所说的向量空间。这是驾驶所需所有信息的三维表示,包括路线、边、路缘的三维位置,交通标志、交通灯、汽车,以及它们的位置、方向、深度、速度等。
我要播放一段视频,请稍等。
在这里,我展示了进入技术栈的原始视频输入,然后神经网络对此进行处理,将其转化到向量空间中。你会看到在车机上渲染的一部分向量空间。
令人着迷的是,我们事实上正在从头开始创建一种人工合成的动物。这里汽车可以被视作为一种动物,它四处走动,感知环境,而且它能自主而富有智能地行动。而我们正在自主研发,从头开始构建所有的组件。

我们当然正在构建其身体的所有机械部件,构建神经系统,即所有电子元件,对我们而言,就是autopilot的大脑。以及特别的,和本次演讲相关的,合成视觉皮层。
生物的视觉皮层实际上具有相当复杂的结构,一些区域用于组织大脑的信息流。特别的,在你的视觉皮层中,光线首先到达视网膜,穿过外侧膝状体(LGN),一直到达视觉皮层的后端,穿过多个视觉皮层(v1、v2、v4)、IT、腹背流(venture)及背侧流(dorsal)。
信息按照一定的布局进行组织。当我们设计汽车的视觉皮层时,我们还想同时设计信息在系统中流动的神经网络架构。当光线照射到"人造视网膜"时,处理流程就开始了。我们将使用神经网络来处理这些信息。
我将大致按时间顺序来组织这部分演讲。我会从某些神经网络开始,回顾下大约四年前我加入团队时,它们是什么样子,然后它们如何随着时间发展。

大约四年前,车辆基本上还只能在高速公路的同一条车道内往前开,它得保持车道,并且得与前车保持距离。那时,所有的处理都是在单张图片层面进行的,单张图片必须由神经网络进行分析,并处理成向量空间的一小部分。
处理的形式为:我们获取分辨率为1280x960,每通道为12位整数,以约36赫兹的频率流入的图片,然后我们用神经网络进行处理。
我们实例化一个特征提取器主干,这个例子里,我们使用残差神经网络。我们有一个主干和一些串联的残差块。我们使用的特定残差网络是Regnets,因为Regnets为神经网络提供了非常好的设计空间,因为它们可以让你很好地权衡延迟和准确性。
这些Regnets为我们提供了不同尺度,不同分辨率的许多特征作为输出。特别在这个功能层次结构的最底层,有着非常高分辨率的信息,通道数非常少;而在顶部,空间分辨率很低,而通道数很多。
在底层,我们有大量神经元在仔细检查图像的细节。在顶部,我们有神经元可以看到图像的大部分,并且掌握了很多场景上下文信息。
然后我们喜欢用特征金字塔网络进行处理。在这里例子里,我们比较喜欢使用BiFPNs,它们能在多个层面上有效地互相交换信息。
例如,如果你是网络底层的一个神经元,你只看到图像的一小部分,你不确定这是不是一辆车;从顶层能知道,嘿,这实际是这条高速公路的消失点,这绝对有所帮助,这可以帮助你消除这是否是一辆汽车的歧义。
在BiFPN和跨尺度特征融合之后,我们就进入了因任务而异的头部。例如,如果你正在进行物体检测,我们有一个单步骤的类yolo的物体检测器。我们初始化一个栅格,每个位置都有一个二进制比特表示那个地方是否有汽车。
除此之外,这里还有一些你可能感兴趣的其他属性:x、y、高度偏移或任何其他属性,比如这是什么类型的汽车等等,这些是为了做检测用的。
我们很快发现,我们不仅仅想检测汽车,还想完成大量的任务。例如,我们想完成交通灯的识别和检测,车道预测,等等。很快,我们的设计就收敛为这种有公共共享主干的结构布局,然后分出若干个头。因此,我们称之为"九头蛇网络",这些是蛇的不同的头。
这种结构布局有不少好处:
第一,由于特征共享,我们可以在测试阶段分摊在车上运行的前向推断,以达到很高效的运行。因为如果我们为每一项任务设立一个主干的话,车上就会有太多主干了。
第二,这会解耦所有的任务,因此我们可以单独的处理每一项任务。例如,我们可以升级任何数据集,或更改头部的某些架构,等等,而不影响任何其他任务。我们不必再重新验证所有其他任务,避免了昂贵的开销。
第三,因为特征这里存在瓶颈,我们经常做的是,将这些特征缓存到硬盘。当我们进行微调时,我们只对缓存的特征进行微调,并且只对头部进行微调。
对于我们的训练工作流来说,最经常发生的是,我们将时不时进行一次端到端的训练,把所有内容综合在一起进行训练。
然后,我们在多尺度特征级别缓存特征。我们基于此数据进行一段时间的微调,然后再进行一次端到端的训练,依此类推。
这是几年前,我们从其中一个九头蛇网络获得的预测结果。再说一下,我们处理的是单张图片,我们处理单张图片,我们对这些图片进行大量的预测。
例如,在这里你可以看到对于停车标志的预测,停止线,线条,边缘,汽车,交通灯,这里的路缘,车辆是不是停着。所有静态物体,如垃圾桶、警示锥等,所有这一切都是网络预测出来的,这个例子里,是九头蛇网络。
这一切都很不错,但是当我们实现FSD时,我们很快发现这还不够。当我们开始实现智能召唤功能时,我们第一次裂开了。
在这里,我展示一些仅仅检测路缘的任务的预测结果,我现在正在展示每一个摄像头的预测结果。我们想在停车场里转转,去找到召唤汽车的主人。现在的问题是,我们不能直接基于图像空间的预测进行驾驶。事实上,我们需要把它们变换到一个所谓的向量空间里。
我们尝试使用了C++来实现这一点,并开发了我们当时所说的"空间占用追踪器"。这里,我们看到图像中的路缘检测结果进行了拼接,跨越摄像头中的场景,摄像头的边界,和时间的变化。
然后,关于这个设计,出现了两个主要的问题:
第一,我们很快发现,调整空间占用追踪器及其超参是一件非常复杂的事。我们肯定不想在C++中手动显式的调参,我们希望调参发生在神经网络内部,并进行端到端的训练。
第二,我们很快发现,图像空间并不是正确的输出空间。我们不想在图像空间中进行预测,我们想直接在向量空间中做预测。
这个图展示了这个问题。第一行展示的是,对于路缘和路线的预测,以红色和蓝色显示。它们在图中看起来很棒,但是一旦你把它们变换到向量空间,一切看起来就很糟糕了,这些信息是没法用来指导驾驶的。
你看到了,预测结果在向量空间中,是多么的糟糕。问题的根本原因是,我们需要每个像素具有极其精确的深度值,以完成投影计算。你可以想象,在图片的每个像素上如此准确地预测深度,这有多难。
以及如果对于任何被遮挡的区域,想要进行预测,我们没法做到这一点。因为在那种情况下,它不是一个图像空间的概念。
顺便说一下,其他与物体检测有关的问题也一样。如果我们仅仅对每个摄像头单独进行预测,那么有时就会遇到这样的情况:某辆汽车实际上横跨了八个摄像头中的五个。
因此,如果我们逐摄像头单独预测,那么,没有任何一个摄像头看到了车辆的全貌,很明显,我们将不能很好的预测整辆车。而融合这些预测结果将是一个极其困难的任务。
我们的直觉是,应该换个方法,一次性获取所有图像,并同时将它们输入到单个神经网络中,然后直接输出到向量空间。
这件事说起来容易,实现则要困难得多。但大致上,我们想以这种方式设计一个神经网络。我们用主干处理每张图像,然后以某种方式把它们融合在一起。我们想把图像空间的特征直接表示成向量空间里的某种特征,然后进入头部进行解码。
这里有两个问题:
问题一,如何创建神经网络的组件,以完成空间转换?这个转换必须是可微的,以能实行端到端的训练。
第二,如果想通过神经网络进行基于向量空间的预测,我们需要基于因向量而异的数据集。只是在图像上进行标注就不够了,我们需要向量空间里的标注数据。
我们将在后面的演讲中更多地讨论第二个问题,现在,我想先专注于神经网络架构,我要深入介绍下第一个问题。
这是大致的问题,对吧。我们正在尝试进行基于这种鸟瞰视图的预测,而不是图像空间预测。
例如,让我们关注输出空间中的单个像素,以黄色表示。作为例子,这个像素正尝试决定自己是不是路缘的一部。那么,图像空间该如何支持这类预测?
嗯,我们大致知道摄像头的位置以及它们的内参和外参,因此,我们可以粗略的地将这个点投影到摄像头图像中。
这一点是否是路缘,证据可能来自于图像中的某个地方。问题在于,这个投影很难计算正确,因为它是马路表面的函数。
路面可能向上或向下倾斜,而且也可能存在其他数据相关的问题,例如,可能会因为汽车而产生遮挡。如果有一辆车挡住了这个视口,图像的这一部分,那么,你可能想要关注图像的另一部分,而不是它投影到的那部分,因为这是数据相关的。
很难为这个组件设计一个固定的转换。为了解决这个问题,我们使用了一个transformer来表示这个空间。而这个transformer,它基于多头自注意力搭建而成。
在这个例子里,实际上我们甚至可以只通过一个积木块来完成大量工作。这样做等效于,我们初始化一个想要的和输出空间大小相同的栅格。然后在输出空间中,用sin和cos函数计算得到的位置编码进行平铺,然后用多层感知器(mlp)将它们编码成一组查询向量。
然后,所有的图像及其特征也生成它们自己的键码和值。然后把查询键码和值输入给多头自注意力。
这样做的效果是,每一个图像片段通过它的键码进行广播,它是什么物体的一部分:嘿,我是柱子的一部分,大致在这个位置,我能在键码里看到这类信息。
然后,每个查询都类似于:嘿,我是输出空间中这个位置上的一个像素,我正在寻找这种类型的特征。
把键码和查询组合相乘,然后返回值相应地被汇集。这样做重新定义了空间,我们发现它对于这种转换非常有效。
如果所有的技术活都干对了,这又是说起来容易,做起来难的事,但假设所有的技术活都干对了... 噢,事实上在此之前,还有另一个问题,我不知道幻灯片有什么问题。
还有一个问题,当你尝试这种方法时,你必须小心处理这里的一些细节。特别是,我们所有汽车的摄像头视角都略有偏差。如果你正在进行从图像空间到输出空间的转换,你需要知道摄像头的校准参数是什么,你需要以某种方式将它输入神经网络。
你当然可以拼接所有图像的摄像头校准参数,并以某种方式将其输入给多层感知器。我们发现,如果把所有图像转换到一个合成的虚拟摄像头中,效果更好。
如果使用特殊的矫正变换,这就是它应该的样子。我们在图像校正层之上插入一个新层,它是摄像头校准参数的一个函数,它将所有图像转换到一个虚拟的公共摄像头中。
例如,如果你要对后视摄像头的很多重复图像进行平均化运算,如果不这样做,就会有点模糊。但是做过校正变换之后,你能看到后视图像变得很清晰。一旦这么做了,效果将大为改善。
这里是一些结果。左边是以前的结果,在右边,我们看到的是,神经网络直接预测得到的结果大为改善。这是一个直接在向量空间中进行预测的多摄像头网络,你能看出来这两个结果天差地别。
基于这个结果就能进行驾驶了。这花了不少时间,AI团队付出了不少令人赞叹的工程努力,才能使它真正工作,并在车内高效运行。这个方法也大为改善了物体检测的效果。
例如在这个视频中,我用橙色展示单摄像头预测的结果,蓝色展示多摄像头预测。如果你只看到车身的一小部分,基本上你无法预测这些车辆,检测结果不会很好,它们的位置预测也不会很好。但多摄像头网络就没这个问题。
这是另一个视频,场景更有象征性。我们看到这些狭小空间里的汽车,跨越了摄像头的边界,很多无用信息都参与了预测。基本上,特别是对于像这一大型车辆,所有的设置都失去了意义。我们可以看到,多摄像头网络在这类预测上遇到的困难要少得多。
好的,目前为止我们实现了多摄像头网络,它们直接在向量空间中给出预测。但我们仍然在每个时间点上完全独立地进行计算。
很快,我们发现需要做出大量的预测。这些预测需要视频的上下文,而我们需要弄清楚如何将上下文输入网络,特别是,这辆车是否处于停车状态?它在移动吗?移动的速度有多快?即使暂时被遮挡了,它是否还在那里?
或者例如,如果我试图预测前方道路的形态,如果能知道我五十米之前看到的标志牌或者道路标记,将很有帮助。
因此,我们尝试将视频模块集成到我们的神经网络架构中,这是我们集中采用的解决方案之一。
我们之前已经使用了多尺度特征,我们现在要插入的是一个特征队列模块。随着时间的推移,它将缓存一些特征值。然后是一个视频模块,它将临时融合这些信息,然后,继续进入负责进行解码的头部。我将一一介绍这两个模块。
另外请注意,我们也将输入动力学数据,即速度和加速度。它们描述了汽车是如何移动的。我们不仅要追踪从所有摄像头看到的图像,还要追踪汽车是如何行驶的。
这里是特征队列和它的大致布局。随着时间的推移,我们基本上会把这些特征以及汽车的动力学数据联系在一起。还有位置编码,它们被关联,编码并存储在一个特征队列中。视频模块将消化这些数据。
这里也有一些细节要保证正确,特别是关于出栈和压栈的机制,特别是什么时候压栈。
这是一张卡通流程图,展现了这里的一些挑战。我们的汽车从下面驶来,来到这里的十字路口,然后车流将开始在我们面前横穿而过,前面的一些车会因此而暂时被遮挡。我们会在这个十字路口停留一段时间,直到轮到我们通行。
这是经常发生的事情,这是其中一些挑战的卡通展示。
第一,对于特征队列,以及我们想要压栈的时机,显然,我们想要一个基于时间的队列。例如,我们每27毫秒将特征输入到队列中。
如果一辆车暂时被遮挡,那么,神经网络将有能力及时查看并引用有关时序的内存,并且了解到,嘿,虽然这东西现在看起来被遮挡了,但在之前的特征中有记录,因此仍然可以用它来进行检测。
更显然,同时也是必要的是,例如,假设你正在对前方的路面和道路形状进行预测,而且你正努力预测自己是不是在一条转弯车道上,而我们旁边的是直行车道,那么,真的有必要理解路线标志和标记牌。
有时,它们很久之前就已经出现了。如果你只有一个基于时间的队列,那么你在等红灯时,就可能忘记这些特征。
因此,除了基于时间的队列,我们还有一个基于空间的队列。每次汽车行驶一定的距离,我们都会把特征压入栈内。
其中一些细节至关重要,在这个例子里,我们有一个基于时间的队列和一个基于空间的队列来缓存特征,然后特征继续进入视频模块。
对于视频模块,我们尝试了如何在时间轴上融合这些信息的多种可能性。我们尝试了三维卷积,transformer,轴向transformer,努力让它们更高效,各种不同风格的RNN(循环神经网络)。
但我们非常喜欢的,也是我想花一些时间介绍的,是一个空间RNN视频模块。
我们的做法是,因为问题的结构,我们在二维地面上行驶。我们实际上可以将隐藏状态组织成一个二维点阵,然后当汽车行驶时,我们只更新汽车附近并可见的部分点阵。
当汽车行驶时,我们利用运动学来积分计算隐藏特征网格中汽车的位置。我们只对车辆附近的点更新RNN。
这个例子展示了这个过程。这里,汽车正在四处行驶。我们看到的是这个RNN的隐藏状态,这些是隐藏状态的不同数据通道。你可以看到,在优化和训练这个神经网络之后,一些数据通道正在追踪道路的不同数据,例如道路的中心,边缘,路线,路面等。
另一个很酷的视频,这是隐藏状态中前10个通道的平均值,每个通道对应不同路口的不同行驶。
我想让你们看的是,这里发生了一些很酷的事情。由于RNN正在随时追踪正在发生的事情,你可以想象,我们已经赋予神经网络能力,以有选择地读写内存。
例如,如果我们旁边有一辆车,挡住了道路的某些部分,那么,现在网络有能力不写入这些位置。但是当汽车开走时,我们的视野恢复了,那么RNN就可以说,好的,视野清晰可见了,我们想要写入空间那个部分的占用情况了。
这里有一些预测的结果。这里,我们对道路边界进行预测,显示成红色,交叉路口显示成蓝色,还有道路中心等。为了看起来清楚,我们在这里只展示了其中一些预测结果。
是的,这是由空间RNN预测的。只展示了单个视频片段,单次行驶,但你可以想象,这里可能会有多次行驶。基本上许多汽车,许多视频片段就可以共同构建这张地图。这基本上就等效于高清地图,只不过它不是一个定义了显式物体的空间,它位于RNN的特征空间中。
这有点酷,我之前从没见过。
视频网络也大大改善了物体检测。在这个例子中,我想展示一个例子,那里有两辆车,一辆车将驶过并短暂地挡住它们,看看当汽车从我们面前经过时,单帧预测和视频预测各自的表现如何。
是的,这很有意义。我们快进一下,展示正在发生的事情。当两者都在视野中时,预测结果大致相同。你会看到有多个橙色的框,因为它们来自不同的摄像头。
当它们被遮挡时,单帧网络的检测失效了,但是视频模块记住了它,车子仍然被检测出来了。当它们只是部分被遮挡时,单帧网络被迫基于它所看到的信息,做出最好的猜测。它被迫做出预测,并做出了一个非常糟糕的预测。
但是视频模块知道这只是一部分,它有历史信息,它知道这不是一个很容易看到的部分,因此没有管它。我们还看到网络预测深度,特别是速度的能力显著提升。
这里,我在展示"移除雷达"项目相关的一个视频片段。我们看到的是雷达深度和速度,以绿色展示。我们只使用视频网络,就要努力匹配甚至超越雷达信号。
你在这里看到橙色的,是单帧预测的效果,蓝色的,仍然是视频模块的效果。你能看到,预测的深度的质量要高得多。而对于速度,橙色信号,显然无法通过单帧网络获得速度,我们只能通过差分深度来计算得到速度。视频模块的结果曲线实际上都在雷达信号之上。对于我们来说,这样做行之有效。
把所有模块组合在一起,就是我们当前架构的大致样子:
从底层输入原始图像,通过校正层来施行摄像头校准,并将所有图像拼接到一个公共的虚拟摄像头中。
regnets残差网络将它们处理成不同尺度的多个特征,将多尺度信息与BiFBN融合,通过一个transformer模块将融合结果重新表示到向量空间,即输出空间中。
结果输入到一个基于时间或空间的特征队列。队列由一个视频模块进行处理,例如空间RNN。然后继续进入九头蛇网络的分支结构,主干和头部用于不同的任务。
这大概就是目前的架构。在右边,能看到一些预测结果,同时展示了一个鸟瞰视角的向量空间,以及图像空间。
从大约三四年前非常简单的基于图像的单一网络开始,这个架构已经复杂了许多,并在继续发展。我们的团队仍在积极致力于架构改进,这绝对令人震撼。
例如,你会注意到对于神经网络而言,时空融合发生的相当迟。也许我们可以更早的将空间或时间进行融合,并在底部实现类似于代价体或光流之类的网络。
或者,我们的输出是密集的栅格,在车内对这些密集的栅格进行后处理,开销巨大,而我们当然有非常严格的延迟要求。因此,现状并不理想。
我们实际上正在研究各种方法,只预测道路的稀疏结构。我们可能只进行点到点的预测,或以某种不需要很大开销后处理的方式。
以上基本就是,如何获得一个非常不错的向量空间。接下来,我相信Ashok会介绍,基于此我们如何实行驾驶控制。
三 规划和控制模块 
Ashok Ellaswamy
谢谢Andrej。
大家好,我叫Ashok。我负责规划和控制,自动标注和仿真团队。
就像Andrej提到的,视觉网络获取密集的视频数据,然后将其压缩成三维向量空间。
而规划器的作用是,利用向量空间,让汽车到达目的地,同时最大限度地提升汽车的安全性,舒适性和效率。
即使早在2019年,我们的规划器也已经是很有经验的司机了。它能够保持车道,按需要变道,并从高速公路出口驶出。但城市街道的驾驶要复杂得多,很少有结构化的车道线,车辆也会更自由地驾驶。然后,汽车必须对所有过往车辆和表现出奇特行为的路人做出反应。
规划的关键问题是什么?
第一,很明显,行为空间是一个非凸空间。
第二,它是一个高维问题。
我所说的非凸是指,可以有多种可能的解决方案,各自独立来说,都是好方案,但是获得全局一致的解决方案是很难的,可能会有一些局部最小值让规划陷入困境。
其次,说它是高维问题,是因为汽车需要规划接下来10到15秒的行为,并且需要为整个时间窗口估计出位置,速度和加速度,运行时需要生成大量的参数。
离散的搜索方法非常适合解决非凸问题,因为搜索是离散的,不会陷入局部最小值,而连续函数的优化则很容易陷入局部最小值,并生成不如人意的解决方案。
另一方面,对于高维问题来说,离散搜索却很糟糕。因为搜索是离散的,它不使用任何梯度信息,那么就必须搜索每个点,才能知道它有多合适。而连续优化则使用基于梯度的方法,可以非常快速地找到一个好的解决方案。
对于这个矛盾,我们的解决方案是按层级分解。先用粗略搜索的方法解决非凸性,得到一个凸的行车空间,然后使用连续优化技术,平滑最终的行驶轨迹。
让我们看一个搜索的例子,在这里我们尝试切换车道。在这种情况下,汽车需要做连续两次变道才能在前方完成左转。为此,汽车会搜索不同的机动方案。
它搜索的第一个方案是尽快变道。但是汽车刹车会很猛,让人很不舒适。
下一个方案是稍微晚一点变道,加速,跟紧前车,超车,然后变道,但这样可能会错过左转。
我们在很短的时间之内,完成数千次类似的搜索。因为这些计算都是基于物理模型的,对未来的模拟就很容易。
然后,我们得到了一组候选方案。最后,我们根据安全性,舒适性和转弯容易程度的最佳组合选择最终方案。大家看到,汽车选择了这条路径。可以看到,当汽车执行这条路径时,它几乎和我们的计划完全匹配。
右边的青线,是汽车的实际速度,它下面的白线是计划速度,我们做了10秒的计划。事后回顾,实际执行与此一致,这是一个制定的不错的计划。
当与其他车辆一起驾驶时,重要的是,不能只为本车做计划,而是要作出整体的规划,针对整体场景交通进行优化。为了做到这一点,我们为场景中的每个相关对象都运行autopilot规划器。这个例子展示了这样做的必要性。
这是一条行车道,大家先看会儿视频。
是的,那是autopilot在自动驾驶,车辆绕过了停放的汽车,警示锥和杆子。这里是相同场景的三维视图。
有辆车迎面而来,autopilot稍微放慢了速度。
但它紧接着意识到我们不能主动避让,因为我们这边没有任何空间,而对面来车可以避让。所以相较于在这里盲目的刹车,autopilot判断对面车辆的速度足够低,可以靠边停车,它应该会给我们让路。因为我们没法让路,于是果断地前行。
·对面来了第二辆车,车速稍快些。
如我所说,我们也为本车以外的物体运行autopilot规划器。在这个例子里,我们为对面来车运行了规划程序。
对面来车的计划是,绕开它这一侧的停车,在绕开停车后,开到道路上自己的右侧。
因为我们不知道司机是怎么思考的,实际上我们会推算对面来车的多种可能的未来。这里一种未来显示为红色,另一种显示为绿色。绿色是主动给我们让路的规划。
但由于这辆车的速度和加速度相当高,我们判断对面的司机不会主动给我们让路,他应该会绕过这些停放的汽车。所以autopilot决定了,好,我这里有空间,那辆车肯定会开过来,所以我要靠边停车。
autopilot开始靠边时,我们注意到,对面的车已经选择了给我们让路,这是基于它的偏航速度和加速度判断出来的。因此,autopilot马上改变主意,继续前进。
这就是为什么我们需要整体规划,否则我们不会知道那位司机会绕过其他停着的汽车,靠边停车。如果不这样做,autopilot就会过于犹豫,没法让汽车真正能够自动驾驶。
我们看到了对于他人的搜索和规划如何搭建起问题的凸空间。最后,我们进行连续优化,以生成规划器能采用的最终轨迹。
这里的灰色形状是凸的行车道。我们基于规划弧长的采样,初始化方向和加速度的样条曲线。并且你可以看到,妥协方案不断进行细粒度的调整,以降低整体的代价。
例如,某些代价定义为与障碍物的距离,行驶时间和舒适度。对于舒适度,你可以看到右侧的横向加速度图具有漂亮的梯形形状。在右侧,绿线是一个漂亮的梯形形状,如果你记录了人类驾驶员的轨迹,这几乎就是它的样子,横向冲击也降到了最小。
总而言之,我们会为自己和场景中的其他人进行搜索。我们设置了一条凸的行车道,然后再优化出一条平滑的路径。同时使用这些技术,可以做一些非常巧妙的事情,如上图所示。
但在其他地方,比如我从小长大的地方,开车的情况可能很不一样。它更加没有规则,汽车和行人相互穿切,踩急刹车,摁喇叭,这是一个疯狂的世界。
我们可以尝试扩大这些方法的规模,但在运行时有效地解决这个问题,真的很困难。相反,我们想要做的是,使用基于学习的方法来有效地解决它们。我想展示为什么要这么做。
我们从这个复杂问题跳到一个更简单的停车问题,但仍然能说明问题的核心。
这是停车场,我们的车是蓝色的,它需要停在这里的绿色车位。它要绕过路缘,停放的汽车和警示锥,这些用橙色显示。
让我们运行一个用A*算法实现的简单基准,一种使用基于晶格搜索的标准算法。这里的启发方法是距离,和目标之间的欧几里德距离。
你可以看到它直接指向目标,但很快就会陷入局部最小值的泥沼。它从那里进行回溯,然后搜索不同的路径,试图绕过这辆停着的汽车。最终它取得进展并到达了目标,但最终使用了40万个节点来达成目标。
显然,这是一种糟糕的启发方法,我们想要做得更好。
如果给汽车添加一条导航路线,并且让它沿着导航路线行进,同时接近目标,就会变成这样。导航路线立即发挥了作用,但是当车辆遇到警示锥或其他障碍物时,它的表现基本上和之前一样:回溯,然后搜索所有新路径。
搜索算法不知道存在着这些障碍物,搜索算法需要尝试每个节点,检查车子是否发生碰撞。如果发生了碰撞,就回退。
导航启发信息的确有帮助,但这个方法仍然需要2万2千个节点。
我们可以设计越来越多的启发式方法来帮助搜索,让搜索变得越来越快,但是设计一个全局最优的启发式方法既繁琐也很困难。即使你使用了与警示锥的距离函数来指导搜索,那也只会对单个警示锥有效,但我们需要的是一个全局函数。
因此,我们转而想使用神经网络来提供启发信息。视觉网络生成向量空间,我们的车辆在其中移动。这基本上看起来像一个Atari公司的游戏,而且是个多人版本。
我们可以使用诸如mu0、alpha0等技术,这些是用来解决围棋和其他Atari游戏的问题的。我们正在研究可以产生状态和行为分布的神经网络,然后可以将其连接到具有各种代价函数的蒙特卡洛树搜索(mcts)中。
一些代价函数可以是显式的,如距离,碰撞,舒适度,行驶时间等,但它们也可以是来自于实际驾驶的手动干预。我们为简单的停车问题训练一个这样的网络。
回到这个问题,让我们看看mcts是如何搜索的。这里你会注意到,规划器基本上能够一下子就找到前进的路径。注意,这甚至都没有使用导航的启发信息。只要给定场景,路径规划就可以直接朝着目标前进。
你看到的所有其他选项,都是可能的选项。它没有选别的,直接选择了直奔目的地。原因在于,神经网络能够吸收场景的全局上下文,然后产生一个价值函数,有效地引导它走向全局最小值,而不是陷入局部最小值。而这只需要288个节点,比使用欧式距离启发的A*算法少了几个数量级。
这就是最终架构的样子:
视觉系统把密集的视频数据压缩为向量空间,它将同时被显式规划器和神经网络规划器使用。除此之外,神经网络规划器还可以消费网络生成的中间特征,它们共同产生了一个行进轨迹的分布。而这,可以使用显式代价函数,人工干预和其他的仿造数据进行端到端的优化。然后,结果进入显式的规划函数,完成计算,并为汽车生成最终的转向和加速指令。
接下来,我们要介绍如何训练这些网络。为了训练这些网络,我们需要大型的数据集。欢迎Andrej简要谈谈人工标注。
四 人工标注 
Andrej Karpathy
是的,数据集当然很关键。
目前为止,我们只讨论了神经网络,但神经网络仅仅为结果的质量设立了上限。很多神经网络有数亿个参数,这几亿个参数需要正确的设置。如果参数设置不当,网络将无法正常工作,因此神经网络只是一个上限。
我们还需要大量的数据集来训练正确的算法,特别是,我提过我们想要数据集直接定义在向量空间中。因此,真正的问题变成了如何积累数据。
因为网络有数亿个参数,我们如何积累数以百万计的向量空间的样例,纯净且多样化,可以有效地训练神经网络。
这里是一个数据集如何随着我们的模型和开发一起演变的故事:
当我大约四年前加入特斯拉时,我们是与第三方合作以获取大量标注数据的。不幸的是,我们很快发现,与第三方合作来获取如此关键的数据集,并不靠谱。与第三方合作的延迟非常高,而且老实说,质量并不令人满意。本着特斯拉彻底垂直整合的精神,我们将所有标注工作收回到公司内部。
随着时间的推移,我们已经发展了一个超过一千人的数据标注团队,全部都是专业的标注师。他们与工程师密切合作,他们就在美国,并与当地的工程师共处一地。
我们密切合作,我们还自己从头搭建所有的软件基础设施,供他们使用。我们有一个开发和维护所有这些数据标注基础设施的团队,晚些会和大家见面。
例如,这里大家能看到,用于维护标注流程的延迟,吞吐量和质量统计数据的一些截图;以及所涉及的人员,所有任务以及标注数量如何随着时间的推移而增长。
我们发现这么做很关键,而我们也为此感到自豪。
一开始,大约三四年前,我们大部分的标注都是在图像空间中进行的。你可以想象,需要相当长的时间来标注这样一副图像。就像这样,我们在这些单张图像上绘制一些多边形和折线。如我所说,我们需要数以百万计的向量空间标注,这还不够。
很快,我们就升级到了三维或四维标注,直接在向量空间中进行标注,而不是单张图像。这里,我展示一个视频片段,你能看到一个非常小的重建场景,你后面会看到更多的重建场景。但这里,是一个很小的对汽车驶过的地面的重建,这里是一些点云,经过了重建。
你会看到,标注师直接在向量空间中改变标注,然后我们将这些改变重新投影到摄像头图像中。因此,我们直接在向量空间中进行标注,这大大提升了我们标注很多数据的产量。因为你只在三维空间中标注一次,然后自动重新投影。
但即便如此,我们意识到这还不够,因为人和电脑有不同的优缺点。人非常擅长标注语义,而计算机非常擅长几何,重建,三角化,追踪。
对我们来说,这更多的,是一个关于人类和计算机如何协同创建这些矢量空间数据集的故事。
我们准备要谈谈自动标注,这是我们为大规模标注视频片段而开发的基础设施。
五 自动标注 
Ashok Ellaswamy
大家好,又见面了。
我们有很多人工标注师,但训练网络所需的数据量远超过他们的产出。所以我们投入资源搭建了一条庞大的自动标注流水线。
这是我们标注单个片段的例子。
片段是具有密集的传感数据的实体,包括:视频,惯性测量数据,gps,里程等,长度45秒到1分钟。片段可以通过我们自己的工程车或客户车上传。
我们收集这些片段,然后将它们发送到服务器。服务器离线运行大量神经网络,以产生中间结果,如分割,掩码,深度,点匹配等,然后利用大量的机器人和人工智能算法来生成可用于训练网络的标注集。
我们首先要标注的数据是路面。通常我们使用样条曲面或三维网格来表示路面,但由于拓扑限制,这些表示方式是不可微的,并不适合生成。我们采用的做法,类似于去年深受好评的"神经辐射场"(NeRF)论文。
我们使用隐式表达来表示路面。我们查询地面上的xy点,并要求网络预测地表的高度,以及各种语义,例如路缘,车道边界,路面,行车空间等。
给定x, y, 我们可以得到z, 它们构成了一个三维点,这个点可以重新投影到所有的摄像头视图中。我们可以进行数百万次这样的查询,并得到大量的点,这些点被重新投影到所有的摄像头视图中。右上角展示了一幅这样的摄像头图像,所有这些点进行了重新投影。
然后我们将重新投影的点与分割图像空间的预测结果进行比较,并整体优化所有摄像头视图,融合空间和时间维度,创建优质的重建场景。这是一个结果的例子。
这是一个经过优化的路面,重新投影到汽车的八个摄像头上,横跨整条时间线。可以看到,它在空间和时间上是具有一致性的。
使用这项技术,当一辆车驶过某些位置时,可以沿路径重建出部分场景,但我们不必止步于此。这里我们收集了同一位置,来自不同汽车的不同片段。每个片段都扫过道路的一部分,酷炫的是,我们可以将它们合并成一个巨大的优化问题。
这里,这16个不同的片段用不同的特征组织起来,例如道路,车道线。它们的数据应该彼此一致,同时也与它们各自图像空间的数据一致。它们共同组成了一种有效的标注路面的方法,不仅是汽车行驶过的地方,也包括它没有行驶过的其他地方。
再次强调,这不仅仅是为了构建高清地图,只是为了标注包含这些路口的片段,因此,我们不必永远维护这份数据。只要标注数据与它们的来源视频一致,人就可以选择性的在此之上清除噪声,或增加额外的元数据,使其更丰富。
我们不必只标注路面,也可以任意的重建三维的静态障碍物。这是从我们的摄像头重建出来的三维点云。
这里的主要创新之处,在于点云的密度。通常,这些点需要纹理来建立从一帧到下一帧的关联。但这里,我们甚至可以在没有纹理的表面上产生这些点,比如路面或墙壁,这对于标注我们可见的任意障碍物非常有用。
在服务器上进行离线计算的另一个好处是,我们可以扮演事后诸葛亮。这是一个超级有用的技巧,因为在车里,网络需要预测出速度,它只能利用历史信息猜测当前的速度是多少。但在离线计算时,我们可以既参考历史也参考未来。这差不多算是作弊吧,我们能获得正确的速度,加速度,等等。
另一个好处是,我们可以有不同的路径,但可以将它们拼接在一起,并跨越遮挡。因为我们知道未来,拥有未来的路径,我们可以匹配这些路径然后进行关联。
这里,你可以看到马路对面的行人持续出现,即使他们被这些汽车多处遮挡。这对于规划器来说真的很重要,因为规划器需要知道是否能看到人。即使他们被遮挡了,规划器仍然需要考虑他们的存在。这是一个巨大的优势。
将所有这些组合在一起,我们可以生成这些惊人的数据集,标注所有的道路纹理,静态物体及所有的移动物体,即使出现了遮挡;生成高质量的动力学标注。你可以看到汽车如何平稳的转弯,生成非常平滑的标注;所有行人持续的得到追踪;停放的车辆速度为零,我们因此知道它们处于停车状态。
这对于我们意义重大。
另一个例子,你可以看到所有数据都是一致的。我们想要生成一百万个这样的标注片段,并用这个大数据集训练我们的多摄像头视频网络,彻底解决这个问题。我们希望得到和你在车内看到的同样的视图。
我们通过"移除雷达"项目开始了第一次探索。
我记得我们只花了不到三个月就移除了雷达。我们注意到,早期的网络在低能见度条件下,结果会受到影响。很明显,这辆卡车刚刚朝我们溅起了一坨雪,我们看不清周围了。但我们应该还记得,这辆车曾经在我们面前。
我们早期的网络并没有这么做,因为这种情况的训练数据太少了。我们就要求整个车队生成大量类似的片段,而它们也照做了。车队的确生成了,生成了很多视频片段,关于前车溅起各种乱七八糟东西的片段。
我们把这些数据送上自动标注生产线,然后在一周内完成了一万个片段的标注。如果采用人工标注每个片段,可能需要几个月的时间。
我们针对200种不同的情况都做了标注,快速创建了大型数据集。我们就是这样移除雷达的。我们用这些数据训练了网络,显而易见这样做完全有效,网络能记住物体在那里。
六 仿真模块 
Ashok Ellaswamy
最后,在"移除雷达"项目中,我们想把一辆电动皮卡放入数据集。你们能猜到这个片段是哪里来的吗?给你们一点时间。
有人说对了。是的,是的,它是渲染出来的,这是我们的仿真结果。
我一开始也很难分辨。让我说的话,它看起来挺漂亮,非常漂亮!
除了自动标注,我们还投入了大量资源,使用仿真来标注数据。这是从不同摄像头角度看之前的同一个场景。我想特别指出几点,比如地面,这不只是普通的沥青地面,它有很多裂缝和破损,有些地面还修补过。
车辆的移动很逼真。卡车头和货箱铰接在一起,穿过人行横道,正在转弯。其他汽车也表现得挺智能,它们避开碰撞,绕过汽车,能平稳地刹车和加速。上面有标志的那辆车,实际上正开着autopilot,它正在进行一个无保护左转。
既然是仿真,物体就都是定义在向量空间上的,因此有完美的标注数据。这里我们展示其中一些生成的标注,这些是带有速度,深度,表面法线,分割信息的车辆包围盒。
Andrej可以提出一个新的标注任务,并下周就要,而我们可以很快地做到这一点。因为我们已经有了向量空间,写点代码就可以非常非常快地生成这些标注。
仿真什么时候有用呢?
第一,当数据难以获取时。
虽然我们的车队规模很大,但有些疯狂的场景仍然很难获取。就像这对夫妇和他们的狗在高速公路上奔跑,同时周围还有其他高速行驶的汽车!我会说,这是一个非常罕见的场景,但它仍然可能发生。当发生时,autopilot仍然需要进行处理。
第二,当数据难以标注时。
这儿有数百位行人在过马路,这可能是在曼哈顿市中心,人们穿过马路。
人需要花好几个小时来手工标注这个片段。即使对于自动标注算法,也很难得到正确的关联,它可能会生成错误的速度值。但在仿真中,这个任务微不足道。因为你已经有了这些物体,你只需要再吐出包围盒和速度数据。
最后,当我们引入闭环行为时。
汽车需要处于某种确定的状态,或者说,数据取决于行为。仿真几乎是可靠地获取场景的唯一方法。
这都挺好。那么,需要做点什么才能完成这一切?
第一,精准的传感器仿真。
再明确下,仿真的目的不仅仅是为了生成漂亮的图片,它需要生成汽车的摄像头和其他传感器会看到的数据。这里,我们为左侧的真实摄像头设置不同的曝光参数,同时,对于右侧的仿真也进行同样的设置。我们几乎可以匹配真实摄像头的输出。
为了做到这一点,我们必须在传感器仿真中对摄像头的许多属性进行建模,包括传感器噪声,运动模糊,光学失真,甚至车头灯光的透射,甚至挡风玻璃的折射模式,等等。
我们不仅仅将其用于autopilot软件,也用它来做出硬件决策,例如镜头设计,摄像头设计,传感器放置,甚至车头灯光的透射属性。
其次,我们需要以逼真的方式渲染视觉效果。
不能产生游戏行业中所谓的"锯齿"。这些锯齿瑕疵,会让仿真穿帮,我们不想要锯齿。我们克服了很多困难,实现了一个很好的在时间和空间层面抗锯齿的算法。
我们也在研究神经元渲染技术,以使图像更加逼真。此外,我们还使用光线追踪技术来生成逼真的光照和全局照明效果。好的,这应该是最后一辆警车了。
我们显然不能只用四五辆车,这样网络很容易过拟合。我们需要有大量逼真的数据资产,比如马路上的驼鹿。我们的库里有数以千计的资产,人们穿着不同的衣服,可以真实地行走。这真的很酷。
我们也在很多不同的地点,获取地图和进行创建,创建仿真场景。我们已经搭建了总计2000英里的道路数据,这几乎是从美国东海岸到西海岸的公路长度。这很酷。
此外,我们开发了高效的工具,可以辅助每位艺术家在一天内多搭建几英里数据。
但这只是冰山一角。事实上,我们用于训练的大部分数据,都是使用算法过程式创建出来的,而不是请艺术家们手工制作这些模拟场景。
这些都是通过大量参数,过程式创建出来的道路。参数包括曲率,各种不同的树木,警示锥,杆子,不同速度的汽车,等,并且它们间的交互为网络产生了源源不断的数据流。
但很多数据可能没有意义,因为网络可能已经学到了。我们同样会使用机器学习的技术来检测哪些数据会导致网络失败,并围绕那些失败创建更多的数据。这是一个闭环,它能帮助网络学的更好。
我们不想就此止步,我们想通过仿真重现出现实世界中导致autopilot失败的所有场景,这样我们就可以让autopilot从此以后保持同样的标准。
在左边,你看到一个从汽车上采集的真实片段。它经过我们的自动标注流水线,创建出环境的三维重建和所有的移动物体。结合原始的视觉信息,我们人工重建出一个相同的场景,并完全用它来进行仿真。
然后,当我们在这个仿真场景里重新运行autopilot时,autopilot可以完成全新的行为。我们可以从原先的失败中构建新的世界,新的结果。这太棒了,因为我们真的不希望autopilot出错。一旦出错,我们就想捕捉数据,并让它保持那个水准。
不仅如此,我们实际上可以采用之前介绍的方法,更进一步,我们可以使用神经元渲染技术让图像看起来更逼真。我们获取原始视频片段,重新合成仿真场景,然后应用神经元渲染技术。
在我看来,它的效果很棒。因为它非常逼真,看起来几乎就像是由实际摄像头拍摄的。这是一个昨晚跑出来的结果,它很酷,因此我们想展示一下。
对于仿真可以达成的目标,我感到非常激动。这还不是全部,因为为我们汽车训练的网络已经使用了仿真数据,我们使用了3亿张图像和近50亿个标注,而且我们想要漂亮的完成未来几个月内将要出现的所有任务。
接下来,请Milan介绍我们如何实现规模化,真正搭建一个标注工厂,并吐出数百万个标注。
七 数据生成规模化 
Milan Kovac
好的,谢谢Ashok。
大家好,我是Milan,我负责把神经网络集成到车内,以及我们大部分的神经网络训练和评估的基础设施。今晚,我想先让你们了解一下这类数据生产工厂所需的计算量到底有多大。
几个月前,作为一个团队,我们需要移除autopilot对于雷达的依赖。这一背景下,我们从250万个片段中生成了超过100亿个标签。
为此,我们必须扩展庞大的离线神经网络和仿真引擎,跨越数千块gpu和略低于2万个cpu核心。在此之上,我们还为仿真引擎加入了2000多台FSD计算机,这是我们最小的计算集群。
我想给大家介绍一下,需要做哪些工作才能把我们的神经网络迁移到汽车上。
我们解决的两个主要限制是延迟和帧速率。这两者对于安全来说至关重要,对于获取周围环境的速度和加速度来说也很重要。问题的关键在于团队编写和扩展的AI编译器。本质上,它是将我们pytorch模型的计算操作映射到一组专用并经过加速的硬件上。
在制定调度策略的时候,我们对吞吐量进行了优化,并解决了严重的静态内存限制。顺便说一句,系统并不是在单引擎上工作,而是是用了FSD计算机上的双引擎。在特斯拉,我们使用双引擎的方式是:任意时刻只有一个引擎向车辆发送控制命令,而另一个用作计算的扩展。但这两种角色在硬件和软件层面都是可以互换的。
在这些AI开发周期中,我们作为一个团队是如何快速互动的?
首先,在过去几年中,我们一直在大力扩展我们评估软件神经网络的能力。目前,针对团队提交的任何代码改动,我们每周总计执行超过一百万次评估。这些评估在三千多台FSD计算机上运行,它们连接在一起,组成一个专用集群。
除此之外,我们一直在开发非常酷的调试工具,这里是其中一个工具的视频。它有助于开发人员进行神经网络的迭代开发。它能在使用视频片段进行迭代时,实时比较同一个神经网络模型不同版本的输出结果。
最后,在过去的几年里,我们一直在大力扩展用于神经网络训练的计算能力。举个具体例子,目前我们有接近1万块gpu。就gpu数量而言,已经超过了世界排名前五的超级计算机。
但这还不够,我想邀请Ganesh谈谈接下来的计划。
八 Dojo超级计算机 
Ganesh Venkataramanan
谢谢Milan。
我叫Ganesh,我负责Dojo项目,很荣幸,能代表正在从事该项目的特斯拉多学科团队来介绍Dojo。
正如Milan介绍的,我们对于神经网络训练速度和能力的需求永无止境。埃隆做出了预判,几年前他就让我们设计一台超级高速的训练计算机。这就是为什么我们启动了Dojo项目。
我们的目标是实现最佳的人工智能训练性能,支持Andrej团队梦寐以求的所有这些更大更复杂的模型,并同时实现高能效和成本效益。
我们思考并实现了一个分布式计算架构。毕竟,目前所有的训练计算机都是某种形式的分布式计算机。它们是拥有计算元素的一个个盒子,以某种网络结构进行连接。
这里它是一个二维网络,但它也可以是任何不同的网络,cpu,gpu,加速器。它们都有计算资源,一些内存和网络结构,但一个普遍趋势是:很容易就能扩展计算,扩展带宽非常困难,降低延迟则极其困难。
你会看到,我们的设计如何应对这一点,我们的设计理念如何解决传统限制的这些方面。
对于Dojo,我们设想一个大型的计算板,其中填满非常鲁棒的计算元素,拥有大内存池的支持,以高带宽低延迟的结构进行互连,形成一个二维网格的样式。
极大规模的神经网络,将被分割并映射,以提取不同的并行性:模型,图,数据并行。然后,在我们的神经编译器中,我们将利用空间和时间的局部性,将通信控制在本地区域间,以减少全局通信。
如果这样做的话,带宽利用率可以随着我们的计算板不断的扩展。我们想要自顶向下将这个技术栈层层攻陷,并移除任何层级上的任何瓶颈。让我们从芯片开始,开启这个由内而外彻底了解Dojo的旅程。
正如我所描述的,芯片拥有计算元素。计算规模的最小实体,称为训练节点。这个节点的选择对于确保无缝扩展非常重要。如果节点选的太小,它能运行的很快,但在最终的软件中,同步开销将占主导地位;如果节点选的太大,在实际硬件上实现起来会很复杂,而且最终会遭遇内存瓶颈问题。
因为我们想将解决延迟和带宽作为主要的优化点,请大家看看我们是怎么做的。
我们选择了信号在非常高的时钟频率(超过2G赫兹时)可以传输的最远距离。我们在它周围画了一个方盒,这是一个信号可以传播的最小延迟,以非常高的频率运行一个时钟周期。然后我们用线把方盒的边缘填满,这就是你可以输入给方盒的最高带宽。
然后,我们在其中添加了机器学习的计算资源;然后,是一个很大的静态内存池;最后,一个可编程内核进行控制。这一切组成了一个高性能的训练节点。
这是什么?这是一个64位超标量cpu,针对矩阵乘法单元和向量SIMD进行了优化。它支持32位浮点数,bfloat16和一种新的格式cfp8,可配置的8位浮点数,由1.25MB具有快速片上纠错功能的静态内存提供支持,采用我们设计的低延迟,高带宽的结构。
这可能是我们计算规模最小的实体,但它整合了巨大的算力。这个计算规模最小的实体可以提供超过1 teraflop(每秒1万亿次浮点计算)的算力。
让我们看看这个架构。
今天在场的计算机架构师们可能可以认出来,一看到这个,你们就会了解,这是一个非常强有力的架构。它是一枚超标量有序cpu,有四个宽标量和两个宽矢量的数据管线。
我们称它为有序,尽管向量和标量管线可以以乱序执行。但对于纯粹主义者来说,我们仍然称它为有序的。
它还支持四路多线程,这提升了利用率,因为我们可以同时进行计算和数据传输。它支持我们的自定义指令集架构(isa),针对机器学习的工作负载进行了全面优化。这里仅举几个例子,它具有转置,提取,链接遍历,广播等功能。
甚至在物理层面上,我们也设计成让它非常的模块化,这样我们就可以开始在每个方向上避开这些训练节点,并开始组成我们想要的计算板。
当我们将354个训练节点组合在一起时,就得到了计算阵列。它能够提供362 teraflops机器学习的算力,当然,还有高带宽结构连接这么多节点。
在这个计算阵列周围,我们设置了576个高速度低功耗的串并转换器,让我们能够通过该芯片获得极高的I/O带宽。
给大家提供一个比较,我们的I/O带宽是当今最先进的网络交换芯片带宽的两倍多,而网络交换芯片被看作是I/O带宽的黄金标准。
如果我们把所有这些组合在一起,我们就得到了专为训练而优化的芯片,"D1芯片"。该芯片采用7纳米技术制造,它在645平方毫米的狭小空间内容纳了500亿个晶体管。
你会注意到,这里100%的面积都用于机器学习训练和带宽。没有暗硅,没有历史兼容支持,这是一台纯粹用于机器学习的机器。
而且,这是一块倒装了D1芯片的BGA基板。
这块板子完全是由特斯拉内部团队设计的,从架构到gds版图到封装。这枚芯片拥有gpu级别的算力,cpu级别的灵活性,两倍于网络芯片级别的I/O带宽。
如果我在纵轴绘制I/O带宽,横轴绘制业界最先进的机器学习芯片的teraflops算力,包括来自于初创公司的,很容易看出,为什么我们的设计远超标准。
既然我们有了这个基础的物理模块,如何围绕它设计整个系统?让我们看一看。
因为D1芯片之间可以无缝连接,我们就把它们组合在一起。我们将50万个训练节点组合在一起,构成了一块计算板。这是1500枚D1芯片相互无缝连接。
然后我们在每一侧终端添加Dojo接口处理器。这是主机桥接,可以连接到数据中心的典型主机上。它一侧以第四代PCI接口连接,通过高带宽结构连接到我们的计算板。接口处理器不仅提供主机桥接,还为计算板提供了高带宽的动态共享内存。此外,接口处理器还可以让我们拥有更高基数的网络连接。
为了实现这个计算板,我们必须想出一个将这些芯片集成在一起的新方法。这就是我们所说的"训练瓦",这是我们规模化系统的基本单位。
这是将25枚优良的D1芯片突破性地集成到晶圆上的工艺。紧密集成,以此保留芯片之间的带宽,带宽得到了最大程度的保留。并且,我们生成了一个高带宽高密度的连接器,以保证训练瓦的输出带宽。
训练瓦可以提供9 petaflop(每秒千万亿次浮点计算)的算力,具有极高的I/O带宽。这可能是芯片行业最大的MCM,多芯片模块。
完成这个设计并不容易,我们没有现有的工具。所有的工具都搞不定,甚至我们的计算集群也不堪重负。我们的工程师想了不同的方法来解决这个问题,他们发明了新的方法让它成为现实。
现在计算板,计算瓦拥有了高带宽I/O,我们还必须为其供电。这里,我们想出了一种新的垂直供电的方式,我们生成了一个定制的电压调节器模块,可以直接把电回流到这个晶圆片上。
通过这些努力,我们得到了芯片和封装,我们还把PCB级的回流技术带给了晶圆技术。我们已经实现了相当规模的集成度,但我们并没有就此止步。我们在这里集成了所有的电气,散热和机械部件,以组成完全集成的训练瓦,输入接口使用52伏直流电。
这是前所未有的成就,是一项了不起的工程。我们的计算板与电源和冷却系统完全垂直,这使得高带宽计算板成为可能。
它是什么?是一个9 petaflop算力的训练瓦。这成为了我们系统的基本规模单位。
而且这是真实的,我不敢相信,我的手上捧着9 petaflops的算力。
事实上,上周我们才得到了第一片真正可以运作的训练瓦。在一个受限的冷却台式设备上,我们跑起来了某些网络。有人告诉我,Andrej不相信我们可以跑网络,直到我们可以运行他的一个作品。
Andrej,这是在Dojo上运行的mingpt2,你相信吗?
下一步,如何用它构建一个计算集群?
到现在为止,你一定已经意识到,我们的模块化故事非常强大。我们把一些训练瓦组合在一起,把各个瓦片拼在一起。一个托盘的2x3计算瓦构成了训练矩阵,一个机柜的两个托盘有100 petaflops算力。
我们就此止步了吗?不。我们进行无缝集成,我们打破了机柜的桎梏,我们严丝无缝地集成这些计算瓦,保持原有带宽。这里没有带宽转移,没有带宽剪取,所有的计算瓦都以相同的带宽无缝连接。
最终,我们得到了一个ExaPOD。这是由10个机柜共同提供的1 exaflops(每秒百亿亿次浮点计算)算力。
你看到的训练节点超过100万个。我们非常关注训练节点,而这里有100万个训练节点,具有统一的带宽。
不仅仅是硬件,软件对于确保可扩展性也很重要。并不是每个计算任务都需要一个巨大的集群,所以我们从一开始就计划好了,我们的计算板可以细分,可以划分为"Dojo处理单元"(dpu)。
一片dpu由一枚或多枚D1芯片组成,它还拥有接口处理器,以及一台或多台主机。并且,它可以根据任意算法,任意网络的需要,扩大或缩小规模。
用户需要做什么?他们只要最低限度地改写他们的脚本。这得益于我们强大的编译器套件,它负责并行粒度,并将神经网络有效地映射到我们的计算板上。
我们的编译器使用多种技术来提取并行性。它不仅可以使用数据,模型,图并行技术来转换网络,实现细粒度并行,它还可以进行优化,以减少内存占用。
有一件事,因为我们采用了高带宽的网络结构,模型的并行性原本是无法扩展到我们目前所能达到的水平的,它之前受限于芯片的边界。现在,由于我们系统的高带宽,我们可以将其扩展到训练瓦,甚至更大范围。因此,大型网络可以以小批次有效地进行映射,并提升利用率,达到新的性能水平。
此外,我们的编译器能够处理高级动态控制流,如循环、if/then/else等。我们的编译器引擎只是我们整个软件套件的一部分,技术栈还包括pytorch的一个扩展,可确保机器学习科学家们习惯的用户接口保持不变。
我们的编译器动态生成代码,以便复用于后续执行。它有一个llvm的后端,为硬件生成二进制文件,这确保我们可以为硬件生成优化的代码,无需手写一行内核代码。
你在前几页的幻灯片中看到过,我们的驾驶技术栈负责多主机,多分区。然后,我们的软件技术栈中还有性能分析器和调试器。有了这一切,我们以垂直方式整合。我们打破了传统的扩展壁垒,这就是我们如何在整个技术栈的上下层级都实现模块化,以达到新的性能水平。
总而言之,展望一下,它将成为速度最快的人工智能训练计算机,相同成本下提供4倍的性能,每度电的性能提升1.3倍,这是节能,能耗减少5倍。
这就是Dojo计算机。
我们还没完工,我们很快就会组装第一个机柜。我们也已经有了完整的下一代计划。我们正在考虑从芯片到系统,不同层面的改进,从而把能力再提升10倍。我们将再次踏上征程,我们正在所有这些领域大量招聘人才。
非常感谢!
接下来,埃隆将为我们介绍,关于人工智能,除了车队,我们还有什么其他计划。谢谢。
九 特斯拉人形机器人擎小柱 
Elon Musk
显然,不像Dojo,那不是真正的机器人。Dojo是真实的,特斯拉机器人将来会是真实的。
但如果你思考一下我们现在围绕汽车所做的事情,特斯拉可以说是世界上最大的机器人公司,因为我们的汽车就是轮子上的半智能机器人,辅以FSD计算机,也就是汽车上的推理引擎。很明显,这个推理引擎将持续的进化。
此外,还有Dojo和所有的神经网络,用于认知世界,了解如何在真实世界中行进。把这些能力整合为人形的形式,挺合理的。它们的传感器,电池和驱动器也很不错。
我们认为,明年某个时间,我们可能会有一个原型,看起来跟刚才那样。它当然应该对人类很友善,并能在真实世界中行进。为人类打造,以消除危险的,重复性的,无聊的工作。
我们将它设置为,在机械层面,物理层面,你可以逃离它,并应该可以战胜它。希望这永远不会发生,但谁又知道呢?
它的速度很慢,时速5英里(约8公里),你跑得比它快,就没问题。
它身高5英尺8英寸(约1米73),头部有一个显示屏,用于展示信息。此外还配备了autopilot系统,它配有八个摄像头和FSD计算机,复用我们在汽车中使用的所有模块。
我认为,生产一个有用的人形机器人,困难之处在于,如果没有给予明确的训练,它就无法在真实世界中行进。我是说,如果没有给予明确的指令。
你说,“请拿起螺栓并用扳手把它拧到汽车上”,它应该能照做。它需要能完成“请去商店给我买以下杂货”这种指令。我认为我们可以做到这一点。
我认为这会是非常意思深远的改变。因为如果你问,经济是什么?从根本上说,经济就是劳动力。那么当劳动力不再短缺时,会发生什么?这就是我认为从长期来看,会有全民基本收入的原因。
但不是现在,因为这个机器人还没造出来,我们还需要一炷香的功夫。
但我认为,未来的体力活将只是一个选择。如果你想要干体力活,可以,但这不是必须。我认为,这显然对经济有着深远的影响。因为鉴于经济的根本是劳动力,资本设备只是经过提炼的劳动力,那么,经济还会有任何实际限制吗?也许没有。
请加入我们的团队,并帮助实现这一切。
好的,请大家都回到台上。如果愿意,你们可以提问了。
继续阅读
阅读原文