• 878查看
  • 0回复

[硬件底层] 详解特斯拉FSD芯片的解决方案

[复制链接]


该用户从未签到

发表于 2-9-2023 08:47:39 | 显示全部楼层 |阅读模式

汽车零部件采购、销售通信录       填写你的培训需求,我们帮你找      招募汽车专业培训老师


特斯拉作为第一个专门为自动驾驶开发芯片的OEM—FSD(full self-driving)芯片。其目的是为当前和未来全自动驾驶相关的数据处理需求提供一个自主掌控的硬件平台。之前也对其进行过简单的梳理,接下来让我们走进FSD芯片的内部。FSD芯片

首先从整体来看,芯片的大小为260μm2,集成了60亿个晶体管,芯片是采用三星的14nmFinFet技术制造,封装为BGA。另外该芯片符合AEC-Q100二级可靠性标准。图1 (a)展示了芯片中的主要模块,集成了12个工作频率为2.2GHz的Cortex-A72核,一个工作频率为2GHz的Mali G71 MP12 GPU,2个工作频率为2GHz的NNA(neural-network accelerator),以及其余未标记区域由外围设备、片上网络结构和内存接口组成。每个NNA拥有32M SRAM和96x96 MAC阵列,每个NNA的算力为36TOP。另外该芯片支持单精度和双精度浮点运算。支持以2133MHz运行的128bitLPDDR4内存。
详解特斯拉FSD芯片的解决方案w1.jpg

图1 (a)FSD芯片照片(b)SoC框图
如图1(b)所示,SoC提供了运行大多数自动驾驶算法的通用CPU内核。每隔几微秒,GPU会接收到新的数据,在存储到DRAM之前进行预处理。一旦新帧在主存可用,cpu指示NNA加速器开始处理它们。加速器控制流进本地SRAM的数据和参数,以及流回DRAM的结果。一旦相应的结果帧被发送到DRAM,加速器触发一个中断返回到CPU。GPU可用于任何可能需要NNA加速器不支持的算法的后处理任务。
芯片设计方法

特斯拉的设计方法是定制,以满足开发时间需求。为此,其决定构建一个自定义加速器NNA,因为与前一代相比,这提供了提高性能和功耗的平衡。其他模块使用了成熟的工业标准IP,以减少开发进度风险。特斯拉混合使用了行业标准工具和开源工具(例如 verilator)来对我们的设计进行广泛的模拟。Verilator 模拟特别适用于周期非常长的测试项目(例如运行整个神经网络),它们可以产生高达50x的加速超过商业模拟器。另一方面,verilator 下的设计编译非常慢,因此我们在 RTL 开发阶段依靠商业模拟器进行快速周转和调试。对于加速器的时序收敛,特斯拉设定了一个非常激进的目标,比最终交付频率 2 GHz 高约 25%。这允许设计在远低于 Vmax 的情况下运行,在芯片的功率预算范围内提供最高性能。NNA神经网络加速器

设计动机自定义 NNA 用于检测一组预定义的对象,包括但不限于车道线、行人、不同类型的车辆,以非常高的帧速率和适度的功率预算。
详解特斯拉FSD芯片的解决方案w2.jpg

图2 初始网络、卷积循环和执行概要

图2展示了一个典型的初始卷积神经网络。该网络有很多层,以及各层之间计算数据流或激活的关联。每次通过该网络都涉及进入一个图像,以及在每一层之后依次构建的各种特征或激活。 当到达最后一层之后,完成对一个对象的检测。

如图2所示,98% 以上的操作都属于卷积。卷积算法由一个7层深度嵌套循环组成。最内层循环中的计算是乘法累加 (MAC) 操作。因此,设计的主要目标是尽可能快地执行大量 MAC 操作,而不会增加功率预算。

但是通过量化或者池化加速卷积的计算,可能会导致性能明显降低,这样将成为整体性能的瓶颈。这些操作还需通过专用的硬件来进行优化,以提高整体性能。

卷积重构和数据流

经过一些重构的卷积循环如图3(a) 所示。仔细检查发现这是一个令人尴尬的并行问题,有很多处需要并行处理 MAC 操作。在卷积循环中,确定每个点积长度的三个最内循环中 MAC 操作的执行在很大程度上是连续的。然而,三个外循环内的计算,即对于每个图像,对于每个输出通道,对于每个输出通道内的所有像素,都是可并行的。但由于需要大内存带宽和显着增加的功耗来支持如此大的并行计算,这仍然是一个难题。因此,接下来将主要关注这两个方面。

详解特斯拉FSD芯片的解决方案w3.jpg

图3 卷积重构和数据流
首先要注意的是,并行处理多个图像是不可行的。出于安全原因,我们不能等待所有图像到达开始计算,因为它增加了对象检测的延迟。我们需要在图像到达后立即开始处理。相反,我们将跨多输出通道和每个输出通道内的多输出像素并行计算。
图 3(a) 显示了重构的卷积循环,优化了数据重用以降低功耗并提高实现的计算带宽。我们合并每个输出通道的两个维度,并将它们展平为行优先形式的一个维度,如图 3(a) 的步骤 (2) 所示。这提供了许多并行处理的输出像素,而不会丢失所需输入数据的局部连续性。

我们还将迭代输出通道的循环替换为迭代每个输出通道内的像素的循环,如图3(a)的步骤(2)和(3)所示。对于一组固定的输出像素,我们首先迭代输出通道的一个子集,然后再移动到下一个通道的下一组输出像素。一个这样的过程,在输出通道的子集内组合一组输出像素,可以作为并行计算来执行。我们继续这个过程,直到耗尽第一个输出通道子集中的所有像素。一旦所有像素耗尽,我们移动到输出通道的下一个子集,并重复该过程。这使我们能够最大限度地共享数据,因为所有输出通道内相同像素集的计算使用相同的输入数据。

图3(b)–(d)也说明了卷积层的上述重构的数据流。通过共享输入激活来计算连续输出通道的相同输出像素,并且通过共享输入权重来计算相同输出通道内的连续输出像素。点积计算的数据和权重共享有助于利用大的计算带宽,同时通过最小化移动数据的负载数量来降低功耗。

计算方案

上述中描述的算法和重构的卷积适用于图4所示的数据流计算方案。为了节省空间,中间显示了一个缩小版的96 × 96 MAC阵列,其中每个单元由一个执行MAC操作的单元组成,该单元具有一个单周期反馈回路。顶部和左侧的矩形网格是虚拟的,表示数据流。顶部的网格(此处称为数据网格)显示了每行中96个数据元素的缩比版本,而左侧的网格(此处称为权重网格)显示了每列中96个权重的缩比版本。数据和权重网格的高度和宽度等于点积的长度。

详解特斯拉FSD芯片的解决方案w4.jpg

图4 计算方案

计算过程如下:数据网格的第一行和权重网格的第一列分别在 MAC 阵列的所有 96 行和 96 列上以流水线方式在几个周期内广播。每个小区使用广播数据和本地权重计算 MAC 操作。在下一个循环中,数据网格的第二行和权重网格的第二列以流水线方式广播,每个单元格中的MAC计算也类似地执行。这个计算过程一直持续到数据和权重网格的所有行和列都已广播,并且所有 MAC 操作都已完成。因此,每个 MAC 单元在本地计算点积,MAC 阵列内没有数据移动,这与在许多其他处理器中实现的收缩阵列计算不同。这导致比收缩阵列实现更低的功率和更小的单元面积。

当所有 MAC 操作完成后,累加器值就可以下推到 SIMD 单元进行后处理了。这将创建第一个 96 x 96 输出切片,如图 5 所示。后处理通常涉及量化操作,在 宽为96的SIMD 单元中执行。宽为96的SIMD 单元的带宽与与每个输出通道相关的 96 元素累加器输出相匹配。MAC 阵列中的累加器行以每个周期一行的速率向下移动到 SIMD 单元。物理上,累加器行每八个周期仅移动一次,以八个为一组。这显着降低了转移累加器数据所消耗的功率。

MAC引擎中的另一个重要特性是MAC和SIMD操作的重叠。当累加器值被下推到SIMD单元进行后处理时,下一个卷积过程会立即在MAC数组中开始。这种重叠计算增加了计算带宽的整体利用率,避免了死循环。

设计原则和指令集体系结构

上一节描述了我们计算的数据流。对于控制流程,我们专注于简单性和电源效率。在现代乱序 CPU 和 GPGPU 上执行的普通应用程序消耗了计算单元之外的大部分能量来移动指令和数据以及昂贵的结构,例如高速缓存、寄存器文件和分支预测器。此外,这种控制结构还引入了显着的设计复杂性。我们的目标是设计一种计算机,其中几乎所有的控制结构都被消除,并且工作负载的执行将所有精力花在对性能最重要的东西上,即MAC引擎。为此,我们实现了一个非常灵活但熟练的状态机,其中所有重要的控制流都内置到状态机中,例如循环构造和融合。

另一个非常重要的性能和功耗优化功能是消除卷积流期间的动态随机存取存储器读写。为了便于推断,每一层的输出数据由从属层消耗,并且可以被覆盖。加载初始激活数据集后,该机器完全通过嵌入计算引擎本身的SRAM进行操作。

这种设计理念在后续有所概述。我们权衡了需要复杂的控制结构的细粒度可编程性,以获得具有粗粒度可编程性的灵活状态机。状态机驱动的控制机制适用于非常紧凑但功能强大且灵活的 ISA。只有 7 条主要指令,带有各种附加控制字段,用于设置状态机以执行不同的任务:数据移入和移出 SRAM(DMA 读取和 DMA 写入)、点积(CONVOLUTION、DECONVOLUTION、 INNER-PRODUCT) 和纯 SIMD (SCALE, ELTWISE)。

数据移动指令是32字节长的,并对源地址和目的地址、长度和依赖标志进行编码。计算指令有256字节长,最多可对三个张量(输入激活量和权重或两个激活量、输出结果)、张量形状和依赖标志的输入地址进行编码。它们还对描述计算性质(填充、跨距、扩展、数据类型等)、处理顺序(行优先或列优先)、优化提示(输入和输出张量填充、预先计算的状态机字段)、融合操作(规模、偏差、池化)的各种参数进行编码。所有的计算指令后面都可以跟随一个可变数量的SIMD指令,这些指令描述了一个SIMD程序,该程序将在所有的点积输出上运行。因此,点积层(CONVOLUTION, DECONVOLUTION)可以与简单的操作(quantification, scale, ReLU)或更复杂的数学函数融合(如Sigmoid, Tanh等)。

网络程序

加速器可以同时执行直接存储器存取和计算指令。在每种类型中,指令都是按顺序执行的,但为了并发性,可以在它们之间重新排序。生产者/消费者排序使用显式依赖标志来维护。

一个典型的程序如图5所示。该程序从几个 DMA 读取操作开始,将数据和权重带入加速器的 SRAM。解析器将它们插入队列并在第一条计算指令处停止。一旦挂起的计算指令的数据和权重在 SRAM 中可用,它们相应的依赖标志就会被设置,计算指令就可以开始与其他排队的 DMA 操作并行执行。

详解特斯拉FSD芯片的解决方案w5.jpg

图5 典型的程序

依赖标志用于跟踪数据可用性和缓冲区使用情况。步骤6中的DMA-in操作覆盖由前面的卷积(步骤5)提供的一个缓冲区,如图5所示。因此,在其目标标志(F0)在卷积结束时被清除之前,它不能开始执行。然而,使用不同的目标缓冲区和标志将允许DMA-in操作与前面的卷积并行执行。

我们的编译器采用Caffe格式的高级网络表示,并将它们转换为类似于图6所示的指令序列。它分析计算图并根据数据流对其排序,融合或划分层以匹配硬件功能。它为中间结果分配SRAM空间和权重张量,并通过依赖标志管理执行顺序。

NNA微体系结构

如图6所示,NNA 围绕两个主要数据路径(点积引擎和 SIMD 单元)以及解释程序、生成内存请求流以及控制数据进出的状态机进行组织。数据路径。

详解特斯拉FSD芯片的解决方案w6.jpg

图6 NNA微体系结构

点积引擎

如计算方案部分所述,点积引擎是一个 96 x 96 的 MAC 单元阵列。每个单元接受两个 8 位整数输入(有符号或无符号)并将它们相乘,将结果添加到 30 位宽的本地累加器寄存器。有许多处理器使用单精度或半精度浮点 (FP) 数据和推理权重部署浮点运算。我们的整数 MAC 计算具有足够的范围和精度,可以以所需的精度执行所有 Tesla 工作负载,并且比使用 FP 算法的计算功耗低一个数量级。

在每个循环中,数组接收两个包含96个元素的向量,并将第一个向量的每个元素与第二个向量的每个元素相乘。结果在适当的位置累积,直到点积序列结束,然后将它们卸载到SIMD引擎进行进一步处理。

每个累加器单元由两个30位寄存器组成:一个累加器和一个移位寄存器。一旦计算序列完成,点积结果被复制到移位寄存器,累加器被清除。这允许结果通过SIMD引擎移出,同时在点积引擎中开始下一个计算阶段。

SIMD单元

SIMD单元是一个宽为96的数据路径,可以执行一组完整的算术指令。它从点积引擎(一个累加器行)一次读取96个值,并作为一个指令序列执行一个后处理操作(SIMD程序)。SIMD程序不能直接访问SRAM,不支持流控制指令(分支)。对于从MAC数组中卸载的96个值的每一组,都执行相同的程序。

SIMD单元是可编程的,具有丰富的指令集,包括各种数据类型、8位、16位和32位整数和单精度浮点数(FP32)。指令集还为控制流提供条件执行。输入数据总是30位宽(强制转换为int32),最终输出总是8位宽(有符号或无符号int8),但中间数据格式可以不同于输入或输出。

由于大多数常见的 SIMD 程序都可以由称为 Fuse-dReLu(融合量化、缩放、ReLU)的单个指令表示,因此指令格式允许将任何算术运算与移位和输出运算融合在一起。FusedReLu 指令是完全流水线化的,允许完整的 96 ? 96 点积引擎将在 96 个周期内卸载。更复杂的后处理序列需要额外的指令,增加了点积引擎的卸载时间。一些复杂的序列是由 FP32 指令和条件执行构建的。30 位累加器值在此类 SIMD 程序开始时转换为 FP32 操作数,而 FP32 结果在 SIMD 程序结束时转换回 8 位整数输出。

池支持

在 SIMD 单元中进行后处理后,输出数据也可以通过池化单元有条件地路由。这允许最频繁的小内核池操作(2x 2 和 3 x3)在 SIMD 执行的阴影下执行,与生成数据的较早层并行。池化硬件实现对齐器来对齐重新排列以优化卷积的输出像素,回到原始格式。池化单元具有三个具有字节级控制的 96 字节 x96 字节池化数组。不太频繁的较大内核池操作作为点积引擎中的卷积层执行。

内存架构

NNA使用32MB的本地SRAM存储权值和激活值。为了同时实现高带宽和高密度,SRAM使用大量相对缓慢的、单端口的存储库来实现。每个周期可以访问多个这样的库,但为了保持高单元密度,不能在连续的周期中访问一个库。

SRAM可以通过两个独立的读端口(256字节和128字节宽)提供高达384字节的数据。仲裁器对来自多个源(权重、激活、程序指令、DMA-out等)的请求进行优先级排序,并通过两个端口对它们进行排序。来自同一个源的请求不能被重新排序,但是来自不同源的请求可以被优先级排序,以最小化块的冲突。

在推理过程中,权值张量总是静态的,可以在SRAM中进行布局,以确保有效的读取模式。对于激活,这并不总是可能的,所以加速器将最近读取的数据存储在1kB的缓存中。通过消除对相同数据的背靠背读取,这有助于最小化SRAM块冲突。为了进一步减少块冲突,加速器可以使用网络程序暗示的不同模式来填充输入和/或输出数据。

控制逻辑

如图6所示,控制逻辑被分为几个不同的状态机:命令序列机、网络序列机、地址和数据序列机,以及SIMD单元。

每个NNA可以将多个网络程序排队并按顺序执行。命令序列维护这样的程序和它们相应的状态寄存器的队列。一旦网络运行到完成,加速器就会在主机系统中触发一个中断。在其中一个cpu上运行的软件可以检查完成状态,并重新使网络处理一个新的输入帧。

网络定序器解释程序指令。如前所述,指令是长数据包,它编码足够的信息来初始化执行状态机。网络排序器解码此信息并将其引导到适当的消费者,强制执行依赖关系并同步机器以避免生产者和消费者层之间潜在的竞争条件。

一旦一个计算指令被解码并引导到它的执行状态机,地址序列器然后生成一个SRAM地址流和命令用于下游的计算。它将输出空间划分为不超过96x96个元素的部分,对于每个这样的部分,它通过相应的点积的所有项进行排序。

权重包在SRAM中被预先排序以匹配执行,因此状态机简单地将它们以96个连续字节的分组进行流处理。然而,激活并不总是来自连续的地址,它们通常必须从多达96个不同的SRAM位置收集。在这种情况下,地址排序器必须为每个包生成多个加载地址。为了简化实现和允许高时钟频率,96个元素的数据包被分割成12个片,每个片8个元素。每个片由一个加载操作提供服务,因此它的第一个元素和最后一个元素之间的最大距离必须小于256字节。因此,可以通过发出1到12个独立的负载操作形成96个激活的包

加载数据与控制信息一起被转发到数据排序器。权重在预取缓冲区中捕获并根据需要发布到执行中。激活存储在数据缓存中,从那里收集 96 个元素并发送到 MAC 阵列。数据路径的命令也来自数据序列器,控制执行启用、累加器移位、SIMD 程序启动、存储地址等。

SIMD 处理器为从 MAC 阵列卸载的每组 96 个累加器结果执行相同的程序。它由地址序列器中生成的控制信息进行同步,并且可以解码、发布和执行 SIMD 算术指令流。虽然 SIMD 单元有自己的寄存器文件并控制数据路径中的数据移动,但它不控制存储结果的目标地址。当地址排序器选择要处理的 96 x 96 输出切片时,它会生成存储地址和任何池化控制。

体系结构决策和结果

当我们完成MAC阵列和SIMD处理器这些模块实现时,主要关注的总是其工作时钟频率。高时钟频率更容易达到目标性能,但通常需要一些逻辑简化,这反过来又会损害特定算法的利用率。

我们决定将此设计优化为具有大量输入和输出通道的深度卷积神经网络。SRAM每周期向MAC阵列提供192字节的数据和权值,只有跨步数为1或2的层才能得到充分利用,跨步数越高的层利用率越低。

根据MAC阵列的大小和形状,加速器的利用率可以有很大的不同,如图7所示。inception-v4和特斯拉视觉网络对MAC阵列的高度显示出显著的敏感性。虽然同时处理更多的输出通道会损害整体利用率,但增加这种能力相对便宜,因为它们都共享相同的输入数据。增加阵列的宽度不会对利用率造成很大的影响,但是它需要更多的硬件资源。在我们选择的设计点(96 × 96 MAC阵列),这些网络的平均利用率刚刚超过80%。

详解特斯拉FSD芯片的解决方案w7.jpg

图7 实现利用率与MAC数组维数的对比

我们必须评估的另一个权衡是SRAM的大小。神经网络的规模在不断扩大,所以尽可能多地添加SRAM可能是一种防止未来的设计方法。然而,更大的SRAM将增加管道的深度和芯片的整体面积,增加功耗和系统的总成本。另一方面,一个太大而无法装入SRAM的卷积层总是会被分解成多个更小的组件,可能会因为将数据溢出和填充到DRAM而付出一些代价。根据我们当前网络的需求和我们的中期规模预测,我们选择了每个加速器32MB的SRAM。
结论

与之前硬件中使用的商用解决方案相比,Tesla 的 FSD 计算机提供了 21 倍的卓越性能提升,同时降低了成本,所有这些都以适度的 25% 的额外功率提升。这种性能水平是通过对一开始的设计原则的毫不妥协的坚持而实现的。在每一步,都通过高度的数据重用和控制流的简约设计最大限度地利用可用计算带宽。这台 FSD 计算机将成为推进 FSD 功能集的基础。

这项工作中学到的关键是效率和灵活性之间的权衡。具有固定功能硬件的定制解决方案可提供最高效率,而完全可编程的解决方案更灵活,但效率明显较低。我们最终确定了一个解决方案,该解决方案具有可配置的固定功能硬件,可以非常有效地执行最常见的功能,但添加了可编程 SIMD 单元,该单元以较低的效率执行不太常见的功能。我们对部署用于推理的 Tesla 工作负载的了解使我们能够以高度的信心做出这样的权衡。


快速发帖

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|Archiver|汽车工程师之家 ( 渝ICP备18012993号-1 )

GMT+8, 22-12-2024 17:32 , Processed in 0.300143 second(s), 30 queries .

Powered by Discuz! X3.5

© 2001-2013 Comsenz Inc.