摘要:
特斯拉的全自动驾驶(FSD)系统是全球首个专用于高要求自动驾驶的计算系统。它基于集成了CPU、ISP和GPU等行业标准组件的新系统芯片(SoC),并使用特斯拉定制的神经网络加速器。
FSD计算机每秒可处理2300帧,比特斯拉之前的硬件高21倍,成本更低。最重要的是,当它的性能得到充分发挥时,它可以在道路上实现更高水平的安全性和自主性。
特斯拉全自动驾驶(FSD)平台和芯片目标
特斯拉全自动驾驶的主要目标是让(FSD)计算机成为当前和未来数据处理的硬件平台,这与全自动驾驶的要求有关。
此外,特斯拉的(FSD)系统已经在2016年10月以来生产的任何特斯拉汽车中引入了正式的主要限制因素和热包络,以适应冷却能力有限的旧车。
FSD计算机的核心是世界上第一个为自动驾驶设计的芯片。我们为神经网络推理提供72个顶级硬件加速器,批量为1的初始工作负载利用率超过80%。我们还包括一套CPU、ISP、GPU和文章编码器,可满足各种预处理和后处理要求。所有这些都是紧密集成的,以满足每个芯片不到40瓦的极其激进的TDP。
图一。d电脑,两个特斯拉FSD芯片,采用双配置,包括摄像头和其他传感器。
该系统包括两个独立启动和运行独立操作系统的FSD芯片实例。在这两种情况下,都允许独立的电源和传感器,以确保系统的异常安全水平。图1所示的计算机在形式、协调和接口级别上与旧硬件兼容。
FSD芯片
FSD芯片是一个260mm2的芯片,大约有2.5亿个门或60亿个晶体管。它由三星使用14纳米FinFet技术制造。如图2所示,芯片采用37.5mm 37.5mm倒装芯片BGA封装。该芯片符合AEC-Q100 2级可靠性标准。
图2(a)显示了芯片中的主要模块。我们从头开始设计了神经网络加速器(NNA)的两个实例,并为系统的其余部分选择了行业标准IP,如A72 CPU、G71 GPU和ISP。rest芯片的未标记区域由外围设备、NOC结构和存储器接口组成。每个NNA都有32兆位SRAM和96*96个MAC阵列。在2GHz时,每个NNA提供36个top,FSD芯片总共有72个top。
如图2(b)所示,FSSOC提供了一个通用CPU来运行大多数自动驾驶算法。
每隔几毫秒,位于dedi的图像信号处理器接收一个新的输入帧,并在存储到DRAM之前对其进行预处理。一旦在主存储器中有新的帧,CPU将指示NNA加速器开始处理它们。加速器控制数据和参数流向它们的本地SRAM,并且流回结果是直接的。一旦相应的结果帧被发送到DRAM,加速器触发中断以返回到CPU复合体。GPU可用于任何可能需要NNA加速器不支持的算法的后处理任务。
图二。(a)主要模块的消防处芯片模具照片。(b) SoC框图。
芯片设计方法
我们的设计方法是定制的,以满足积极的开发进度。出于这个原因,我们决定构建一个定制的加速器,因为它提供了比上一代产品更高的性能和功耗。我们使用可用的硬IP或软IP。该技术节点用于剩余的SoC模块,以降低开发进度的风险。
我们混合使用行业标准工具和开源工具,用于广泛的应用,如verilator来模拟我们的设计。Verilator模拟特别适合长时间测试(比如运行整个神经网络),在这种情况下他们放弃了比商业模拟器高50的加速比。另一方面,verilator下的设计很慢,所以我们依赖商业模拟器快速周转,在RTL开发阶段调试。除了模拟之外,我们还广泛使用硬件模拟器来确保SoC的高度功能验证。
对于加速器的定时关机,我们设定了一个非常激进的目标,比最终出货频率2 GHz高25%左右。这使得该设计远远低于Vmax,在我们的功耗预算范围内提供最高的性能,这是在硅表征后测得的。
神经加速器的设计动机
神经网络加速器
设计动机
自定义NNA用于检测一组预定义的对象,包括但不限于车道线、行人、不同类型的车辆。如平台目标中所述,帧速率非常高,功耗预算适中。
图3。初始网络、卷积循环和执行配置文件
图3显示了一个典型的初始卷积神经网络。1,2网络有许多层和连接,表示通信数据流或激活。通过这个网络的每个过程都涉及一个图像,以及在每一层之后依次构建的各种功能或激活。在最后一层之后检测到物体。
如图3所示,98%以上的运算属于卷积。卷积算法由七个深度嵌套的循环组成,如图3所示。最内层循环中的计算是乘法累加(MAC)操作。因此,我们设计的主要目标是在不增加功耗预算的情况下,尽可能快地执行大量MAC操作。
将卷积加速一个数量级将导致量化或池化等操作的频率降低。如果这些操作的性能显著下降,它们将成为整体性能的瓶颈。这些操作还使用专用硬件进行了优化,以提高整体性能。
卷积和数据流
图4。卷积和数据流。
卷积循环,经过一些重建,如图4(a)所示。仔细考察发现,这是一个尴尬的并行MAC操作,处理问题的机会很多。在卷积中,MAC运算执行三个最里面的循环,这决定了每个点积的长度在很大程度上是连续的。然而,三个外部循环,即对于每个图像、每个输出通道和每个输出中的所有像素通道,可以是并行的。但是,这仍然是一个困难的过程,由于内存带宽大,问题的需求和动力明显增加。消费支撑这么大的并行计算。因此,在本文的其余部分,我们将重点关注这两个方面。
首先,我们并行处理多幅图像是不可行的。出于安全考虑,我们不能等到所有图像都到达后再开始计算,因为这样会增加目标检测的延迟。图像一到我们就要开始处理。相反,我们将跨多个输出通道和每个输出通道内的多个输出像素进行并行计算。
图4(a)示出了重构的卷积环路,其优化了数据重用以降低功耗并增加实现的计算带宽。我们将每个输出通道的两个维度合并,以行头的形式展平为一个维度,如步骤(2)和图4(a)所示。这提供了许多并行输出像素,而不会丢失所需输入数据的局部连续性。
我们还切换循环以迭代每个输出通道中的像素,如图4(a)的步骤(2)和(3)所示。对于一组固定的输出像素,我们首先迭代输出通道的子集,然后移动到下一组输出像素进行下一次传输。将输出通道子集中的一组输出像素组合起来的一个这样的过程可以被形成为并行计算。我们继续这个过程,直到输出通道的第一个子集中的所有像素都耗尽。一旦所有像素耗尽,我们将移动到输出通道的下一个子集,并重复该过程。这使我们能够最大限度地共享数据,就像所有输出通道中相同像素集的计算使用相同的输入数据一样。
图4(b )-( d)还示出了通过上面卷积重建层的连续图像的相同输出像素输出通道共享输入来激活数据流,并且通过在相同输出通道中共享输入权重来计算连续输出像素。这种点积计算的数据和权重的共享有助于利用大规模计算的带宽,同时通过最小化移动数据的负载来降低功耗。
计算方案
图5。计算方案。
上一节描述的重构卷积算法适用于数据流计算方案,如图5所示。中间简洁的空间展示了一个缩小版的物理9696 MAC阵列,其中每个单元实现一个单元一个周期的MAC运算和反馈回路。顶部和左侧的矩形网格是虚拟的,代表数据流。顶部的网格(这里称为数据网格)显示了96个数据元素的简化版本。在每一行中,左边的网格(这里称为重量网格)显示了每一列中96个重量的简化版本。数据网格和权重网格的高度和宽度等于点积的长度。
计算过程如下:数据网格的第一行和权重网格的第一列分别以流水线方式在几个周期内在MAC阵列的所有96行和96列上广播。每个小区使用广播数据和本地权重来计算MAC操作。在下一个周期中,以流水线方式广播数据网格的第二行和权重网格的第二列,并且类似地执行每个小区中的MAC计算。该计算过程将继续,直到数据和权重网格的所有行和列都已被广播,并且所有MAC操作都已完成。因此,与许多其他处理器中实现的脉动阵列计算不同,每个MAC单元在MAC阵列中本地计算点积,而不移动数据。这导致比脉动阵列更低的功率和更小的单元面积。
当所有MAC操作完成时,累加器值准备好被下推到SIMD单元进行后处理。这将创建第一个96输出切片,如图5所示。后处理通常涉及量化操作,量化操作在96-宽SIMD单元中执行。96位SIMD单元的带宽与每个输出通道的96位累加器输出相匹配。MAC阵列中的累加器行以每个周期一行的速率向下移动到SIMD单元。物理上,累加器线每八个周期才移动一次,一组八个。这大大降低了移动累加器数据所消耗的功率。MAC引擎的另一个重要特征是MAC和SIMD操作的重叠。当累加器值下推到SIMD单元进行后处理时,MAC数组中的下一个卷积运算立即开始。这种重叠计算提高了计算带宽的整体利用率,避免了无限循环。
设计原则和指令集
体系结构
上一节描述了计算的数据流。对于控制流,我们关注简单性和能效。在现代无序CPU和gp GPU 57上执行的一般应用程序将消耗计算单元外部的大部分能量来移动指令和数据,并消耗昂贵的结构(如缓存、寄存器文件和分支预测器)。此外,这种控制结构也引入了显著的设计复杂性。我们的目标是设计一台计算机,在这台计算机中,几乎所有浪费的控制结构都被淘汰,工作负载的执行会把所有的精力花在对性能最重要的东西上,也就是MAC引擎。出于这个原因,我们实现了一个非常灵活但熟练的状态机,其中所有昂贵的控制流都内置在状态机中,比如循环构造和融合。
另一个非常重要的性能和功耗优化功能是消除卷积流期间的DRAM读写。为了进行推断,每个层的输出数据被相关层使用,并且可以被覆盖。在加载初始激活数据集之后,机器完全由嵌入在计算引擎本身中的SRAM操作。
这个设计概念在最后一节中概述。对于具有粗粒度可编程性的灵活状态机,我们权衡需要昂贵控制结构的细粒度可编程性。由状态机驱动的控制机制有助于形成非常紧凑但功能强大且灵活的ISA。只有七个主指令,以及各种附加控制字段,用于设置状态机来执行不同的任务:数据进出SRAM(DMA读取和DMA写入)、点积(卷积、去卷积、内积)和纯SIMD(缩放、ELTWISE)。
数据移动指令的长度是32字节,并且源地址和目的地址、长度和依赖性标志被编码。计算指令长256字节,输入地址可以编码。最多可编码三个张量(输入激活和权重或两个激活张量,输出结果)、张量形状和依赖性标志。它们还对各种参数进行编码,这些参数描述了计算的性质(填充、步幅、扩展、数据类型等)。)、处理顺序(行优先或列优先)、优化提示(输入和输出张量填充、预计算状态机字段)、融合操作(缩放、偏移、池)。所有计算指令后面都可以跟随着数量可变的SIMD指令,这些指令描述了在所有点积输出上运行的SIMD程序。因此,点层(卷积、反卷积)可以通过简单的运算(量化、缩放、ReLU)或更复杂的数学函数(如Sigmoid、Tanh等)进行融合。).
广播网节目
加速器可以同时执行DMA和计算指令。在每种类型中,指令都是按顺序执行的,但是它们可以在指令之间重新排序以实现并发。生产者/消费者排序使用显式依赖标志来维护。
图6。典型网络程序
典型的程序如图6所示。该程序从几个DMA读取操作开始,将数据和权重放入加速器的SRAM中。解析器将它们插入队列,并在第一条计算指令处停止。一旦挂起的计算指令的数据和权重在SRAM中可用,它们相应的依赖性标志将被设置,并且计算指令可以开始与其他排队的DMA操作并行执行。
依赖标志用于跟踪数据可用性和缓冲区使用情况。如图6所示,在步骤6中运行的DMA覆盖了由先前卷积(步骤5)生成的缓冲区。因此,它不能开始执行,直到其目标标志(F0)在卷积结束时被清除。然而,使用不同的目标缓冲区和标志将允许正在运行的DMA与先前的卷积并行执行。
我们的编译器使用Caffe格式的高级网络表示,并将其转换成类似于图6中的指令序列。它分析计算图,并根据数据流、汇聚或划分层进行排序,以匹配硬件功能。它为中间结果和权重张量分配SRAM空间,并通过依赖标志管理执行顺序。
NNA微体系结构
图7。NNA微型建筑。
如图7所示,NNA是围绕两条主要数据路径(点积引擎和SIMD单元)和状态机组织的,状态机解释程序,生成内存请求流,并控制数据路径内外的数据移动。
点积引擎
如“计算方案”一节所述,点积引擎是96个MAC单元的阵列。每个单元接受两个8位整数输入(有符号或无符号),将它们相乘,并将结果添加到30位宽的本地累加器寄存器。许多处理器使用单精度或半精度浮点(FP)数据和推理权重来部署浮点运算。我们的整数MAC计算具有足够的范围和精度,以所需的精度执行所有特斯拉工作负载,其功耗比使用FP算法的计算低一个数量级。
在每个周期中,数组接收两个向量,每个向量有96个元素,并将第一个向量的每个元素乘以第二个向量的每个元素。结果将在本地累加,直到点积序列结束,然后卸载到SIMD引擎进行进一步处理。
每个累加器单元围绕两个30位寄存器构建:累加器和移位寄存器。一旦计算序列完成,点积结果被复制到移位寄存器中,累加器清零。这允许结果通过SIMD引擎移出,而下一个计算阶段在点积引擎中开始。
单指令多数据单元
SIMD单元是一个96宽的数据路径,可以执行一整套算术指令。它一次从点积引擎(累加器行)读取96个值,并作为指令序列执行后处理操作(SIMD程序)。SIMD程序不能直接访问SRAM,并且不支持流控制指令(分支)。对从MAC数组中卸载的每组96个值执行相同的过程。
SIMD单元可以通过丰富的指令集进行编程,具有各种数据类型,8位、16位和32位整数以及单精度浮点(FP32)。指令集还为控制流提供了条件执行。输入数据始终为30位宽(强制转换为int32),最终输出始终为8位宽(有符号或无符号int8),但中间数据格式可能与输入或输出不同。
由于大多数常见的SIMD程序都可以用一条名为FusedReLu(FusedQuantization,scale,ReLu)的指令来表示,该指令格式允许任何算术运算与移位和输出操作相结合。FuseDelu指令完全流水线化,允许96点积引擎在96个周期内卸载。更复杂的后处理序列需要额外的指令,这增加了点积引擎的卸载时间。一些复杂的序列是由FP32指令和条件执行构成的。在这种SIMD程序开始时,30位累加器值被转换成FP32操作数,在SIMD程序结束时,FP32结果被转换回8位整数输出。
联合支持
在SIMD单元中进行后处理后,输出数据也可以有条件地通过池单元进行路由。这允许最频繁的小内核池操作(2和3)在SIMD执行的阴影下执行,与生成数据的早期层并行。硬件实现对准器,该对准器将重新排列的输出像素对准,以将卷积优化回原始格式。该单元具有三个96字节的96字节池阵列,具有字节级控制。不太频繁的大型内核池操作作为dotproduct引擎中的卷积层执行。
记忆组织
NNA使用32mb本地SRAM来存储权重和激活。为了同时实现高带宽和高密度,SRAM是用很多相对较慢的单端口组实现的。在每个周期中可以访问多个这样的存储组,但是为了保持高单元密度,不能在连续的周期中访问存储组。
SRAM可以通过两个独立的读取端口(256字节和128字节宽)提供每个周期高达384字节的数据。仲裁器对来自多个来源(权重、激活、程序指令、DMA输出等)的请求进行优先级排序。)并通过两个端口对它们进行分类。来自同一来源的请求不能被重新排序,但是来自不同来源的请求可以被优先化以最小化存储体冲突。
在推理过程中,权张量始终是静态的,可以在SRAM中布局,以确保有效的读取模式。对于激活,这并不总是可能的,因此加速器将最近读取的数据存储在1kb的缓存中。这有助于通过消除对相同数据的连续读取来最小化SRAM组冲突。为了进一步减少存储体冲突,加速器可以使用网络程序提示的不同模式来填充输入和/或输出数据。
控制逻辑
如图7所示,控制逻辑分为几个不同的状态机:命令序列器、网络序列器、地址和数据序列器以及SIMD单元。
每个NNA可以将多个网络程序排队并按顺序执行。定序器维护这些程序的队列及其相应的状态寄存器。一旦网络运行,加速器将在主机系统中触发中断。在其中一个CPU上运行的软件可以检查完成状态,并重新启用网络来处理新的输入帧。
网络定序器解释程序指令。如前所述,指令是一个长数据包,它编码了足够的信息来初始化执行状态机。网络定序器对这些信息进行解码,并将其引导至适当的用户,加强依赖性并同步机器,以避免生产者和用户之间的潜在竞争条件。
一旦计算指令被解码并被引导至其执行状态机,地址序列器将为下游计算生成SRAM地址和命令流。它将输出空间划分为多达96个元素的部分,对于每个这样的部分,它将按照相应点积的所有项目进行排序。
权重包在SRAM中预先排序以匹配执行,因此状态机只需以96个连续字节为一组对其进行流式传输。然而,激活并不总是来自连续的地址,它们通常必须从多达96个不同的SRAM位置收集。这种情况下,地址序列器必须为每个数据包生成多个加载地址。为了简化实现并允许高时钟频率,96元素的数据包被分成12段,每段有8个元素。每个片由单个加载操作提供服务,因此它的第一个和最后一个元素之间的最大距离必须小于256字节。因此,通过发出1到12个独立的加载操作,可以形成96个激活的分组。
该负载与控制信息一起被转发到数据定序器。权重在预取缓冲器中被捕获,并在需要时被发送到执行。激活存储在数据缓存中,从数据缓存中收集96个元素并发送到MAC阵列。数据路径的命令也从数据序列发生器导入,数据序列发生器控制执行使能、累加器移位、SIMD程序启动、存储器地址等。
图8。实现对MAC阵列维度的利用
SIMD处理器对从MAC阵列中卸载的每组96个累加器结果执行相同的程序。它由地址序列发生器产生的控制信息同步,可以解码、发布和执行SIMD算术指令流。虽然SIMD单元有自己的寄存器文件,并控制数据路径中的数据移动,但它不控制存储结果的目标地址。当地址序列器选择要处理的96 96输出片时,它将生成存储地址和任何池控制。
架构和结果
在实施各种机器时,如我们的MAC阵列和SIMD处理器,主要关注点总是与其工作时钟频率有关。高时钟频率更容易实现目标性能,但通常需要一些逻辑简化,这反过来会损害特定算法的利用率。
我们决定优化具有大量输入和输出通道的深度卷积神经网络的设计。SRAM在每个周期提供给MAC阵列的192字节数据和权重只能在跨度为1或2的层得到充分利用,而跨度较高的层往往利用率较低。
根据MAC阵列的大小和形状,加速器的利用率可能会有很大差异,如图8所示。inception-v4和Tesla Vision Network都对MAC阵列的高度非常敏感。虽然同时处理更多的输出通道可能会影响整体利用率,但这种能力的成本相对较低,因为它们共享相同的输入数据。增加阵列的宽度对利用率不会有太大影响,但是需要大量的硬件资源。在我们选择的设计点(96 MAC阵列),这些网络的平均利用率略高于80%。
我们必须评估的另一个权衡是SRAM的大小。神经网络的规模越来越大,所以尽可能的增加SRAM可能是未来验证设计的一种方式。然而,较大的SRAM将增加芯片的流水线深度和总面积,从而增加功耗和系统的总成本。另一方面,一个太大而不适合SRAM的卷积层总是会被分解成几个更小的组件,这可能会为数据溢出和填充到DRAM中付出一些代价。根据我们当前网络的需求和中期扩展预测,我们为每个加速器选择了32 MB SRAM。
结论
与我们以前硬件中使用的商业解决方案相比,Tesla的FSD计算机提供了出色的性能提升,同时降低了成本,所有这些都需要25%的额外功耗。这一水平的性能是通过坚持我们最初的设计原则实现的。在每一步中,我们通过高度的数据重用和最小的控制流设计来最大化可用的计算带宽。这台FSD计算机将成为推进FSD功能集的基础。
从这项工作中学习的关键是效率和灵活性之间的权衡。具有固定功能硬件的定制解决方案提供了最高的效率,而完全可编程的解决方案更加灵活,但效率明显较低。最后,我们决定采用具有可配置固定功能硬件的解决方案,它可以非常高效地执行最常见的功能,但添加了可编程SIMD单元,它执行不太常见的功能,效率较低。我们对特斯拉的推理工作量的了解,使我们能够满怀信心地做出这样的权衡。
特斯拉的FSD计算机比我们以前的硬件中使用的商业解决方案提供了出色的21倍性能提升,同时降低了成本,所有这些都需要25%的额外功耗。这一水平的性能是通过坚持我们最初的设计原则实现的。
作者:莫石
来源:汇编自---- theme alticle:hot chips